Subversion Repositories Kolibri OS

Rev

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

Rev Author Line No. Line
7538 leency 1
;как устроено дерево:
2
;массив, на который указывает PTree содержит записи _tree
3
;
4
;0 0,szRoot
5
;1  1,dir1
6
;2  1,dir2
7
;3   2,dir21
8
;4   2,dir22
9
;5    3,dir221
10
;6   2,dir23
11
;7  1,dir3
12
;8  1,dir4
13
;9   2,dir41
14
 
15
 
16
 
17
 
18
RAZD equ 1		;Знак разделителя строк
19
 
20
F_ONLY_READ	equ 1b
21
F_HIDDEN	equ 10b
22
F_SYSTEM	equ 100b
23
F_LABEL 	equ 1000b
24
F_FOLDER	equ 10000b
25
F_NOT_BACKUP	equ 100000b
26
 
27
TR_LINE_H equ 18
28
TR_STEP_W equ 10
29
NUM_READ_FILES = 26
30
TR_BACKGROUND = 0EFF8FFh
31
 
32
 
33
 
34
 
35
macro p2p r1,r2
36
{
37
	push	dword r2
38
	pop	dword r1
39
}
40
 
41
macro CopyStr strOut,strIn
42
{
43
	mov	edi,strOut
44
	mov	esi,strIn
45
    @@: lodsb
46
	stosb
47
	test	al,al
48
	jnz	@b
49
}
50
 
51
 
52
struct _BDWK
53
	flags		rd 1	;bit0: only read , hidden , system , label , folder , not backup
54
	encod		rb 1	;0-ASCII, 1-UNICODE
55
	res		rb 3
56
	timeCreated	rd 1
57
	dataCreated	rd 1
58
	lastTimeAccess rd 1
59
	lastDataAccess rd 1
60
	lastTimeModify rd 1
61
	lastDataModify rd 1
62
	size		rq 1
63
	name		rb 263
64
ends
65
 
66
proc d_OutTree
67
	pushad
68
	pushfd
69
 
70
	mov	edi,[PTree]
71
	dps 'Дерево:'
72
	dnl
73
   @@:	cmp	dword[edi+4],0
74
	je	.exit
75
	dph [edi]
76
	dps ' '
77
	dph [edi+4]
78
	dps ' '
79
	dpsP [edi+4]
80
	dnl
81
	add	edi,8
82
	jmp	@b
83
  .exit:
84
 
85
	popfd
86
	popad
87
	ret
88
endp
89
 
90
 
91
 
92
struct _tree
93
	open	rd 1	;0, либо количество подкаталогов(учитывая подкаталоги открытых подкаталогов)
94
	name	rd 1	;указатель на строку относительно PStrings
95
ends
96
 
97
 
98
 
99
 
100
uglobal
101
;-------------- file_tree.inc
102
 
103
openDir rb 1024 	;здесь путь для чтения папки
104
tmpStr rb 1024
105
 
106
treeDirBuf rb 32+304*NUM_READ_FILES
107
PTree	rd 1	;указатель на массив структур _tree. Последняя - _tree.name = 0
108
TreeSize rd 1
109
 
110
endg
111
 
112
iglobal
113
;------------- file_tree.inc
114
szRoot db 'hd0',0
115
 
116
tree_info:
117
  .x		dd 13
118
  .y		dd 110
119
  .w		dd 284
120
  .h		dd 300
121
  .numLines	dd 200/TR_LINE_H
122
  .firstLine	dd 0
123
 
124
fiTree		dd 1
125
  .numBlock	dd 0
126
  .flags	dd 0
127
  .numRead	dd NUM_READ_FILES
128
  .buff 	dd treeDirBuf;buf
129
		db 0
130
  .path 	dd openDir
131
 
132
 
133
imgFree:
8839 leency 134
; file 'pic/free.raw'
7538 leency 135
imgOk:
8839 leency 136
; file 'pic/ok.raw'
7538 leency 137
imgMinus:
8839 leency 138
; file 'pic/minus.raw'
7538 leency 139
imgPlus:
8839 leency 140
; file 'pic/plus.raw'
7538 leency 141
i_end:
142
 
143
readFolder dd rdFoldforTree	;функция, которой читается папка
144
 
145
 
146
endg
147
 
148
 
149
DDD123 = 0
150
 
151
 
152
proc file_tree_Init
153
	stdcall MM_AllocMem,4000
154
	mov	[TVROOT],eax
155
	mov	dword[eax],0
156
	mov	dword[eax+4],4000
157
 
158
	mcall	68,12,4096
159
	mov	[PTree],eax
160
 
161
	mov	[eax+_tree.open],dword 0
162
	mov	[eax+_tree.name],dword szRoot
163
	mov	[eax+8+_tree.open],dword 0
164
	mov	[eax+8+_tree.name],dword 0
165
 
166
 
167
DDD123 = 0
168
if DDD123
169
	mov	[1*8+eax+_tree.open],dword 1
170
       mov     [1*8+eax+_tree.name],dword sz_d1
171
	mov	[2*8+eax+_tree.open],dword 1
172
	mov	[2*8+eax+_tree.name],dword sz_d2
173
	mov	[3*8+eax+_tree.open],dword 2
174
	mov	[3*8+eax+_tree.name],dword sz_d21
175
	mov	[4*8+eax+_tree.open],dword 2
176
	mov	[4*8+eax+_tree.name],dword sz_d22
177
	mov	[5*8+eax+_tree.open],dword 3
178
	mov	[5*8+eax+_tree.name],dword sz_d221
179
	mov	[6*8+eax+_tree.open],dword 2
180
       mov     [6*8+eax+_tree.name],dword sz_d23
181
	mov	[7*8+eax+_tree.open],dword 1
182
	mov	[7*8+eax+_tree.name],dword sz_d3
183
	mov	[8*8+eax+_tree.open],dword 1
184
	mov	[8*8+eax+_tree.name],dword sz_d4
185
	mov	[9*8+eax+_tree.open],dword 2
186
	mov	[9*8+eax+_tree.name],dword sz_d41
187
	mov	[0Ah*8+eax+_tree.open],dword 0
188
	mov	[0Ah*8+eax+_tree.name],dword 0
189
end if
190
	mov	[TreeSize],1
191
 
192
;Fantomer      ;  mcall   68,12,4096
193
      ;  mov     [PWoSearch],eax
194
      ;  mov     dword[eax],searchPath
195
      ;  mov     dword[eax+4],0
