0,0 → 1,252 |
;----------------------------------------------------------------------------- |
put_to_clipboard: |
; we have allocated memory? |
mov edi,[clipboard_buf] |
test edi,edi |
jz .end |
; convert from Tinypad format to the kernel clipboard format |
add edi,3*4 |
mov esi,[copy_buf] |
mov ecx,[copy_count] |
cld |
;-------------------------------------- |
@@: |
push ecx |
lodsd |
mov ecx,eax |
lodsw |
rep movsb |
mov ax,0x0a0d |
stosw |
; mov ax,0x0d |
; stosb |
pop ecx |
dec ecx |
jnz @b |
|
xor eax,eax |
stosb |
; building the clipboard slot header |
mov esi,[clipboard_buf] |
sub edi,esi |
mov [esi],edi ; clipboard area size |
xor eax,eax |
mov [esi+4],eax ; ; type 'text' |
inc eax |
mov [esi+8],eax ; cp866 text encoding |
; put slot to the kernel clipboard |
mov edx,[clipboard_buf] |
mov ecx,[edx] |
mcall 54,2 |
; remove unnecessary memory area |
xor eax,eax |
stdcall mem.ReAlloc,[clipboard_buf],eax |
mov [clipboard_buf],eax |
xor eax,eax |
mov [copy_size],eax |
mov [copy_count],eax |
stdcall mem.ReAlloc,[copy_buf],eax |
mov [copy_buf],eax |
;-------------------------------------- |
.end: |
ret |
;----------------------------------------------------------------------------- |
get_from_clipboard: |
pushad |
mcall 54,0 |
; no slots of clipboard ? |
test eax,eax |
jz .exit |
; main list area not found ? |
inc eax |
test eax,eax |
jz .exit |
|
sub eax,2 |
mov ecx,eax |
mcall 54,1 |
; main list area not found ? |
inc eax |
test eax,eax |
jz .exit |
; error ? |
sub eax,2 |
test eax,eax |
jz .exit |
|
inc eax |
mov [clipboard_buf],eax |
; check contents of container |
mov ebx,[eax+4] |
; check for text |
test ebx,ebx |
jnz .no_valid_text |
|
mov ebx,[eax+8] |
; check for cp866 |
cmp bl,1 |
jz .yes_valid_text |
|
.no_valid_text: |
xor eax,eax |
mov [copy_size],eax |
jmp .remove_area |
;-------------------------------------- |
.yes_valid_text: |
call know_number_line_breaks |
mov [copy_count],ebx |
|
mov eax,[clipboard_buf] |
sub esi,eax |
mov [eax],esi |
|
shl ebx,1 |
lea ebx,[ebx*3] |
|
mov eax,[clipboard_buf] |
mov eax,[eax] |
sub eax,4*3 |
add eax,ebx |
mov [copy_size],eax |
|
stdcall mem.ReAlloc,[copy_buf],eax |
mov [copy_buf],eax |
|
call convert_clipboard_buf_to_copy_buf |
; remove unnecessary memory area |
.remove_area: |
xor eax,eax |
stdcall mem.ReAlloc,[clipboard_buf],eax |
mov [clipboard_buf],eax |
;-------------------------------------- |
.exit: |
popad |
ret |
;----------------------------------------------------------------------------- |
convert_clipboard_buf_to_copy_buf: |
mov edi,[copy_buf] |
mov ebx,edi |
add edi,6 |
mov eax,[clipboard_buf] |
mov esi,eax |
add esi,4*3 |
mov ecx,[eax] |
sub ecx,4*3 |
xor edx,edx |
cld |
;-------------------------------------- |
.loop: |
lodsb |
|
test al,al |
jz .inc_counter ;.end_of_data |
|
cmp al,0x0d |
je .check_0x0a |
|
cmp al,0x0a |
je .inc_counter |
|
dec ecx |
jz .end_of_data |
|
stosb |
jmp .loop |
;-------------------------------------- |
.check_0x0a: |
dec ecx |
jz .end_of_data |
|
cmp [esi],byte 0x0a |
jne @f |
|
lodsb |
;-------------------------------------- |
.inc_counter: |
dec ecx |
jz .end_of_data |
;-------------------------------------- |
@@: |
mov eax,edi |
sub eax,ebx |
sub eax,6 |
.@@111: |
mov [ebx],eax |
test edx,edx |
jz @f |
|
test eax,eax |
jz @f |
|
mov [ebx+4],word EDITOR_LINE_FLAG_MOFIFIED |
@@: |
mov ebx,edi |
add edi,6 |
inc edx |
jmp .loop |
;-------------------------------------- |
.end_of_data: |
sub edi,[copy_buf] |
sub edi,6 |
mov [copy_size],edi |
ret |
;----------------------------------------------------------------------------- |
know_number_line_breaks: |
; to know the number of line breaks |
mov eax,[clipboard_buf] |
mov esi,eax |
add esi,4*3 |
mov ecx,[eax] |
sub ecx,4*3 |
xor ebx,ebx |
cld |
;-------------------------------------- |
@@: |
lodsb |
|
test al,al |
jz .end_of_data_1 |
|
cmp al,0x0d |
je .check_0x0a |
|
cmp al,0x0a |
je .inc_counter |
|
dec ecx |
jnz @b |
|
jmp .end_of_data |
;-------------------------------------- |
.check_0x0a: |
inc ebx |
dec ecx |
jz .end_of_data |
|
cmp [esi],byte 0x0a |
jne @b |
|
lodsb |
dec ecx |
jnz @b |
|
jmp .end_of_data |
;-------------------------------------- |
.inc_counter: |
inc ebx |
dec ecx |
jnz @b |
;-------------------------------------- |
.end_of_data_1: |
cmp [esi-2],byte 0x0d |
je .end_of_data |
|
cmp [esi-2],byte 0x0a |
je .end_of_data |
|
inc ebx |
inc esi |
;-------------------------------------- |
.end_of_data: |
ret |
;----------------------------------------------------------------------------- |