Subversion Repositories Kolibri OS

Rev

Rev 2825 | 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)
9
//
2825 leency 10
// IntToStr( ESI)
11
// StrToInt()
12
// upcase( ESI)
13
// lowcase( ESI)
14
//------------------------------------------------------------------------------
15
 
2839 leency 16
 
2825 leency 17
inline fastcall unsigned int strlen( EDI)
18
{
19
	$xor eax, eax
20
	$mov ecx, -1
21
	$REPNE $SCASB
22
	EAX-=2+ECX;
23
}
24
 
25
 
26
inline fastcall strcpy( EDI, ESI)
27
{
28
	$cld
29
l2:
30
	$lodsb
31
	$stosb
32
	$test al,al
33
	$jnz l2
34
}
35
 
36
 
37
inline fastcall strcat( EDI, ESI)
38
{
39
  asm {
40
    mov ebx, edi
41
    xor ecx, ecx
42
    xor eax, eax
43
    dec ecx
44
    repne scasb
45
    dec edi
46
    mov edx, edi
47
    mov edi, esi
48
    xor ecx, ecx
49
    xor eax, eax
50
    dec ecx
51
    repne scasb
52
    xor ecx, 0ffffffffh
53
    mov edi, edx
54
    mov edx, ecx
55
    mov eax, edi
56
    shr ecx, 2
57
    rep movsd
58
    mov ecx, edx
59
    and ecx, 3
60
    rep movsb
61
    mov eax, ebx
62
	}
63
}
64
 
2839 leency 65
char buffer[11];
2825 leency 66
inline fastcall dword IntToStr( ESI)
67
{
68
     $mov     edi, #buffer
69
     $mov     ecx, 10
70
     $test     esi, esi
71
     $jns     f1
72
     $mov     al, '-'
73
     $stosb
74
     $neg     esi
75
f1:
76
     $mov     eax, esi
77
     $push     -'0'
78
f2:
79
     $xor     edx, edx
80
     $div     ecx
81
     $push     edx
82
     $test     eax, eax
83
     $jnz     f2
84
f3:
85
     $pop     eax
86
     $add     al, '0'
87
     $stosb
88
     $jnz     f3
89
     $mov     eax, #buffer
90
     $ret
91
}
92
 
93
 
94
inline fastcall dword StrToInt()
95
{
96
	ESI=EDI=EAX;
97
	IF(DSBYTE[ESI]=='-')ESI++;
98
	EAX=0;
99
	BH=AL;
100
	do{
101
		BL=DSBYTE[ESI]-'0';
102
		EAX=EAX*10+EBX;
103
		ESI++;
104
	}while(DSBYTE[ESI]>0);
105
	IF(DSBYTE[EDI]=='-') -EAX;
106
}
107
 
108
 
109
inline fastcall signed int strcmp( ESI, EDI)
110
{
111
	loop()
112
	{
113
		IF (DSBYTE[ESI]
114
		IF (DSBYTE[ESI]>DSBYTE[EDI]) RETURN 1;
115
		IF (DSBYTE[ESI]=='\0') RETURN 0;
116
		ESI++;
117
		EDI++;
118
	}
119
}
120
 
2839 leency 121
inline fastcall unsigned int strchr( ESI,BL)
2825 leency 122
{
2839 leency 123
	int jj=0;
124
	do{
125
		jj++;
126
		$lodsb
127
		IF(AL==BL) return jj;
128
	} while(AL!=0);
129
}
130
 
131
 
132
inline fastcall unsigned int strrchr( ESI,BL)
133
{
2825 leency 134
	int jj=0, last=-1;
135
	do{
136
		jj++;
137
		$lodsb
138
		IF(AL==BL) last=jj;
139
	} while(AL!=0);
140
	return last;
141
}
142
 
143
 
144
inline fastcall upcase( ESI)
145
{
146
	do{
147
		AL=DSBYTE[ESI];
148
		IF(AL>='a')IF(AL<='z')DSBYTE[ESI]=AL&0x5f;
149
 		ESI++;
150
	}while(AL!=0);
151
}
152
 
153
inline fastcall lowcase( ESI)
154
{
155
	do{
156
		$LODSB
157
		IF(AL>='A')&&(AL<='Z'){
158
			AL+=0x20;
159
			DSBYTE[ESI-1]=AL;
160
			CONTINUE;
161
		}
162
	}while(AL!=0);
163
}
164
 
165
 
166
inline fastcall unsigned int strstr( EBX, EDX)
167
{
168
  asm {
169
    mov edi, edx
170
    xor ecx, ecx
171
    xor eax, eax
172
    dec ecx
173
    repne scasb
174
    not ecx
175
    dec ecx
176
    je ls2
177
    mov esi, ecx
178
    xor ecx, ecx
179
    mov edi, ebx
180
    dec ecx
181
    repne scasb
182
    not ecx
183
    sub ecx, esi
184
    jbe ls2
185
    mov edi, ebx
2839 leency 186
    lea ebx, DSDWORD[ esi-1]
2825 leency 187
ls1: mov esi, edx
188
    lodsb
189
    repne scasb
190
    jne ls2
191
    mov eax, ecx
192
    push edi
193
    mov ecx, ebx
194
    repe cmpsb
195
    pop edi
196
    mov ecx, eax
197
    jne ls1
2839 leency 198
    lea eax, DSDWORD[ edi-1]
2825 leency 199
    jmp short ls3
200
ls2: xor eax, eax
201
ls3:
202
  }
203
}