Subversion Repositories Kolibri OS

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
4341 yogev_ezra 1
format MS COFF
2
public EXPORTS
3
section '.flat' code readable align 16
4
; void __stdcall START(dword state);
5
DLL_ENTRY equ 1
6
DLL_EXIT equ -1
7
START:
8
	cmp	dword [esp+4], DLL_ENTRY
9
	jnz	.ret
10
	push	edi
11
        mov     edi, tolower_table
12
        push    'A'
13
        pop     ecx
14
        xor     eax, eax
15
@@:
16
        stosb
17
        inc     eax
18
        loop    @b
19
        add     al, 0x20
20
        mov     cl, 'Z'-'A'+1
21
@@:
22
        stosb
23
        inc     eax
24
        loop    @b
25
        sub     al, 0x20
26
        mov     cl, 'А'-'Z'-1
27
@@:
28
        stosb
29
        inc     eax
30
        loop    @b
31
        add     al, 0x20
32
        mov     cl, 'Р'-'А'
33
@@:
34
        stosb
35
        inc     eax
36
        loop    @b
37
        add     al, 0x30
38
        mov     cl, 'Я'-'Р'+1
39
@@:
40
        stosb
41
        inc     eax
42
        loop    @b
43
        sub     al, 0x50
44
        mov     cl, 256-'Я'-1
45
@@:
46
        stosb
47
        inc     eax
48
        loop    @b
49
        mov     byte [edi-256+'Ё'], 'ё'
50
        pop	edi
51
.ret:
52
	ret	4
53
 
54
; enum sort_mode
55
; { SORT_BY_NAME = 0, SORT_BY_NAME_REV = 1,
56
;   SORT_BY_EXT = 2, SORT_BY_EXT_REV = 3,
57
;   SORT_BY_MODIFIED = 4, SORT_BY_MODIFIED_REV = 5,
58
;   SORT_BY_SIZE = 6, SORT_BY_SIZE_REV = 7,
59
;   SORT_BY_CREATED = 10, SORT_BY_CREATED_REV = 11,
60
;   SORT_BY_ACCESSED = 12, SORT_BY_ACCESSED_REV = 13 };
61
; int __stdcall sort_dir(BDFE* folder_data, unsigned num_folder_entries, sort_mode mode);
62
; return: 0 = ok, 1 = error
63
sort_dir:
64
        cmp     dword [esp+12], num_compare_fns
65
        jae     .error
66
        push    ebx
67
        mov     eax, ptr_table + 0x1FFF
68
        mov     edx, ptr_table
69
        and     eax, not 0xFFF
70
        mov     ecx, [esp+4+8]  ; num_folder_entries
71
        sub     eax, edx
72
        shl     ecx, 3
73
        jz      .done
74
        cmp     eax, ecx
75
        jae     .memok
76
        push    68
77
        pop     eax
78
        push    12
79
        pop     ebx
80
        int     0x40
81
        test    eax, eax
82
        jz      .error2
83
        mov     edx, eax
84
.memok:
85
        shr     ecx, 3
86
        mov     eax, edx
87
        mov     ebx, [esp+4+4]  ; folder_data
88
        push    ecx
89
.init_ptr:
90
        mov     [eax], ebx
91
        mov     [eax+4], eax
92
        add     eax, 8
93
        add     ebx, 304
94
        sub     ecx, 1
95
        jnz     .init_ptr
96
        pop     ecx
97
        mov     ebx, [esp+4+12] ; mode
98
        mov     ebx, [compare_fns+ebx*4]
99
        test    ebx, ebx
100
        jz      .done_free
101
        push    esi edi ecx
102
        call    sort
103
        pop     ecx
104
        mov     ebx, edx
105
        sub     esp, 304
106
.moveloop:
107
        mov     esi, [ebx]
108
        test    esi, esi
109
        jz      .movenext
110
        cmp     [ebx+4], ebx
111
        jz      .movenext
112
        mov     esi, [ebx]
113
        mov     edi, esp
114
        push    ecx
115
        mov     ecx, 304/4
116
        rep     movsd
117
        mov     edi, [ebx]
118
        mov     eax, [ebx+4]
119
.z:
120
        mov     esi, [eax]
121
        mov     dword [eax], 0
122
        push    esi
123
        mov     ecx, 304/4
124
        rep     movsd
125
        pop     edi
126
        mov     eax, [eax+4]
127
        cmp     eax, ebx
128
        jnz     .z
129
        lea     esi, [esp+4]
130
        mov     ecx, 304/4
131
        rep     movsd
132
        pop     ecx
133
.movenext:
134
        add     ebx, 8
135
        sub     ecx, 1
136
        jnz     .moveloop
137
        add     esp, 304
138
        pop     edi esi
139
.done_free:
140
        cmp     edx, ptr_table
141
        jz      .done
142
        push    68