196
	ret
197
endp
198
if DDD123
199
sz_d1	db 'dir1',0
200
sz_d2	db 'dir2',0
201
sz_d21	db 'dir21',0
202
sz_d22	db 'dir22',0
203
sz_d221 db 'dir221',0
204
sz_d23	db 'dir23',0
205
sz_d3	db 'dir3',0
206
sz_d4	db 'dir4',0
207
sz_d41	db 'dir41',0
208
end if
209
 
210
uglobal
211
  bufImg rb 384*300*3
212
endg
213
 
214
proc file_tree_Draw
215
locals
216
       tr_y	rd 1
217
       tr_numLine rd 1
218
endl
219
 
220
	mcall	13,<[tree_info.x],[tree_info.w]>,\
221
		   <[tree_info.y],[tree_info.h]>,TR_BACKGROUND
222
 
223
	mov	[tr_numLine],0
224
	p2p	[tr_y],[tree_info.y]
225
	mov	eax,[PTree]
226
	mov	eax,[eax+_tree.open]
227
	inc	eax
228
 
229
 
230
	mov	ecx,[TreeSize]
231
    .drawLine:
232
	push	ecx
233
 
234
	mov	edi,[tr_numLine]
235
	shl	edi,3
236
	add	edi,[PTree]
237
 
238
     ;   mov     eax,[edi+_tree.open]
239
     ;   mov     bx,TR_LINE_H
240
     ;   mul     bx
241
     ;   add     eax,[tree_info.x]
242
     ;   mpack   ebx,eax,[tr_y]
243
 
244
POPRDLJAKART = 4
245
	mov	eax,[edi+_tree.open]
246
	mov	bx,TR_STEP_W
247
	mul	bx
248
	add	eax,[tree_info.x]
249
	mpack	edx,eax,[tr_y]
250
	add	edx,POPRDLJAKART   ;поправка для картинок
251
 
252
	mov	eax,[edi+_tree.open]
253
	inc	eax
254
	cmp	eax,[edi+8+_tree.open]
255
	je     @f
256
	mov	ebx,imgPlus
257
	jmp	.draw1
258
      @@:
259
	mov	ebx,imgMinus
260
     .draw1:
261
	mcall	7,,<9,9>
262
 
263
	push	edx
264
 
265
	;mov     eax,edi
266
	;call    getPath
267
	;mov     ebx,eax
268
	;stdcall findVetka,eax
269
	;push    ecx
270
	;stdcall strCpy,ebx,
271
	;stdcall MM_DelMem,ebx
272
	mov	ebx,edi
273
	call	getFullPath
274
	stdcall findVetka,openDir
275
 
276
	test	ecx,ecx
277
	jnz	.l1
278
	mov	ebx,imgOk
279
	jmp	.l2
280
.l1:
281
	mov	ebx,imgFree
282
.l2:
283
 
284
	pop	edx
285
	add	edx,15 shl 16
286
	mov	ebx,imgOk
287
	mcall	7,,<9,9>
288
	sub	edx,POPRDLJAKART   ;убираем поправку для картинок
289
 
290
	lea	ebx,[edx+1+10*10000h]
291
 
292
 
293
	mov	ecx,90000000h
294
	or	ecx,[sc.work_text]
295
 
296
	mov	edx,[edi+_tree.name]
297
	mcall	4
298
 
299
	add	[tr_y],TR_LINE_H
300
	inc	[tr_numLine]
301
 
302
	mov	eax,[tree_info.y]
303
	add	eax,[tree_info.h]
304
	cmp	[tr_y],eax
305
	jae	.end
306
 
307
	pop	ecx
308
	dec	ecx
309
	jnz	.drawLine
310
.end:
311
 
312
	ret
313
endp
314
 
315
 
316
 
317
proc file_tree_Mouse
318
locals
319
   m_x rd 1
320
endl
321
	;mcall   37,0 абсолютные координаты мыши
322
 
323
	mcall	37,2 ;кнопки
324
	test	al,1
325
	jz	.exit
326
 
327
 
328
	mcall	37,1 ;координаты относительно окна
329
	mov	bx,ax	;y
330
	shr	eax,16	;x
331
	mov	[m_x],eax
332
 
333
	cmp	eax,[tree_info.x]	;отбрасываем клики вне дерева
334
	jb	.exit
335
 
336
	sub	eax,[tree_info.x]
337
	cmp	eax,[tree_info.w]
338
	ja	.exit
339
 
340
	cmp	ebx,[tree_info.y]
341
	jb	.exit
342
	sub	ebx,[tree_info.y]
343
	mov	edx,ebx
344
	cmp	edx,[tree_info.h]
345
	ja	.exit
346
 
347
	mov	eax,edx
348
 
349
	mov	bx,TR_LINE_H
350
	xor	edx,edx
351
	div	bx
352
 
353
	mov	ebx,[PTree]
354
	lea	ebx,[ebx+eax*8]
355
	      ;eax=номер строки, ebx - указатель на _tree,
356
 
357
				;пропускаем все клики ниже дерева
358
 
359
	mov	edx,[TreeSize]
360
	dec	edx
361
	cmp	eax,edx
362
	ja	.exit
363
 
364
	mov	eax,[ebx+_tree.open]
365
	mov	dx,TR_STEP_W
366
	mul	dx
367
	add	eax,[tree_info.x]
368
	cmp	eax,[m_x]
369
	ja	.mark
370
	add	eax,9
371
	cmp	eax,[m_x]
372
	jb	.mark
373
 
374
				;проверяем: закрыть или открыть папку
375
	mov	edx,[ebx+_tree.open]
376
	inc	edx
377
	cmp	[ebx+_tree.open+8],edx
378
	jne	@f
379
	call	tree_closeFolder
380
	call	file_tree_Draw
381
	ret
382
     @@:
383
	call	tree_openFolder
384
 
385
	call	file_tree_Draw
386
	jmp	.exit
387
 .mark:
388
	;клик по строке
389
 
390
 .exit:
391
	ret
392
endp
393
 
394
 
395
;-------------------------------------------------------------------------------
396
;---------------------- закрывает папку ----------------------------------------
397
;-------------------------------------------------------------------------------
398
; inp:  ebx - указатель на _tree,
399
;-------------------------------------------------------------------------------
400
proc tree_closeFolder
401
 
402
	mov	esi,[ebx+_tree.open]
403
	lea	edi,[ebx+8]
404
    @@:
