Subversion Repositories Kolibri OS

Rev

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

Rev Author Line No. Line
5598 pavelyakov 1
#ifndef INCLUDE_STRING_H
2
#define INCLUDE_STRING_H
3
 
4
#ifndef INCLUDE_MEM_H
5
#include "../lib/mem.h"
6
#endif
7
 
3067 leency 8
//------------------------------------------------------------------------------
5574 pavelyakov 9
// strspn(dword text1,text2) --- example: strspn("12 year","1234567890") -> return 2
10
// strpbrk(dword text1,text2) --- example: strpbrk("this test", " ckfi") -> return "is test"
3067 leency 11
// strcmp( ESI, EDI)
12
// strlen( EDI)
5713 leency 13
// utf8_strlen( ESI)
3107 leency 14
// strcpy( EDI, ESI) --- 0 if ==
5803 leency 15
// strlcpy(dword text1,text2,signed length)
3067 leency 16
// strcat( EDI, ESI)
5573 pavelyakov 17
// strncat(dword text1,text2,signed length) --- pasting the text of a certain length
3363 leency 18
// strchr( ESI,BL) --- find first BL
19
// strrchr( ESI,BL) --- find last BL
3067 leency 20
// strstr( EBX, EDX)
5573 pavelyakov 21
// itoa(signed long number) --- convert the number as a string
22
// atoi(dword text) --- convert a string as a number
3067 leency 23
// strupr( ESI)
5690 leency 24
// strlwr( ESI) --- Cyrillic symbols may not work
3067 leency 25
// strttl( EDX)
26
// strtok( ESI)
5573 pavelyakov 27
// strltrim(dword text) --- removes "blank" characters on the left (\r, \n and space)
28
// strrtrim(dword text) --- removes "blank" characters on the right (\r, \n and space)
29
// strtrim(dword text) --- delete "empty" characters (\ r \ n and space) on both sides
3444 leency 30
// chrnum(dword searchin, char symbol)
3107 leency 31
// strcpyb(dword searchin, copyin, startstr, endstr) --- copy string between strings
3128 leency 32
// strnumb(dword searchin, startstr, endstr) --- get number between strings
5573 pavelyakov 33
// strdup(dword text) --- allocation under the text
3067 leency 34
//------------------------------------------------------------------------------
35
 
5573 pavelyakov 36
/*
3067 leency 37
inline fastcall signed int strcmp( ESI, EDI)
38
{
5573 pavelyakov 39
    loop()
40
    {
41
        IF (DSBYTE[ESI]
42
        IF (DSBYTE[ESI]>DSBYTE[EDI]) RETURN 1;
43
        IF (DSBYTE[ESI]=='\0') RETURN 0;
44
        ESI++;
45
        EDI++;
46
    }
3067 leency 47
}
5573 pavelyakov 48
*/
3067 leency 49
 
5598 pavelyakov 50
 
51
 
5575 pavelyakov 52
inline int strspn(dword text1,text2)
5574 pavelyakov 53
{
54
	dword beg;
55
	char s1,s2;
56
	int ret;
57
	ret = 0;
58
	beg = text2;
59
	do {
60
		s1 = ESBYTE[text1];
61
		text2 = beg;
62
		do {
63
			s2 = ESBYTE[text2];
64
			if(s1==s2)
65
			{
66
				if(!s2)break;
67
				$inc ret
68
				break;
69
			}
70
			else $inc text2
71
		} while(s2);
72
		$inc text1
73
	} while(s1);
74
	return ret;
75
}
3067 leency 76
 
5575 pavelyakov 77
inline dword strpbrk(dword text1,text2)
5574 pavelyakov 78
{
79
	char s,ss;
80
	dword beg;
81
	beg = text2;
82
	do {
83
		s = ESBYTE[text1];
84
		text2 = beg;
85
		do {
86
			ss = ESBYTE[text2];
87
			if(ss==s) return text1;
88
			$inc text2
89
		} while(ss);
90
		$inc text1
91
	} while(s);
92
	return text1;
93
}
94
 
