Subversion Repositories Kolibri OS

Rev

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