405
	cmp	[edi+_tree.open],esi
406
	jbe	@f
407
	stdcall MM_DelMem,[edi+_tree.name]
408
	add	edi,8
409
	jmp	@b
410
    @@:
411
 
412
 
413
	mov	esi,edi
414
	lea	edi,[ebx+8]
415
 
416
	mov	eax,esi
417
	sub	eax,edi
418
	shr	eax,3
419
	sub	[TreeSize],eax
420
 
421
			   ;сдвигаем все структуры, которые ниже закрываемой, вверх
422
    @@: movsd
423
	lodsd
424
	stosd
425
	test	eax,eax
426
	jnz	@b
427
 
428
	ret
429
endp
430
 
431
;-------------------------------------------------------------------------------
432
;-------------------- открывает папку ------------------------------------------
433
;-------------------------------------------------------------------------------
434
; inp:  eax=номер строки, ebx - указатель на _tree,
435
;-------------------------------------------------------------------------------
436
 
437
proc tree_openFolder
438
locals
439
	p_treeOpen  rd 1
440
	currLine rd 1
441
	PTmpTree rd 1
442
	endTmpTree rd 1
443
	lEOF	 rd 1
444
	numFolds rd 1
445
	openLine rd 1
446
 
447
endl
448
	mov	[p_treeOpen],ebx
449
  ; int3
450
	call	getFullPath
451
 
452
;----- Читаем папку и заполняем tmpTree---------------------------------------------------------
453
 
454
	mcall	68,12,8192
455
	mov	[PTmpTree],eax	      ;память для списка каталогов
456
 
457
	mov	[lEOF],0
458
	mov	[endTmpTree],0
459
	mov	[numFolds],0
460
 
461
	mov	[fiTree.numBlock],0
462
 
463
 .stepLoadFold: 		      ;чтение папки
464
;   dpsP [fiTree+21]
465
;   dnl
466
 
467
	mcall	70,fiTree
468
;        mov     eax, fiTree
469
;        call    [readFolder]
470
 
471
	test	eax,eax
472
	je	@f
473
	cmp	eax,6
474
	jne	.err
475
     @@:
476
 
477
	cmp	ebx,NUM_READ_FILES
478
	je	@f
479
	mov	[lEOF],1		;ставим EOF
480
   @@:
481
	mov	ecx,ebx
482
 
483
	mov	edi,treeDirBuf+32
484
 
485
   .testRec:			    ;обработка записей в treeDirBuf
486
	push	ecx
487
 
488
	lea	eax,[edi+_BDWK.name]  ;отбрасываем не папки и папки . и ..
489
	cmp	word[eax],'.'
490
	je	.endtestRec
491
 
492
	cmp	word[eax],'..'
493
	jne	@f
494
	cmp	byte[eax+2],0
495
	je	.endtestRec
496
     @@:
497
 
498
       ; cmp     [edi+_BDWK.flags],F_FOLDER
499
       ; jne     .endtestRec
500
 
501
	inc	[numFolds]
502
	push	edi
503
 
504
	lea	esi,[edi+_BDWK.name]
505
 
506
 
507
     ;;;;;;;;;   ;добавление папки в список
508
	mov	edi,esi       ;получаем длину строки
509
	xor	al,al
510
	mov	ecx,260
511
	repne	scasb
512
	mov	eax,260
513
	sub	eax,ecx
514
 
515
	stdcall MM_AllocMem,eax
516
;dph eax
517
;dnl
518
	mov	edi,eax
519
	mov	ebx,[endTmpTree]
520
	add	ebx,[PTmpTree]
521
	mov	[ebx],eax
522
	add	[endTmpTree],4
523
 
524
	mov	ecx,ebx      ;если мало места под записи, то перераспределить
525
	add	ecx,4	     ;больше памяти
526
	test	ecx,0FFFh
527
	jz	@f
528
	and	ecx,0FFFFF000h
529
	add	ecx,1000h
530
    @@: sub	ecx,4
531
	cmp	ecx,ebx
532
	jne	@f
533
	mcall	68,20,,[PTmpTree]
534
	mov	[PTmpTree],eax
535
 
536
    @@: lodsb
537
	stosb
538
	test	al,al
539
	jnz	@b
540
 
541
 
542
	pop	edi
543
 
544
    .endtestRec:
545
	add	edi,304
546
	pop	ecx
547
	dec	ecx
548
	jnz	.testRec
549
 
550
 
551
	add	[fiTree.numBlock],NUM_READ_FILES
552
 
553
	cmp	[lEOF],1
554
	jne	.stepLoadFold
555
 
556
	cmp	[numFolds],0
557
	je	.exit
558
      ;;;;;;;;;;;; вписываем в основное дерево
559
			   ;смещаем записи вниз, чтоб вписать новую ветку дерева
560
 
561
	mov	esi,[PTree]
562
	mov	eax,[TreeSize]
563
	inc	eax
564
	shl	eax,3
565
	add	esi,eax
566
 
567
	mov	edi,esi
568
	mov	eax,[numFolds]
569
	shl	eax,3
570
	add	edi,eax
571
 
572
	mov	eax,esi
573
	sub	eax,[p_treeOpen]
574
	shr	eax,2
575
	mov	ecx,eax
576
	add	esi,4
577
	add	edi,4
578
	std
579
	rep	movsd
580
	cld
581
 
582
				;теперь записываем в [PTree]
583
	mov	ebx,[p_treeOpen]
584
	mov	eax,[ebx+_tree.open]
585
	inc	eax
586
	mov	esi,[PTmpTree]
587
	lea	edi,[ebx+8]
588
	mov	ecx,[numFolds]
589
    @@: mov	[edi+_tree.open],eax
590
	p2p	[edi+_tree.name],[esi]
591
	add	esi,4
592
	add	edi,8
593
	loop	@b
594
 
595
	mov	eax,[numFolds]
596
	add	[TreeSize],eax
597
 
598
.exit:
599
  .err:
600
 
601
	mcall	68,13,[PTmpTree]
602
 
603
   call d_OutTree
604
	ret
605
endp
606
 
607
;-------------------------------------------------------------------------------
608
;--- находит полный путь до элемента -------------------------------------------
609
;-------------------------------------------------------------------------------
610
;inp: ebx = Pointer to _tree.
611
;outp: openDir содержит полный путь (после последней папки имеется /)
612
;-------------------------------------------------------------------------------
613
proc getFullPath
614
;нужно пробежаться от последней папки в пути вверх, по родительским
615
;сначала записываем папки в tmpStr, разделяя их символом RAZD, затем
616
;скопиpуем их в обратном порядке в готовый путь в openDir
617
	push	ebx edi esi
