Subversion Repositories Kolibri OS

Rev

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

Rev Author Line No. Line
3067 leency 1
//------------------------------------------------------------------------------
2
// strcmp( ESI, EDI)
3
// strlen( EDI)
3107 leency 4
// strcpy( EDI, ESI) --- 0 if ==
5573 pavelyakov 5
// strncpy(dword text1,text2,signed length)
3067 leency 6
// strcat( EDI, ESI)
5573 pavelyakov 7
// strncat(dword text1,text2,signed length) --- pasting the text of a certain length
3363 leency 8
// strchr( ESI,BL) --- find first BL
9
// strrchr( ESI,BL) --- find last BL
3067 leency 10
// strstr( EBX, EDX)
5573 pavelyakov 11
// itoa(signed long number) --- convert the number as a string
12
// atoi(dword text) --- convert a string as a number
3067 leency 13
// strupr( ESI)
3107 leency 14
// strlwr( ESI) --- kyrillic symbols may not work
3067 leency 15
// strttl( EDX)
16
// strtok( ESI)
5573 pavelyakov 17
// strltrim(dword text) --- removes "blank" characters on the left (\r, \n and space)
18
// strrtrim(dword text) --- removes "blank" characters on the right (\r, \n and space)
19
// strtrim(dword text) --- delete "empty" characters (\ r \ n and space) on both sides
3444 leency 20
// chrnum(dword searchin, char symbol)
3107 leency 21
// strcpyb(dword searchin, copyin, startstr, endstr) --- copy string between strings
3128 leency 22
// strnumb(dword searchin, startstr, endstr) --- get number between strings
5573 pavelyakov 23
// strdup(dword text) --- allocation under the text
3067 leency 24
//------------------------------------------------------------------------------
25
 
5573 pavelyakov 26
/*
3067 leency 27
inline fastcall signed int strcmp( ESI, EDI)
28
{
5573 pavelyakov 29
    loop()
30
    {
31
        IF (DSBYTE[ESI]
32
        IF (DSBYTE[ESI]>DSBYTE[EDI]) RETURN 1;
33
        IF (DSBYTE[ESI]=='\0') RETURN 0;
34
        ESI++;
35
        EDI++;
36
    }
3067 leency 37
}
5573 pavelyakov 38
*/
3067 leency 39
 
40
 
41
inline fastcall signed int strncmp( ESI, EDI, ECX)
42
{
43
  asm {
44
    MOV EBX, EDI
45
    XOR EAX, EAX
46
    MOV EDX, ECX
47
    OR ECX, ECX
48
    JE L1
49
    REPNE SCASB
50
    SUB EDX, ECX
51
    MOV ECX, EDX
52
    MOV EDI, EBX
53
    XOR EBX, EBX
54
    REPE CMPSB
55
    MOV AL, DSBYTE[ ESI-1]
56
    MOV BL, DSBYTE[ EDI-1]
57
    SUB EAX, EBX
58
L1:
59
  }
60
}
61
 
62
 
63
inline fastcall unsigned int strlen( EDI)
64
{
5573 pavelyakov 65
    $xor eax, eax
66
    $mov ecx, -1
67
    $REPNE $SCASB
68
    EAX-=2+ECX;
3067 leency 69
}
70
 
71
 
5573 pavelyakov 72
signed int strcmp(dword text1, text2)
73
{
74
	char s1,s2;
75
	dword p1,p2;
76
	p1 = text1;
77
	p2 = text2;
78
	loop()
79
	{
80
		s1 = DSBYTE[text1];
81
		s2 = DSBYTE[text2];
82
		if(s1==s2)
83
		{
84
			if(s1==0) return 0;
85
		}
86
		else {
87
 
88
			return -1;
89
		}
90
		$inc text1
91
		$inc text2
92
	}
93
	return 0;
94
}
95
 
96
 
3363 leency 97
inline fastcall void strcpy( EDI, ESI)
3067 leency 98
{
5573 pavelyakov 99
    $cld
3107 leency 100
L2:
5573 pavelyakov 101
    $lodsb
102
    $stosb
103
    $test al,al
104
    $jnz L2
3067 leency 105
}
106
 
5573 pavelyakov 107
void strncpy(dword text1, text2, signed len)
108
	signed o1,o2;
