Subversion Repositories Kolibri OS

Rev

Rev 2086 | Rev 2125 | 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
 
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
 
83
    jmp .no_colors
84
  @@:
85
 
86
	mov esi,[options_file]
87
	mov edi,count_colors_text
88
	mov ecx,9*4
89
	rep movsb
90
 
91
	mov eax,[options_file]
92
	add eax,32
93
	mov dword[tex_colors],eax
94
 
95
	mov eax,dword[count_colors_text] ;init: Col (offset to key words)
96
	add eax,8
97
	shl eax,2
98
	add eax,[options_file]
99
	mov dword[Col],eax
100
 
101
	;init: tex_help_f1
102
	mov ecx,dword[ColWords]
103
	imul ecx,sizeof.TexColViv
104
	add ecx,dword[Col]
105
	mov dword[tex_help_f1],ecx
106
 
107
	;формирование текста в окне текстового редактора
108
	stdcall [ted_clear], tedit0,1
109
 
110
	stdcall print_capt,capt_header
111
 
112
	stdcall print_capt,col_1
113
	stdcall print_color,[color_cursor]
114
	stdcall print_capt,col_2
115
	stdcall print_color,[color_wnd_capt]
116
	stdcall print_capt,col_3
117
	stdcall print_color,[color_wnd_work]
118
	stdcall print_capt,col_4
119
	stdcall print_color,[color_wnd_bord]
120
	stdcall print_capt,col_5
121
	stdcall print_color,[color_select]
122
	stdcall print_capt,col_6
123
	stdcall print_color,[color_cur_text]
124
 
125
	stdcall print_capt,col_7
126
	mov ecx,[count_colors_text] ;количество цветов текста
127
	mov eax,[tex_colors]
128
	@@:
129
		stdcall print_capt,capt_type_dd
130
		stdcall print_color,[eax]
131
		add eax,4
132
	loop @b
133
 
134
	stdcall print_capt,capt_lbl_wo
135
	mov ecx,dword[ColWords]
136
	mov eax,[Col]
137
	xor ebx,ebx
138
	@@:
139
		inc ebx
140
		stdcall print_word,eax,ebx
141
		add eax,sizeof.TexColViv
142
	loop @b
143
 
144
	stdcall print_capt,capt_lbl_f1
145
	mov ecx,dword[ColWords]
146
	mov eax,[Col]
147
	xor ebx,ebx
148
	@@:
149
		inc ebx
150
		stdcall print_word_f1,eax,ebx
151
		add eax,sizeof.TexColViv
152
	loop @b
153
 
2086 IgorA 154
	;stdcall [ted_init_scroll_bars], tedit0,4
155
	;stdcall [ted_draw], tedit0
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
		jmp .end_f1_calc
233
	@@:
234
		stdcall str_cat,esi,capt_null
235
	.end_f1_calc:
236
 
237
	mov esi,text_buffer
238
	stdcall str_len,esi ;узнаем длинну всей строки
239
	stdcall [ted_text_add], tedit0,esi,eax,ted_opt_ed_change_time+ted_opt_ed_move_cursor
240
 
241
mov ecx,edi
242
mov edi,text_buffer
243
mov byte[edi],','
244
inc edi
245
mov byte[edi],0
246
	xor eax,eax
247
	mov al,byte[ecx+MAX_COLOR_WORD_LEN+4] ;wwo
248
	stdcall str_cat_value,edi,eax
249
	stdcall str_len,edi
250
	add edi,eax
251
	mov byte[edi],','
252
	inc edi
253
 
254
	xor eax,eax
2102 IgorA 255
	mov ax,word[ecx+MAX_COLOR_WORD_LEN+4+1] ;(escc shl 8)+endc
256
	cmp ax,0 ;проверяем есть ли завершающий и экранинующий символ
1476 IgorA 257
	je @f
258
		stdcall str_cat_value,edi,eax
259
		stdcall str_len,edi
260
		add edi,eax
261
	@@:
262
	mov byte[edi],','
263
	inc edi
264
 
265
	xor eax,eax
266
	mov al,byte[ecx+MAX_COLOR_WORD_LEN+4+2] ;color
267
	stdcall str_cat_value,edi,eax
268
	stdcall str_len,edi
269
	add edi,eax
270
	mov byte[edi],13
271
	inc edi
272
	mov byte[edi],0
273
 
274
	mov esi,text_buffer
275
	stdcall str_len,esi
276
	stdcall [ted_text_add], tedit0,esi,eax,ted_opt_ed_move_cursor
277
 
278
	popad
279
	ret
280
endp
281
 
282
align 4
283
proc print_word_f1, text:dword, index:dword
284
	pushad
