Subversion Repositories Kolibri OS

Rev

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