618
	mov	eax,[ebx+_tree.open]
619
	mov	edi,tmpStr+1
620
	mov	byte[edi-1],RAZD
621
 
622
	cmp	[ebx+_tree.name],0
623
	je	.copyIn_openDir
624
 
625
	jmp	.addFoldToPath
626
   .testLine:
627
	cmp	[ebx+_tree.open],eax
628
	jb	.addFoldToPath
629
 
630
	sub	ebx,8
631
	cmp	ebx,[PTree]
632
	jne	.testLine
633
       ; jmp     .copyIn_openDir
634
 
635
   .addFoldToPath:
636
	mov	byte[edi-1],RAZD
637
	mov	esi,[ebx+_tree.name]
638
    @@: lodsb
639
	stosb
640
	test	al,al
641
	jnz	@b
642
 
643
	mov	eax,[ebx+_tree.open]
644
	cmp	ebx,[PTree]
645
	je	.copyIn_openDir
646
 
647
	cmp	ebx,[PTree]
648
	jne	.testLine
649
	sub	ebx,8
650
	cmp	ebx,[PTree]
651
	jne	.testLine
652
 
653
   .copyIn_openDir:
654
	sub	edi,2
655
	mov	edx,openDir+1
656
	mov	byte[edx-1],'/'
657
	mov	byte[edx],0
658
	cmp	edi,tmpStr-1
659
	je	.endConv
660
    @@:
661
	mov	al,RAZD
662
	mov	ecx,1024
663
	std
664
	repne scasb
665
	cld
666
 
667
	push	edi
668
	add	edi,2
669
	mov	eax,1024
670
	sub	eax,ecx
671
	mov	ecx,eax
672
	mov	esi,edi
673
	mov	edi,edx
674
	rep movsb
675
	mov	byte[edi-1],'/'
676
	mov	byte[edi],0
677
	mov	edx,edi
678
	pop	edi
679
 
680
	cmp	edi,tmpStr-1
681
	jne	@b
682
     .endConv:
683
 
684
	pop	esi edi ebx
685
	ret
686
endp
687
 
688
 
689
;inp eax = Pointer to _tree
690
;outp eax = Pointer to string - full path
691
;Память с именем освободить!!!
692
proc getPath
693
locals
694
	strTmp rb 256
695
	reslt rd 1
696
endl
697
	push	ebx edi esi
698
	mov	ebx,eax
699
	mov	eax,[eax+_tree.open]
700
	lea	edi,[strTmp+1]
701
	mov	byte[edi-1],RAZD
702
 
703
	cmp	ebx,[PTree]
704
	je	.copyIn_openDir
705
	jmp	.addFoldToPath
706
   .testLine:
707
	cmp	[ebx+_tree.open],eax
708
	jb	.addFoldToPath
709
 
710
	sub	ebx,8
711
	cmp	ebx,[PTree]
712
	jne	.testLine
713
	jmp	.copyIn_openDir
714
 
715
   .addFoldToPath:
716
	mov	byte[edi-1],RAZD
717
	mov	esi,[ebx+_tree.name]
718
    @@: lodsb
719
	stosb
720
	test	al,al
721
	jnz	@b
722
 
723
	mov	eax,[ebx+_tree.open]
724
	sub	ebx,8
725
	cmp	ebx,[PTree]
726
	jne	.testLine
727
 
728
   .copyIn_openDir:
729
	lea	eax,[strTmp]
730
	stdcall strLen,eax
731
	stdcall MM_AllocMem,eax
732
	mov	[reslt],eax
733
	mov	edx,eax
734
	inc	edx
735
	sub	edi,2
736
	mov	byte[edx-1],'/'
737
	mov	byte[edx],0
738
	lea	eax,[strTmp-1]
739
	cmp	edi,eax
740
	je	.endConv
741
    @@:
742
	mov	al,RAZD
743
	mov	ecx,1024
744
	std
745
	repne scasb
746
	cld
747
 
748
	push	edi
749
	add	edi,2
750
	mov	eax,1024
751
	sub	eax,ecx
752
	mov	ecx,eax
753
	mov	esi,edi
754
	mov	edi,edx
755
	rep movsb
756
	mov	byte[edi-1],'/'
757
	mov	byte[edi],0
758
	mov	edx,edi
759
	pop	edi
760
 
761
	lea	eax,[strTmp-1]
762
	cmp	edi,eax
763
	jne	@b
764
     .endConv:
765
	mov	eax,[reslt]
766
	pop	esi edi ebx
767
	ret
768
endp
769
 
770
;####################################################################################################
771
;####################################################################################################
772
;####################################################################################################
773
;####################################################################################################
774
 
775
 
776
;tree_ функции, хранящие отмеченные пути. построены в виде дерева папок\файлов
777
;в памяти храняться как список структур (usel)
778
 
779
;tree_Add(path)
780
;добавляет путь в дерево отмеченых файлов
781
;вывод
782
;еах = 0 - добавлено
783
;      1 - такой путь уже есть
784
;     -1 - неверный путь
785
;
786
;
787
;tree_Del(path)
788
 
789
 
790
 
791
 
792
 
793
;####################################################################################################
794
struct _vetka
795
 
796
	sizeused rd 1
797
	sizebuf rd 1
798
ends
799
 
800
struct _usel
801
 
802
	pName rd 1
803
	pNext rd 1
804
ends
805
 
806
 
