Subversion Repositories Kolibri OS

Rev

Rev 2125 | Rev 7575 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
1476 IgorA 1
struct FileInfoBlock
2
	Function dd ?
3
	Position dd ?
4
	Flags	 dd ?
5
	Count	 dd ?
6
	Buffer	 dd ?
7
		db ?
8
	FileName dd ?
9
ends
10
 
11
struct TexColViv
2102 IgorA 12
	Text  rb MAX_COLOR_WORD_LEN ; слово для подсветки
13
	f1    dd 0 ; справка по слову
14
	flags db ? ; f1+4 флаги используемые при выделении
15
	endc  db ? ; f1+5 символ конца выделения (используется при flags&4)
16
	escc  db ? ; f1+6 экранирующий символ (используется при flags&4)
17
	color db ? ; f1+7 номер цвета
1476 IgorA 18
ends
19
 
20
count_colors_text dd 1
21
ColWords dd 0
22
color_cursor dd ?
23
color_wnd_capt dd ?
24
color_wnd_work dd ?
25
color_wnd_bord dd ?
26
color_select dd ?
27
color_cur_text dd ?
28
color_wnd_text dd ?
29
 
30
options_file dd 0
31
options_file_end dd 0
32
tex_colors dd 0
33
tex_help_f1 dd 0
34
 
35
Col dd 0 ;указатель на структуры ключевых слов TexColViv
36
 
37
keyUpr dd 0
38
err_opn db 0 ;ошибка открытия файла
39
err_sav db 0 ;ошибка сохранения файла
40
 
41
sc system_colors
42
 
43
run_file_70 FileInfoBlock
44
 
45
align 4
46
InitColText:
47
	pushad
48
 
49
	mov  ebx,dword[fn_col_option]
50
	copy_path ebx,fn_syntax_dir,file_name_rez,0
51
	copy_path file_name_rez,sys_path,file_name,0
52
 
53
  mov eax,70
54
  mov [run_file_70.Function], 0
55
  mov [run_file_70.Position], 0
56
  mov [run_file_70.Flags], 0
57
  mov ebx,[options_file_end]
58
  sub ebx,[options_file]
59
  mov [run_file_70.Count], ebx
60
  m2m [run_file_70.Buffer], [options_file]
61
  mov byte[run_file_70+20], 0
62
  mov [run_file_70.FileName], file_name
63
  mov ebx,run_file_70
64
  int 0x40
65
 
66
 
67
	;init: count_colors_text, ColWords, ...
68
	mov dword[count_colors_text],1
69
	mov dword[ColWords],0
70
	mov dword[tex_help_f1],0
71
 
2159 IgorA 72
	cmp eax,6
73
	je @f
74
	cmp eax,0
75
	je @f
76
		cmp ax,10
77
		jl .zifra_0_9
78
			mov al,'?'
79
			sub ax,48
80
		.zifra_0_9:
81
		add ax,48
82
		jmp .no_colors
83
	@@:
1476 IgorA 84
 
85
	mov esi,[options_file]
86
	mov edi,count_colors_text
87
	mov ecx,9*4
88
	rep movsb
89
 
90
	mov eax,[options_file]
91
	add eax,32
92
	mov dword[tex_colors],eax
93
 
94
	mov eax,dword[count_colors_text] ;init: Col (offset to key words)
95
	add eax,8
96
	shl eax,2
97
	add eax,[options_file]
98
	mov dword[Col],eax
99
 
100
	;init: tex_help_f1
101
	mov ecx,dword[ColWords]
102
	imul ecx,sizeof.TexColViv
103
	add ecx,dword[Col]
104
	mov dword[tex_help_f1],ecx
105
 
106
	;формирование текста в окне текстового редактора
107
	stdcall [ted_clear], tedit0,1
108
 
109
	stdcall print_capt,capt_header
110
 
111
	stdcall print_capt,col_1
112
	stdcall print_color,[color_cursor]
113
	stdcall print_capt,col_2
114
	stdcall print_color,[color_wnd_capt]
115
	stdcall print_capt,col_3
116
	stdcall print_color,[color_wnd_work]
117
	stdcall print_capt,col_4
118
	stdcall print_color,[color_wnd_bord]
119
	stdcall print_capt,col_5
120
	stdcall print_color,[color_select]
121
	stdcall print_capt,col_6
122
	stdcall print_color,[color_cur_text]
123
 
124
	stdcall print_capt,col_7
125
	mov ecx,[count_colors_text] ;количество цветов текста
126
	mov eax,[tex_colors]
127
	@@:
128
		stdcall print_capt,capt_type_dd
129
		stdcall print_color,[eax]
130
		add eax,4
131
	loop @b
132
 
133
	stdcall print_capt,capt_lbl_wo
134
	mov ecx,dword[ColWords]
135
	mov eax,[Col]