3067 leency 95
inline fastcall signed int strncmp( ESI, EDI, ECX)
96
{
97
  asm {
98
    MOV EBX, EDI
99
    XOR EAX, EAX
100
    MOV EDX, ECX
101
    OR ECX, ECX
102
    JE L1
103
    REPNE SCASB
104
    SUB EDX, ECX
105
    MOV ECX, EDX
106
    MOV EDI, EBX
107
    XOR EBX, EBX
108
    REPE CMPSB
109
    MOV AL, DSBYTE[ ESI-1]
110
    MOV BL, DSBYTE[ EDI-1]
111
    SUB EAX, EBX
112
L1:
113
  }
114
}
115
 
5606 pavelyakov 116
/*
117
inline signed int strncmp(dword text1,text2,len)
118
{
119
 
120
	loop()
121
	{
122
		if(DSBYTE[text1]!=DSBYTE[text2])return text1-text2;
123
		$dec len
124
		if(!len)return 0;
125
	}
126
}
127
*/
3067 leency 128
inline fastcall unsigned int strlen( EDI)
129
{
5573 pavelyakov 130
    $xor eax, eax
131
    $mov ecx, -1
132
    $REPNE $SCASB
133
    EAX-=2+ECX;
3067 leency 134
}
135
 
5575 pavelyakov 136
inline strnlen(dword str, dword maxlen)
137
{
138
	dword cp;
139
	for (cp = str; (maxlen != 0) && (DSBYTE[cp] != '\0'); cp++, maxlen--);
140
	return cp - str;
141
}
3067 leency 142
 
5713 leency 143
inline fastcall unsigned int utf8_strlen( ESI)
144
{
145
 $xor  ecx, ecx
146
  _loop:
147
 $lodsb
148
 $test  al, al
149
 $jz  _done
150
 $and al, 0xc0
151
 $cmp al, 0x80
152
 $jz  _loop
153
 $inc ecx
154
 $jmp _loop
155
 
156
  _done:
157
 return ECX;
158
}
5575 pavelyakov 159
 
160
inline signed int strcmp(dword text1, text2)
5573 pavelyakov 161
{
162
	char s1,s2;
163
	dword p1,p2;
164
	p1 = text1;
165
	p2 = text2;
166
	loop()
167
	{
168
		s1 = DSBYTE[text1];
169
		s2 = DSBYTE[text2];
170
		if(s1==s2)
171
		{
172
			if(s1==0) return 0;
173
		}
174
		else {
5574 pavelyakov 175
			return s1-s2;
5573 pavelyakov 176
		}
177
		$inc text1
178
		$inc text2
179
	}
180
	return 0;
181
}
182
 
7286 leency 183
/*
184
TODO: rewrite streq() using pure assembliy
185
 
186
inline fastcall void strcpy( EDI, ESI)
187
{
188
    $cld
189
L2:
190
    $lodsb
191
    $stosb
192
    $test al,al
193
    $jnz L2
6058 leency 194
}
7286 leency 195
*/
6058 leency 196
 
7286 leency 197
inline fastcall streq(ESI, EDI)
198
{
199
	loop()
200
	{
201
		if(DSBYTE[ESI]==DSBYTE[EDI])
202
		{
203
			if(DSBYTE[ESI]==0) return true;
204
		}
205
		else {
206
			return false;
207
		}
208
		ESI++;
209
		EDI++;
210
	}
211
	return true;
212
}
213
 
5575 pavelyakov 214
/*
215
signed int strncmp(dword s1, s2, signed n)
216
unsigned char _s1,_s2;
217
{
218
	if (n == 0)
219
		return 0;
220
	do {
221
		_s1 = DSBYTE[s1];
222
		_s2 = DSBYTE[s2];
223
		if (_s1 != _s2)
224
		{
225
			$dec s2
226
			return _s1 - _s2;
227
		}
228
		$inc s2
229
		if (_s1 == 0)
230
			break;
231
		$inc s1
232
		$dec n
233
	} while (n);
234
	return 0;
235
}
236
*/
5573 pavelyakov 237
 
5575 pavelyakov 238
 
3363 leency 239
inline fastcall void strcpy( EDI, ESI)
3067 leency 240
{
5573 pavelyakov 241
    $cld
3107 leency 242
L2:
5573 pavelyakov 243
    $lodsb
244
    $stosb
245
    $test al,al
246
    $jnz L2
3067 leency 247
}
248
 