109
{
110
	o1 = len/4;
111
	o2 = len-4*o1;
112
	while(o1){
113
		ESDWORD[text1] = ESDWORD[text2];
114
		text1 += 4;
115
		text2 += 4;
116
		$dec o1
117
	}
118
	while(o2){
119
		ESBYTE[text1] = ESBYTE[text2];
120
		$inc text1
121
		$inc text2
122
		$dec o2
123
	}
124
}
3067 leency 125
 
3128 leency 126
inline fastcall int strlcpy(dword ESI, EDI, EBX)
127
{
5573 pavelyakov 128
    if (EBX<0) return -1;
129
    EDX=0;
130
    do {
131
        DSBYTE[ESI]=DSBYTE[EDI];
132
        ESI++;
133
        EDI++;
134
        EDX++;
135
        if (EDX==EBX) { DSBYTE[ESI]='\0'; return -1;}
136
    } while(DSBYTE[EDI-1]!='\0');
137
    return 0;
3128 leency 138
}
139
 
5573 pavelyakov 140
/*
141
inline fastcall void strtrim( ESI)
3448 esevece 142
{
5573 pavelyakov 143
    EDI = ESI;
144
    do{
145
        AL=DSBYTE[EDI];
146
        if (AL != '\32') && (AL != '\13') && (AL != '\10')
147
        {
148
            DSBYTE[ESI]=AL;
149
            $inc ESI
150
        }
151
         $inc EDI
152
    }while(AL!=0);
153
    DSBYTE[ESI] = '\0';
154
}
155
*/
156
 
157
byte __isWhite(int s){ if (s==13)||(s==32)||(s==10)||(s==9) return true; return false; }
158
void strltrim(dword text){
159
	int s;
160
	dword back_text;
161
	back_text = text;
162
	s = ESBYTE[text];
163
	while(__isWhite(s))
164
	{
165
		$inc text
166
		s = ESBYTE[text];
167
	}
168
	loop()
169
	{
170
		ESBYTE[back_text] = s;
171
		$inc back_text
172
		if(!s) break;
173
		$inc text
174
		s = ESBYTE[text];
175
	};
176
}
177
 
178
void strrtrim(dword text)
179
{
180
	int s;
181
	dword p;
182
	do {
183
		s = ESBYTE[text];
184
		if(__isWhite(s))
3448 esevece 185
		{
5573 pavelyakov 186
			p = text;
187
			while(__isWhite(s))
188
			{
189
				$inc text;
190
				s = ESBYTE[text];
191
			}
3448 esevece 192
		}
5573 pavelyakov 193
		else $inc text
194
	} while(s);
195
	$dec text
196
	s = ESBYTE[text];
197
	if(__isWhite(s)) ESBYTE[p] = 0;
3448 esevece 198
}
3128 leency 199
 
5573 pavelyakov 200
void strtrim(dword text){
201
	int s;
202
	dword p,back_text;
203
	back_text = text;
204
	s = ESBYTE[text];
205
	while(__isWhite(s))
206
	{
207
		$inc text
208
		s = ESBYTE[text];
209
	}
210
	do {
211
		s = ESBYTE[text];
212
		if(__isWhite(s))
213
		{
214
			p = back_text;
215
			while(__isWhite(s))
216
			{
217
				ESBYTE[back_text] = s;
218
				$inc back_text
219
				$inc text;
220
				s = ESBYTE[text];
221
			}
222
		}
223
		else {
224
			ESBYTE[back_text] = s;
225
			$inc back_text
226
			$inc text
227
		}
228
	} while(s);
229
	$dec text
230
	s = ESBYTE[text];
231
	if(__isWhite(s)) ESBYTE[p] = 0;
232
}
3128 leency 233
 
3363 leency 234
inline fastcall void strcat( EDI, ESI)
3067 leency 235
{
236
  asm {
237
    mov ebx, edi
238
    xor ecx, ecx
239
    xor eax, eax
240
    dec ecx
241
    repne scasb
242
    dec edi
243
    mov edx, edi
244
    mov edi, esi
245
    xor ecx, ecx
246
    xor eax, eax
247
    dec ecx
248
    repne scasb
249
    xor ecx, 0ffffffffh
250
    mov edi, edx
251
    mov edx, ecx
252
    mov eax, edi
253
    shr ecx, 2
254
    rep movsd
255
    mov ecx, edx
256
    and ecx, 3
257
    rep movsb
258
    mov eax, ebx
5573 pavelyakov 259
    }
260
}
261
 