285
	mov edi,dword[text]
286
	mov esi,dword[edi+MAX_COLOR_WORD_LEN] ;f1
287
	cmp esi,0
288
	je @f
289
		mov ebx,text_buffer
290
		mov byte[ebx],0
291
		stdcall str_cat,ebx,capt_point
292
		stdcall str_cat_value,ebx,[index]
293
		stdcall str_cat,ebx,capt_beg_db
294
		stdcall str_len,ebx
295
		add ebx,eax
296
 
297
		add esi,dword[tex_help_f1]
298
		stdcall code_string,esi,ebx ;кодируем строку
299
		stdcall str_cat,ebx,capt_end_word_f1
300
 
301
		mov ebx,text_buffer
302
		stdcall str_len,ebx
303
		stdcall [ted_text_add], tedit0,ebx,eax,ted_opt_ed_move_cursor
304
	@@:
305
	popad
306
	ret
307
endp
308
 
309
align 4
310
proc code_string, text:dword, out_text:dword
311
	pushad
312
	mov esi,dword[text]
313
	stdcall str_len,esi
314
	mov ecx,eax
315
	mov edi,dword[out_text]
316
 
317
	.copy:
318
		mov al,byte[esi]
319
		inc esi
320
		cmp al,9
321
		je @f
322
		cmp al,13
323
		je @f
324
		cmp al,39
325
		je @f
326
			mov byte[edi],al
327
			inc edi
328
			loop .copy
329
			jmp .end_copy
330
		@@:
331
			mov byte[edi],39
332
			mov byte[edi+1],','
333
			add edi,2
334
			and eax,0xff
335
			mov dword[edi],0
336
			call tl_convert_to_str
337
			stdcall str_len,edi
338
			add edi,eax
339
			mov byte[edi],','
340
			mov byte[edi+1],39
341
			add edi,2
342
	loop .copy
343
	.end_copy:
344
	mov byte[edi],0
345
	popad
346
	ret
347
endp
348
 
349
align 4
350
proc mem_clear, mem:dword, len:dword
351
	push eax ecx edi
352
	cld
353
	xor al,al
354
	mov edi, dword[mem]
355
	mov ecx, dword[len]
356
	repne stosb
357
	pop edi ecx eax
358
	ret
359
endp
360
 
361
align 4
362
proc str_cat, str1:dword, str2:dword
363
	push eax ecx edi esi
364
	mov esi,dword[str2]
365
	stdcall str_len,esi
366
	mov ecx,eax
367
	inc ecx
368
	mov edi,dword[str1]
369
	stdcall str_len,edi
370
	add edi,eax
371
	cld
372
	repne movsb
373
	pop esi edi ecx eax
374
	ret
375
endp
376
 
377
align 4
378
proc str_cat_value, str1:dword, value:dword
379
	pushad
380
	mov edi,[str1]
381
	stdcall str_len,edi
382
	add edi,eax
383
	mov eax,[value]
384
	call tl_convert_to_str
385
	popad
386
	ret
387
endp
388
 
389
;output:
390
; eax = strlen
391
align 4
392
proc str_len, str1:dword
393
	mov eax,[str1]
394
	@@:
395
		cmp byte[eax],0
396
		je @f
397
		inc eax
398
		jmp @b
399
	@@:
400
	sub eax,[str1]
401
	ret
402
endp
403
 
404
;input:
405
; eax = value
406
; edi = string buffer
407
align 4
408
tl_convert_to_str:
409
	pushad
410
	stdcall mem_clear,edi,12
411
	call .str
412
	popad
413
	ret
414
 
415
align 4
416
.str:
417
	mov ecx,0x0a ;задается система счисления изменяются регистры ebx,eax,ecx,edx входные параметры eax - число
418
		;преревод числа в ASCII строку входные данные ecx=система счисленя edi адрес куда записывать, будем строку, причем конец переменной
419
	cmp eax,ecx  ;сравнить если в eax меньше чем в ecx то перейти на @@-1 т.е. на pop eax
420
	jb @f
421
		xor edx,edx ;очистить edx
422
		div ecx     ;разделить - остаток в edx
423
		push edx    ;положить в стек
424
		;dec edi    ;смещение необходимое для записи с конца строки
425
		call .str   ;перейти на саму себя т.е. вызвать саму себя и так до того момента пока в eax не станет меньше чем в ecx
426
		pop eax
427
	@@: ;cmp al,10 ;проверить не меньше ли значение в al чем 10 (для системы счисленя 10 данная команда - лишная))
428
	or al,0x30  ;данная команда короче  чем две выше
429
	stosb	    ;записать элемент из регистра al в ячеку памяти es:edi
430
	ret