Subversion Repositories Kolibri OS

Rev

Rev 7439 | Rev 7742 | 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
{
7506 leency 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
 
7439 leency 833
inline cdecl int sprintf(dword buf, format,...)
5582 pavelyakov 834
{
7439 leency 835
	#define END_ARGS 0xFF00FF //ARGS FUNCTION
5576 pavelyakov 836
	byte s;
7439 leency 837
	char X[10];
5576 pavelyakov 838
	dword ret, tmp, l;
839
	dword arg = #format;
840
	ret = buf;
841
	s = DSBYTE[format];
7439 leency 842
	while(s){
843
		if(s=='%'){
844
			arg+=4;
5576 pavelyakov 845
			tmp = DSDWORD[arg];
7439 leency 846
			if(tmp==END_ARGS)goto END_FUNC_SPRINTF;
847
			$inc format
5576 pavelyakov 848
			s = DSBYTE[format];
7439 leency 849
			if(!s)goto END_FUNC_SPRINTF;
5576 pavelyakov 850
			switch(s)
851
			{
852
				case 's':
853
					l = tmp;
7439 leency 854
					s = DSBYTE[tmp];
855
					while(s)
5576 pavelyakov 856
					{
7439 leency 857
						DSBYTE[buf] = s;
858
						$inc tmp
859
						$inc buf
860
						s = DSBYTE[tmp];
5576 pavelyakov 861
					}
862
				break;
863
				case 'c':
864
					DSBYTE[buf] = tmp;
7439 leency 865
					$inc buf
5576 pavelyakov 866
				break;
867
				case 'u': //if(tmp<0)return ret;
868
				case 'd':
869
				case 'i':
870
					tmp = itoa(tmp);
7439 leency 871
					if(!DSBYTE[tmp])goto END_FUNC_SPRINTF;
5576 pavelyakov 872
					l = strlen(tmp);
5646 pavelyakov 873
					strlcpy(buf,tmp,l);
5576 pavelyakov 874
					buf += l;
875
				break;
876
				case 'a':
877
				case 'A':
7439 leency 878
					strlcpy(buf,"0x00000000",10);
879
					buf+=10;
880
					l=buf;
881
					while(tmp)
5576 pavelyakov 882
					{
7439 leency 883
						$dec buf
884
						s=tmp&0xF;
885
						if(s>9)DSBYTE[buf]='A'+s-10;
886
						else DSBYTE[buf]='0'+s;
887
						tmp>>=4;
5576 pavelyakov 888
					}
7439 leency 889
					buf=l;
5576 pavelyakov 890
				break;
891
				case 'p':
892
					tmp = itoa(#tmp);
7439 leency 893
					if(!DSBYTE[tmp])goto END_FUNC_SPRINTF;
5576 pavelyakov 894
					l = strlen(tmp);
5646 pavelyakov 895
					strlcpy(buf,tmp,l);
5576 pavelyakov 896
					buf += l;
897
				break;
898
				case '%':
899
					DSBYTE[buf] = '%';
7439 leency 900
					$inc buf
5576 pavelyakov 901
				break;
902
				default:
7439 leency 903
				goto END_FUNC_SPRINTF;
5576 pavelyakov 904
			}
905
		}
7439 leency 906
		else {
5576 pavelyakov 907
			DSBYTE[buf] = s;
7439 leency 908
			$inc buf
5576 pavelyakov 909
		}
7439 leency 910
		$inc format
5576 pavelyakov 911
		s = DSBYTE[format];
912
	}
7439 leency 913
	END_FUNC_SPRINTF:
5576 pavelyakov 914
	DSBYTE[buf] = 0;
6771 leency 915
	return ret;
5576 pavelyakov 916
}
917
 
5598 pavelyakov 918
inline signed strcoll(dword text1,text2)
919
{
920
	char s,ss;
921
	loop()
922
	{
923
		s = DSBYTE[text2];
924
		ss=strchr(text1,s);
925
		if(ss)return ss;
926
		text2++;
927
	}
928
	return 0;
929
}
930
 
7163 leency 931
:replace_char(dword in_str, char from_char, to_char, int length) {
7049 leency 932
	int i;
933
	for (i=0; i
934
		if (ESBYTE[in_str+i] == from_char) ESBYTE[in_str+i] = to_char;
935
	}
936
	ESBYTE[in_str+length]=0;
937
}
938
 
939
 
3067 leency 940
#define strnmov strmovn
941
#define stricmp strcmpi
942
#define strcmpn strncmp
3467 leency 943
 
5598 pavelyakov 944
#endif