807
;''''''''''''''''' ГОТОВА
808
;добавляет путь в дерево отмеченых файлов
809
;вывод
810
;еах = 0 - добавлено
811
;      1 - такой путь уже есть
812
;     -1 - неверный путь
813
proc tree_Add path:DWORD
814
locals
815
 numFolds rd 1
816
 vetB rd 1
817
 uselB rd 1
818
endl
819
	push	ebx edi esi
820
;int3
821
	stdcall getNumFolds, [path]
822
	cmp	eax,-1
823
	je	.error
824
 
825
	mov	ecx,eax
826
	inc	eax
827
	mov	[numFolds],eax
828
				;ищем каталог, с которого начинаем дописывание дерева
829
.searchBegin:
830
	push	ecx
831
	mov	eax,[numFolds]
832
	sub	eax,ecx
833
	stdcall getFirstTailPath, [path], eax
834
	push	eax
835
	stdcall findVetka,eax
836
	mov	ebx,ecx
837
	mov	[vetB],eax
838
	mov	[uselB],edx
839
	pop	eax
840
	stdcall MM_DelMem,eax
841
	cmp	ebx,0
842
	jne	.foundBegin
843
	pop	ecx
844
	loop	.searchBegin
845
	jmp	.exitNotAdded
846
.foundBegin:	 ;в стеке ещё есх от прошлого loop'a
847
;int3
848
	mov	eax,[uselB]
849
	mov	ebx,[eax+_usel.pNext]
850
	cmp	ebx,0
851
	jne	@f
852
	mov	ebx,eax
853
	stdcall MM_AllocMem,4000
854
	mov	[ebx+_usel.pNext],eax
855
	mov	dword[eax],0
856
	mov	dword[eax+4],4000
857
	mov	ebx,eax
858
@@:
859
	mov	eax,ebx
860
	add	[eax+_vetka.sizeused],8
861
	mov	edx,[eax+_vetka.sizebuf]
862
	sub	edx,8
863
	cmp	[eax+_vetka.sizeused],edx
864
	jb	.noOverflow
865
 
866
	add	edx,8
867
	push	eax		;увеличиваем размер буфера
868
	push	edx		;функции realloc нет - потому такое извращение - Fantom
869
	add	edx,4000
870
	mov	esi,eax
871
	stdcall MM_AllocMem, edx
872
	mov	ebx,eax
873
	mov	edi,eax
874
	pop	ecx
875
	shr	ecx,2
876
	rep movsd
877
	pop	eax
878
	stdcall MM_DelMem,eax
879
	mov	eax,ebx
880
 
881
.noOverflow:
882
	mov	ebx, [eax+_vetka.sizeused]
883
	lea	ebx, [ebx+eax]
884
				;ebx = PU_      - usel
885
				;eax = P_       - vetka
886
	mov	eax,[numFolds]
887
	sub	eax,[esp]		 ;- в стеке всё ещё есх от .searchBegin
888
	dec	eax
889
	stdcall getFoldByNum ,[path], eax
890
	mov	[ebx+_usel.pName],eax
891
	mov	[ebx+_usel.pNext],0
892
 
893
;call D_OutTree
894
;dps '--------------------------------'
895
;dnl
896
	pop	ecx
897
	dec	ecx
898
	jnz	.searchBegin
899
	mov	eax, 0
900
	jmp	.exit
901
.exitNotAdded:
902
	mov	eax,1
903
	jmp	.exit
904
.error:
905
	mov	eax,-1
906
 
907
.exit:
908
;dps '-- ИТОГ ------------------------'
909
;dnl
910
;call D_OutTree
911
	pop	esi edi ebx
912
	ret
913
endp
914
 
915
DDt dd 0
916
 
917
;-------------------------------------------------------------------------------
918
; ДЛЯ ОТЛАДКИ
919
proc D_OutTree
920
	mov	eax,[TVROOT]
921
	call	D_OutTree2
922
	ret
923
endp
924
 
925
proc D_OutTree2
926
	inc	[DDt]
927
	mov	ecx,[eax]
928
	shr	ecx,3
929
	add	eax,8
930
.loop:
931
	push	eax ecx
932
	mov	ecx,[DDt]
933
.space: dps ' '
934
	loop	.space
935
 
936
	dpsP	[eax]
937
      dps '    '
938
      dph  dword[eax+4]
939
	dnl
940
	cmp	dword[eax+4],0
941
	je	@f
942
	mov	eax,[eax+4]
943
	call	D_OutTree2
944
       @@:
945
	pop	ecx eax
946
	add	eax,8
947
	loop	.loop
948
	dec	[DDt]
949
 
950
	ret
951
endp
952
;-------------------------------------------------------------------------------
953
 
954
 
955
;tree_Del(path)
956
;           если в указанном узле есть указатель на ветку, то
957
;             treeDelIn(path)
958
;           удалить указанный узел
959
;           если он не последний в списке, то
960
;             если он не стоит последним, то
961
;                сдвинуть все последующие структуры узел вверх на 8
962
;last_elem:  иначе
963
;             удалить эту ветку
964
;             tree_Del(путь - 1 элемент)
965
 
966
;treeDelIn(path)
967
;        если это ветка, то
968
;          пока есть узлы {
969
;            если у узла есть ветка, то
970
;              treeDelIn(путь до текущего узла)
971
;            иначе
972
;              освободить память с именем
973
;          }
974
;ГОТОВ
975
;return:
976
;eax = 0 - success, -1 - error
977
proc tree_Del path:DWORD
978
locals
979
 PU rd 1
980
 P rd 1
981
 path2 rb 256
982
endl
983
;int3
984
	push	ebx edi esi
985
	stdcall findVetka,[path]
986
	test	ecx,ecx
987
	jne	.err
988
	mov	edi,edx
989
	mov	esi,eax
990
	cmp	[edi+_usel.pNext],dword 0
991
	je	@f
992
	mov	eax,edi
993
	push	edi esi
994
	call treeDelIn
995
	pop	esi edi
996
@@:
997
	stdcall MM_DelMem,[edi+_usel.pName]
998
	mov	eax,[esi+_vetka.sizeused]
999
	cmp	eax,8
1000
	je	.last_elem
1001
 
1002
	add	eax,esi ; - last _usel
1003
	cmp	edi,eax  ;if last _usel, then do not
1004
	je	@f
1005
	push	esi
1006
	sub	eax,edi ;move all _usel up
1007
	shr	eax,2
1008
	mov	ecx,eax
1009
	mov	esi,edi
1010
	add	esi,8
1011
	rep	movsd
1012
	pop	esi
1013
 
1014
@@:	sub	dword [esi+_vetka.sizeused],8
1015
	jmp	.exit
1016
 
1017
.last_elem:
1018
	stdcall MM_DelMem,esi
1019
	stdcall findUselMinusOne,[path]
1020
	cmp	ecx,0
1021
	jne	.exit
1022
	mov	[edx+_usel.pNext],0
1023
.exit:
1024
	xor	eax,eax
1025
	pop	esi edi ebx
1026
	ret
1027
 
1028
.err:
1029
	or	eax,-1
1030
	pop	esi edi ebx
1031
	ret
1032
 
1033
endp
1034
 
1035
;!!!!   не сохраняет регистры
1036
 
1037
;input: eax = pointer to _usel
1038
proc treeDelIn
1039
	;mov     eax,[eax+_usel.pNext]  ;опасно, но и так везде проверяется перед вызовом
1040
	;cmp     eax,0
1041
	;je      .exit
1042
 
1043
	lea	ebx,[eax+8]
1044
	mov	ecx,[eax]
1045
	shr	ecx,3	;количество узлов
1046
.loop:
1047
	push	ecx
1048
	mov	eax,[ebx+_usel.pNext]
1049
	test	eax,eax
1050
	jz	@f
1051
	push	ebx
1052
	call	treeDelIn
1053
	pop	ebx
1054
    @@:
1055
	stdcall MM_DelMem,[ebx+_usel.pName]
1056
	stdcall MM_DelMem,[ebx+_usel.pNext]
1057
	add	ebx,8
1058
	pop	ecx
1059
	dec	ecx
1060
	jnz	.loop
1061
.exit:
1062
 
1063
	ret
1064
endp
1065
 
1066
; """""""""""""""" ГОТОВА
1067
;path = /hd0/1/kol      -folder
1068
;TV1 -> us'hd0' -> us'1' -> us'kol'
1069
;path = /hd0/1/mtldr    -file
1070
;path = /rd/1/kernel.mnt - file in ramdisk
1071
 
1072
;находит ветку в которой находится узел с нужной нам папкой
1073
;вывод:
1074
;eax - ветка
1075
;edx - узел, который найден последним, т. е. для пути /rd/1/lib/qwe будет узел lib, так как файла qwe нет
1076
;ecx - 0 - нужный ветка/узел успешно найден
1077
;      1 - нужный ветка/узел не найден - на выходе последний найденый узел
1078
;      2 - неверный параметр
1079
proc findVetka path:DWORD
1080
locals
1081
	curFold rd 1
1082
	num_f rd 1
1083
	old_vetk rd 1
1084
	old_usel rd 1
1085
endl
1086
;int3
1087
	mov	eax, [TVROOT]
1088
	cmp	dword[eax],0
1089
	jne	@f
1090
	mov	edx, 0
1091
	mov	ecx,2
1092
	xor	eax,eax
1093
	ret
1094
     @@:
1095
	push	ebx edi esi
1096
	mov	[num_f], 0
1097
	xor	edx, edx
1098
	stdcall getFoldByNum, [path], 0
1099
	test	eax, eax
1100
	jz	.error2
1101
;dpsP eax
1102
;dnl
1103
 
1104
	mov	[curFold], eax
1105
	mov	esi, [TVROOT]
1106
.goLoop:
1107
	mov	ebx, 8
1108
	mov	ecx, [esi]
1109
	shr	ecx, 3		     ;столько в TVROOT структур usel
1110
.loop:
1111
	push	ecx
1112
	stdcall strCmp, [curFold], [esi+ebx]
1113
	test	al, al
1114
	jz	.find
1115
	add	ebx, 8
1116
	pop	ecx
1117
	loop	.loop
1118
	jmp	.error1
1119
 
1120
.find:
1121
	pop	eax	; выровняли
1122
	inc	[num_f]
1123
	stdcall MM_DelMem, [curFold]
1124
	stdcall getFoldByNum, [path], [num_f]
1125
	test	eax, eax
1126
	jz	.end
1127
	mov	[curFold], eax
1128
 
1129
 
1130
	cmp	dword[esi+ebx+4], 0
1131
	jz	.error
1132
	lea	eax, [esi+ebx]
1133
	mov	[old_vetk],esi
1134
	mov	[old_usel],eax
1135
	mov	esi, [esi+ebx+4]
1136
	jmp	.goLoop
1137
.end:
1138
 
1139
	mov	eax, esi
1140
	lea	edx, [esi+ebx]
1141
	xor	ecx,ecx
1142
	jmp	.exit
1143
 
1144
.error:
1145
	stdcall MM_DelMem, [curFold]
1146
	mov	eax, esi
1147
	lea	edx, [esi+ebx]
1148
	mov	ecx,1
1149
	jmp	.exit
1150
.error1:
1151
	stdcall MM_DelMem, [curFold]
1152
	mov	eax, [old_vetk]
1153
	mov	edx, [old_usel]
1154
	mov	ecx,1
1155
	jmp	.exit
1156
.error2:
1157
	stdcall MM_DelMem, [curFold]
1158
	mov	eax, 0
1159
	mov	edx, 0
1160
	mov	ecx,2
1161
 
1162
.exit:
1163
	pop	esi edi ebx
1164
	ret
1165
endp
1166
 
1167
	  ;ГОТОВА
1168
;находит узел, который ссылается на заданный узел
1169
;вернёт в edx usel, для предпоследней папки в пути
1170
;eax - ветка, в которой этот узел
1171
;есх - статус(0, 1, 2, -1)
1172
proc findUselMinusOne path:DWORD
1173
locals
1174
  path2 rb 256
1175
endl
1176
	push	ebx edi esi
1177
 
1178
	stdcall strLen,[path]
1179
	cmp	eax,255
1180
	ja	.err
1181
	lea	eax,[path2]
1182
	stdcall strCpy,[path],eax
1183
 
1184
	lea	edi,[path2]
1185
	xor	al,al
1186
	mov	ecx,256
1187
	repne scasb		;           V
1188
	test	ecx,ecx 	;/hd0/1/kol
1189
	jz	.err   ;только одна папка
1190
	sub	ecx,255
1191
	xor	ecx,-1
1192
	inc	ecx
1193
	sub	edi,2
1194
	cmp	byte [edi], '/'
1195
	jne	@f
1196
	dec	edi
1197
	dec	ecx
1198
	@@:
1199
	mov	al,'/'
1200
	std
1201
	repne	scasb
1202
	cld
1203
	test	ecx,ecx
1204
	jz	.err   ; только одна папка
1205
 
1206
	inc	edi
1207
	mov	byte[edi],0
1208
 
1209
	lea	eax,[path2]
1210
	stdcall findVetka,eax
1211
	jmp	@f
1212
.err:
1213
	xor	eax,eax
1214
	xor	edx,edx
1215
	or     ecx,-1
1216
@@:
1217
	pop	esi edi ebx
1218
	ret
1219
endp
1220
 
1221
;--------------Готова
1222
;находит узел для заданного каталога в пути
1223
;eax = Pointer to _vetka
1224
;edx = Pointer to _usel
1225
;ecx = status (0 - success,             1 - found path not full,
1226
;              2 - path not corrected, -1 - only one folder in path)
1227
 
1228
proc findUselByNum path:DWORD,num:DWORD
1229
locals
1230
  path2 rb 256
1231
endl
1232
	push	ebx edi esi
1233
 
1234
	stdcall getNumFolds,[path]
1235
	cmp	eax,[num]
1236
	jl	.err
1237
 
1238
	xor	ebx,ebx
1239
	lea	edi,[path2]
1240
	mov	esi,[path]
1241
	cmp	byte[esi],'/'
1242
	jne	.l2
1243
	dec	ebx
1244
.l2:	lodsb
1245
	stosb
1246
	cmp	al,'/'
1247
	jne	@f
1248
	inc	ebx
1249
	cmp	ebx,[num]
1250
	ja	.go
1251
      @@:
1252
	test	al,al
1253
	jnz	.l2
1254
 
1255
.go:
1256
	mov	byte[esi-1],0
1257
	lea	eax,[path2]
1258
	stdcall findVetka,eax
1259
	jmp	@f
1260
.err:
1261
	xor	eax,eax
1262
	xor	edx,edx
1263
	or	ecx,-1
1264
@@:
1265
	pop	esi edi ebx
1266
	ret
1267
endp
1268
 
1269
;''''''''''''''' ГОТОВА
1270
;Возвращает имя файла/каталога из всего пути
1271
; --- !!! Память нужно будет освободить
1272
proc getName path:DWORD
1273
	push	esi edi