136
	xor ebx,ebx
137
	@@:
138
		inc ebx
139
		stdcall print_word,eax,ebx
140
		add eax,sizeof.TexColViv
141
	loop @b
142
 
143
	stdcall print_capt,capt_lbl_f1
144
	mov ecx,dword[ColWords]
145
	mov eax,[Col]
146
	xor ebx,ebx
147
	@@:
148
		inc ebx
149
		stdcall print_word_f1,eax,ebx
150
		add eax,sizeof.TexColViv
151
	loop @b
152
 
2125 IgorA 153
	; подготовка для  PathShow
154
	push dword PathShow_data_1
155
	call [PathShow_prepare]
2086 IgorA 156
	call draw_window
1476 IgorA 157
 
158
	.no_colors:
159
	popad
160
	ret
161
 
162
align 4
163
proc print_color, color:dword
164
	pushad
165
	mov eax,dword[color]
166
 
167
	mov ebx,eax ;меняем местами red и blue
168
	shr ebx,16
169
	xchg al,bl
170
	and eax,0xffff
171
	and ebx,0xff
172
	shl ebx,16
173
	or eax,ebx
174
 
175
	ror al,4
176
	ror eax,8
177
	ror al,4
178
	ror eax,8
179
	ror al,4
180
	rol eax,16
181
	mov edi,text_buffer
182
	mov word[edi],'0x'
183
	add edi,2
184
	mov ecx,6
185
	@@:
186
		mov ebx,eax
187
		and ebx,0xf
188
		cmp bx,9
189
		jle .cifra
190
			add bx,39
191
		.cifra:
192
		add bx,48
193
		mov byte[edi],bl
194
		inc edi
195
		shr eax,4
196
	loop @b
197
	mov byte[edi],13
198
	mov ebx,ted_opt_ed_change_time+ted_opt_ed_move_cursor
199
	stdcall [ted_text_add], tedit0,text_buffer,9,ebx
200
	popad
201
	ret
202
endp
203
 
204
align 4
205
proc print_capt, capt:dword
206
	pushad
207
	mov esi,dword[capt]
208
	stdcall str_len,esi
209
	stdcall [ted_text_add], tedit0,esi,eax,ted_opt_ed_change_time+ted_opt_ed_move_cursor
210
	popad
211
	ret
212
endp
213
 
214
align 4
215
proc print_word, text:dword, index:dword
216
	pushad
217
	mov esi,text_buffer
218
	mov byte[esi],0
219
	stdcall str_cat,esi,capt_beg_word
220
	stdcall str_len,esi
221
	add esi,eax
222
 
223
	mov edi,dword[text]
224
	stdcall code_string,edi,esi ;кодируем строку с ключевым словом
225
	stdcall str_cat,esi,capt_end_word
226
 
227
	cmp dword[edi+MAX_COLOR_WORD_LEN],0 ;f1
228
	je @f
229
		stdcall str_cat,esi,capt_calc_f1
230
		stdcall str_cat_value,esi,[index]
231
		stdcall str_cat,esi,capt_lbl_f1_use
232
	@@:
233
 
234
	mov esi,text_buffer
235
	stdcall str_len,esi ;узнаем длинну всей строки
236
	stdcall [ted_text_add], tedit0,esi,eax,ted_opt_ed_change_time+ted_opt_ed_move_cursor
237
 
238
mov ecx,edi
239
mov edi,text_buffer
240
mov byte[edi],','
241
inc edi
242
mov byte[edi],0
243
	xor eax,eax
244
	mov al,byte[ecx+MAX_COLOR_WORD_LEN+4] ;wwo
245
	stdcall str_cat_value,edi,eax
246
	stdcall str_len,edi
247
	add edi,eax
248
	mov byte[edi],','
249
	inc edi
250
 
251
	xor eax,eax
2102 IgorA 252
	mov ax,word[ecx+MAX_COLOR_WORD_LEN+4+1] ;(escc shl 8)+endc
253
	cmp ax,0 ;проверяем есть ли завершающий и экранинующий символ
1476 IgorA 254
	je @f
255
		stdcall str_cat_value,edi,eax
256
		stdcall str_len,edi
257
		add edi,eax
258
	@@:
259
	mov byte[edi],','
260
	inc edi
261
 
262
	xor eax,eax
2159 IgorA 263
	mov al,byte[ecx+MAX_COLOR_WORD_LEN+4+3] ;color
1476 IgorA 264
	stdcall str_cat_value,edi,eax
265
	stdcall str_len,edi
266
	add edi,eax
267
	mov byte[edi],13
268
	inc edi
269
	mov byte[edi],0
270
 
271
	mov esi,text_buffer
272
	stdcall str_len,esi
273
	stdcall [ted_text_add], tedit0,esi,eax,ted_opt_ed_move_cursor