3128 leency 249
inline fastcall int strlcpy(dword ESI, EDI, EBX)
250
{
5573 pavelyakov 251
    if (EBX<0) return -1;
252
    EDX=0;
253
    do {
254
        DSBYTE[ESI]=DSBYTE[EDI];
255
        ESI++;
256
        EDI++;
257
        EDX++;
258
        if (EDX==EBX) { DSBYTE[ESI]='\0'; return -1;}
259
    } while(DSBYTE[EDI-1]!='\0');
260
    return 0;
3128 leency 261
}
262
 
7049 leency 263
:void strncpy(dword dst, src, len)
264
{
265
	while (len)
266
	{
267
		ESBYTE[dst] = ESBYTE[src];
268
		dst++;
269
		src++;
270
		len--;
271
	}
272
	ESBYTE[dst]=0;
273
}
274
 
5573 pavelyakov 275
/*
276
inline fastcall void strtrim( ESI)
3448 esevece 277
{
5573 pavelyakov 278
    EDI = ESI;
279
    do{
280
        AL=DSBYTE[EDI];
281
        if (AL != '\32') && (AL != '\13') && (AL != '\10')
282
        {
283
            DSBYTE[ESI]=AL;
284
            $inc ESI
285
        }
286
         $inc EDI
287
    }while(AL!=0);
288
    DSBYTE[ESI] = '\0';
289
}
290
*/
291
 
5582 pavelyakov 292
inline byte __isWhite(int s){ if (s==13)||(s==32)||(s==10)||(s==9) return true; return false; }
5575 pavelyakov 293
inline void strltrim(dword text){
5573 pavelyakov 294
	int s;
295
	dword back_text;
296
	back_text = text;
297
	s = ESBYTE[text];
298
	while(__isWhite(s))
299
	{
300
		$inc text
301
		s = ESBYTE[text];
302
	}
303
	loop()
304
	{
305
		ESBYTE[back_text] = s;
306
		$inc back_text
307
		if(!s) break;
308
		$inc text
309
		s = ESBYTE[text];
310
	};
311
}
312
 
5575 pavelyakov 313
inline void strrtrim(dword text)
5573 pavelyakov 314
{
315
	int s;
316
	dword p;
317
	do {
318
		s = ESBYTE[text];
319
		if(__isWhite(s))
3448 esevece 320
		{
5573 pavelyakov 321
			p = text;
322
			while(__isWhite(s))
323
			{
324
				$inc text;
325
				s = ESBYTE[text];
326
			}
3448 esevece 327
		}
5573 pavelyakov 328
		else $inc text
329
	} while(s);
330
	$dec text
331
	s = ESBYTE[text];
332
	if(__isWhite(s)) ESBYTE[p] = 0;
3448 esevece 333
}
3128 leency 334
 
5575 pavelyakov 335
inline void strtrim(dword text){
5573 pavelyakov 336
	int s;
337
	dword p,back_text;
338
	back_text = text;
339
	s = ESBYTE[text];
340
	while(__isWhite(s))
341
	{
342
		$inc text
343
		s = ESBYTE[text];
344
	}
345
	do {
346
		s = ESBYTE[text];
347
		if(__isWhite(s))
348
		{
349
			p = back_text;
350
			while(__isWhite(s))
351
			{
352
				ESBYTE[back_text] = s;
353
				$inc back_text
354
				$inc text;
355
				s = ESBYTE[text];
356
			}
357
		}
358
		else {
359
			ESBYTE[back_text] = s;
360
			$inc back_text
361
			$inc text
362
		}
363
	} while(s);
364
	$dec text
365
	s = ESBYTE[text];
366
	if(__isWhite(s)) ESBYTE[p] = 0;
367
}
3128 leency 368
 
3363 leency 369
inline fastcall void strcat( EDI, ESI)
3067 leency 370
{
371
  asm {
372
    mov ebx, edi
373
    xor ecx, ecx
374
    xor eax, eax
375
    dec ecx
376
    repne scasb
377
    dec edi
378
    mov edx, edi
379
    mov edi, esi
380
    xor ecx, ecx
381
    xor eax, eax
382
    dec ecx
383
    repne scasb
384
    xor ecx, 0ffffffffh
385
    mov edi, edx
386
    mov edx, ecx
387
    mov eax, edi
388
    shr ecx, 2
389
    rep movsd
390
    mov ecx, edx
391
    and ecx, 3
392
    rep movsb
393
    mov eax, ebx
5573 pavelyakov 394
    }
395
}
396
 