143
        pop     eax
144
        push    13
145
        pop     ebx
146
        mov     ecx, edx
147
        int     0x40
148
.done:
149
        pop     ebx
150
        xor     eax, eax
151
        ret     12
152
.error2:
153
        pop     ebx
154
.error:
155
        push    1
156
        pop     eax
157
        ret     12
158
 
159
; Сортировка qword'ов в количестве ecx по адресу edx, функция сравнения в ebx
160
; Разрушает eax, ecx, esi, edi
161
sort:
162
;        jecxz   .done  ; checked by caller
163
        mov     eax, ecx
164
@@:
165
        push    eax
166
        call    .restore
167
        pop     eax
168
        sub     eax, 1
169
        jnz     @b
170
@@:
171
        cmp     ecx, 1
172
        jz      .done
173
        mov     esi, 1
174
        mov     edi, ecx
175
        call    .exchange
176
        dec     ecx
177
        mov     eax, 1
178
        call    .restore
179
        jmp     @b
180
.done:
181
        ret
182
 
183
.exchange:
184
        push    eax ecx
185
        mov     eax, [edx+esi*8-8]
186
        mov     ecx, [edx+edi*8-8]
187
        mov     [edx+esi*8-8], ecx
188
        mov     [edx+edi*8-8], eax
189
        mov     eax, [edx+esi*8-4]
190
        mov     ecx, [edx+edi*8-4]
191
        mov     [edx+esi*8-4], ecx
192
        mov     [edx+edi*8-4], eax
193
        pop     ecx eax
194
        ret
195
 
196
.restore:
197
        lea     esi, [eax+eax]
198
        cmp     esi, ecx
199
        ja      .doner
200
        push    esi
201
        mov     esi, [edx+esi*8-8]
202
        mov     edi, [edx+eax*8-8]
203
        call    ebx
204
        pop     esi
205
        ja      .need_xchg
206
        cmp     esi, ecx
207
        jae     .doner
208
        push    esi
209
        mov     esi, [edx+esi*8]
210
        mov     edi, [edx+eax*8-8]
211
        call    ebx
212
        pop     esi
213
        jbe     .doner
214
.need_xchg:
215
        cmp     esi, ecx
216
        jz      .do_xchg
217
        push    esi
218
        mov     edi, [edx+esi*8-8]
219
        mov     esi, [edx+esi*8]
220
        call    ebx
221
        pop     esi
222
        sbb     esi, -1
223
.do_xchg:
224
        mov     edi, eax
225
        call    .exchange
226
        mov     eax, esi
227
        jmp     .restore
228
.doner:
229
        ret
230
 
231
compare_name:
232
        test    byte [esi], 10h
233
        jnz     .1dir
234
        test    byte [edi], 10h
235
        jnz     .greater
236
.eq1:
237
        add     esi, 40
238
        add     edi, 40
239
        jmp     strcmpi
240
.greater:
241
        test    esi, esi
242
        ret
243
.1dir:
244
        test    byte [edi], 10h
245
        jnz     .eq1
246
.less:
247
        xor     edi, edi
248
        stc
249
        ret
250
 
251
compare_name_rev:
252
        test    byte [esi], 10h
253
        jnz     .1dir
254
        test    byte [edi], 10h
255
        jnz     .greater
256
.eq1:
257
        add     esi, 40
258
        add     edi, 40
259
        xchg    esi, edi
260
        jmp     strcmpi
261
.greater:
262
        test    esi, esi
263
        ret
264
.1dir:
265
        test    byte [edi], 10h
266
        jnz     .eq1
267
.less:
268
        xor     edi, edi
269
        stc
270
        ret
271
 
272
strcmpi:
273
        push    eax
274
@@:
275
        lodsb
276
        call    match_symbol
277
        jnz     .ret
278
        inc     edi
279
        test    al, al
280
        jnz     @b
281
.ret:
282
        pop     eax
283
        ret
284
 
285
compare_ext:
286
        test    byte [esi], 10h
287
        jnz     .1dir
288
        test    byte [edi], 10h
289
        jnz     .greater
290
.eq1:
291
        add     esi, 40
292
        add     edi, 40
293
        push    esi edi
294
        call    seek_ext
295
        xchg    esi, edi
296
        call    seek_ext
297
        xchg    esi, edi
298
        call    strcmpi
299
        jnz     .ret
300
        pop     edi esi
301
        jmp     strcmpi
302
.ret:
303
        pop     edi esi
304
        ret
305
.greater:
306
        test    esi, esi
307
        ret
308
.1dir:
309
        test    byte [edi], 10h
310
        jnz     .eq1
311
.less:
312
        xor     edi, edi
313
        stc
314
        ret
315
 
316
compare_ext_rev:
317
        test    byte [esi], 10h
318
        jnz     .1dir
319
        test    byte [edi], 10h
