Subversion Repositories Kolibri OS

Rev

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