Subversion Repositories Kolibri OS

Rev

Rev 3448 | Rev 3958 | 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
 
3225 leency 236
void strcpyb(dword search_in, copyin, startstr, endstr)
3128 leency 237
{
238
	dword startp, endp;
3225 leency 239
	startp = strstr(search_in, startstr) + strlen(startstr);
240
	endp = strstri(startp, endstr);
3128 leency 241
	if (startp==endp) return;
242
	do
243
	{
244
		DSBYTE[copyin] = DSBYTE[startp];
245
		copyin++;
246
		startp++;
247
	}
248
	while (startp
249
	DSBYTE[copyin] = '\0';
250
}
251
 
252
 
3081 leency 253
/*void strcat(char *to, char *from) //òîæå ðàáîòàåò
254
{
255
	while(*to) to++;
256
	while(*from)
257
	{
258
		*to = *from;
259
		to++;
260
		from++;
261
	}
262
	*to = '\0';
263
}*/
264
 
3067 leency 265
dword itoa( ESI)
266
{
267
	unsigned char buffer[11];
3114 leency 268
	$pusha
269
 
3067 leency 270
	EDI = #buffer;
271
	ECX = 10;
272
	if (ESI < 0)
273
	{
274
		 $mov     al, '-'
275
		 $stosb
276
		 $neg     esi
277
	}
278
 
279
	$mov     eax, esi
280
	$push    -'0'
3107 leency 281
F2:
3067 leency 282
	$xor     edx, edx
283
	$div     ecx
284
	$push    edx
285
	$test    eax, eax
3107 leency 286
	$jnz     F2
287
F3:
3067 leency 288
	$pop     eax
289
	$add     al, '0'
290
	$stosb
3107 leency 291
	$jnz     F3
3067 leency 292
 
293
	$mov     al, '\0'
294
	$stosb
3128 leency 295
 
296
	$popa
3114 leency 297
    return #buffer;
3067 leency 298
}
299
 
300
 
301
inline fastcall dword atoi( EDI)
302
{
3128 leency 303
	$push ebx
304
	$push esi
3067 leency 305
	ESI=EDI;
3128 leency 306
	while (DSBYTE[ESI]==' ') ESI++;
307
	if (DSBYTE[ESI]=='-') ESI++;
3067 leency 308
	EAX=0;
3128 leency 309
	while (DSBYTE[ESI]>='0') && (DSBYTE[ESI]<='9')
310
	{
311
		$xor ebx, ebx
312
		EBX = DSBYTE[ESI]-'0';
313
		EAX *= 10;
314
		EAX += EBX;
3067 leency 315
		ESI++;
3128 leency 316
	}
317
	IF (DSBYTE[EDI]=='-') -EAX;
318
	$pop esi
319
	$pop ebx
3067 leency 320
}
321
 
322
 
323
 
324
inline fastcall strupr( ESI)
325
{
326
	do{
327
		AL=DSBYTE[ESI];
328
		IF(AL>='a')IF(AL<='z')DSBYTE[ESI]=AL&0x5f;
329
		IF (AL>=160) && (AL<=175) DSBYTE[ESI] = AL - 32;	//à-ï
330
		IF (AL>=224) && (AL<=239) DSBYTE[ESI] = AL - 80;	//à-ï
331
 		ESI++;
332
	}while(AL!=0);
333
}
334
 
335
inline fastcall strlwr( ESI)
336
{
337
	do{
338
		$LODSB
339
		IF(AL>='A')&&(AL<='Z'){
340
			AL+=0x20;
341
			DSBYTE[ESI-1]=AL;
342
			CONTINUE;
343
		}
344
	}while(AL!=0);
345
}
346
 
347
inline fastcall strttl( EDX)
348
{
349
	AL=DSBYTE[EDX];
350
	IF(AL>='a')&&(AL<='z')DSBYTE[EDX]=AL&0x5f;
351
	IF (AL>=160) && (AL<=175) DSBYTE[EDX] = AL - 32;	//à-ï
352
	IF (AL>=224) && (AL<=239) DSBYTE[EDX] = AL - 80;	//à-ï
353
	do{
354
		EDX++;
355
		AL=DSBYTE[EDX];
356
		IF(AL>='A')&&(AL<='Z'){DSBYTE[EDX]=AL|0x20; CONTINUE;}
357
		IF(AL>='€')&&(AL<='')DSBYTE[EDX]=AL|0x20; // -¯
358
		IF (AL>=144) && (AL<=159) DSBYTE[EDX] = AL + 80;	//à-ï
359
	}while(AL!=0);
360
}
361
 
3128 leency 362
void debugi(dword d_int)
3067 leency 363
{
3128 leency 364
	char tmpch[11];
365
	strcpy(#tmpch, itoa(d_int));
366
	debug(#tmpch);
3067 leency 367
}
368
 
3363 leency 369
 
3067 leency 370
 
371
#define strncpy strcpyn
372
#define strnmov strmovn
373
#define stricmp strcmpi
374
#define strcmpn strncmp
3467 leency 375