320
        jnz     .greater
321
.eq1:
322
        add     esi, 40
323
        add     edi, 40
324
        push    esi edi
325
        call    seek_ext
326
        xchg    esi, edi
327
        call    seek_ext
328
        call    strcmpi
329
        jnz     .ret
330
        pop     edi esi
331
        xchg    esi, edi
332
        jmp     strcmpi
333
.ret:
334
        pop     edi esi
335
        ret
336
.greater:
337
        test    esi, esi
338
        ret
339
.1dir:
340
        test    byte [edi], 10h
341
        jnz     .eq1
342
.less:
343
        xor     edi, edi
344
        stc
345
        ret
346
 
347
seek_ext:
348
        push    eax
349
        xor     eax, eax
350
.l:
351
        inc     esi
352
        cmp     byte [esi-1], '.'
353
        jnz     @f
354
        mov     eax, esi
355
@@:
356
        cmp     byte [esi-1], 0
357
        jnz     .l
358
        test    eax, eax
359
        jnz     @f
360
        lea     eax, [esi-1]
361
@@:
362
        mov     esi, eax
363
        pop     eax
364
        ret
365
 
366
compare_modified:
367
        test    byte [esi], 10h
368
        jnz     .1dir
369
        test    byte [edi], 10h
370
        jnz     .greater
371
.eq1:
372
        push    edi
373
        mov     edi, [edi+28]
374
        cmp     edi, [esi+28]
375
        pop     edi
376
        jnz     @f
377
        push    edi
378
        mov     edi, [edi+24]
379
        cmp     edi, [esi+24]
380
        pop     edi
381
        jnz     @f
382
        add     esi, 40
383
        add     edi, 40
384
        jmp     strcmpi
385
@@:
386
        ret
387
.greater:
388
        test    esi, esi
389
        ret
390
.1dir:
391
        test    byte [edi], 10h
392
        jnz     .eq1
393
.less:
394
        xor     edi, edi
395
        stc
396
        ret
397
 
398
compare_modified_rev:
399
        test    byte [esi], 10h
400
        jnz     .1dir
401
        test    byte [edi], 10h
402
        jnz     .greater
403
.eq1:
404
        push    esi
405
        mov     esi, [esi+28]
406
        cmp     esi, [edi+28]
407
        pop     esi
408
        jnz     @f
409
        push    esi
410
        mov     esi, [esi+24]
411
        cmp     esi, [edi+24]
412
        pop     esi
413
        jnz     @f
414
        add     esi, 40
415
        add     edi, 40
416
        xchg    esi, edi
417
        jmp     strcmpi
418
@@:
419
        ret
420
.greater:
421
        test    esi, esi
422
        ret
423
.1dir:
424
        test    byte [edi], 10h
425
        jnz     .eq1
426
.less:
427
        xor     edi, edi
428
        stc
429
        ret
430
 
431
compare_size:
432
        test    byte [esi], 10h
433
        jnz     .1dir
434
        test    byte [edi], 10h
435
        jnz     .greater
436
.eq1:
437
        push    edi
438
        mov     edi, [edi+36]
439
        cmp     edi, [esi+36]
440
        pop     edi
441
        jnz     @f
442
        push    edi
443
        mov     edi, [edi+32]
444
        cmp     edi, [esi+32]
445
        pop     edi
446
        jnz     @f
447
        add     esi, 40
448
        add     edi, 40
449
        jmp     strcmpi
450
@@:
451
        ret
452
.greater:
453
        test    esi, esi
454
        ret
455
.1dir:
456
        test    byte [edi], 10h
457
        jnz     .eq1
458
.less:
459
        xor     edi, edi
460
        stc
461
        ret
462
 
463
compare_size_rev:
464
        test    byte [esi], 10h
465
        jnz     .1dir
466
        test    byte [edi], 10h
467
        jnz     .greater
468
.eq1:
469
        push    esi
470
        mov     esi, [esi+36]
471
        cmp     esi, [edi+36]
472
        pop     esi
473
        jnz     @f
474
        push    esi
475
        mov     esi, [esi+32]
476
        cmp     esi, [edi+32]
477
        pop     esi
478
        jnz     @f
479
        add     esi, 40
480
        add     edi, 40
481
        xchg    esi, edi
482
        jmp     strcmpi
483
@@:
484
        ret
485
.greater:
486
        test    esi, esi
487
        ret
488
.1dir:
489
        test    byte [edi], 10h
490
        jnz     .eq1
491
.less:
492
        xor     edi, edi
493
        stc
494
        ret
495
 
496
compare_unordered:
497
        cmp     esi, edi
498
        ret
499
compare_unordered_rev:
500
        cmp     edi, esi
501
        ret
502
 
503
compare_created:
504
        test    byte [esi], 10h
505
        jnz     .1dir
506
        test    byte [edi], 10h
