Subversion Repositories Kolibri OS

Rev

Rev 7941 | Rev 8278 | 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
 
209
inline fastcall streq(ESI, EDI)
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
	return true;
224
}
225
 
3363 leency 226
inline fastcall void strcpy( EDI, ESI)
3067 leency 227
{
5573 pavelyakov 228
    $cld
3107 leency 229
L2:
5573 pavelyakov 230
    $lodsb
231
    $stosb
232
    $test al,al
233
    $jnz L2
3067 leency 234
}
235
 
3128 leency 236
inline fastcall int strlcpy(dword ESI, EDI, EBX)
237
{
5573 pavelyakov 238
    if (EBX<0) return -1;
239
    EDX=0;
240
    do {
241
        DSBYTE[ESI]=DSBYTE[EDI];
242
        ESI++;
243
        EDI++;
244
        EDX++;
245
        if (EDX==EBX) { DSBYTE[ESI]='\0'; return -1;}
246
    } while(DSBYTE[EDI-1]!='\0');
247
    return 0;
3128 leency 248
}
249
 
7049 leency 250
:void strncpy(dword dst, src, len)
251
{
7758 leency 252
	while (len) && (ESBYTE[src])
7049 leency 253
	{
254
		ESBYTE[dst] = ESBYTE[src];
255
		dst++;
256
		src++;
257
		len--;
258
	}
259
	ESBYTE[dst]=0;
260
}
261
 
5573 pavelyakov 262
/*
263
inline fastcall void strtrim( ESI)
3448 esevece 264
{
5573 pavelyakov 265
    EDI = ESI;
266
    do{
267
        AL=DSBYTE[EDI];
268
        if (AL != '\32') && (AL != '\13') && (AL != '\10')
269
        {
270
            DSBYTE[ESI]=AL;
271
            $inc ESI
272
        }
273
         $inc EDI
274
    }while(AL!=0);
275
    DSBYTE[ESI] = '\0';
276
}
277
*/
278
 
5582 pavelyakov 279
inline byte __isWhite(int s){ if (s==13)||(s==32)||(s==10)||(s==9) return true; return false; }
5575 pavelyakov 280
inline void strltrim(dword text){
5573 pavelyakov 281
	int s;
282
	dword back_text;
283
	back_text = text;
284
	s = ESBYTE[text];
285
	while(__isWhite(s))
286
	{
287
		$inc text
288
		s = ESBYTE[text];
289
	}
290
	loop()
291
	{
292
		ESBYTE[back_text] = s;
293
		$inc back_text
294
		if(!s) break;
295
		$inc text
296
		s = ESBYTE[text];
297
	};
298
}
299
 
5575 pavelyakov 300
inline void strrtrim(dword text)
5573 pavelyakov 301
{
302
	int s;
303
	dword p;
304
	do {
305
		s = ESBYTE[text];
306
		if(__isWhite(s))
3448 esevece 307
		{
5573 pavelyakov 308
			p = text;
309
			while(__isWhite(s))
310
			{
311
				$inc text;
312
				s = ESBYTE[text];
313
			}
3448 esevece 314
		}
5573 pavelyakov 315
		else $inc text
316
	} while(s);
317
	$dec text
318
	s = ESBYTE[text];
319
	if(__isWhite(s)) ESBYTE[p] = 0;
3448 esevece 320
}
3128 leency 321
 
5575 pavelyakov 322
inline void strtrim(dword text){
5573 pavelyakov 323
	int s;
324
	dword p,back_text;
325
	back_text = text;
326
	s = ESBYTE[text];
327
	while(__isWhite(s))
328
	{
329
		$inc text
330
		s = ESBYTE[text];
331
	}
332
	do {
333
		s = ESBYTE[text];
334
		if(__isWhite(s))
335
		{
336
			p = back_text;
337
			while(__isWhite(s))
338
			{
339
				ESBYTE[back_text] = s;
340
				$inc back_text
341
				$inc text;
342
				s = ESBYTE[text];
343
			}
344
		}
345
		else {
346
			ESBYTE[back_text] = s;
347
			$inc back_text
348
			$inc text
349
		}
350
	} while(s);
351
	$dec text
352
	s = ESBYTE[text];
353
	if(__isWhite(s)) ESBYTE[p] = 0;
354
}
3128 leency 355
 