262
void strncat(dword text1, text2, signed len)
263
	signed o1,o2;
264
	char s;
265
{
266
	s = ESBYTE[text1];
267
	while(s){
268
		$inc text1
269
		s = ESBYTE[text1];
3067 leency 270
	}
5573 pavelyakov 271
	o1 = len/4;
272
	o2 = len-4*o1;
273
	while(o1){
274
		ESDWORD[text1] = ESDWORD[text2];
275
		text1 += 4;
276
		text2 += 4;
277
		$dec o1
278
	}
279
	while(o2){
280
		ESBYTE[text1] = ESBYTE[text2];
281
		$inc text1
282
		$inc text2
283
		$dec o2
284
	}
3067 leency 285
}
286
 
3363 leency 287
inline fastcall void chrcat(ESI, BL)
288
{
5573 pavelyakov 289
    EDI = strlen(ESI);
290
    ESBYTE[ESI+EDI] = BL;
291
    ESBYTE[ESI+EDI+1] = 0;
3363 leency 292
}
3128 leency 293
 
3363 leency 294
 
3128 leency 295
inline fastcall signed int strchr( ESI,BL)
296
{
5573 pavelyakov 297
    int jj=0;
298
    do{
299
        jj++;
300
        $lodsb
301
        IF(AL==BL) return jj;
302
    } while(AL!=0);
303
    return 0;
3128 leency 304
}
305
 
306
 
307
inline fastcall signed int strrchr( ESI,BL)
308
{
5573 pavelyakov 309
    int jj=0, last=0;
310
    do{
311
        jj++;
312
        $lodsb
313
        IF(AL==BL) last=jj;
314
    } while(AL!=0);
315
    return last;
3128 leency 316
}
317
 
318
 
319
int chrnum(dword searchin, char symbol)
320
{
5573 pavelyakov 321
    int num = 0;
322
    while(DSBYTE[searchin])
323
    {
324
        if (DSBYTE[searchin] == symbol)    num++;
325
        searchin++;
326
    }
327
    return num;
3128 leency 328
}
329
 
330
 
3363 leency 331
inline fastcall signed int strstr( EBX, EDX)
3128 leency 332
{
333
  asm {
334
    MOV EDI, EDX
335
    XOR ECX, ECX
336
    XOR EAX, EAX
337
    DEC ECX
338
    REPNE SCASB
339
    NOT ECX
340
    DEC ECX
341
    JE LS2
342
    MOV ESI, ECX
343
    XOR ECX, ECX
344
    MOV EDI, EBX
345
    DEC ECX
346
    REPNE SCASB
347
    NOT ECX
348
    SUB ECX, ESI
349
    JBE LS2
350
    MOV EDI, EBX
351
    LEA EBX, DSDWORD[ ESI-1]
352
LS1: MOV ESI, EDX
353
    LODSB
354
    REPNE SCASB
355
    JNE LS2
356
    MOV EAX, ECX
357
    PUSH EDI
358
    MOV ECX, EBX
359
    REPE CMPSB
360
    POP EDI
361
    MOV ECX, EAX
362
    JNE LS1
363
    LEA EAX, DSDWORD[ EDI-1]
364
    JMP SHORT LS3
365
LS2: XOR EAX, EAX
366
LS3:
367
  }
368
}
369
 
4226 punk_joker 370
dword strcmpi(dword cmp1, cmp2)
371
{
5573 pavelyakov 372
    char si, ue;
3128 leency 373
 
5573 pavelyakov 374
    loop()
375
    {
376
        si = DSBYTE[cmp1];
377
        ue = DSBYTE[cmp2];
378
        if (si>='A') && (si<='Z') si +=32;
379
        if (ue>='A') && (ue<='Z') ue +=32;
380
        if (si != ue) return -1;
381
        cmp1++;
382
        cmp2++;
383
        if ((DSBYTE[cmp1]=='\0') && (DSBYTE[cmp2]=='\0')) return 0;
384
        if (DSBYTE[cmp1]=='\0') return -1;
385
        if (DSBYTE[cmp2]=='\0') return 1;
386
    }
4226 punk_joker 387
}
388
 