507
        jnz     .greater
508
.eq1:
509
        push    edi
510
        mov     edi, [edi+12]
511
        cmp     edi, [esi+12]
512
        pop     edi
513
        jnz     @f
514
        push    edi
515
        mov     edi, [edi+8]
516
        cmp     edi, [esi+8]
517
        pop     edi
518
        jnz     @f
519
        add     esi, 40
520
        add     edi, 40
521
        jmp     strcmpi
522
@@:
523
        ret
524
.greater:
525
        test    esi, esi
526
        ret
527
.1dir:
528
        test    byte [edi], 10h
529
        jnz     .eq1
530
.less:
531
        xor     edi, edi
532
        stc
533
        ret
534
 
535
compare_created_rev:
536
        test    byte [esi], 10h
537
        jnz     .1dir
538
        test    byte [edi], 10h
539
        jnz     .greater
540
.eq1:
541
        push    esi
542
        mov     esi, [esi+12]
543
        cmp     esi, [edi+12]
544
        pop     esi
545
        jnz     @f
546
        push    esi
547
        mov     esi, [esi+8]
548
        cmp     esi, [edi+8]
549
        pop     esi
550
        jnz     @f
551
        add     esi, 40
552
        add     edi, 40
553
        xchg    esi, edi
554
        jmp     strcmpi
555
@@:
556
        ret
557
.greater:
558
        test    esi, esi
559
        ret
560
.1dir:
561
        test    byte [edi], 10h
562
        jnz     .eq1
563
.less:
564
        xor     edi, edi
565
        stc
566
        ret
567
 
568
compare_accessed:
569
        test    byte [esi], 10h
570
        jnz     .1dir
571
        test    byte [edi], 10h
572
        jnz     .greater
573
.eq1:
574
        push    edi
575
        mov     edi, [edi+20]
576
        cmp     edi, [esi+20]
577
        pop     edi
578
        jnz     @f
579
        push    edi
580
        mov     edi, [edi+16]
581
        cmp     edi, [esi+16]
582
        pop     edi
583
        jnz     @f
584
        add     esi, 40
585
        add     edi, 40
586
        jmp     strcmpi
587
@@:
588
        ret
589
.greater:
590
        test    esi, esi
591
        ret
592
.1dir:
593
        test    byte [edi], 10h
594
        jnz     .eq1
595
.less:
596
        xor     edi, edi
597
        stc
598
        ret
599
 
600
compare_accessed_rev:
601
        test    byte [esi], 10h
602
        jnz     .1dir
603
        test    byte [edi], 10h
604
        jnz     .greater
605
.eq1:
606
        push    esi
607
        mov     esi, [esi+20]
608
        cmp     esi, [edi+20]
609
        pop     esi
610
        jnz     @f
611
        push    esi
612
        mov     esi, [esi+16]
613
        cmp     esi, [edi+16]
614
        pop     esi
615
        jnz     @f
616
        add     esi, 40
617
        add     edi, 40
618
        xchg    esi, edi
619
        jmp     strcmpi
620
@@:
621
        ret
622
.greater:
623
        test    esi, esi
624
        ret
625
.1dir:
626
        test    byte [edi], 10h
627
        jnz     .eq1
628
.less:
629
        xor     edi, edi
630
        stc
631
        ret
632
 
633
match_symbol:
634
; in: al,[edi]=symbols
635
; out: flags as 'cmp al,[edi]'
636
        push    eax ecx
637
        movzx   ecx, al
638
        mov     al, [tolower_table+ecx]
639
        movzx   ecx, byte [edi]
640
        cmp     al, [tolower_table+ecx]
641
        pop     ecx eax
642
        ret
643
 
644
align 4
645
compare_fns     dd      compare_name
646
                dd      compare_name_rev
647
                dd      compare_ext
648
                dd      compare_ext_rev
649
                dd      compare_modified
650
                dd      compare_modified_rev
651
                dd      compare_size
652
                dd      compare_size_rev
653
;                dd      compare_unordered
654
;                dd      compare_unordered_rev
655
                dd      0
656
                dd      0
657
                dd      compare_created
658
                dd      compare_created_rev
659
                dd      compare_accessed
660
                dd      compare_accessed_rev
661
num_compare_fns = ($ - compare_fns) / 4
662
 
663
EXPORTS:
664
	dd	szStart,	START
665
	dd	szVersion,	0x00010001
666
	dd	szSortDir,	sort_dir
667
	dd	szStrcmpi,	strcmpi
668
	dd	0
669
szStart		db	'START',0
670
szVersion       db      'version',0
671
szSortDir	db	'SortDir',0
672
szStrcmpi	db	'strcmpi',0
673
 
674
section '.data' data readable writable align 16
675
tolower_table	rb	256
676
; ptr_table must be last variable
677
ptr_table       rb      0x1000