3363 leency 356
inline fastcall void strcat( EDI, ESI)
3067 leency 357
{
358
  asm {
359
    mov ebx, edi
360
    xor ecx, ecx
361
    xor eax, eax
362
    dec ecx
363
    repne scasb
364
    dec edi
365
    mov edx, edi
366
    mov edi, esi
367
    xor ecx, ecx
368
    xor eax, eax
369
    dec ecx
370
    repne scasb
371
    xor ecx, 0ffffffffh
372
    mov edi, edx
373
    mov edx, ecx
374
    mov eax, edi
375
    shr ecx, 2
376
    rep movsd
377
    mov ecx, edx
378
    and ecx, 3
379
    rep movsb
380
    mov eax, ebx
5573 pavelyakov 381
    }
382
}
383
 
7757 leency 384
:void strncat(dword dst, src, len)
5573 pavelyakov 385
{
7752 leency 386
	while (ESBYTE[dst]) && (len) {
387
		dst++;
388
		len--;
389
	}
7757 leency 390
	while (ESBYTE[src]) && (len>1) {
7750 leency 391
		ESBYTE[dst] = ESBYTE[src];
392
		dst++;
393
		src++;
394
		len--;
3067 leency 395
	}
7752 leency 396
	ESBYTE[dst] = 0;
3067 leency 397
}
398
 
7757 leency 399
:void chrncat(dword dst, unsigned char s, dword len)
400
{
401
	while (ESBYTE[dst]) && (len) {
402
		dst++;
403
		len--;
404
	}
405
	if (len>1) {
406
		ESBYTE[dst] = s;
407
		ESBYTE[dst+1] = 0;
408
	}
409
}
410
 
7750 leency 411
inline fastcall void chrcat(ESI, DI)
3363 leency 412
{
7750 leency 413
    while (ESBYTE[ESI]) ESI++;
414
    ESBYTE[ESI] = DI;
415
    ESI++;
416
    ESBYTE[ESI] = 0;
3363 leency 417
}
3128 leency 418
 
5598 pavelyakov 419
inline dword strchr(dword shb;char s)
420
{
421
	char ss;
422
	loop()
423
	{
424
		ss = DSBYTE[shb];
425
		if(!ss)return 0;
426
		if(ss==s)return shb;
427
		shb++;
428
	}
3128 leency 429
}
430
 
431
inline fastcall signed int strrchr( ESI,BL)
432
{
5573 pavelyakov 433
    int jj=0, last=0;
434
    do{
435
        jj++;
436
        $lodsb
437
        IF(AL==BL) last=jj;
438
    } while(AL!=0);
439
    return last;
3128 leency 440
}
441
 
442
 
6742 leency 443
inline fastcall unsigned int chrnum( ESI, BL)
3128 leency 444
{
5573 pavelyakov 445
    int num = 0;
6742 leency 446
    while(DSBYTE[ESI])
5573 pavelyakov 447
    {
6742 leency 448
        if (DSBYTE[ESI] == BL) num++;
449
        ESI++;
5573 pavelyakov 450
    }
451
    return num;
3128 leency 452
}
453
 
454
 
3363 leency 455
inline fastcall signed int strstr( EBX, EDX)
3128 leency 456
{
457
  asm {
458
    MOV EDI, EDX
459
    XOR ECX, ECX
460
    XOR EAX, EAX
461
    DEC ECX
462
    REPNE SCASB
463
    NOT ECX
464
    DEC ECX
465
    JE LS2
466
    MOV ESI, ECX
467
    XOR ECX, ECX
468
    MOV EDI, EBX
469
    DEC ECX
470
    REPNE SCASB
471
    NOT ECX
472
    SUB ECX, ESI
473
    JBE LS2
474
    MOV EDI, EBX
475
    LEA EBX, DSDWORD[ ESI-1]
476
LS1: MOV ESI, EDX
477
    LODSB
478
    REPNE SCASB
479
    JNE LS2
480
    MOV EAX, ECX
481
    PUSH EDI
482
    MOV ECX, EBX
483
    REPE CMPSB
484
    POP EDI
485
    MOV ECX, EAX
486
    JNE LS1
487
    LEA EAX, DSDWORD[ EDI-1]
488
    JMP SHORT LS3
489
LS2: XOR EAX, EAX
490
LS3:
491
  }
492
}
493
 
