Subversion Repositories Kolibri OS

Rev

Rev 7863 | Rev 7941 | 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
 
7878 leency 494
inline signed int strcmpi(dword cmp1, cmp2)
4226 punk_joker 495
{
5573 pavelyakov 496
    char si, ue;
3128 leency 497
 
5573 pavelyakov 498
    loop()
499
    {
500
        si = DSBYTE[cmp1];
501
        ue = DSBYTE[cmp2];
502
        if (si>='A') && (si<='Z') si +=32;
503
        if (ue>='A') && (ue<='Z') ue +=32;
7878 leency 504
        if (si != ue) return si-ue;
5573 pavelyakov 505
        cmp1++;
506
        cmp2++;
507
        if ((DSBYTE[cmp1]=='\0') && (DSBYTE[cmp2]=='\0')) return 0;
508
        if (DSBYTE[cmp1]=='\0') return -1;
509
        if (DSBYTE[cmp2]=='\0') return 1;
510
    }
4226 punk_joker 511
}
512
 
5582 pavelyakov 513
inline dword strstri(dword searchin, usestr_s)
3128 leency 514
{
5573 pavelyakov 515
    dword usestr_e = usestr_s;
516
    char si, ue;
3128 leency 517
 
5573 pavelyakov 518
    while(DSBYTE[searchin])
519
    {
520
        si = DSBYTE[searchin];
521
        ue = DSBYTE[usestr_e];
522
        if (si>='A') && (si<='Z') si +=32;
523
        if (ue>='A') && (ue<='Z') ue +=32;
524
        if (si == ue) usestr_e++; else usestr_e = usestr_s;
525
        searchin++;
526
        if (DSBYTE[usestr_e]=='\0') return searchin;
527
    }
6021 leency 528
    return -1;
3128 leency 529
}
530
 
531
 
