Subversion Repositories Kolibri OS

Rev

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