6742 leency 397
:void strncat(dword text1, text2, signed len)
398
signed o1,o2;
399
char s;
5573 pavelyakov 400
{
5576 pavelyakov 401
	s = DSBYTE[text1];
5573 pavelyakov 402
	while(s){
403
		$inc text1
5576 pavelyakov 404
		s = DSBYTE[text1];
3067 leency 405
	}
5573 pavelyakov 406
	o1 = len/4;
407
	o2 = len-4*o1;
408
	while(o1){
5576 pavelyakov 409
		DSDWORD[text1] = DSDWORD[text2];
5573 pavelyakov 410
		text1 += 4;
411
		text2 += 4;
412
		$dec o1
413
	}
414
	while(o2){
5576 pavelyakov 415
		DSBYTE[text1] = DSBYTE[text2];
5573 pavelyakov 416
		$inc text1
417
		$inc text2
418
		$dec o2
419
	}
5576 pavelyakov 420
	DSBYTE[text1] = 0;
3067 leency 421
}
422
 
3363 leency 423
inline fastcall void chrcat(ESI, BL)
424
{
5573 pavelyakov 425
    EDI = strlen(ESI);
426
    ESBYTE[ESI+EDI] = BL;
427
    ESBYTE[ESI+EDI+1] = 0;
3363 leency 428
}
3128 leency 429
 
5598 pavelyakov 430
inline dword strchr(dword shb;char s)
431
{
432
	char ss;
433
	loop()
434
	{
435
		ss = DSBYTE[shb];
436
		if(!ss)return 0;
437
		if(ss==s)return shb;
438
		shb++;
439
	}
3128 leency 440
}
441
 
442
inline fastcall signed int strrchr( ESI,BL)
443
{
5573 pavelyakov 444
    int jj=0, last=0;
445
    do{
446
        jj++;
447
        $lodsb
448
        IF(AL==BL) last=jj;
449
    } while(AL!=0);
450
    return last;
3128 leency 451
}
452
 
453
 
6742 leency 454
inline fastcall unsigned int chrnum( ESI, BL)
3128 leency 455
{
5573 pavelyakov 456
    int num = 0;
6742 leency 457
    while(DSBYTE[ESI])
5573 pavelyakov 458
    {
6742 leency 459
        if (DSBYTE[ESI] == BL) num++;
460
        ESI++;
5573 pavelyakov 461
    }
462
    return num;
3128 leency 463
}
464
 
465
 
3363 leency 466
inline fastcall signed int strstr( EBX, EDX)
3128 leency 467
{
468
  asm {
469
    MOV EDI, EDX
470
    XOR ECX, ECX
471
    XOR EAX, EAX
472
    DEC ECX
473
    REPNE SCASB
474
    NOT ECX
475
    DEC ECX
476
    JE LS2
477
    MOV ESI, ECX
478
    XOR ECX, ECX
479
    MOV EDI, EBX
480
    DEC ECX
481
    REPNE SCASB
482
    NOT ECX
483
    SUB ECX, ESI
484
    JBE LS2
485
    MOV EDI, EBX
486
    LEA EBX, DSDWORD[ ESI-1]
487
LS1: MOV ESI, EDX
488
    LODSB
489
    REPNE SCASB
490
    JNE LS2
491
    MOV EAX, ECX
492
    PUSH EDI
493
    MOV ECX, EBX
494
    REPE CMPSB
495
    POP EDI
496
    MOV ECX, EAX
497
    JNE LS1
498
    LEA EAX, DSDWORD[ EDI-1]
499
    JMP SHORT LS3
500
LS2: XOR EAX, EAX
501
LS3:
502
  }
503
}
504
 
