Subversion Repositories spk

Rev

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

Rev Author Line No. Line
1 cycrow 1
#include <stdarg.h>
2
#include <math.h>
3
#include "strutils.h"
4
//---------------------------------------------------------------------------------
5
char ** strexplode(char separator, char *string, size_t *size, size_t limit)
6
{
7
	size_t len=strlen(string);
8
	char *pos=string, *old=string, *end = string + len;
9
	char **array;
10
	*size=memrep(string, separator, 0, len, limit);
11
	if(limit==0) (*size)++;
12
	array=new char*[*size];
13
	int i=0;
14
	size_t done=0;
15
	do{
16
		pos=(char*)memchr(pos, 0, end - pos);
17
		array[i++]=old;
18
		if(pos) old=++pos;
19
		if(limit && (++done >=limit)) break;
20
	}
21
	while(pos && pos <= end);
22
 
23
	return array;
24
}
25
//---------------------------------------------------------------------------------
26
char * ExtractFileName(const char *pszPath, bool bNoExtension)
27
{
28
	const char *end=pszPath + strlen(pszPath);
114 cycrow 29
	char *pos = const_cast<char*>(strrchr(pszPath, '\\'));
1 cycrow 30
	if(pos==NULL) pos=(char*)pszPath - 1;
114 cycrow 31
	char *str=new char[end - pos + 1];
32
	memcpy(str, ++pos, end - pos + 1);
1 cycrow 33
	if(bNoExtension){
34
		pos=strrchr(str, '.');
35
		if(pos) *pos=0;
36
	}
37
	return str;
38
}
39
//---------------------------------------------------------------------------------
114 cycrow 40
#ifdef STRUTILS_WIN_WCHAR
41
wchar_t * ExtractFileNameW(const wchar_t *pszPath, bool bNoExtension)
42
{
43
	const wchar_t *end=pszPath + wcslen(pszPath);
44
	wchar_t *pos=wcsrchr(pszPath, '\\');
45
	if(pos==NULL) pos=(wchar_t*)pszPath - 1;
46
	wchar_t *str=new wchar_t[end - pos + 1];
47
	memcpy(str, ++pos, (end - pos + 1) * sizeof(wchar_t));
48
	if(bNoExtension){
49
		pos=wcsrchr(str, '.');
50
		if(pos) *pos=0;
51
	}
52
	return str;
53
}
54
//---------------------------------------------------------------------------------
55
#endif
56
 