3128 leency 389
dword strstri(dword searchin, usestr_s)
390
{
5573 pavelyakov 391
    dword usestr_e = usestr_s;
392
    char si, ue;
3128 leency 393
 
5573 pavelyakov 394
    while(DSBYTE[searchin])
395
    {
396
        si = DSBYTE[searchin];
397
        ue = DSBYTE[usestr_e];
398
        if (si>='A') && (si<='Z') si +=32;
399
        if (ue>='A') && (ue<='Z') ue +=32;
400
        if (si == ue) usestr_e++; else usestr_e = usestr_s;
401
        searchin++;
402
        if (DSBYTE[usestr_e]=='\0') return searchin;
403
    }
404
    return 0;
3128 leency 405
}
406
 
407
 
3958 leency 408
unsigned int strcpyb(dword search_in, copyin, startstr, endstr)
3128 leency 409
{
5573 pavelyakov 410
    dword startp, endp;
411
    dword copyin_start_off = copyin;
412
    if (startstr==0) startp = search_in; else startp = strstr(search_in, startstr) + strlen(startstr);
413
    endp = strstri(startp, endstr);
414
    if (endp==0) endp = startp+strlen(search_in);
415
    //if (startp==endp) return 0;
416
    do
417
    {
418
        DSBYTE[copyin] = DSBYTE[startp];
419
        copyin++;
420
        startp++;
421
    }
422
    while (startp
423
    DSBYTE[copyin] = '\0';
424
    return copyin_start_off;
3128 leency 425
}
426
 
427
 
5423 leency 428
/*void strcat(char *to, char *from)
3081 leency 429
{
5573 pavelyakov 430
    while(*to) to++;
431
    while(*from)
432
    {
433
        *to = *from;
434
        to++;
435
        from++;
436
    }
437
    *to = '\0';
3081 leency 438
}*/
439
 
3114 leency 440
 
3067 leency 441
inline fastcall dword atoi( EDI)
442
{
5573 pavelyakov 443
    $push ebx
444
    $push esi
445
    ESI=EDI;
446
    while (DSBYTE[ESI]==' ') ESI++;
447
    if (DSBYTE[ESI]=='-') ESI++;
448
    EAX=0;
449
    while (DSBYTE[ESI]>='0') && (DSBYTE[ESI]<='9')
450
    {
451
        $xor ebx, ebx
452
        EBX = DSBYTE[ESI]-'0';
453
        EAX *= 10;
454
        EAX += EBX;
455
        ESI++;
456
    }
457
    IF (DSBYTE[EDI]=='-') -EAX;
458
    $pop esi
459
    $pop ebx
3067 leency 460
}
461
 
462
 
463
 
464
inline fastcall strupr( ESI)
465
{
5573 pavelyakov 466
    do{
467
        AL=DSBYTE[ESI];
468
        IF(AL>='a')IF(AL<='z')DSBYTE[ESI]=AL&0x5f;
469
        IF (AL>=160) && (AL<=175) DSBYTE[ESI] = AL - 32;    //à-ï
470
        IF (AL>=224) && (AL<=239) DSBYTE[ESI] = AL - 80;    //à-ï
471
         ESI++;
472
    }while(AL!=0);
3067 leency 473
}
474
 
475
inline fastcall strlwr( ESI)
476
{
5573 pavelyakov 477
    do{
478
        $LODSB
479
        IF(AL>='A')&&(AL<='Z'){
480
            AL+=0x20;
481
            DSBYTE[ESI-1]=AL;
482
            CONTINUE;
483
        }
484
    }while(AL!=0);
3067 leency 485
}
486
 
487
inline fastcall strttl( EDX)
488
{
5573 pavelyakov 489
    AL=DSBYTE[EDX];
490
    IF(AL>='a')&&(AL<='z')DSBYTE[EDX]=AL&0x5f;
491
    IF (AL>=160) && (AL<=175) DSBYTE[EDX] = AL - 32;    //à-ï
492
    IF (AL>=224) && (AL<=239) DSBYTE[EDX] = AL - 80;    //à-ï
493
    do{
494
        EDX++;
495
        AL=DSBYTE[EDX];
496
        IF(AL>='A')&&(AL<='Z'){DSBYTE[EDX]=AL|0x20; CONTINUE;}
497
        IF(AL>='€')&&(AL<='')DSBYTE[EDX]=AL|0x20; // -¯
498
        IF (AL>=144) && (AL<=159) DSBYTE[EDX] = AL + 80;    //à-ï
499
    }while(AL!=0);
3067 leency 500
}
501
 
5573 pavelyakov 502
/*
4166 leency 503
dword itoa( ESI)
504
{
4639 yogev_ezra 505
    unsigned char buffer[11];
5573 pavelyakov 506
    $pusha
507
    EDI = #buffer;
508
    ECX = 10;
509
    if (ESI < 0)
510
    {
511
         $mov     al, '-'
512
         $stosb
513
         $neg     esi
514
    }
4166 leency 515
 
5573 pavelyakov 516
    $mov     eax, esi
517
    $push    -'0'
4166 leency 518
F2:
5573 pavelyakov 519
    $xor     edx, edx
520
    $div     ecx
521
    $push    edx
522
    $test    eax, eax
523
    $jnz     F2
4166 leency 524
F3:
5573 pavelyakov 525
    $pop     eax
526
    $add     al, '0'
527
    $stosb
528
    $jnz     F3
529
 
530
    $mov     al, '\0'
531
    $stosb
4166 leency 532
 
5573 pavelyakov 533
    $popa
4166 leency 534
    return #buffer;
535
}
5573 pavelyakov 536
*/
537
 
538
dword itoa(signed long number)
4166 leency 539
{
5573 pavelyakov 540
	unsigned char buf[11];
541
	dword ret;
542
	byte cmd;
543
	long mask,tmp;
544
	mask = 1000000000;
545
	cmd = true;
546
	if(!number){
547
		ESBYTE[buf] = '0';
548
		ESBYTE[buf+1] = 0;
549
		return buf;
550
	}
551
	ret = buf;
552
	if(number<0)
4166 leency 553
	{
5573 pavelyakov 554
		$neg number
555
		ESBYTE[buf] = '-';
556
		$inc buf
4166 leency 557
	}
5573 pavelyakov 558
	while(mask)
559
	{
560
		tmp = number / mask;
561
		tmp = tmp%10;
562
 
563
		if(cmd){
564
			if(tmp){
565
				ESBYTE[buf] = tmp + '0';
566
				$inc buf
567
				cmd = false;
568
			}
569
		}
570
		else {
571
			ESBYTE[buf] = tmp + '0';
572
			$inc buf
573
		}
574
		mask /= 10;
575
	}
576
	ESBYTE[buf] = 0;
577
	return ret;
578
}
579
 
580
inline fastcall itoa_(signed int EDI, ESI)
581
{
582
    $pusha
583
    EBX = EDI;
584
    ECX = 10;
585
    if (ESI > 90073741824)
586
    {
587
         $mov     al, '-'
588
         $stosb
589
         $neg     esi
590
    }
4166 leency 591
 
5573 pavelyakov 592
    $mov     eax, esi
593
    $push    -'0'
4166 leency 594
F2:
5573 pavelyakov 595
    $xor     edx, edx
596
    $div     ecx
597
    $push    edx
598
    $test    eax, eax
599
    $jnz     F2
4166 leency 600
F3:
5573 pavelyakov 601
    $pop     eax
602
    $add     al, '0'
603
    $stosb
604
    $jnz     F3
605
 
606
    $mov     al, '\0'
607
    $stosb
4166 leency 608
 
5573 pavelyakov 609
    $popa
4166 leency 610
    return EBX;
5573 pavelyakov 611
}
4166 leency 612
 
5573 pavelyakov 613
dword strdup(dword text)
614
{
615
    dword l = strlen(text);
616
    dword ret = malloc(l+1);
617
    strncpy(ret,text,l);
618
    return ret;
619
}
620
 
3128 leency 621
void debugi(dword d_int)
3067 leency 622
{
5573 pavelyakov 623
    char tmpch[12];
624
    itoa_(#tmpch, d_int);
625
    debugln(#tmpch);
3067 leency 626
}
627
 
3363 leency 628
 
5573 pavelyakov 629
//#define strncpy strcpyn
3067 leency 630
#define strnmov strmovn
631
#define stricmp strcmpi
632
#define strcmpn strncmp
3467 leency 633