1274
 
1275
	stdcall strLen,[path]
1276
	mov	edi,[path]
1277
	add	edi,eax
1278
	sub	edi,2
1279
	cmp	byte[edi],'/'
1280
	jne	@f
1281
	dec	edi
1282
@@:
1283
	mov	ecx,eax
1284
	mov	al,'/'
1285
	std
1286
	repne scasb
1287
	cld
1288
	add	edi,2
1289
	stdcall strLen,edi
1290
	mov	esi,eax
1291
	stdcall MM_AllocMem, ecx
1292
	push	eax
1293
	add	esi,eax
1294
	stdcall strCpy,edi, eax
1295
	cmp	byte[esi-2],'/'
1296
	jne	@f
1297
	mov	byte[esi-2],0
1298
@@:
1299
	pop	eax
1300
	pop	edi esi
1301
	ret
1302
endp
1303
 
1304
 
1305
 
1306
; """""""""""""""" ГОТОВА
1307
proc strCpy src:DWORD,dest:DWORD
1308
	push	esi edi
1309
	mov	edi,[dest]
1310
	mov	esi,[src]
1311
@@:	lodsb
1312
	stosb
1313
	test	al,al
1314
	jnz	@b
1315
	pop	edi esi
1316
	ret
1317
endp
1318
 
1319
; """""""""""""""" ГОТОВА
1320
; с учётом завершающего 0
1321
proc strLen strz:DWORD
1322
	push	edi