274
 
275
	popad
276
	ret
277
endp
278
 
279
align 4
280
proc print_word_f1, text:dword, index:dword
281
	pushad
282
	mov edi,dword[text]
283
	mov esi,dword[edi+MAX_COLOR_WORD_LEN] ;f1
284
	cmp esi,0
285
	je @f
286
		mov ebx,text_buffer
287
		mov byte[ebx],0
288
		stdcall str_cat,ebx,capt_point
289
		stdcall str_cat_value,ebx,[index]
290
		stdcall str_cat,ebx,capt_beg_db
291
		stdcall str_len,ebx
292
		add ebx,eax
293
 
294
		add esi,dword[tex_help_f1]
295
		stdcall code_string,esi,ebx ;кодируем строку
296
		stdcall str_cat,ebx,capt_end_word_f1
297
 
298
		mov ebx,text_buffer
299
		stdcall str_len,ebx
300
		stdcall [ted_text_add], tedit0,ebx,eax,ted_opt_ed_move_cursor
301
	@@:
302
	popad
303
	ret
304
endp
305
 
306
align 4
307
proc code_string, text:dword, out_text:dword
308
	pushad
309
	mov esi,dword[text]
310
	stdcall str_len,esi
311
	mov ecx,eax
312
	mov edi,dword[out_text]
313
 
314
	.copy:
315
		mov al,byte[esi]
316
		inc esi
317
		cmp al,9
318
		je @f
319
		cmp al,13
320
		je @f
321
		cmp al,39
322
		je @f
323
			mov byte[edi],al
324
			inc edi
325
			loop .copy
326
			jmp .end_copy
327
		@@:
328
			mov byte[edi],39
329
			mov byte[edi+1],','
330
			add edi,2
331
			and eax,0xff
332
			mov dword[edi],0
333
			call tl_convert_to_str
334
			stdcall str_len,edi
335
			add edi,eax
336
			mov byte[edi],','
337
			mov byte[edi+1],39
338
			add edi,2
339
	loop .copy
340
	.end_copy:
341
	mov byte[edi],0
342
	popad
343
	ret
344
endp
345
 
346
align 4
347
proc mem_clear, mem:dword, len:dword
348
	push eax ecx edi
349
	cld
350
	xor al,al
351
	mov edi, dword[mem]
352
	mov ecx, dword[len]
353
	repne stosb
354
	pop edi ecx eax
355
	ret
356
endp
357
 
358
align 4
359
proc str_cat, str1:dword, str2:dword
360
	push eax ecx edi esi
361
	mov esi,dword[str2]
362
	stdcall str_len,esi
363
	mov ecx,eax
364
	inc ecx
365
	mov edi,dword[str1]
366
	stdcall str_len,edi
367
	add edi,eax
368
	cld
369
	repne movsb
370
	pop esi edi ecx eax
371
	ret
372
endp
373
 
374
align 4
375
proc str_cat_value, str1:dword, value:dword
376
	pushad
377
	mov edi,[str1]
378
	stdcall str_len,edi
379
	add edi,eax
380
	mov eax,[value]
381
	call tl_convert_to_str
382
	popad
383
	ret
384
endp
385
 
386
;output:
387
; eax = strlen
388
align 4
389
proc str_len, str1:dword
390
	mov eax,[str1]
391
	@@:
392
		cmp byte[eax],0
393
		je @f
394
		inc eax
395
		jmp @b
396
	@@:
397
	sub eax,[str1]
398
	ret
399
endp
400
 
401
;input:
402
; eax = value
403
; edi = string buffer
404
align 4
405
tl_convert_to_str:
406
	pushad
407
	stdcall mem_clear,edi,12
408
	call .str
409
	popad
410
	ret
411
 
412
align 4
413
.str:
414
	mov ecx,0x0a ;задается система счисления изменяются регистры ebx,eax,ecx,edx входные параметры eax - число
415
		;преревод числа в ASCII строку входные данные ecx=система счисленя edi адрес куда записывать, будем строку, причем конец переменной
416
	cmp eax,ecx  ;сравнить если в eax меньше чем в ecx то перейти на @@-1 т.е. на pop eax
417
	jb @f
418
		xor edx,edx ;очистить edx
419
		div ecx     ;разделить - остаток в edx
420
		push edx    ;положить в стек
421
		;dec edi    ;смещение необходимое для записи с конца строки
422
		call .str   ;перейти на саму себя т.е. вызвать саму себя и так до того момента пока в eax не станет меньше чем в ecx
423
		pop eax
424
	@@: ;cmp al,10 ;проверить не меньше ли значение в al чем 10 (для системы счисленя 10 данная команда - лишная))
425
	or al,0x30  ;данная команда короче  чем две выше
426
	stosb	    ;записать элемент из регистра al в ячеку памяти es:edi
427
	ret