1 cycrow 57
char * ExtractFilePath(const char *pszPath)
58
{
114 cycrow 59
	const char *pos=strrchr(pszPath, '\\');
60
	char *path = NULL;
1 cycrow 61
	if(pos){
114 cycrow 62
		path = new char[pos - pszPath + 1];
1 cycrow 63
		memcpy(path, pszPath, pos - pszPath);
114 cycrow 64
		path[pos - pszPath] = 0;
1 cycrow 65
	}
66
	return path;
67
}
68
//---------------------------------------------------------------------------------
69
char * strcat2(int num, ...)
70
{
71
	va_list ap=va_start(ap, num);
72
	const char *s;
73
	char *str;
74
	size_t l=0;
75
	for(int i=0; i < num; i++){
76
		s=va_arg(ap, char*);
77
		l+=strlen(s);
78
	}
79
	va_end(ap);
80
	str=new char[l + 1];
81
	str[0]=0;
82
	ap=va_start(ap, num);
83
	for(int i=0; i < num; i++){
84
		s=va_arg(ap, const char*);
85
		strcat(str, s);
86
	}
87
	va_end(ap);
88
	return str;
89
}
90
//---------------------------------------------------------------------------------
91
char ** lineexplode(char *pszBuffer, size_t size, size_t *count)
92
{
93
	char **ar;
94
	size_t cnt=0;
95
	// change LF to 0
96
	memrep(pszBuffer, 10, 0, size);
97
	// chanfe CR to 0
98
	memrep(pszBuffer, 13, 0, size);
99
 
100
	char *pos=pszBuffer, *old=pszBuffer, *end=pszBuffer + size;
101
	do{
102
		pos=(char*)memchr(old, 0, end - pos);
103
		cnt++;
104
		if(pos)
105
			while(*(++pos)==0) ;
106
		old=pos;
107
	}
108
	while(pos && ((end - pos) > 0));
109
 
110
	if(cnt==0) {
111
		*count=0;
112
		return NULL;
113
	}
114
	ar=new char*[cnt];
115
	size_t i=0;
116
	old=pos=pszBuffer;
117
	do{
118
		pos=(char*)memchr(old, 0, end - pos);
119
		ar[i++]=old;
120
		if(pos)
121
			while(*(++pos)==0) ;
122
		old=pos;
123
	}
124
	while(pos && ((end - pos) > 0));
125
	*count=cnt;
126
	return ar;
127
}
128
//---------------------------------------------------------------------------------
129
char * ChangeFileExtension(const char *pszFileName, const char *pszExt)
130
{
131
	const char *ch, *end=pszFileName + strlen(pszFileName);
132
	char *newfile;
133
 
134
	for(ch=end; ch >= pszFileName && *ch!='.' && *ch!='\\'; ch--)
135
	 ;;
136
 
137
	size_t len;
138
	if(*ch=='\\')
139
		len=end - pszFileName;
140
	else if(ch < pszFileName)
141
		len=end - ch - 1;
142
	else
143
		len=ch - pszFileName;
144
	size_t extlen=strlen(pszExt);
145
	newfile=new char[len + extlen + 2];
146
	newfile[len + extlen + 1]=0;
147
	memcpy(newfile, pszFileName, len);
148
	newfile[len]='.';
149
	memcpy(newfile + len + 1, pszExt, extlen);
150
	return newfile;
151
}
152
//---------------------------------------------------------------------------------
153
const char * GetFileExtension(const char *pszFileName)
154
{
155
	const char *ch, *end=pszFileName + strlen(pszFileName);
156
 
157
	for(ch=end; ch >= pszFileName && *ch!='.' && *ch!='\\'; ch--)
158
	 ;;
159
 
160
	if(ch < pszFileName || *ch=='\\')
161
		return end;
162
	else
163
		return ch + 1;
164
}
165
//---------------------------------------------------------------------------------
166
int hextoi(const char *str)
167
{
168
	size_t len, last;
169
	bool neg=false;
170
	while(*str!=0 && *str==' ')
171
		str++;
172
 
173
	// skip leading 0x....
174
	if(*str=='+')
175
		str++;
176
	else if(*str=='-') {
177
		str++;
178
		neg=true;
179
	}
180
	if(*str=='0' && ((str[1] | 0x20)=='x'))
181
		str+=2;
182
 
183
	int val=0, v;
184
 
185
	len=strlen(str);
186
	for(last=0; last < len; last++){
187
		int v=str[last] | 0x20;
188
		if(!((v >= '0' && v <='9') || (v >= 'a' && v <='f')))
189
			break;
190
	}
191
 
114 cycrow 192
	for(size_t i = last - 1; (int)i >= 0; i--){
193
		v = str[i] | 0x20;
1 cycrow 194
		if(v >= 'a')
195
			v-=87;
196
		else
197
			v-=48;
198
 
114 cycrow 199
		val += v * (int)pow(16.0, (int)(last - i - 1));
1 cycrow 200
	}
201
	if(neg)	val*=-1;
202
	return val;
203
}
204
//---------------------------------------------------------------------------------
205
bool ishexa(const char *str)
206
{
207
	size_t len, last;
208
	while(*str!=0 && *str==' ')
209
		str++;
210
 
211
	if(*str=='+' || *str=='-')
212
		str++;
213
 
214
	// skip leading 0x....
215
	if(*str=='0' && ((str[1] | 0x20)=='x'))
216
		str+=2;
217
 
218
	len=strlen(str);
219
	if(len==0) return false;
220
	for(last=0; last < len; last++){
221
		int v=str[last] | 0x20;
222
		if(!((v >= '0' && v <='9') || (v >= 'a' && v <='f')))
223
			return false;
224
	}
225
 
226
	return true;
227
}
228
//---------------------------------------------------------------------------------