1323
	mov	edi,[strz]
1324
	xor	al,al
1325
	mov	ecx,1024
1326
	repnz	scasb
1327
	mov	eax,1024
1328
	sub	eax,ecx
1329
	pop	edi
1330
	ret
1331
endp
1332
 
1333
; """""""""""""""" ГОТОВА
1334
proc strCmp src1:DWORD, src2:DWORD
1335
	push	esi edi
1336
	mov	edi, [src1]
1337
	mov	esi, [src2]
1338
	mov	eax, 1
1339
@@:	test	al, al
1340
	jz	.end
1341
	lodsb
1342
	scasb
1343
	jz	@b
1344
 
1345
	ja	.low
1346
	mov	eax, 1
1347
	jmp	@f
1348
.low:
1349
	mov	eax, -1
1350
@@:
1351
	pop	edi esi
1352
	ret
1353
.end:
1354
	xor	eax,eax
1355
	jmp	@b
1356
endp
1357
 
1358
 
1359
; """""""""""""""" ГОТОВА
1360
;возращает имя папки из всего пути по его номеру.
1361
;! Счёт начинается с 0
1362
; --- !!! Память нужно будет освободить
1363
proc getFoldByNum strz:DWORD, num:DWORD
1364
	push	ebx edi esi
1365
 
1366
	mov	esi, [strz]
1367
	mov	ecx, 1024
1368
	stdcall MM_AllocMem, 256
1369
	mov	ebx, eax
1370
	cmp	byte[esi], '/'
1371
	jne	@f
1372
	inc	esi
1373
     @@:
1374
 
1375
.find_begin:
1376
	cmp	[num], 0
1377
	jz	.copy
1378
 
1379
    @@: lodsb
1380
	cmp	al, '/'
1381
	je	@f
1382
	cmp	al, 0
1383
	je	.error
1384
	loop	@b
1385
    @@: dec	[num]
1386
	jmp	.find_begin
1387
 
1388
.copy:
1389
	;dec     esi
1390
	mov	edi, ebx
1391
	mov	byte[edi], 1 ;это метка того, что ни один байт не записан
1392
    @@:
1393
	lodsb
1394
	cmp	al, '/'
1395
	je	@f
1396
	cmp	al, 0
1397
	je	@f
1398
	stosb
1399
	loop	@b
1400
    @@:
1401
	cmp	byte[edi], 1
1402
	jne	@f
1403
.error:
1404
	stdcall MM_DelMem, ebx
1405
	xor	ebx, ebx
1406
	jmp	.end
1407
      @@:
1408
	xor	al, al
1409
	stosb
1410
.end:
1411
	mov	eax, ebx
1412
	pop	esi edi ebx
1413
	ret
1414
endp
1415
 
1416
 
