Subversion Repositories Kolibri OS

Rev

Rev 7750 | Rev 7757 | 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
 
7750 leency 398
:void strncat(dword dst, src, dword len)
5573 pavelyakov 399
{
7752 leency 400
	while (ESBYTE[dst]) && (len) {
401
		dst++;
402
		len--;
403
	}
7750 leency 404
	while (ESBYTE[src]) && (len) {
405
		ESBYTE[dst] = ESBYTE[src];
406
		dst++;
407
		src++;
408
		len--;
3067 leency 409
	}
7752 leency 410
	ESBYTE[dst] = 0;
3067 leency 411
}
412
 
7750 leency 413
inline fastcall void chrcat(ESI, DI)
3363 leency 414
{
7750 leency 415
    while (ESBYTE[ESI]) ESI++;
416
    ESBYTE[ESI] = DI;
417
    ESI++;
418
    ESBYTE[ESI] = 0;
3363 leency 419
}
3128 leency 420
 
5598 pavelyakov 421
inline dword strchr(dword shb;char s)
422
{
423
	char ss;
424
	loop()
425
	{
426
		ss = DSBYTE[shb];
427
		if(!ss)return 0;
428
		if(ss==s)return shb;
429
		shb++;
430
	}
3128 leency 431
}
432
 
433
inline fastcall signed int strrchr( ESI,BL)
434
{
5573 pavelyakov 435
    int jj=0, last=0;
436
    do{
437
        jj++;
438
        $lodsb
439
        IF(AL==BL) last=jj;
440
    } while(AL!=0);
441
    return last;
3128 leency 442
}
443
 
444
 
6742 leency 445
inline fastcall unsigned int chrnum( ESI, BL)
3128 leency 446
{
5573 pavelyakov 447
    int num = 0;
6742 leency 448
    while(DSBYTE[ESI])
5573 pavelyakov 449
    {
6742 leency 450
        if (DSBYTE[ESI] == BL) num++;
451
        ESI++;
5573 pavelyakov 452
    }
453
    return num;
3128 leency 454
}
455
 
456
 
3363 leency 457
inline fastcall signed int strstr( EBX, EDX)
3128 leency 458
{
459
  asm {
460
    MOV EDI, EDX
461
    XOR ECX, ECX
462
    XOR EAX, EAX
463
    DEC ECX
464
    REPNE SCASB
465
    NOT ECX
466
    DEC ECX
467
    JE LS2
468
    MOV ESI, ECX
469
    XOR ECX, ECX
470
    MOV EDI, EBX
471
    DEC ECX
472
    REPNE SCASB
473
    NOT ECX
474
    SUB ECX, ESI
475
    JBE LS2
476
    MOV EDI, EBX
477
    LEA EBX, DSDWORD[ ESI-1]
478
LS1: MOV ESI, EDX
479
    LODSB
480
    REPNE SCASB
481
    JNE LS2
482
    MOV EAX, ECX
483
    PUSH EDI
484
    MOV ECX, EBX
485
    REPE CMPSB
486
    POP EDI
487
    MOV ECX, EAX
488
    JNE LS1
489
    LEA EAX, DSDWORD[ EDI-1]
490
    JMP SHORT LS3
491
LS2: XOR EAX, EAX
492
LS3:
493
  }
494
}
495
 
5582 pavelyakov 496
inline dword strcmpi(dword cmp1, cmp2)
4226 punk_joker 497
{
5573 pavelyakov 498
    char si, ue;
3128 leency 499
 
5573 pavelyakov 500
    loop()
501
    {
502
        si = DSBYTE[cmp1];
503
        ue = DSBYTE[cmp2];
504
        if (si>='A') && (si<='Z') si +=32;
505
        if (ue>='A') && (ue<='Z') ue +=32;
506
        if (si != ue) return -1;
507
        cmp1++;
508
        cmp2++;
509
        if ((DSBYTE[cmp1]=='\0') && (DSBYTE[cmp2]=='\0')) return 0;
510
        if (DSBYTE[cmp1]=='\0') return -1;
511
        if (DSBYTE[cmp2]=='\0') return 1;
512
    }
4226 punk_joker 513
}
514
 