7941 leency 494
inline int strnum(dword haystack, needle)
495
{
496
	int count = 0;
497
	int needle_len = strlen(needle);
498
	loop() {
499
		if (! haystack = strstr(haystack, needle)) break;
500
		haystack+=needle_len;
501
		count++;
502
	}
503
	return count;
504
}
505
 
7945 leency 506
inline int strinum(dword haystack, needle)
507
{
508
	int count = 0;
509
	int needle_len = strlen(needle);
510
	loop() {
511
		if (! haystack = strstri(haystack, needle)) break;
512
		haystack+=needle_len;
513
		count++;
514
	}
515
	return count;
516
}
517
 
7878 leency 518
inline signed int strcmpi(dword cmp1, cmp2)
4226 punk_joker 519
{
5573 pavelyakov 520
    char si, ue;
3128 leency 521
 
5573 pavelyakov 522
    loop()
523
    {
524
        si = DSBYTE[cmp1];
525
        ue = DSBYTE[cmp2];
526
        if (si>='A') && (si<='Z') si +=32;
527
        if (ue>='A') && (ue<='Z') ue +=32;
7878 leency 528
        if (si != ue) return si-ue;
5573 pavelyakov 529
        cmp1++;
530
        cmp2++;
531
        if ((DSBYTE[cmp1]=='\0') && (DSBYTE[cmp2]=='\0')) return 0;
532
        if (DSBYTE[cmp1]=='\0') return -1;
533
        if (DSBYTE[cmp2]=='\0') return 1;
534
    }
4226 punk_joker 535
}
536
 
5582 pavelyakov 537
inline dword strstri(dword searchin, usestr_s)
3128 leency 538
{
5573 pavelyakov 539
    dword usestr_e = usestr_s;
540
    char si, ue;
3128 leency 541
 
5573 pavelyakov 542
    while(DSBYTE[searchin])
543
    {
544
        si = DSBYTE[searchin];
545
        ue = DSBYTE[usestr_e];
546
        if (si>='A') && (si<='Z') si +=32;
547
        if (ue>='A') && (ue<='Z') ue +=32;
548
        if (si == ue) usestr_e++; else usestr_e = usestr_s;
549
        searchin++;
550
        if (DSBYTE[usestr_e]=='\0') return searchin;
551
    }
7945 leency 552
    return 0;
3128 leency 553
}
554
 
555
 