5582 pavelyakov 505
inline dword strcmpi(dword cmp1, cmp2)
4226 punk_joker 506
{
5573 pavelyakov 507
    char si, ue;
3128 leency 508
 
5573 pavelyakov 509
    loop()
510
    {
511
        si = DSBYTE[cmp1];
512
        ue = DSBYTE[cmp2];
513
        if (si>='A') && (si<='Z') si +=32;
514
        if (ue>='A') && (ue<='Z') ue +=32;
515
        if (si != ue) return -1;
516
        cmp1++;
517
        cmp2++;
518
        if ((DSBYTE[cmp1]=='\0') && (DSBYTE[cmp2]=='\0')) return 0;
519
        if (DSBYTE[cmp1]=='\0') return -1;
520
        if (DSBYTE[cmp2]=='\0') return 1;
521
    }
4226 punk_joker 522
}
523
 
5582 pavelyakov 524
inline dword strstri(dword searchin, usestr_s)
3128 leency 525
{
5573 pavelyakov 526
    dword usestr_e = usestr_s;
527
    char si, ue;
3128 leency 528
 
5573 pavelyakov 529
    while(DSBYTE[searchin])
530
    {
531
        si = DSBYTE[searchin];
532
        ue = DSBYTE[usestr_e];
533
        if (si>='A') && (si<='Z') si +=32;
534
        if (ue>='A') && (ue<='Z') ue +=32;
535
        if (si == ue) usestr_e++; else usestr_e = usestr_s;
536
        searchin++;
537
        if (DSBYTE[usestr_e]=='\0') return searchin;
538
    }
6021 leency 539
    return -1;
3128 leency 540
}
541
 
542
 
