Subversion Repositories Kolibri OS

Rev

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

Rev Author Line No. Line
5598 pavelyakov 1
#ifndef INCLUDE_STRING_H
2
#define INCLUDE_STRING_H
5676 pavelyakov 3
#print "[include ]\n"
5598 pavelyakov 4
 
5
#ifndef INCLUDE_MEM_H
6
#include "../lib/mem.h"
7
#endif
8
 
3067 leency 9
//------------------------------------------------------------------------------
5574 pavelyakov 10
// strspn(dword text1,text2) --- example: strspn("12 year","1234567890") -> return 2
11
// strpbrk(dword text1,text2) --- example: strpbrk("this test", " ckfi") -> return "is test"
3067 leency 12
// strcmp( ESI, EDI)
13
// strlen( EDI)
5713 leency 14
// utf8_strlen( ESI)
3107 leency 15
// strcpy( EDI, ESI) --- 0 if ==
5573 pavelyakov 16
// strncpy(dword text1,text2,signed length)
3067 leency 17
// strcat( EDI, ESI)
5573 pavelyakov 18
// strncat(dword text1,text2,signed length) --- pasting the text of a certain length
3363 leency 19
// strchr( ESI,BL) --- find first BL
20
// strrchr( ESI,BL) --- find last BL
3067 leency 21
// strstr( EBX, EDX)
5573 pavelyakov 22
// itoa(signed long number) --- convert the number as a string
23
// atoi(dword text) --- convert a string as a number
3067 leency 24
// strupr( ESI)
5690 leency 25
// strlwr( ESI) --- Cyrillic symbols may not work
3067 leency 26
// strttl( EDX)
27
// strtok( ESI)
5573 pavelyakov 28
// strltrim(dword text) --- removes "blank" characters on the left (\r, \n and space)
29
// strrtrim(dword text) --- removes "blank" characters on the right (\r, \n and space)
30
// strtrim(dword text) --- delete "empty" characters (\ r \ n and space) on both sides
3444 leency 31
// chrnum(dword searchin, char symbol)
3107 leency 32
// strcpyb(dword searchin, copyin, startstr, endstr) --- copy string between strings
3128 leency 33
// strnumb(dword searchin, startstr, endstr) --- get number between strings
5573 pavelyakov 34
// strdup(dword text) --- allocation under the text
3067 leency 35
//------------------------------------------------------------------------------
36
 
5573 pavelyakov 37
/*
3067 leency 38
inline fastcall signed int strcmp( ESI, EDI)
39
{
5573 pavelyakov 40
    loop()
41
    {
42
        IF (DSBYTE[ESI]
43
        IF (DSBYTE[ESI]>DSBYTE[EDI]) RETURN 1;
44
        IF (DSBYTE[ESI]=='\0') RETURN 0;
45
        ESI++;
46
        EDI++;
47
    }
3067 leency 48
}
5573 pavelyakov 49
*/
3067 leency 50
 
5598 pavelyakov 51
 
52
 
5575 pavelyakov 53
inline int strspn(dword text1,text2)
5574 pavelyakov 54
{
55
	dword beg;
56
	char s1,s2;
57
	int ret;
58
	ret = 0;
59
	beg = text2;
60
	do {
61
		s1 = ESBYTE[text1];
62
		text2 = beg;
63
		do {
64
			s2 = ESBYTE[text2];
65
			if(s1==s2)
66
			{
67
				if(!s2)break;
68
				$inc ret
69
				break;
70
			}
71
			else $inc text2
72
		} while(s2);
73
		$inc text1
74
	} while(s1);
75
	return ret;
76
}
3067 leency 77
 
5575 pavelyakov 78
inline dword strpbrk(dword text1,text2)
5574 pavelyakov 79
{
80
	char s,ss;
81
	dword beg;
82
	beg = text2;
83
	do {
84
		s = ESBYTE[text1];
85
		text2 = beg;
86
		do {
87
			ss = ESBYTE[text2];
88
			if(ss==s) return text1;
89
			$inc text2
90
		} while(ss);
91
		$inc text1
92
	} while(s);
93
	return text1;
94
}
95
 