5582 pavelyakov 556
inline unsigned int strcpyb(dword search_in, copyin, startstr, endstr)
3128 leency 557
{
5573 pavelyakov 558
    dword startp, endp;
559
    dword copyin_start_off = copyin;
560
    if (startstr==0) startp = search_in; else startp = strstr(search_in, startstr) + strlen(startstr);
7945 leency 561
    if (! endp = strstri(startp, endstr)) endp = startp+strlen(search_in);
5573 pavelyakov 562
    //if (startp==endp) return 0;
563
    do
564
    {
565
        DSBYTE[copyin] = DSBYTE[startp];
566
        copyin++;
567
        startp++;
568
    }
569
    while (startp
570
    DSBYTE[copyin] = '\0';
571
    return copyin_start_off;
3128 leency 572
}
573
 
574
 
5423 leency 575
/*void strcat(char *to, char *from)
3081 leency 576
{
5573 pavelyakov 577
    while(*to) to++;
578
    while(*from)
579
    {
580
        *to = *from;
581
        to++;
582
        from++;
583
    }
584
    *to = '\0';
3081 leency 585
}*/
586
 
3114 leency 587
 
3067 leency 588
inline fastcall dword atoi( EDI)
589
{
5573 pavelyakov 590
    $push ebx
591
    $push esi
592
    ESI=EDI;
593
    while (DSBYTE[ESI]==' ') ESI++;
594
    if (DSBYTE[ESI]=='-') ESI++;
595
    EAX=0;
596
    while (DSBYTE[ESI]>='0') && (DSBYTE[ESI]<='9')
597
    {
598
        $xor ebx, ebx
599
        EBX = DSBYTE[ESI]-'0';
600
        EAX *= 10;
601
        EAX += EBX;
602
        ESI++;
603
    }
604
    IF (DSBYTE[EDI]=='-') -EAX;
605
    $pop esi
606
    $pop ebx
3067 leency 607
}
608
 
609
 
610
 
611
inline fastcall strupr( ESI)
612
{
5573 pavelyakov 613
    do{
614
        AL=DSBYTE[ESI];
615
        IF(AL>='a')IF(AL<='z')DSBYTE[ESI]=AL&0x5f;
616
        IF (AL>=160) && (AL<=175) DSBYTE[ESI] = AL - 32;    //à-ï
617
        IF (AL>=224) && (AL<=239) DSBYTE[ESI] = AL - 80;    //à-ï
618
         ESI++;
619
    }while(AL!=0);
3067 leency 620
}
621
 
622
inline fastcall strlwr( ESI)
623
{
5573 pavelyakov 624
    do{
625
        $LODSB
626
        IF(AL>='A')&&(AL<='Z'){
627
            AL+=0x20;
628
            DSBYTE[ESI-1]=AL;
629
            CONTINUE;
630
        }
631
    }while(AL!=0);
3067 leency 632
}
633
 
634
inline fastcall strttl( EDX)
635
{
5573 pavelyakov 636
    AL=DSBYTE[EDX];
637
    IF(AL>='a')&&(AL<='z')DSBYTE[EDX]=AL&0x5f;
638
    IF (AL>=160) && (AL<=175) DSBYTE[EDX] = AL - 32;    //à-ï
639
    IF (AL>=224) && (AL<=239) DSBYTE[EDX] = AL - 80;    //à-ï
640
    do{
641
        EDX++;
642
        AL=DSBYTE[EDX];
643
        IF(AL>='A')&&(AL<='Z'){DSBYTE[EDX]=AL|0x20; CONTINUE;}
644
        IF(AL>='€')&&(AL<='')DSBYTE[EDX]=AL|0x20; // -¯
645
        IF (AL>=144) && (AL<=159) DSBYTE[EDX] = AL + 80;    //à-ï
646
    }while(AL!=0);
3067 leency 647
}
648
 
5573 pavelyakov 649
/*
4166 leency 650
dword itoa( ESI)
651
{
4639 yogev_ezra 652
    unsigned char buffer[11];
5573 pavelyakov 653
    $pusha
654
    EDI = #buffer;
655
    ECX = 10;
656
    if (ESI < 0)
657
    {
658
         $mov     al, '-'
659
         $stosb
660
         $neg     esi
661
    }
4166 leency 662
 
5573 pavelyakov 663
    $mov     eax, esi
664
    $push    -'0'
4166 leency 665
F2:
5573 pavelyakov 666
    $xor     edx, edx
667
    $div     ecx
668
    $push    edx
669
    $test    eax, eax
670
    $jnz     F2
4166 leency 671
F3:
5573 pavelyakov 672
    $pop     eax
673
    $add     al, '0'
674
    $stosb
675
    $jnz     F3
676
 
677
    $mov     al, '\0'
678
    $stosb
4166 leency 679
 
5573 pavelyakov 680
    $popa
4166 leency 681
    return #buffer;
682
}
5573 pavelyakov 683
*/
5591 pavelyakov 684
:unsigned char BUF_ITOA[11];
5575 pavelyakov 685
inline dword itoa(signed long number)
4166 leency 686
{
5576 pavelyakov 687
	dword ret,p;
5573 pavelyakov 688
	byte cmd;
689
	long mask,tmp;
690
	mask = 1000000000;
691
	cmd = true;
5591 pavelyakov 692
	p = #BUF_ITOA;
5573 pavelyakov 693
	if(!number){
5576 pavelyakov 694
		ESBYTE[p] = '0';
695
		ESBYTE[p+1] = 0;
696
		return p;
5573 pavelyakov 697
	}
5576 pavelyakov 698
	ret = p;
5573 pavelyakov 699
	if(number<0)
4166 leency 700
	{
5573 pavelyakov 701
		$neg number
5576 pavelyakov 702
		ESBYTE[p] = '-';
703
		$inc p
4166 leency 704
	}
5573 pavelyakov 705
	while(mask)
706
	{
707
		tmp = number / mask;
708
		tmp = tmp%10;
709
 
710
		if(cmd){
711
			if(tmp){
5576 pavelyakov 712
				ESBYTE[p] = tmp + '0';
713
				$inc p
5573 pavelyakov 714
				cmd = false;
715
			}
716
		}
717
		else {
5576 pavelyakov 718
			ESBYTE[p] = tmp + '0';
719
			$inc p
5573 pavelyakov 720
		}
721
		mask /= 10;
722
	}
5576 pavelyakov 723
	ESBYTE[p] = 0;
5573 pavelyakov 724
	return ret;
725
}
5576 pavelyakov 726
 
5582 pavelyakov 727
inline fastcall itoa_(signed int EDI, ESI)
5573 pavelyakov 728
{
729
    $pusha
730
    EBX = EDI;
731
    ECX = 10;
732
    if (ESI > 90073741824)
733
    {
734
         $mov     al, '-'
735
         $stosb
736
         $neg     esi
737
    }
4166 leency 738
 
5573 pavelyakov 739
    $mov     eax, esi
740
    $push    -'0'
4166 leency 741
F2:
5573 pavelyakov 742
    $xor     edx, edx
743
    $div     ecx
744
    $push    edx
745
    $test    eax, eax
746
    $jnz     F2
4166 leency 747
F3:
5573 pavelyakov 748
    $pop     eax
749
    $add     al, '0'
750
    $stosb
751
    $jnz     F3
752
 
753
    $mov     al, '\0'
754
    $stosb
4166 leency 755
 
5573 pavelyakov 756
    $popa
4166 leency 757
    return EBX;
5573 pavelyakov 758
}
4166 leency 759
 
5582 pavelyakov 760
inline dword memchr(dword s,int c,signed len)
5573 pavelyakov 761
{
5576 pavelyakov 762
	if(!len) return NULL;
763
	do {
764
		if(DSBYTE[s] == c) return s;
765
		$inc s
766
		$dec len
767
	} while(len);
768
	return NULL;
769
}
770
 
5582 pavelyakov 771
inline dword strdup(dword text)
5576 pavelyakov 772
{
5573 pavelyakov 773
    dword l = strlen(text);
774
    dword ret = malloc(l+1);
5576 pavelyakov 775
	if(!ret) return NULL;
5803 leency 776
    strlcpy(ret,text,l);
5573 pavelyakov 777
    return ret;
778
}
779
 
5582 pavelyakov 780
inline dword strndup(dword str, signed maxlen)
5575 pavelyakov 781
{
782
	dword copy,len;
783
 
784
	len = strnlen(str, maxlen);
785
	copy = malloc(len + 1);
786
	if (copy != NULL)
787
	{
5803 leency 788
		strlcpy(copy, str, len);
5575 pavelyakov 789
		DSBYTE[len+copy] = '\0';
790
	}
791
	return copy;
792
}
793
 
5582 pavelyakov 794
inline dword hexdec(dword text)
5576 pavelyakov 795
{
5582 pavelyakov 796
	char s;
797
	dword ret,l;
798
	ret = 0;
799
	s = DSBYTE[text];
800
	while(s)
801
	{
802
		ret <<= 4;
803
		if(s>='A')&&(s<='F')ret |= s-'A'+10;
804
		else if(s>='a')&&(s<='f')ret |= s-'a'+10;
5598 pavelyakov 805
		else if(s>='0')&&(s<='9')ret |= s-'0';
5582 pavelyakov 806
		text++;
807
		s = DSBYTE[text];
808
	}
5598 pavelyakov 809
	return ret;
810
}
811
 
812
inline signed csshexdec(dword text)
813
{
814
	char s;
815
	dword ret,l;
816
	byte tmp;
817
	l = strlen(text);
818
	ret = 0;
819
	s = DSBYTE[text];
820
	tmp = 0;
821
	if(l==6) while(s)
5582 pavelyakov 822
	{
823
		ret <<= 4;
824
		if(s>='A')&&(s<='F')ret |= s-'A'+10;
825
		else if(s>='a')&&(s<='f')ret |= s-'a'+10;
5598 pavelyakov 826
		else if(s>='0')&&(s<='9')ret |= s-'0';
5582 pavelyakov 827
		text++;
828
		s = DSBYTE[text];
5598 pavelyakov 829
	}
830
	else if(l==3) while(s)
831
	{
832
		ret |= tmp;
833
		ret <<= 4;
834
		ret |= tmp;
835
		ret <<= 4;
836
		if(s>='A')&&(s<='F')tmp = s-'A'+10;
837
		else if(s>='a')&&(s<='f')tmp = s-'a'+10;
838
		else if(s>='0')&&(s<='9')tmp = s-'0';
839
		text++;
840
		s = DSBYTE[text];
841
	}
5582 pavelyakov 842
	return ret;
843
}
844
 
7439 leency 845
inline cdecl int sprintf(dword buf, format,...)
5582 pavelyakov 846
{
7439 leency 847
	#define END_ARGS 0xFF00FF //ARGS FUNCTION
5576 pavelyakov 848
	byte s;
7439 leency 849
	char X[10];
5576 pavelyakov 850
	dword ret, tmp, l;
851
	dword arg = #format;
852
	ret = buf;
853
	s = DSBYTE[format];
7439 leency 854
	while(s){
855
		if(s=='%'){
856
			arg+=4;
5576 pavelyakov 857
			tmp = DSDWORD[arg];
7439 leency 858
			if(tmp==END_ARGS)goto END_FUNC_SPRINTF;
859
			$inc format
5576 pavelyakov 860
			s = DSBYTE[format];
7439 leency 861
			if(!s)goto END_FUNC_SPRINTF;
5576 pavelyakov 862
			switch(s)
863
			{
864
				case 's':
865
					l = tmp;
7439 leency 866
					s = DSBYTE[tmp];
867
					while(s)
5576 pavelyakov 868
					{
7439 leency 869
						DSBYTE[buf] = s;
870
						$inc tmp
871
						$inc buf
872
						s = DSBYTE[tmp];
5576 pavelyakov 873
					}
874
				break;
875
				case 'c':
876
					DSBYTE[buf] = tmp;
7439 leency 877
					$inc buf
5576 pavelyakov 878
				break;
879
				case 'u': //if(tmp<0)return ret;
880
				case 'd':
881
				case 'i':
882
					tmp = itoa(tmp);
7439 leency 883
					if(!DSBYTE[tmp])goto END_FUNC_SPRINTF;
5576 pavelyakov 884
					l = strlen(tmp);
5646 pavelyakov 885
					strlcpy(buf,tmp,l);
5576 pavelyakov 886
					buf += l;
887
				break;
888
				case 'a':
889
				case 'A':
7439 leency 890
					strlcpy(buf,"0x00000000",10);
891
					buf+=10;
892
					l=buf;
893
					while(tmp)
5576 pavelyakov 894
					{
7439 leency 895
						$dec buf
896
						s=tmp&0xF;
897
						if(s>9)DSBYTE[buf]='A'+s-10;
898
						else DSBYTE[buf]='0'+s;
899
						tmp>>=4;
5576 pavelyakov 900
					}
7439 leency 901
					buf=l;
5576 pavelyakov 902
				break;
903
				case 'p':
904
					tmp = itoa(#tmp);
7439 leency 905
					if(!DSBYTE[tmp])goto END_FUNC_SPRINTF;
5576 pavelyakov 906
					l = strlen(tmp);
5646 pavelyakov 907
					strlcpy(buf,tmp,l);
5576 pavelyakov 908
					buf += l;
909
				break;
910
				case '%':
911
					DSBYTE[buf] = '%';
7439 leency 912
					$inc buf
5576 pavelyakov 913
				break;
914
				default:
7439 leency 915
				goto END_FUNC_SPRINTF;
5576 pavelyakov 916
			}
917
		}
7439 leency 918
		else {
5576 pavelyakov 919
			DSBYTE[buf] = s;
7439 leency 920
			$inc buf
5576 pavelyakov 921
		}
7439 leency 922
		$inc format
5576 pavelyakov 923
		s = DSBYTE[format];
924
	}
7439 leency 925
	END_FUNC_SPRINTF:
5576 pavelyakov 926
	DSBYTE[buf] = 0;
6771 leency 927
	return ret;
5576 pavelyakov 928
}
929
 
5598 pavelyakov 930
inline signed strcoll(dword text1,text2)
931
{
932
	char s,ss;
933
	loop()
934
	{
935
		s = DSBYTE[text2];
936
		ss=strchr(text1,s);
937
		if(ss)return ss;
938
		text2++;
939
	}
940
	return 0;
941
}
942
 
7764 leency 943
// void * memset( ptr, value, num );
944
// fills the memory with a dword
945
// example: memset(str,'-', sizeof(str));
946
inline void MEMSETD(EDI,ECX,EAX)
947
{
948
	$REP
949
	$STOSD
950
}
951
 
7163 leency 952
:replace_char(dword in_str, char from_char, to_char, int length) {
7863 leency 953
	dword max = in_str + length;
954
	while (in_str < max) {
955
		if (ESBYTE[in_str] == from_char) ESBYTE[in_str] = to_char;
956
		in_str++;
7049 leency 957
	}
958
}
959
 
5598 pavelyakov 960
#endif