Subversion Repositories Kolibri OS

Rev

Rev 4489 | Go to most recent revision | Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
4487 mario79 1
;-----------------------------------------------------------------------------
2
put_to_clipboard:
3
; we have allocated memory?
4
	mov	edi,[clipboard_buf]
5
	test	edi,edi
6
	jz	.end
7
; convert from Tinypad format to the kernel clipboard format
8
	add	edi,3*4
9
	mov	esi,[copy_buf]
10
	mov	ecx,[copy_count]
11
	cld
12
;--------------------------------------
13
@@:
14
	push	ecx
15
	lodsd
16
	mov	ecx,eax
17
	lodsw
18
	rep	movsb
19
	mov	ax,0x0a0d
20
	stosw
21
;	mov	ax,0x0d
22
;	stosb
23
	pop	ecx
24
	dec	ecx
25
	jnz	@b
26
 
27
	xor	eax,eax
28
	stosb
29
; building the clipboard slot header
30
	mov	esi,[clipboard_buf]
31
	sub	edi,esi
32
	mov	[esi],edi ; clipboard area size
33
	xor	eax,eax
34
	mov	[esi+4],eax ;	; type 'text'
35
	inc	eax
36
	mov	[esi+8],eax	; cp866 text encoding
37
; put slot to the kernel clipboard
38
	mov	edx,[clipboard_buf]
39
	mov	ecx,[edx]
40
	mcall	54,2
41
; remove unnecessary memory area
42
	xor	eax,eax
43
        stdcall mem.ReAlloc,[clipboard_buf],eax
44
        mov     [clipboard_buf],eax
45
	xor	eax,eax
46
	mov	[copy_size],eax
47
        mov     [copy_count],eax
48
        stdcall mem.ReAlloc,[copy_buf],eax
49
        mov     [copy_buf],eax
50
;--------------------------------------
51
.end:
52
	ret
53
;-----------------------------------------------------------------------------
54
get_from_clipboard:
55
	pushad
56
	mcall	54,0
57
; no slots of clipboard ?
58
	test	eax,eax
59
	jz	.exit
60
; main list area not found ?
61
	inc	eax
62
	test	eax,eax
63
	jz	.exit
64
 
65
	sub	eax,2
66
	mov	ecx,eax
67
	mcall	54,1
68
; main list area not found ?
69
	inc	eax
70
	test	eax,eax
71
	jz	.exit
72
; error ?
73
	sub	eax,2
74
	test	eax,eax
75
	jz	.exit
76
 
77
	inc	eax
78
	mov	[clipboard_buf],eax
79
; check contents of container
80
	mov	ebx,[eax+4]
81
; check for text
82
	test	ebx,ebx
83
	jnz	.no_valid_text
84
 
85
	mov	ebx,[eax+8]
86
; check for cp866
87
	cmp	bl,1
88
	jz	.yes_valid_text
89
 
90
.no_valid_text:
91
	xor	eax,eax
92
	mov	[copy_size],eax
93
	jmp	.remove_area
94
;--------------------------------------
95
.yes_valid_text:
96
	call	know_number_line_breaks
97
        mov     [copy_count],ebx
98
 
99
	mov	eax,[clipboard_buf]
100
	sub	esi,eax
101
	mov	[eax],esi
102
 
103
	shl	ebx,1
104
	lea	ebx,[ebx*3]
105
 
106
	mov	eax,[clipboard_buf]
107
	mov	eax,[eax]
108
	sub	eax,4*3
109
	add	eax,ebx
110
        mov     [copy_size],eax
111
 
112
        stdcall mem.ReAlloc,[copy_buf],eax
113
        mov     [copy_buf],eax
114
 
115
	call	convert_clipboard_buf_to_copy_buf
116
; remove unnecessary memory area
117
.remove_area:
118
	xor	eax,eax
119
        stdcall mem.ReAlloc,[clipboard_buf],eax
120
        mov     [clipboard_buf],eax
121
;--------------------------------------
122
.exit:
123
	popad
124
	ret
125
;-----------------------------------------------------------------------------
126
convert_clipboard_buf_to_copy_buf:
127
	mov	edi,[copy_buf]
128
	mov	ebx,edi
129
	add	edi,6
130
	mov	eax,[clipboard_buf]
131
	mov	esi,eax
132
	add	esi,4*3
133
	mov	ecx,[eax]
134
	sub	ecx,4*3
135
	xor	edx,edx
136
	cld
137
;--------------------------------------
138
.loop:
139
	lodsb
140
 
141
	test	al,al
142
	jz	.inc_counter	;.end_of_data
143
 
144
	cmp	al,0x0d
145
	je	.check_0x0a
146
 
147
	cmp	al,0x0a
148
	je	.inc_counter
149
 
150
	dec	ecx
151
	jz	.end_of_data
152
 
153
	stosb
154
	jmp	.loop
155
;--------------------------------------
156
.check_0x0a:
157
	dec	ecx
158
	jz	.end_of_data
159
 
160
	cmp	[esi],byte 0x0a
161
	jne	@f
162
 
163
	lodsb
164
;--------------------------------------
165
.inc_counter:
166
	dec	ecx
167
	jz	.end_of_data
168
;--------------------------------------
169
@@:
170
	mov	eax,edi
171
	sub	eax,ebx
172
	sub	eax,6
173
.@@111:
174
	mov	[ebx],eax
175
	test	edx,edx
176
	jz	@f
177
 
178
	test	eax,eax
179
	jz	@f
180
 
181
	mov	[ebx+4],word EDITOR_LINE_FLAG_MOFIFIED
182
@@:
183
	mov	ebx,edi
184
	add	edi,6
185
	inc	edx
186
	jmp	.loop
187
;--------------------------------------
188
.end_of_data:
189
	sub	edi,[copy_buf]
190
	sub	edi,6
191
        mov     [copy_size],edi
192
	ret
193
;-----------------------------------------------------------------------------
194
know_number_line_breaks:
195
; to know the number of line breaks
196
	mov	eax,[clipboard_buf]
197
	mov	esi,eax
198
	add	esi,4*3
199
	mov	ecx,[eax]
200
	sub	ecx,4*3
201
	xor	ebx,ebx
202
	cld
203
;--------------------------------------
204
@@:
205
	lodsb
206
 
207
	test	al,al
208
	jz	.end_of_data_1
209
 
210
	cmp	al,0x0d
211
	je	.check_0x0a
212
 
213
	cmp	al,0x0a
214
	je	.inc_counter
215
 
216
	dec	ecx
217
	jnz	@b
218
 
219
	jmp	.end_of_data
220
;--------------------------------------
221
.check_0x0a:
222
	inc	ebx
223
	dec	ecx
224
	jz	.end_of_data
225
 
226
	cmp	[esi],byte 0x0a
227
	jne	@b
228
 
229
	lodsb
230
	dec	ecx
231
	jnz	@b
232
 
233
	jmp	.end_of_data
234
;--------------------------------------
235
.inc_counter:
236
	inc	ebx
237
	dec	ecx
238
	jnz	@b
239
;--------------------------------------
240
.end_of_data_1:
241
	cmp	[esi-2],byte 0x0d
242
	je	.end_of_data
243
 
244
	cmp	[esi-2],byte 0x0a
245
	je	.end_of_data
246
 
247
	inc	ebx
248
	inc	esi
249
;--------------------------------------
250
.end_of_data:
251
	ret
252
;-----------------------------------------------------------------------------