1417
; """""""""""""""" ГОТОВА
1418
;возращает количество элементов
1419
;ret: eax = Num or -1
1420
proc getNumFolds path:DWORD
1421
	push	ebx edi esi
1422
 
1423
	stdcall strLen,[path]
1424
	cmp	eax,255
1425
	ja	.err
1426
 
1427
	xor	ebx,ebx
1428
	mov	esi,[path]
1429
	cmp	byte[esi],'/'
1430
	jne	.l1
1431
	dec	ebx
1432
.l1:	lodsb
1433
	cmp	al,'/'
1434
	jne	@f
1435
	inc	ebx
1436
      @@:
1437
	test	al,al
1438
	jnz	.l1
1439
 
1440
	cmp	[esi-2],byte '/'
1441
	je	@f
1442
	inc	ebx
1443
@@:
1444
 
1445
	mov	eax,ebx
1446
	jmp	.exit
1447
.err:
1448
	or	eax,-1
1449
.exit:
1450
	pop	esi edi ebx
1451
	ret
1452
endp
1453
 
1454
 
1455
;''''''''''''''''ГОТОВА
1456
;возвращает часть пути: первые num каталогов
1457
;ret: Указатель на строку.
1458
; --- !!! Память нужно будет освободить
1459
proc getFirstTailPath path:DWORD, num:DWORD
1460
	push	ebx edi esi
1461
 
1462
	cmp	[num],0
1463
	je	.err
1464
 
1465
 
1466
	stdcall strLen,[path]
1467
	cmp	eax,255
1468
	ja	.err
1469
 
1470
	stdcall MM_AllocMem, eax
1471
	mov	edi,eax
1472
	push	eax
1473
 
1474
 
1475
	xor	ebx,ebx
1476
	mov	esi,[path]
1477
	cmp	byte[esi],'/'
1478
	jne	.l1
1479
.l1:	lodsb
1480
	stosb
1481
	cmp	al,'/'
1482
	jne	@f
1483
	inc	ebx
1484
	cmp	ebx,[num]
1485
	ja	.endloop
1486
      @@:
1487
	test	al,al
1488
	jnz	.l1
1489
.endloop:
1490
 
1491
	cmp	[esi-2],byte '/'
1492
	je	@f
1493
	mov	byte[edi-1],0
1494
	jmp	.l2
1495
@@:
1496
	mov	byte[edi-2],0
1497
.l2:
1498
 
1499
	pop	eax
1500
	jmp	.exit
1501
.err:
1502
 
1503
	or	eax,-1
1504
 
1505
.exit:
1506
 
1507
	pop	esi edi ebx
1508
	ret
1509
endp
1510
 
1511
 
1512
proc TESTINIT
1513
;---- чтобы струтуры менеджера памяти были в норме нужно именно им выделить память под это дерево
1514
 
1515
;;TEST                            getFoldByNum
1516
;tstStr db '/hd0/1/dqw',0
1517
;        stdcall getFoldByNum,tstStr,2
1518
;        dpsP eax
1519
;        dps '|'
1520
;        dnl
1521
;        ret
1522
	stdcall MM_AllocMem,4000
1523
	mov	[TVROOT],eax
1524
	stdcall MM_AllocMem,4000
1525
	mov	[Tus1+4],eax
1526
	stdcall MM_AllocMem,4000
1527
	mov	[Tus2+4],eax
1528
 
1529
	stdcall MM_AllocMem,4
1530
	mov	[Tus1],eax
1531
	stdcall MM_AllocMem,4
1532
	mov	[Tus2],eax
1533
	stdcall MM_AllocMem,4
1534
	mov	[Tus3],eax
1535
 
1536
	stdcall strCpy,sname1,[Tus1]
1537
	stdcall strCpy,sname2,[Tus2]
1538
	stdcall strCpy,sname3,[Tus3]
1539
 
1540
	mov	esi,TvetkaHD0
1541
	mov	edi,[TVROOT]
1542
	mov	ecx,4
1543
	rep	movsd
1544
 
1545
	mov	esi,Tvetka1
1546
	mov	edi,[Tus1+4]
1547
	mov	ecx,4
1548
	rep	movsd
1549
 
1550
	mov	esi,TvetkaKOL
1551
	mov	edi,[Tus2+4]
1552
	mov	ecx,4
1553
	rep	movsd
1554
 
1555
 
1556
;int3
1557
;        stdcall tree_Add,strTets1
1558
       ; stdcall tree_Add,strTets2
1559
       ; stdcall tree_Add,strTets3
1560
;dps '----------'
1561
;dnl
1562
;call D_OutTree
1563
 
1564
;        stdcall tree_Del,strTets2
1565
;dps '----------'
1566
;dnl
1567
;call D_OutTree
1568
;dps '-------------------------'
1569
;dnl
1570
    ;    stdcall getFoldByNum,strTets,0
1571
;mov     edi,eax
1572
;dpsP edi
1573
;dnl
1574
     ;int3
1575
	mov	eax,[PTree]
1576
	lea	eax, [5*8+eax+_tree.open]
1577
	call GetPath
1578
      dpsP eax
1579
      dnl
1580
	ret
1581
endp
1582
 
1583
 
1584
;;TEST
1585
strTets1 db '/hd0/kol/asd1',0
1586
strTets2 db '/hd0/kol/asd2',0
1587
strTets3 db '/hd0/kol/asd3',0
1588
 
1589
TvetkaHD0:
1590
	dd 2*4
1591
	dd 4000
1592
 
1593
 Tus1:
1594
	dd sname1
1595
	dd Tvetka1
1596
;---------------------
1597
 
1598
 
1599
 
1600
Tvetka1:
1601
	dd 2*4
1602
	dd 4000
1603
 
1604
 Tus2:
1605
	dd sname2
1606
	dd TvetkaKOL
1607
;---------------------
1608
 
1609
 
1610
TvetkaKOL:
1611
	dd 2*4
1612
	dd 4000
1613
 
1614
 Tus3:
1615
	dd sname3
1616
	dd 0
1617
;---------------------
1618
 
1619
sname1 db 'hd0',0
1620
sname2 db '1',0
1621
sname3 db 'kol',0
1622
 
1623
_TBUFSIZE dd 4000 - $
1624
 
1625
 
1626
TVROOT rd 1
1627
 
1628
;будет буфер отмеченных файлов/папок
1629
;открыть папку
1630
; если она отмечена вся, то ничего не делать
1631
; если в ней убрать галку, то добавить в список отмеченных все остальные,
1632
;            а папку убрать из списка
1633
; если поставить галку на последнем не выделенном файле, то ничего. просто добавить его в список,манипуляции с папками незачем
1634
;
1635
 
1636
;vetka:
1637
; sizeused
1638
; sizebuf(def - 4000)
1639
; array of usel
1640
;
1641
; --- реализация ---
1642
;дерево выделенных объектов:
1643
; узел (usel):
1644
;   pName - двслово - указатель на строку имя узла
1645
;   pNext - двслово - указатель на vetka или 0
1646
 
1647
 
1648
;vetka {2*8,4000-2*8,
1649
;usel [Program_Files,0],
1650
;usel [Doc,v2]
1651
;}
1652
;v2:
1653
;vetka {1*8,4000-8,
1654
;usel [fold1,0]
1655
;}