5582 pavelyakov 515
inline dword strstri(dword searchin, usestr_s)
3128 leency 516
{
5573 pavelyakov 517
    dword usestr_e = usestr_s;
518
    char si, ue;
3128 leency 519
 
5573 pavelyakov 520
    while(DSBYTE[searchin])
521
    {
522
        si = DSBYTE[searchin];
523
        ue = DSBYTE[usestr_e];
524
        if (si>='A') && (si<='Z') si +=32;
525
        if (ue>='A') && (ue<='Z') ue +=32;
526
        if (si == ue) usestr_e++; else usestr_e = usestr_s;
527
        searchin++;
528
        if (DSBYTE[usestr_e]=='\0') return searchin;
529
    }
6021 leency 530
    return -1;
3128 leency 531
}
532
 
533
 
5582 pavelyakov 534
inline unsigned int strcpyb(dword search_in, copyin, startstr, endstr)
3128 leency 535
{
5573 pavelyakov 536
    dword startp, endp;
537
    dword copyin_start_off = copyin;
538
    if (startstr==0) startp = search_in; else startp = strstr(search_in, startstr) + strlen(startstr);
539
    endp = strstri(startp, endstr);
540
    if (endp==0) endp = startp+strlen(search_in);
541
    //if (startp==endp) return 0;
542
    do
543
    {
544
        DSBYTE[copyin] = DSBYTE[startp];
545
        copyin++;
546
        startp++;
547
    }
548
    while (startp
549
    DSBYTE[copyin] = '\0';
550
    return copyin_start_off;
3128 leency 551
}
552
 
553
 
5423 leency 554
/*void strcat(char *to, char *from)
3081 leency 555
{
5573 pavelyakov 556
    while(*to) to++;
557
    while(*from)
558
    {
559
        *to = *from;
560
        to++;
561
        from++;
562
    }
563
    *to = '\0';
3081 leency 564
}*/
565
 
3114 leency 566
 
3067 leency 567
inline fastcall dword atoi( EDI)
568
{
5573 pavelyakov 569
    $push ebx
570
    $push esi
571
    ESI=EDI;
572
    while (DSBYTE[ESI]==' ') ESI++;
573
    if (DSBYTE[ESI]=='-') ESI++;
574
    EAX=0;
575
    while (DSBYTE[ESI]>='0') && (DSBYTE[ESI]<='9')
576
    {
577
        $xor ebx, ebx
578
        EBX = DSBYTE[ESI]-'0';
579
        EAX *= 10;
580
        EAX += EBX;
581
        ESI++;
582
    }
583
    IF (DSBYTE[EDI]=='-') -EAX;
584
    $pop esi
585
    $pop ebx
3067 leency 586
}
587
 
588
 
589
 
590
inline fastcall strupr( ESI)
591
{
5573 pavelyakov 592
    do{
593
        AL=DSBYTE[ESI];
594
        IF(AL>='a')IF(AL<='z')DSBYTE[ESI]=AL&0x5f;
595
        IF (AL>=160) && (AL<=175) DSBYTE[ESI] = AL - 32;    //à-ï
596
        IF (AL>=224) && (AL<=239) DSBYTE[ESI] = AL - 80;    //à-ï
597
         ESI++;
598
    }while(AL!=0);
3067 leency 599
}
600
 
601
inline fastcall strlwr( ESI)
602
{
5573 pavelyakov 603
    do{
604
        $LODSB
605
        IF(AL>='A')&&(AL<='Z'){
606
            AL+=0x20;
607
            DSBYTE[ESI-1]=AL;
608
            CONTINUE;
609
        }
610
    }while(AL!=0);
3067 leency 611
}
612
 
613
inline fastcall strttl( EDX)
614
{
5573 pavelyakov 615
    AL=DSBYTE[EDX];
616
    IF(AL>='a')&&(AL<='z')DSBYTE[EDX]=AL&0x5f;
617
    IF (AL>=160) && (AL<=175) DSBYTE[EDX] = AL - 32;    //à-ï
618
    IF (AL>=224) && (AL<=239) DSBYTE[EDX] = AL - 80;    //à-ï
619
    do{
620
        EDX++;
621
        AL=DSBYTE[EDX];
622
        IF(AL>='A')&&(AL<='Z'){DSBYTE[EDX]=AL|0x20; CONTINUE;}
623
        IF(AL>='€')&&(AL<='')DSBYTE[EDX]=AL|0x20; // -¯
624
        IF (AL>=144) && (AL<=159) DSBYTE[EDX] = AL + 80;    //à-ï
625
    }while(AL!=0);
3067 leency 626
}
627
 
5573 pavelyakov 628
/*
4166 leency 629
dword itoa( ESI)
630
{
4639 yogev_ezra 631
    unsigned char buffer[11];
5573 pavelyakov 632
    $pusha
633
    EDI = #buffer;
634
    ECX = 10;
635
    if (ESI < 0)
636
    {
637
         $mov     al, '-'
638
         $stosb
639
         $neg     esi
640
    }
4166 leency 641
 
5573 pavelyakov 642
    $mov     eax, esi
643
    $push    -'0'
4166 leency 644
F2:
5573 pavelyakov 645
    $xor     edx, edx
646
    $div     ecx
647
    $push    edx
648
    $test    eax, eax
649
    $jnz     F2
4166 leency 650
F3:
5573 pavelyakov 651
    $pop     eax
652
    $add     al, '0'
653
    $stosb
654
    $jnz     F3
655
 
656
    $mov     al, '\0'
657
    $stosb
4166 leency 658
 
5573 pavelyakov 659
    $popa
4166 leency 660
    return #buffer;
661
}
5573 pavelyakov 662
*/
5591 pavelyakov 663
:unsigned char BUF_ITOA[11];
5575 pavelyakov 664
inline dword itoa(signed long number)
4166 leency 665
{
5576 pavelyakov 666
	dword ret,p;
5573 pavelyakov 667
	byte cmd;
668
	long mask,tmp;
669
	mask = 1000000000;
670
	cmd = true;
5591 pavelyakov 671
	p = #BUF_ITOA;
5573 pavelyakov 672
	if(!number){
5576 pavelyakov 673
		ESBYTE[p] = '0';
674
		ESBYTE[p+1] = 0;
675
		return p;
5573 pavelyakov 676
	}
5576 pavelyakov 677
	ret = p;
5573 pavelyakov 678
	if(number<0)
4166 leency 679
	{
5573 pavelyakov 680
		$neg number
5576 pavelyakov 681
		ESBYTE[p] = '-';
682
		$inc p
4166 leency 683
	}
5573 pavelyakov 684
	while(mask)
685
	{
686
		tmp = number / mask;
687
		tmp = tmp%10;
688
 
689
		if(cmd){
690
			if(tmp){
5576 pavelyakov 691
				ESBYTE[p] = tmp + '0';
692
				$inc p
5573 pavelyakov 693
				cmd = false;
694
			}
695
		}
696
		else {
5576 pavelyakov 697
			ESBYTE[p] = tmp + '0';
698
			$inc p
5573 pavelyakov 699
		}
700
		mask /= 10;
701
	}
5576 pavelyakov 702
	ESBYTE[p] = 0;
5573 pavelyakov 703
	return ret;
704
}
5576 pavelyakov 705
 
5582 pavelyakov 706
inline fastcall itoa_(signed int EDI, ESI)
5573 pavelyakov 707
{
708
    $pusha
709
    EBX = EDI;
710
    ECX = 10;
711
    if (ESI > 90073741824)
712
    {
713
         $mov     al, '-'
714
         $stosb
715
         $neg     esi
716
    }
4166 leency 717
 
5573 pavelyakov 718
    $mov     eax, esi
719
    $push    -'0'
4166 leency 720
F2:
5573 pavelyakov 721
    $xor     edx, edx
722
    $div     ecx
723
    $push    edx
724
    $test    eax, eax
725
    $jnz     F2
4166 leency 726
F3:
5573 pavelyakov 727
    $pop     eax
728
    $add     al, '0'
729
    $stosb
730
    $jnz     F3
731
 
732
    $mov     al, '\0'
733
    $stosb
4166 leency 734
 
5573 pavelyakov 735
    $popa
4166 leency 736
    return EBX;
5573 pavelyakov 737
}
4166 leency 738
 
5582 pavelyakov 739
inline dword memchr(dword s,int c,signed len)
5573 pavelyakov 740
{
5576 pavelyakov 741
	if(!len) return NULL;
742
	do {
743
		if(DSBYTE[s] == c) return s;
744
		$inc s
745
		$dec len
746
	} while(len);
747
	return NULL;
748
}
749
 
5582 pavelyakov 750
inline dword strdup(dword text)
5576 pavelyakov 751
{
5573 pavelyakov 752
    dword l = strlen(text);
753
    dword ret = malloc(l+1);
5576 pavelyakov 754
	if(!ret) return NULL;
5803 leency 755
    strlcpy(ret,text,l);
5573 pavelyakov 756
    return ret;
757
}
758
 
5582 pavelyakov 759
inline dword strndup(dword str, signed maxlen)
5575 pavelyakov 760
{
761
	dword copy,len;
762
 
763
	len = strnlen(str, maxlen);
764
	copy = malloc(len + 1);
765
	if (copy != NULL)
766
	{
5803 leency 767
		strlcpy(copy, str, len);
5575 pavelyakov 768
		DSBYTE[len+copy] = '\0';
769
	}
770
	return copy;
771
}
772
 
5582 pavelyakov 773
inline dword hexdec(dword text)
5576 pavelyakov 774
{
5582 pavelyakov 775
	char s;
776
	dword ret,l;
777
	ret = 0;
778
	s = DSBYTE[text];
779
	while(s)
780
	{
781
		ret <<= 4;
782
		if(s>='A')&&(s<='F')ret |= s-'A'+10;
783
		else if(s>='a')&&(s<='f')ret |= s-'a'+10;
5598 pavelyakov 784
		else if(s>='0')&&(s<='9')ret |= s-'0';
5582 pavelyakov 785
		text++;
786
		s = DSBYTE[text];
787
	}
5598 pavelyakov 788
	return ret;
789
}
790
 
791
inline signed csshexdec(dword text)
792
{
793
	char s;
794
	dword ret,l;
795
	byte tmp;
796
	l = strlen(text);
797
	ret = 0;
798
	s = DSBYTE[text];
799
	tmp = 0;
800
	if(l==6) while(s)
5582 pavelyakov 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];
5598 pavelyakov 808
	}