5582 pavelyakov 543
inline unsigned int strcpyb(dword search_in, copyin, startstr, endstr)
3128 leency 544
{
5573 pavelyakov 545
    dword startp, endp;
546
    dword copyin_start_off = copyin;
547
    if (startstr==0) startp = search_in; else startp = strstr(search_in, startstr) + strlen(startstr);
548
    endp = strstri(startp, endstr);
549
    if (endp==0) endp = startp+strlen(search_in);
550
    //if (startp==endp) return 0;
551
    do
552
    {
553
        DSBYTE[copyin] = DSBYTE[startp];
554
        copyin++;
555
        startp++;
556
    }
557
    while (startp
558
    DSBYTE[copyin] = '\0';
559
    return copyin_start_off;
3128 leency 560
}
561
 
562
 
5423 leency 563
/*void strcat(char *to, char *from)
3081 leency 564
{
5573 pavelyakov 565
    while(*to) to++;
566
    while(*from)
567
    {
568
        *to = *from;
569
        to++;
570
        from++;
571
    }
572
    *to = '\0';
3081 leency 573
}*/
574
 
3114 leency 575
 
3067 leency 576
inline fastcall dword atoi( EDI)
577
{
5573 pavelyakov 578
    $push ebx
579
    $push esi
580
    ESI=EDI;
581
    while (DSBYTE[ESI]==' ') ESI++;
582
    if (DSBYTE[ESI]=='-') ESI++;
583
    EAX=0;
584
    while (DSBYTE[ESI]>='0') && (DSBYTE[ESI]<='9')
585
    {
586
        $xor ebx, ebx
587
        EBX = DSBYTE[ESI]-'0';
588
        EAX *= 10;
589
        EAX += EBX;
590
        ESI++;
591
    }
592
    IF (DSBYTE[EDI]=='-') -EAX;
593
    $pop esi
594
    $pop ebx
3067 leency 595
}
596
 
597
 
598
 
599
inline fastcall strupr( ESI)
600
{
5573 pavelyakov 601
    do{
602
        AL=DSBYTE[ESI];
603
        IF(AL>='a')IF(AL<='z')DSBYTE[ESI]=AL&0x5f;
604
        IF (AL>=160) && (AL<=175) DSBYTE[ESI] = AL - 32;    //à-ï
605
        IF (AL>=224) && (AL<=239) DSBYTE[ESI] = AL - 80;    //à-ï
606
         ESI++;
607
    }while(AL!=0);
3067 leency 608
}
609
 
610
inline fastcall strlwr( ESI)
611
{
5573 pavelyakov 612
    do{
613
        $LODSB
614
        IF(AL>='A')&&(AL<='Z'){
615
            AL+=0x20;
616
            DSBYTE[ESI-1]=AL;
617
            CONTINUE;
618
        }
619
    }while(AL!=0);
3067 leency 620
}
621
 
622
inline fastcall strttl( EDX)
623
{
5573 pavelyakov 624
    AL=DSBYTE[EDX];
625
    IF(AL>='a')&&(AL<='z')DSBYTE[EDX]=AL&0x5f;
626
    IF (AL>=160) && (AL<=175) DSBYTE[EDX] = AL - 32;    //à-ï
627
    IF (AL>=224) && (AL<=239) DSBYTE[EDX] = AL - 80;    //à-ï
628
    do{
629
        EDX++;
630
        AL=DSBYTE[EDX];
631
        IF(AL>='A')&&(AL<='Z'){DSBYTE[EDX]=AL|0x20; CONTINUE;}
632
        IF(AL>='€')&&(AL<='')DSBYTE[EDX]=AL|0x20; // -¯
633
        IF (AL>=144) && (AL<=159) DSBYTE[EDX] = AL + 80;    //à-ï
634
    }while(AL!=0);
3067 leency 635
}
636
 
5573 pavelyakov 637
/*
4166 leency 638
dword itoa( ESI)
639
{
4639 yogev_ezra 640
    unsigned char buffer[11];
5573 pavelyakov 641
    $pusha
642
    EDI = #buffer;
643
    ECX = 10;
644
    if (ESI < 0)
645
    {
646
         $mov     al, '-'
647
         $stosb
648
         $neg     esi
649
    }
4166 leency 650
 
5573 pavelyakov 651
    $mov     eax, esi
652
    $push    -'0'
4166 leency 653
F2:
5573 pavelyakov 654
    $xor     edx, edx
655
    $div     ecx
656
    $push    edx
657
    $test    eax, eax
658
    $jnz     F2
4166 leency 659
F3:
5573 pavelyakov 660
    $pop     eax
661
    $add     al, '0'
662
    $stosb
663
    $jnz     F3
664
 
665
    $mov     al, '\0'
666
    $stosb
4166 leency 667
 
5573 pavelyakov 668
    $popa
4166 leency 669
    return #buffer;
670
}
5573 pavelyakov 671
*/
5591 pavelyakov 672
:unsigned char BUF_ITOA[11];
5575 pavelyakov 673
inline dword itoa(signed long number)
4166 leency 674
{
5576 pavelyakov 675
	dword ret,p;
5573 pavelyakov 676
	byte cmd;
677
	long mask,tmp;
678
	mask = 1000000000;
679
	cmd = true;
5591 pavelyakov 680
	p = #BUF_ITOA;
5573 pavelyakov 681
	if(!number){
5576 pavelyakov 682
		ESBYTE[p] = '0';
683
		ESBYTE[p+1] = 0;
684
		return p;
5573 pavelyakov 685
	}
5576 pavelyakov 686
	ret = p;
5573 pavelyakov 687
	if(number<0)
4166 leency 688
	{
5573 pavelyakov 689
		$neg number
5576 pavelyakov 690
		ESBYTE[p] = '-';
691
		$inc p
4166 leency 692
	}
5573 pavelyakov 693
	while(mask)
694
	{
695
		tmp = number / mask;
696
		tmp = tmp%10;
697
 
698
		if(cmd){
699
			if(tmp){
5576 pavelyakov 700
				ESBYTE[p] = tmp + '0';
701
				$inc p
5573 pavelyakov 702
				cmd = false;
703
			}
704
		}
705
		else {
5576 pavelyakov 706
			ESBYTE[p] = tmp + '0';
707
			$inc p
5573 pavelyakov 708
		}
709
		mask /= 10;
710
	}
5576 pavelyakov 711
	ESBYTE[p] = 0;
5573 pavelyakov 712
	return ret;
713
}
5576 pavelyakov 714
 
5582 pavelyakov 715
inline fastcall itoa_(signed int EDI, ESI)
5573 pavelyakov 716
{
717
    $pusha
718
    EBX = EDI;
719
    ECX = 10;
720
    if (ESI > 90073741824)
721
    {
722
         $mov     al, '-'
723
         $stosb
724
         $neg     esi
725
    }
4166 leency 726
 
5573 pavelyakov 727
    $mov     eax, esi
728
    $push    -'0'
4166 leency 729
F2:
5573 pavelyakov 730
    $xor     edx, edx
731
    $div     ecx
732
    $push    edx
733
    $test    eax, eax
734
    $jnz     F2
4166 leency 735
F3:
5573 pavelyakov 736
    $pop     eax
737
    $add     al, '0'
738
    $stosb
739
    $jnz     F3
740
 
741
    $mov     al, '\0'
742
    $stosb
4166 leency 743
 
5573 pavelyakov 744
    $popa
4166 leency 745
    return EBX;
5573 pavelyakov 746
}
4166 leency 747
 
5582 pavelyakov 748
inline dword memchr(dword s,int c,signed len)
5573 pavelyakov 749
{
5576 pavelyakov 750
	if(!len) return NULL;
751
	do {
752
		if(DSBYTE[s] == c) return s;
753
		$inc s
754
		$dec len
755
	} while(len);
756
	return NULL;
757
}
758
 
5582 pavelyakov 759
inline dword strdup(dword text)
5576 pavelyakov 760
{
5573 pavelyakov 761
    dword l = strlen(text);
762
    dword ret = malloc(l+1);
5576 pavelyakov 763
	if(!ret) return NULL;
5803 leency 764
    strlcpy(ret,text,l);
5573 pavelyakov 765
    return ret;
766
}
767
 
5582 pavelyakov 768
inline dword strndup(dword str, signed maxlen)
5575 pavelyakov 769
{
770
	dword copy,len;
771
 
772
	len = strnlen(str, maxlen);
773
	copy = malloc(len + 1);
774
	if (copy != NULL)
775
	{
5803 leency 776
		strlcpy(copy, str, len);
5575 pavelyakov 777
		DSBYTE[len+copy] = '\0';
778
	}
779
	return copy;
780
}
781
 
5582 pavelyakov 782
inline dword hexdec(dword text)
5576 pavelyakov 783
{
5582 pavelyakov 784
	char s;
785
	dword ret,l;
786
	ret = 0;
787
	s = DSBYTE[text];
788
	while(s)
789
	{
790
		ret <<= 4;
791
		if(s>='A')&&(s<='F')ret |= s-'A'+10;
792
		else if(s>='a')&&(s<='f')ret |= s-'a'+10;
5598 pavelyakov 793
		else if(s>='0')&&(s<='9')ret |= s-'0';
5582 pavelyakov 794
		text++;
795
		s = DSBYTE[text];
796
	}
5598 pavelyakov 797
	return ret;
798
}
799
 
800
inline signed csshexdec(dword text)
801
{
802
	char s;
803
	dword ret,l;
804
	byte tmp;
805
	l = strlen(text);
806
	ret = 0;
807
	s = DSBYTE[text];
808
	tmp = 0;
809
	if(l==6) while(s)
5582 pavelyakov 810
	{
811
		ret <<= 4;
812
		if(s>='A')&&(s<='F')ret |= s-'A'+10;
813
		else if(s>='a')&&(s<='f')ret |= s-'a'+10;
5598 pavelyakov 814
		else if(s>='0')&&(s<='9')ret |= s-'0';
5582 pavelyakov 815
		text++;
816
		s = DSBYTE[text];
5598 pavelyakov 817
	}
818
	else if(l==3) while(s)
819
	{
820
		ret |= tmp;
821
		ret <<= 4;
822
		ret |= tmp;
823
		ret <<= 4;
824
		if(s>='A')&&(s<='F')tmp = s-'A'+10;
825
		else if(s>='a')&&(s<='f')tmp = s-'a'+10;
826
		else if(s>='0')&&(s<='9')tmp = s-'0';
827
		text++;
828
		s = DSBYTE[text];
829
	}
5582 pavelyakov 830
	return ret;
831
}
832
 
7435 pavelyakov 833
:dword stdcall sprintf(dword buf, format,...)
5582 pavelyakov 834
{
5576 pavelyakov 835
	byte s;
836
	dword ret, tmp, l;
837
	dword arg = #format;
838
	ret = buf;
839
	s = DSBYTE[format];
7435 pavelyakov 840
	while(s)
841
	{
842
		if(s == '%')
843
		{
844
			arg += 4;
5576 pavelyakov 845
			tmp = DSDWORD[arg];
7435 pavelyakov 846
			format++;
5576 pavelyakov 847
			s = DSBYTE[format];
7435 pavelyakov 848
			IF (!s)
849
			{
850
				DSBYTE[buf] = 0;
851
				return ret;
852
			}
5576 pavelyakov 853
			switch(s)
854
			{
855
				case 's':
856
					l = tmp;
7435 pavelyakov 857
					WHILE(DSBYTE[tmp])
5576 pavelyakov 858
					{
7435 pavelyakov 859
						DSBYTE[buf] = DSBYTE[tmp];
860
						tmp++;
861
						buf++;
5576 pavelyakov 862
					}
863
				break;
864
				case 'c':
865
					DSBYTE[buf] = tmp;
7435 pavelyakov 866
					buf++;
5576 pavelyakov 867
				break;
868
				case 'u': //if(tmp<0)return ret;
869
				case 'd':
870
				case 'i':
871
					tmp = itoa(tmp);
7435 pavelyakov 872
					IF (!DSBYTE[tmp])
873
					{
874
						DSBYTE[buf] = 0;
875
						return ret;
876
					}
5576 pavelyakov 877
					l = strlen(tmp);
5646 pavelyakov 878
					strlcpy(buf,tmp,l);
5576 pavelyakov 879
					buf += l;
880
				break;
881
				case 'a':
882
				case 'A':
7435 pavelyakov 883
					strlcpy(buf, "0x00000000", 10);
884
					buf += 10;
885
					l = buf;
886
					WHILE(tmp)
5576 pavelyakov 887
					{
7435 pavelyakov 888
						buf--;
889
						s = tmp & 0xF;
890
						IF (s > 9) DSBYTE[buf] = 'A' - 10 + s;
891
						ELSE DSBYTE[buf] = '0' + s;
892
						tmp >>= 4;
5576 pavelyakov 893
					}
7435 pavelyakov 894
					buf = l;
5576 pavelyakov 895
				break;
896
				case 'p':
897
					tmp = itoa(#tmp);
7435 pavelyakov 898
					IF (!DSBYTE[tmp])
899
					{
900
						DSBYTE[buf] = 0;
901
						return ret;
902
					}
5576 pavelyakov 903
					l = strlen(tmp);
5646 pavelyakov 904
					strlcpy(buf,tmp,l);
5576 pavelyakov 905
					buf += l;
906
				break;
907
				case '%':
908
					DSBYTE[buf] = '%';
7435 pavelyakov 909
					buf++;
5576 pavelyakov 910
				break;
911
				default:
7435 pavelyakov 912
				{
913
					DSBYTE[buf] = 0;
914
					return ret;
915
				}
5576 pavelyakov 916
			}
917
		}
7435 pavelyakov 918
		else
919
		{
5576 pavelyakov 920
			DSBYTE[buf] = s;
7435 pavelyakov 921
			buf++;
5576 pavelyakov 922
		}
7435 pavelyakov 923
		format++;
5576 pavelyakov 924
		s = DSBYTE[format];
925
	}
7435 pavelyakov 926
 
5576 pavelyakov 927
	DSBYTE[buf] = 0;
6771 leency 928
	return ret;
5576 pavelyakov 929
}
930
 
5598 pavelyakov 931
inline signed strcoll(dword text1,text2)
932
{
933
	char s,ss;
934
	loop()
935
	{
936
		s = DSBYTE[text2];
937
		ss=strchr(text1,s);
938
		if(ss)return ss;
939
		text2++;
940
	}
941
	return 0;
942
}
943
 
7163 leency 944
:replace_char(dword in_str, char from_char, to_char, int length) {
7049 leency 945
	int i;
946
	for (i=0; i
947
		if (ESBYTE[in_str+i] == from_char) ESBYTE[in_str+i] = to_char;
948
	}
949
	ESBYTE[in_str+length]=0;
950
}
951
 
952
 
3067 leency 953
#define strnmov strmovn
954
#define stricmp strcmpi
955
#define strcmpn strncmp
3467 leency 956
 
5598 pavelyakov 957
#endif