Subversion Repositories Kolibri OS

Rev

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

Rev Author Line No. Line
2825 leency 1
//------------------------------------------------------------------------------
2839 leency 2
// strcmp( ESI, EDI)
2825 leency 3
// strlen( EDI)
4
// strcpy( EDI, ESI)
5
// strcat( EDI, ESI)
2839 leency 6
// strchr( ESI,BL)
7
// strrchr( ESI,BL)
8
// strstr( EBX, EDX)
2844 leency 9
// itoa( ESI)
10
// atoi( EAX)
11
// strupr( ESI)
12
// strlwr( ESI)
13
// strtok( ESI)
2825 leency 14
//------------------------------------------------------------------------------
15
 
2874 leency 16
inline fastcall signed int strcmp( ESI, EDI)
17
{
18
	loop()
19
	{
20
		IF (DSBYTE[ESI]
21
		IF (DSBYTE[ESI]>DSBYTE[EDI]) RETURN 1;
22
		IF (DSBYTE[ESI]=='\0') RETURN 0;
23
		ESI++;
24
		EDI++;
25
	}
26
}
2839 leency 27
 
2874 leency 28
 
29
inline fastcall signed int strncmp( ESI, EDI, ECX)
30
{
31
  asm {
32
    MOV EBX, EDI
33
    XOR EAX, EAX
34
    MOV EDX, ECX
35
    OR ECX, ECX
36
    JE L1
37
    REPNE SCASB
38
    SUB EDX, ECX
39
    MOV ECX, EDX
40
    MOV EDI, EBX
41
    XOR EBX, EBX
42
    REPE CMPSB
43
    MOV AL, DSBYTE[ ESI-1]
44
    MOV BL, DSBYTE[ EDI-1]
45
    SUB EAX, EBX
46
L1:
47
  }
48
}
49
 
50
/*
51
 
52
inline fastcall signed int strcmpi( ESI,EDI)
53
uses EBX
54
{
55
	do{
56
		$lodsb
57
		IF(AL>='a')&&(AL<='z')AL-=0x20;
58
		BL=DSBYTE[(E)DI];
59
		IF(BL>='a')&&(BL<='z')BL-=0x20;
60
		AL-=BL;
61
		IF(!ZEROFLAG)BREAK;
62
		(E)DI++;
63
	}while(BL!=0);
64
}
65
 
66
inline char STRNCMPI((E)SI,(E)DI,(E)CX)
67
{
68
	(E)AX=0;
69
	LOOPNZ((E)CX){
70
		$lodsb
71
		IF(AL>='a')&&(AL<='z')AL-=0x20;
72
		AH=DSBYTE[EDI];
73
		IF(AH>='a')&&(AH<='z')AH-=0x20;
74
		EDI++;
75
		IF(AL==0)||(AH==0)||(AL!=AH)BREAK;
76
	}
77
	AL=AL-AH;
78
}*/
79
 
80
 
81
 
2825 leency 82
inline fastcall unsigned int strlen( EDI)
83
{
84
	$xor eax, eax
85
	$mov ecx, -1
86
	$REPNE $SCASB
87
	EAX-=2+ECX;
88
}
89
 
90
 
91
inline fastcall strcpy( EDI, ESI)
92
{
93
	$cld
94
l2:
95
	$lodsb
96
	$stosb
97
	$test al,al
98
	$jnz l2
99
}
100
 
101
 
102
inline fastcall strcat( EDI, ESI)
103
{
104
  asm {
105
    mov ebx, edi
106
    xor ecx, ecx
107
    xor eax, eax
108
    dec ecx
109
    repne scasb
110
    dec edi
111
    mov edx, edi
112
    mov edi, esi
113
    xor ecx, ecx
114
    xor eax, eax
115
    dec ecx
116
    repne scasb
117
    xor ecx, 0ffffffffh
118
    mov edi, edx
119
    mov edx, ecx
120
    mov eax, edi
121
    shr ecx, 2
122
    rep movsd
123
    mov ecx, edx
124
    and ecx, 3
125
    rep movsb
126
    mov eax, ebx
127
	}
128
}
129
 
2839 leency 130
char buffer[11];
2844 leency 131
inline fastcall dword itoa( ESI)
2825 leency 132
{
133
     $mov     edi, #buffer
134
     $mov     ecx, 10
135
     $test     esi, esi
136
     $jns     f1
137
     $mov     al, '-'
138
     $stosb
139
     $neg     esi
140
f1:
141
     $mov     eax, esi
142
     $push     -'0'
143
f2:
144
     $xor     edx, edx
145
     $div     ecx
146
     $push     edx
147
     $test     eax, eax
148
     $jnz     f2
149
f3:
150
     $pop     eax
151
     $add     al, '0'
152
     $stosb
153
     $jnz     f3
154
     $mov     eax, #buffer
155
     $ret
156
}
157
 
158
 
2844 leency 159
inline fastcall dword atoi( EDI)
2825 leency 160
{
2844 leency 161
	//ESI=EDI=EAX;
162
	ESI=EDI;
2825 leency 163
	IF(DSBYTE[ESI]=='-')ESI++;
164
	EAX=0;
165
	BH=AL;
166
	do{
167
		BL=DSBYTE[ESI]-'0';
168
		EAX=EAX*10+EBX;
169
		ESI++;
170
	}while(DSBYTE[ESI]>0);
171
	IF(DSBYTE[EDI]=='-') -EAX;
172
}
173
 
174
 
2839 leency 175
inline fastcall unsigned int strchr( ESI,BL)
2825 leency 176
{
2839 leency 177
	int jj=0;
178
	do{
179
		jj++;
180
		$lodsb
181
		IF(AL==BL) return jj;
182
	} while(AL!=0);
183
}
184
 
185
 
186
inline fastcall unsigned int strrchr( ESI,BL)
187
{
2825 leency 188
	int jj=0, last=-1;
189
	do{
190
		jj++;
191
		$lodsb
192
		IF(AL==BL) last=jj;
193
	} while(AL!=0);
194
	return last;
195
}
196
 
197
 
2844 leency 198
inline fastcall strupr( ESI)
2825 leency 199
{
200
	do{
201
		AL=DSBYTE[ESI];
202
		IF(AL>='a')IF(AL<='z')DSBYTE[ESI]=AL&0x5f;
203
 		ESI++;
204
	}while(AL!=0);
205
}
206
 
2844 leency 207
inline fastcall strlwr( ESI)
2825 leency 208
{
209
	do{
210
		$LODSB
211
		IF(AL>='A')&&(AL<='Z'){
212
			AL+=0x20;
213
			DSBYTE[ESI-1]=AL;
214
			CONTINUE;
215
		}
216
	}while(AL!=0);
217
}
218
 
219
 
220
inline fastcall unsigned int strstr( EBX, EDX)
221
{
222
  asm {
223
    mov edi, edx
224
    xor ecx, ecx
225
    xor eax, eax
226
    dec ecx
227
    repne scasb
228
    not ecx
229
    dec ecx
230
    je ls2
231
    mov esi, ecx
232
    xor ecx, ecx
233
    mov edi, ebx
234
    dec ecx
235
    repne scasb
236
    not ecx
237
    sub ecx, esi
238
    jbe ls2
239
    mov edi, ebx
2839 leency 240
    lea ebx, DSDWORD[ esi-1]
2825 leency 241
ls1: mov esi, edx
242
    lodsb
243
    repne scasb
244
    jne ls2
245
    mov eax, ecx
246
    push edi
247
    mov ecx, ebx
248
    repe cmpsb
249
    pop edi
250
    mov ecx, eax
251
    jne ls1
2839 leency 252
    lea eax, DSDWORD[ edi-1]
2825 leency 253
    jmp short ls3
254
ls2: xor eax, eax
255
ls3:
256
  }
2844 leency 257
}
258
 
2874 leency 259
 
260
 
261
 
262
 
263
 
264
 
265
 
266
 
267
 
268
 
269
 
270
 
271
 
272
 
273
 
2844 leency 274
/* strtok( LPSTR dest, src, divs);
275
src - указатель на исходную строку или результат предыдущего вызова
276
dest - указатель на буфер, куда будет скопировано слово
277
divs - указатель на строку, содержащую символы-разделители
278
Возвращает: 0, если слов больше нет
279
         не 0, если слово скопировано в dest (передайте это значение
280
               в качестве src для последующего поиска) */
281
 
282
dword fastcall strtok( EDX, ESI, EBX)
283
{
284
  asm {
285
    XOR ECX, ECX
286
    MOV EDI, EBX
287
    XOR EAX, EAX
288
    DEC ECX
289
    REPNE SCASB
290
    XOR ECX, 0FFFFFFFFH
291
    DEC ECX
292
    PUSH ECX
293
L1: LODSB
294
    OR AL, AL
295
    JZ L4
296
    MOV EDI, EBX
297
    MOV ECX, SSDWORD[ ESP]
298
    REPNE SCASB
299
    JZ L1
300
    DEC ESI
301
L2: LODSB
302
    MOV EDI, EBX
303
    MOV ECX, SSDWORD[ ESP]
304
    REPNE SCASB
305
    JZ L3
306
    MOV DSBYTE[ EDX], AL
307
    INC EDX
308
    JMP SHORT L2
309
L3: MOV EAX, ESI
310
L4: POP ECX
311
  } DSBYTE[ EDX] = 0;
312
}
2874 leency 313
 
314
#define strncpy strcpyn
315
#define strnmov strmovn
316
#define stricmp strcmpi
317
#define strcmpn strncmp
318
#define strncmpi strcmpni
319
#define stricmpn strcmpni
320
#define strnicmp strcmpni
321
#define strincmp strcmpni
322
#define strcmpin strcmpni