Subversion Repositories Kolibri OS

Rev

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