Subversion Repositories spk

Rev

Rev 114 | Go to most recent revision | Details | Last modification | View Log | RSS feed

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