3067 leency 96
inline fastcall signed int strncmp( ESI, EDI, ECX)
97
{
98
  asm {
99
    MOV EBX, EDI
100
    XOR EAX, EAX
101
    MOV EDX, ECX
102
    OR ECX, ECX
103
    JE L1
104
    REPNE SCASB
105
    SUB EDX, ECX
106
    MOV ECX, EDX
107
    MOV EDI, EBX
108
    XOR EBX, EBX
109
    REPE CMPSB
110
    MOV AL, DSBYTE[ ESI-1]
111
    MOV BL, DSBYTE[ EDI-1]
112
    SUB EAX, EBX
113
L1:
114
  }
115
}
116
 
5606 pavelyakov 117
/*
118
inline signed int strncmp(dword text1,text2,len)
119
{
120
 
121
	loop()
122
	{
123
		if(DSBYTE[text1]!=DSBYTE[text2])return text1-text2;
124
		$dec len
125
		if(!len)return 0;
126
	}
127
}
128
*/
3067 leency 129
inline fastcall unsigned int strlen( EDI)
130
{
5573 pavelyakov 131
    $xor eax, eax
132
    $mov ecx, -1
133
    $REPNE $SCASB
134
    EAX-=2+ECX;
3067 leency 135
}
136
 
5575 pavelyakov 137
inline strnlen(dword str, dword maxlen)
138
{
139
	dword cp;
140
	for (cp = str; (maxlen != 0) && (DSBYTE[cp] != '\0'); cp++, maxlen--);
141
	return cp - str;
142
}
3067 leency 143
 
5713 leency 144
inline fastcall unsigned int utf8_strlen( ESI)
145
{
146
 $xor  ecx, ecx
147
  _loop:
148
 $lodsb
149
 $test  al, al
150
 $jz  _done
151
 $and al, 0xc0
152
 $cmp al, 0x80
153
 $jz  _loop
154
 $inc ecx
155
 $jmp _loop
156
 
157
  _done:
158
 return ECX;
159
}
5575 pavelyakov 160
 
161
inline signed int strcmp(dword text1, text2)
5573 pavelyakov 162
{
163
	char s1,s2;
164
	dword p1,p2;
165
	p1 = text1;
166
	p2 = text2;
167
	loop()
168
	{
169
		s1 = DSBYTE[text1];
170
		s2 = DSBYTE[text2];
171
		if(s1==s2)
172
		{
173
			if(s1==0) return 0;
174
		}
175
		else {
5574 pavelyakov 176
			return s1-s2;
5573 pavelyakov 177
		}
178
		$inc text1
179
		$inc text2
180
	}
181
	return 0;
182
}
183
 
5575 pavelyakov 184
/*
185
signed int strncmp(dword s1, s2, signed n)
186
unsigned char _s1,_s2;
187
{
188
	if (n == 0)
189
		return 0;
190
	do {
191
		_s1 = DSBYTE[s1];
192
		_s2 = DSBYTE[s2];
193
		if (_s1 != _s2)
194
		{
195
			$dec s2
196
			return _s1 - _s2;
197
		}
198
		$inc s2
199
		if (_s1 == 0)
200
			break;
201
		$inc s1
202
		$dec n
203
	} while (n);
204
	return 0;
205
}
206
*/
5573 pavelyakov 207
 
5575 pavelyakov 208
 
3363 leency 209
inline fastcall void strcpy( EDI, ESI)
3067 leency 210
{
5573 pavelyakov 211
    $cld
3107 leency 212
L2:
5573 pavelyakov 213
    $lodsb
214
    $stosb
215
    $test al,al
216
    $jnz L2
3067 leency 217
}
218
 
5582 pavelyakov 219
inline dword strncpy(dword text1, text2, signed len)
5573 pavelyakov 220
	signed o1,o2;
221
{
5576 pavelyakov 222
	if(!text1)||(!len) return text1;
223
	if(len<4)
224
	{
225
		o2 = len;
226
		goto RUN_BYTE;
227
	}
5573 pavelyakov 228
	o1 = len/4;
229
	o2 = len-4*o1;
230
	while(o1){
5576 pavelyakov 231
		DSDWORD[text1] = DSDWORD[text2];
5573 pavelyakov 232
		text1 += 4;
233
		text2 += 4;
</