Subversion Repositories Kolibri OS

Rev

Rev 3958 | Rev 4180 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
3067 leency 1
//------------------------------------------------------------------------------
2
// strcmp( ESI, EDI)
3
// strlen( EDI)
3107 leency 4
// strcpy( EDI, ESI) --- 0 if ==
3067 leency 5
// strcat( EDI, ESI)
3363 leency 6
// strchr( ESI,BL) --- find first BL
7
// strrchr( ESI,BL) --- find last BL
3067 leency 8
// strstr( EBX, EDX)
9
// itoa( ESI)
10
// atoi( EAX)
11
// strupr( ESI)
3107 leency 12
// strlwr( ESI) --- kyrillic symbols may not work
3067 leency 13
// strttl( EDX)
14
// strtok( ESI)
3448 esevece 15
// strtrim( ESI) --- removes "blank" characters (\r, \n and space)
3444 leency 16
// chrnum(dword searchin, char symbol)
3107 leency 17
// strcpyb(dword searchin, copyin, startstr, endstr) --- copy string between strings
3128 leency 18
// strnumb(dword searchin, startstr, endstr) --- get number between strings
3067 leency 19
//------------------------------------------------------------------------------
20
 
21
inline fastcall signed int strcmp( ESI, EDI)
22
{
23
	loop()
24
	{
25
		IF (DSBYTE[ESI]
26
		IF (DSBYTE[ESI]>DSBYTE[EDI]) RETURN 1;
27
		IF (DSBYTE[ESI]=='\0') RETURN 0;
28
		ESI++;
29
		EDI++;
30
	}
31
}
32
 
33
 
34
inline fastcall signed int strncmp( ESI, EDI, ECX)
35
{
36
  asm {
37
    MOV EBX, EDI
38
    XOR EAX, EAX
39
    MOV EDX, ECX
40
    OR ECX, ECX
41
    JE L1
42
    REPNE SCASB
43
    SUB EDX, ECX
44
    MOV ECX, EDX
45
    MOV EDI, EBX
46
    XOR EBX, EBX
47
    REPE CMPSB
48
    MOV AL, DSBYTE[ ESI-1]
49
    MOV BL, DSBYTE[ EDI-1]
50
    SUB EAX, EBX
51
L1:
52
  }
53
}
54
 
55
 
56
inline fastcall unsigned int strlen( EDI)
57
{
58
	$xor eax, eax
59
	$mov ecx, -1
60
	$REPNE $SCASB
61
	EAX-=2+ECX;
62
}
63
 
64
 
3363 leency 65
inline fastcall void strcpy( EDI, ESI)
3067 leency 66
{
67
	$cld
3107 leency 68
L2:
3067 leency 69
	$lodsb
70
	$stosb
71
	$test al,al
3107 leency 72
	$jnz L2
3067 leency 73
}
74
 
75
 
3128 leency 76
inline fastcall int strlcpy(dword ESI, EDI, EBX)
77
{
78
	EDX=0;
79
	do {
80
		DSBYTE[ESI]=DSBYTE[EDI];
81
		ESI++;
82
		EDI++;
83
		EDX++;
84
		if (EDX==EBX) { DSBYTE[ESI]='\0'; return -1;}
85
	} while(DSBYTE[EDI-1]!='\0');
86
	return 0;
87
}
88
 
3448 esevece 89
inline fastcall strtrim( ESI)
90
{
91
	EDI = ESI;
92
	do{
93
		AL=DSBYTE[EDI];
94
		if (AL != '\32') && (AL != '\13') && (AL != '\10')
95
		{
96
			DSBYTE[ESI]=AL;
97
			ESI++;
98
		}
99
 		EDI++;
100
	}while(AL!=0);
101
	DSBYTE[ESI] = '\0';
102
}
3128 leency 103
 
104
 
3363 leency 105
inline fastcall void strcat( EDI, ESI)
3067 leency 106
{
107
  asm {
108
    mov ebx, edi
109
    xor ecx, ecx
110
    xor eax, eax
111
    dec ecx
112
    repne scasb
113
    dec edi
114
    mov edx, edi
115
    mov edi, esi
116
    xor ecx, ecx
117
    xor eax, eax
118
    dec ecx
119
    repne scasb
120
    xor ecx, 0ffffffffh
121
    mov edi, edx
122
    mov edx, ecx
123
    mov eax, edi
124
    shr ecx, 2
125
    rep movsd
126
    mov ecx, edx
127
    and ecx, 3
128
    rep movsb
129
    mov eax, ebx
130
	}
131
}
132
 
3363 leency 133
inline fastcall void chrcat(ESI, BL)
134
{
135
	EDI = strlen(ESI);
136
	ESBYTE[ESI+EDI] = BL;
137
	ESBYTE[ESI+EDI+1] = 0;
138
}
3128 leency 139
 
3363 leency 140
 
3128 leency 141
inline fastcall signed int strchr( ESI,BL)
142
{
143
	int jj=0;
144
	do{
145
		jj++;
146
		$lodsb
147
		IF(AL==BL) return jj;
148
	} while(AL!=0);
149
	return 0;
150
}
151
 
152
 
153
inline fastcall signed int strrchr( ESI,BL)
154
{
155
	int jj=0, last=0;
156
	do{
157
		jj++;
158
		$lodsb
159
		IF(AL==BL) last=jj;
160
	} while(AL!=0);
161
	return last;
162
}
163
 
164
 
165
int chrnum(dword searchin, char symbol)
166
{
167
	int num = 0;
168
	while(DSBYTE[searchin])
169
	{
170
		if (DSBYTE[searchin] == symbol)	num++;
171
		searchin++;
172
	}
173
	return num;
174
}
175
 
176
 
3363 leency 177
inline fastcall signed int strstr( EBX, EDX)
3128 leency 178
{
179
  asm {
180
    MOV EDI, EDX
181
    XOR ECX, ECX
182
    XOR EAX, EAX
183
    DEC ECX
184
    REPNE SCASB
185
    NOT ECX
186
    DEC ECX
187
    JE LS2
188
    MOV ESI, ECX
189
    XOR ECX, ECX
190
    MOV EDI, EBX
191
    DEC ECX
192
    REPNE SCASB
193
    NOT ECX
194
    SUB ECX, ESI
195
    JBE LS2
196
    MOV EDI, EBX
197
    LEA EBX, DSDWORD[ ESI-1]
198
LS1: MOV ESI, EDX
199
    LODSB
200
    REPNE SCASB
201
    JNE LS2
202
    MOV EAX, ECX
203
    PUSH EDI
204
    MOV ECX, EBX
205
    REPE CMPSB
206
    POP EDI
207
    MOV ECX, EAX
208
    JNE LS1
209
    LEA EAX, DSDWORD[ EDI-1]
210
    JMP SHORT LS3
211
LS2: XOR EAX, EAX
212
LS3:
213
  }
214
}
215
 
216
 
217
dword strstri(dword searchin, usestr_s)
218
{
219
	dword usestr_e = usestr_s;
220
	char si, ue;
221
 
222
	while(DSBYTE[searchin])
223
	{
224
		si = DSBYTE[searchin];
225
		ue = DSBYTE[usestr_e];
226
		if (si>='A') && (si<='Z') si +=32;
227
		if (ue>='A') && (ue<='Z') ue +=32;
228
		if (si == ue) usestr_e++; else usestr_e = usestr_s;
229
		searchin++;
230
		if (DSBYTE[usestr_e]=='\0') return searchin;
231
	}
232
	return 0;
233
}
234
 
235
 
3958 leency 236
unsigned int strcpyb(dword search_in, copyin, startstr, endstr)
3128 leency 237
{
238
	dword startp, endp;
3958 leency 239
	dword copyin_start_off = copyin;
240
	if (startstr==0) startp = search_in; else startp = strstr(search_in, startstr) + strlen(startstr);
3225 leency 241
	endp = strstri(startp, endstr);
3958 leency 242
	if (endp==0) endp = startp+strlen(search_in);
243
	//if (startp==endp) return 0;
3128 leency 244
	do
245
	{
246
		DSBYTE[copyin] = DSBYTE[startp];
247
		copyin++;
248
		startp++;
249
	}
250
	while (startp
251
	DSBYTE[copyin] = '\0';
3958 leency 252
	return copyin_start_off;
3128 leency 253
}
254
 
255
 
3081 leency 256
/*void strcat(char *to, char *from) //òîæå ðàáîòàåò
257
{
258
	while(*to) to++;
259
	while(*from)
260
	{
261
		*to = *from;
262
		to++;
263
		from++;
264
	}
265
	*to = '\0';
266
}*/
267
 
3114 leency 268
 
3067 leency 269
inline fastcall dword atoi( EDI)
270
{
3128 leency 271
	$push ebx
272
	$push esi
3067 leency 273
	ESI=EDI;
3128 leency 274
	while (DSBYTE[ESI]==' ') ESI++;
275
	if (DSBYTE[ESI]=='-') ESI++;
3067 leency 276
	EAX=0;
3128 leency 277
	while (DSBYTE[ESI]>='0') && (DSBYTE[ESI]<='9')
278
	{
279
		$xor ebx, ebx
280
		EBX = DSBYTE[ESI]-'0';
281
		EAX *= 10;
282
		EAX += EBX;
3067 leency 283
		ESI++;
3128 leency 284
	}
285
	IF (DSBYTE[EDI]=='-') -EAX;
286
	$pop esi
287
	$pop ebx
3067 leency 288
}
289
 
290
 
291
 
292
inline fastcall strupr( ESI)
293
{
294
	do{
295
		AL=DSBYTE[ESI];
296
		IF(AL>='a')IF(AL<='z')DSBYTE[ESI]=AL&0x5f;
297
		IF (AL>=160) && (AL<=175) DSBYTE[ESI] = AL - 32;	//à-ï
298
		IF (AL>=224) && (AL<=239) DSBYTE[ESI] = AL - 80;	//à-ï
299
 		ESI++;
300
	}while(AL!=0);
301
}
302
 
303
inline fastcall strlwr( ESI)
304
{
305
	do{
306
		$LODSB
307
		IF(AL>='A')&&(AL<='Z'){
308
			AL+=0x20;
309
			DSBYTE[ESI-1]=AL;
310
			CONTINUE;
311
		}
312
	}while(AL!=0);
313
}
314
 
315
inline fastcall strttl( EDX)
316
{
317
	AL=DSBYTE[EDX];
318
	IF(AL>='a')&&(AL<='z')DSBYTE[EDX]=AL&0x5f;
319
	IF (AL>=160) && (AL<=175) DSBYTE[EDX] = AL - 32;	//à-ï
320
	IF (AL>=224) && (AL<=239) DSBYTE[EDX] = AL - 80;	//à-ï
321
	do{
322
		EDX++;
323
		AL=DSBYTE[EDX];
324
		IF(AL>='A')&&(AL<='Z'){DSBYTE[EDX]=AL|0x20; CONTINUE;}
325
		IF(AL>='€')&&(AL<='')DSBYTE[EDX]=AL|0x20; // -¯
326
		IF (AL>=144) && (AL<=159) DSBYTE[EDX] = AL + 80;	//à-ï
327
	}while(AL!=0);
328
}
329
 
4166 leency 330
unsigned char buffer[11];
331
dword itoa( ESI)
332
{
333
	$pusha
334
	EDI = #buffer;
335
	ECX = 10;
336
	if (ESI < 0)
337
	{
338
		 $mov     al, '-'
339
		 $stosb
340
		 $neg     esi
341
	}
342
 
343
	$mov     eax, esi
344
	$push    -'0'
345
F2:
346
	$xor     edx, edx
347
	$div     ecx
348
	$push    edx
349
	$test    eax, eax
350
	$jnz     F2
351
F3:
352
	$pop     eax
353
	$add     al, '0'
354
	$stosb
355
	$jnz     F3
356
 
357
	$mov     al, '\0'
358
	$stosb
359
 
360
	$popa
361
    return #buffer;
362
}
363
 
364
inline fastcall itoa_(signed int EDI, ESI)
365
{
366
	$pusha
367
	EBX = EDI;
368
	ECX = 10;
369
	if (ESI > 90073741824)
370
	{
371
		 $mov     al, '-'
372
		 $stosb
373
		 $neg     esi
374
	}
375
 
376
	$mov     eax, esi
377
	$push    -'0'
378
F2:
379
	$xor     edx, edx
380
	$div     ecx
381
	$push    edx
382
	$test    eax, eax
383
	$jnz     F2
384
F3:
385
	$pop     eax
386
	$add     al, '0'
387
	$stosb
388
	$jnz     F3
389
 
390
	$mov     al, '\0'
391
	$stosb
392
 
393
	$popa
394
    return EBX;
395
}
396
 
3128 leency 397
void debugi(dword d_int)
3067 leency 398
{
4166 leency 399
	char tmpch[12];
400
	itoa_(#tmpch, d_int);
3128 leency 401
	debug(#tmpch);
3067 leency 402
}
403
 
3363 leency 404
 
3067 leency 405
 
406
#define strncpy strcpyn
407
#define strnmov strmovn
408
#define stricmp strcmpi
409
#define strcmpn strncmp
3467 leency 410