Subversion Repositories Kolibri OS

Rev

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