809
	else if(l==3) while(s)
810
	{
811
		ret |= tmp;
812
		ret <<= 4;
813
		ret |= tmp;
814
		ret <<= 4;
815
		if(s>='A')&&(s<='F')tmp = s-'A'+10;
816
		else if(s>='a')&&(s<='f')tmp = s-'a'+10;
817
		else if(s>='0')&&(s<='9')tmp = s-'0';
818
		text++;
819
		s = DSBYTE[text];
820
	}
5582 pavelyakov 821
	return ret;
822
}
823
 
7439 leency 824
inline cdecl int sprintf(dword buf, format,...)
5582 pavelyakov 825
{
7439 leency 826
	#define END_ARGS 0xFF00FF //ARGS FUNCTION
5576 pavelyakov 827
	byte s;
7439 leency 828
	char X[10];
5576 pavelyakov 829
	dword ret, tmp, l;
830
	dword arg = #format;
831
	ret = buf;
832
	s = DSBYTE[format];
7439 leency 833
	while(s){
834
		if(s=='%'){
835
			arg+=4;
5576 pavelyakov 836
			tmp = DSDWORD[arg];
7439 leency 837
			if(tmp==END_ARGS)goto END_FUNC_SPRINTF;
838
			$inc format
5576 pavelyakov 839
			s = DSBYTE[format];
7439 leency 840
			if(!s)goto END_FUNC_SPRINTF;
5576 pavelyakov 841
			switch(s)
842
			{
843
				case 's':
844
					l = tmp;
7439 leency 845
					s = DSBYTE[tmp];
846
					while(s)
5576 pavelyakov 847
					{
7439 leency 848
						DSBYTE[buf] = s;
849
						$inc tmp
850
						$inc buf
851
						s = DSBYTE[tmp];
5576 pavelyakov 852
					}
853
				break;
854
				case 'c':
855
					DSBYTE[buf] = tmp;
7439 leency 856
					$inc buf
5576 pavelyakov 857
				break;
858
				case 'u': //if(tmp<0)return ret;
859
				case 'd':
860
				case 'i':
861
					tmp = itoa(tmp);
7439 leency 862
					if(!DSBYTE[tmp])goto END_FUNC_SPRINTF;
5576 pavelyakov 863
					l = strlen(tmp);
5646 pavelyakov 864
					strlcpy(buf,tmp,l);
5576 pavelyakov 865
					buf += l;
866
				break;
867
				case 'a':
868
				case 'A':
7439 leency 869
					strlcpy(buf,"0x00000000",10);
870
					buf+=10;
871
					l=buf;
872
					while(tmp)
5576 pavelyakov 873
					{
7439 leency 874
						$dec buf
875
						s=tmp&0xF;
876
						if(s>9)DSBYTE[buf]='A'+s-10;
877
						else DSBYTE[buf]='0'+s;
878
						tmp>>=4;
5576 pavelyakov 879
					}
7439 leency 880
					buf=l;
5576 pavelyakov 881
				break;
882
				case 'p':
883
					tmp = itoa(#tmp);
7439 leency 884
					if(!DSBYTE[tmp])goto END_FUNC_SPRINTF;
5576 pavelyakov 885
					l = strlen(tmp);
5646 pavelyakov 886
					strlcpy(buf,tmp,l);
5576 pavelyakov 887
					buf += l;
888
				break;
889
				case '%':
890
					DSBYTE[buf] = '%';
7439 leency 891
					$inc buf
5576 pavelyakov 892
				break;
893
				default:
7439 leency 894
				goto END_FUNC_SPRINTF;
5576 pavelyakov 895
			}
896
		}
7439 leency 897
		else {
5576 pavelyakov 898
			DSBYTE[buf] = s;
7439 leency 899
			$inc buf
5576 pavelyakov 900
		}
7439 leency 901
		$inc format
5576 pavelyakov 902
		s = DSBYTE[format];
903
	}
7439 leency 904
	END_FUNC_SPRINTF:
5576 pavelyakov 905
	DSBYTE[buf] = 0;
6771 leency 906
	return ret;
5576 pavelyakov 907
}
908
 
5598 pavelyakov 909
inline signed strcoll(dword text1,text2)
910
{
911
	char s,ss;
912
	loop()
913
	{
914
		s = DSBYTE[text2];
915
		ss=strchr(text1,s);
916
		if(ss)return ss;
917
		text2++;
918
	}
919
	return 0;
920
}
921
 
7163 leency 922
:replace_char(dword in_str, char from_char, to_char, int length) {
7049 leency 923
	int i;
924
	for (i=0; i
925
		if (ESBYTE[in_str+i] == from_char) ESBYTE[in_str+i] = to_char;
926
	}
927
	ESBYTE[in_str+length]=0;
928
}
929
 
5598 pavelyakov 930
#endif