5582 pavelyakov 532
inline unsigned int strcpyb(dword search_in, copyin, startstr, endstr)
3128 leency 533
{
5573 pavelyakov 534
    dword startp, endp;
535
    dword copyin_start_off = copyin;
536
    if (startstr==0) startp = search_in; else startp = strstr(search_in, startstr) + strlen(startstr);
537
    endp = strstri(startp, endstr);
538
    if (endp==0) endp = startp+strlen(search_in);
539
    //if (startp==endp) return 0;
540
    do
541
    {
542
        DSBYTE[copyin] = DSBYTE[startp];
543
        copyin++;
544
        startp++;
545
    }
546
    while (startp
547
    DSBYTE[copyin] = '\0';
548
    return copyin_start_off;
3128 leency 549
}
550
 
551
 
5423 leency 552
/*void strcat(char *to, char *from)
3081 leency 553
{
5573 pavelyakov 554
    while(*to) to++;
555
    while(*from)
556
    {
557
        *to = *from;
558
        to++;
559
        from++;
560
    }
561
    *to = '\0';
3081 leency 562
}*/
563
 
3114 leency 564
 
3067 leency 565
inline fastcall dword atoi( EDI)
566
{
5573 pavelyakov 567
    $push ebx
568
    $push esi
569
    ESI=EDI;
570
    while (DSBYTE[ESI]==' ') ESI++;
571
    if (DSBYTE[ESI]=='-') ESI++;
572
    EAX=0;
573
    while (DSBYTE[ESI]>='0') && (DSBYTE[ESI]<='9')
574
    {
575
        $xor ebx, ebx
576
        EBX = DSBYTE[ESI]-'0';
577
        EAX *= 10;
578
        EAX += EBX;
579
        ESI++;
580
    }
581
    IF (DSBYTE[EDI]=='-') -EAX;
582
    $pop esi
583
    $pop ebx
3067 leency 584
}
585
 
586
 
587
 
588
inline fastcall strupr( ESI)
589
{
5573 pavelyakov 590
    do{
591
        AL=DSBYTE[ESI];
592
        IF(AL>='a')IF(AL<='z')DSBYTE[ESI]=AL&0x5f;
593
        IF (AL>=160) && (AL<=175) DSBYTE[ESI] = AL - 32;    //à-ï
594
        IF (AL>=224) && (AL<=239) DSBYTE[ESI] = AL - 80;    //à-ï
595
         ESI++;
596
    }while(AL!=0);
3067 leency 597
}
598
 
599
inline fastcall strlwr( ESI)
600
{
5573 pavelyakov 601
    do{
602
        $LODSB
603
        IF(AL>='A')&&(AL<='Z'){
604
            AL+=0x20;
605
            DSBYTE[ESI-1]=AL;
606
            CONTINUE;
607
        }
608
    }while(AL!=0);
3067 leency 609
}
610
 
611
inline fastcall strttl( EDX)
612
{
5573 pavelyakov 613
    AL=DSBYTE[EDX];
614
    IF(AL>='a')&&(AL<='z')DSBYTE[EDX]=AL&0x5f;
615
    IF (AL>=160) && (AL<=175) DSBYTE[EDX] = AL - 32;    //à-ï
616
    IF (AL>=224) && (AL<=239) DSBYTE[EDX] = AL - 80;    //à-ï
617
    do{
618
        EDX++;
619
        AL=DSBYTE[EDX];
620
        IF(AL>='A')&&(AL<='Z'){DSBYTE[EDX]=AL|0x20; CONTINUE;}
621
        IF(AL>='€')&&(AL<='')DSBYTE[EDX]=AL|0x20; // -¯
622
        IF (AL>=144) && (AL<=159) DSBYTE[EDX] = AL + 80;    //à-ï
623
    }while(AL!=0);
3067 leency 624
}
625
 
5573 pavelyakov 626
/*
4166 leency 627
dword itoa( ESI)
628
{
4639 yogev_ezra 629
    unsigned char buffer[11];
5573 pavelyakov 630
    $pusha
631
    EDI = #buffer;
632
    ECX = 10;
633
    if (ESI < 0)
634
    {
635
         $mov     al, '-'
636
         $stosb
637
         $neg     esi
638
    }
4166 leency 639
 
5573 pavelyakov 640
    $mov     eax, esi
641
    $push    -'0'
4166 leency 642
F2:
5573 pavelyakov 643
    $xor     edx, edx
644
    $div     ecx
645
    $push    edx
646
    $test    eax, eax
647
    $jnz     F2
4166 leency 648
F3:
5573 pavelyakov 649
    $pop     eax
650
    $add     al, '0'
651
    $stosb
652
    $jnz     F3
653
 
654
    $mov     al, '\0'
655
    $stosb
4166 leency 656
 
5573 pavelyakov 657
    $popa
4166 leency 658
    return #buffer;
659
}
5573 pavelyakov 660
*/
5591 pavelyakov 661
:unsigned char BUF_ITOA[11];
5575 pavelyakov 662
inline dword itoa(signed long number)
4166 leency 663
{
5576 pavelyakov 664
	dword ret,p;
5573 pavelyakov 665
	byte cmd;
666
	long mask,tmp;
667
	mask = 1000000000;
668
	cmd = true;
5591 pavelyakov 669
	p = #BUF_ITOA;
5573 pavelyakov 670
	if(!number){
5576 pavelyakov 671
		ESBYTE[p] = '0';
672
		ESBYTE[p+1] = 0;
673
		return p;
5573 pavelyakov 674
	}
5576 pavelyakov 675
	ret = p;
5573 pavelyakov 676
	if(number<0)
4166 leency 677
	{
5573 pavelyakov 678
		$neg number
5576 pavelyakov 679
		ESBYTE[p] = '-';
680
		$inc p
4166 leency 681
	}
5573 pavelyakov 682
	while(mask)
683
	{
684
		tmp = number / mask;
685
		tmp = tmp%10;
686
 
687
		if(cmd){
688
			if(tmp){
5576 pavelyakov 689
				ESBYTE[p] = tmp + '0';
690
				$inc p
5573 pavelyakov 691
				cmd = false;
692
			}
693
		}
694
		else {
5576 pavelyakov 695
			ESBYTE[p] = tmp + '0';
696
			$inc p
5573 pavelyakov 697
		}
698
		mask /= 10;
699
	}
5576 pavelyakov 700
	ESBYTE[p] = 0;
5573 pavelyakov 701
	return ret;
702
}
5576 pavelyakov 703
 
5582 pavelyakov 704
inline fastcall itoa_(signed int EDI, ESI)
5573 pavelyakov 705
{
706
    $pusha
707
    EBX = EDI;
708
    ECX = 10;
709
    if (ESI > 90073741824)
710
    {
711
         $mov     al, '-'
712
         $stosb
713
         $neg     esi
714
    }
4166 leency 715
 
5573 pavelyakov 716
    $mov     eax, esi
717
    $push    -'0'
4166 leency 718
F2:
5573 pavelyakov 719
    $xor     edx, edx
720
    $div     ecx
721
    $push    edx
722
    $test    eax, eax
723
    $jnz     F2
4166 leency 724
F3:
5573 pavelyakov 725
    $pop     eax
726
    $add     al, '0'
727
    $stosb
728
    $jnz     F3
729
 
730
    $mov     al, '\0'
731
    $stosb
4166 leency 732
 
5573 pavelyakov 733
    $popa
4166 leency 734
    return EBX;
5573 pavelyakov 735
}
4166 leency 736
 
5582 pavelyakov 737
inline dword memchr(dword s,int c,signed len)
5573 pavelyakov 738
{
5576 pavelyakov 739
	if(!len) return NULL;
740
	do {
741
		if(DSBYTE[s] == c) return s;
742
		$inc s
743
		$dec len
744
	} while(len);
745
	return NULL;
746
}
747
 
5582 pavelyakov 748
inline dword strdup(dword text)
5576 pavelyakov 749
{
5573 pavelyakov 750
    dword l = strlen(text);
751
    dword ret = malloc(l+1);
5576 pavelyakov 752
	if(!ret) return NULL;
5803 leency 753
    strlcpy(ret,text,l);
5573 pavelyakov 754
    return ret;
755
}
756
 
5582 pavelyakov 757
inline dword strndup(dword str, signed maxlen)
5575 pavelyakov 758
{
759
	dword copy,len;
760
 
761
	len = strnlen(str, maxlen);
762
	copy = malloc(len + 1);
763
	if (copy != NULL)
764
	{
5803 leency 765
		strlcpy(copy, str, len);
5575 pavelyakov 766
		DSBYTE[len+copy] = '\0';
767
	}
768
	return copy;
769
}
770
 
5582 pavelyakov 771
inline dword hexdec(dword text)
5576 pavelyakov 772
{
5582 pavelyakov 773
	char s;
774
	dword ret,l;
775
	ret = 0;
776
	s = DSBYTE[text];
777
	while(s)
778
	{
779
		ret <<= 4;
780
		if(s>='A')&&(s<='F')ret |= s-'A'+10;
781
		else if(s>='a')&&(s<='f')ret |= s-'a'+10;
5598 pavelyakov 782
		else if(s>='0')&&(s<='9')ret |= s-'0';
5582 pavelyakov 783
		text++;
784
		s = DSBYTE[text];
785
	}
5598 pavelyakov 786
	return ret;
787
}
788
 
789
inline signed csshexdec(dword text)
790
{
791
	char s;
792
	dword ret,l;
793
	byte tmp;
794
	l = strlen(text);
795
	ret = 0;
796
	s = DSBYTE[text];
797
	tmp = 0;
798
	if(l==6) while(s)
5582 pavelyakov 799
	{
800
		ret <<= 4;
801
		if(s>='A')&&(s<='F')ret |= s-'A'+10;
802
		else if(s>='a')&&(s<='f')ret |= s-'a'+10;
5598 pavelyakov 803
		else if(s>='0')&&(s<='9')ret |= s-'0';
5582 pavelyakov 804
		text++;
805
		s = DSBYTE[text];
5598 pavelyakov 806
	}
807
	else if(l==3) while(s)
808
	{
809
		ret |= tmp;
810
		ret <<= 4;
811
		ret |= tmp;
812
		ret <<= 4;
813
		if(s>='A')&&(s<='F')tmp = s-'A'+10;
814
		else if(s>='a')&&(s<='f')tmp = s-'a'+10;
815
		else if(s>='0')&&(s<='9')tmp = s-'0';
816
		text++;
817
		s = DSBYTE[text];
818
	}
5582 pavelyakov 819
	return ret;
820
}
821
 
7439 leency 822
inline cdecl int sprintf(dword buf, format,...)
5582 pavelyakov 823
{
7439 leency 824
	#define END_ARGS 0xFF00FF //ARGS FUNCTION
5576 pavelyakov 825
	byte s;
7439 leency 826
	char X[10];
5576 pavelyakov 827
	dword ret, tmp, l;
828
	dword arg = #format;
829
	ret = buf;
830
	s = DSBYTE[format];
7439 leency 831
	while(s){
832
		if(s=='%'){
833
			arg+=4;
5576 pavelyakov 834
			tmp = DSDWORD[arg];
7439 leency 835
			if(tmp==END_ARGS)goto END_FUNC_SPRINTF;
836
			$inc format
5576 pavelyakov 837
			s = DSBYTE[format];
7439 leency 838
			if(!s)goto END_FUNC_SPRINTF;
5576 pavelyakov 839
			switch(s)
840
			{
841
				case 's':
842
					l = tmp;
7439 leency 843
					s = DSBYTE[tmp];
844
					while(s)
5576 pavelyakov 845
					{
7439 leency 846
						DSBYTE[buf] = s;
847
						$inc tmp
848
						$inc buf
849
						s = DSBYTE[tmp];
5576 pavelyakov 850
					}
851
				break;
852
				case 'c':
853
					DSBYTE[buf] = tmp;
7439 leency 854
					$inc buf
5576 pavelyakov 855
				break;
856
				case 'u': //if(tmp<0)return ret;
857
				case 'd':
858
				case 'i':
859
					tmp = itoa(tmp);
7439 leency 860
					if(!DSBYTE[tmp])goto END_FUNC_SPRINTF;
5576 pavelyakov 861
					l = strlen(tmp);
5646 pavelyakov 862
					strlcpy(buf,tmp,l);
5576 pavelyakov 863
					buf += l;
864
				break;
865
				case 'a':
866
				case 'A':
7439 leency 867
					strlcpy(buf,"0x00000000",10);
868
					buf+=10;
869
					l=buf;
870
					while(tmp)
5576 pavelyakov 871
					{
7439 leency 872
						$dec buf
873
						s=tmp&0xF;
874
						if(s>9)DSBYTE[buf]='A'+s-10;
875
						else DSBYTE[buf]='0'+s;
876
						tmp>>=4;
5576 pavelyakov 877
					}
7439 leency 878
					buf=l;
5576 pavelyakov 879
				break;
880
				case 'p':
881
					tmp = itoa(#tmp);
7439 leency 882
					if(!DSBYTE[tmp])goto END_FUNC_SPRINTF;
5576 pavelyakov 883
					l = strlen(tmp);
5646 pavelyakov 884
					strlcpy(buf,tmp,l);
5576 pavelyakov 885
					buf += l;
886
				break;
887
				case '%':
888
					DSBYTE[buf] = '%';
7439 leency 889
					$inc buf
5576 pavelyakov 890
				break;
891
				default:
7439 leency 892
				goto END_FUNC_SPRINTF;
5576 pavelyakov 893
			}
894
		}
7439 leency 895
		else {
5576 pavelyakov 896
			DSBYTE[buf] = s;
7439 leency 897
			$inc buf
5576 pavelyakov 898
		}
7439 leency 899
		$inc format
5576 pavelyakov 900
		s = DSBYTE[format];
901
	}
7439 leency 902
	END_FUNC_SPRINTF:
5576 pavelyakov 903
	DSBYTE[buf] = 0;
6771 leency 904
	return ret;
5576 pavelyakov 905
}
906
 
5598 pavelyakov 907
inline signed strcoll(dword text1,text2)
908
{
909
	char s,ss;
910
	loop()
911
	{
912
		s = DSBYTE[text2];
913
		ss=strchr(text1,s);
914
		if(ss)return ss;
915
		text2++;
916
	}
917
	return 0;
918
}
919
 
7764 leency 920
// void * memset( ptr, value, num );
921
// fills the memory with a dword
922
// example: memset(str,'-', sizeof(str));
923
inline void MEMSETD(EDI,ECX,EAX)
924
{
925
	$REP
926
	$STOSD
927
}
928
 
7163 leency 929
:replace_char(dword in_str, char from_char, to_char, int length) {
7863 leency 930
	dword max = in_str + length;
931
	while (in_str < max) {
932
		if (ESBYTE[in_str] == from_char) ESBYTE[in_str] = to_char;
933
		in_str++;
7049 leency 934
	}
935
}
936
 
5598 pavelyakov 937
#endif