xstring.c
上传用户:tany51
上传日期:2013-06-12
资源大小:1397k
文件大小:7k
源码类别:

MySQL数据库

开发平台:

Visual C++

  1. /*
  2.  * Copyright (C) 2000,2001 Onlyer (onlyer@263.net)
  3.  *
  4.  * This program is free software; you can redistribute it and/or
  5.  * modify it under the terms of the GNU General Public License
  6.  * as published by the Free Software Foundation; either version 2
  7.  * of the License, or (at your option) any later version.
  8.  *
  9.  * This program is distributed in the hope that it will be useful,
  10.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  11.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  12.  * GNU General Public License for more details.
  13.  *
  14.  * You should have received a copy of the GNU General Public License
  15.  * along with this program; if not, write to the Free Software
  16.  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
  17.  */
  18. #include "common/setup_before.h"
  19. #include "setup.h"
  20. #include <stdio.h>
  21. #include <ctype.h>
  22. #ifdef HAVE_STRING_H
  23. # include <string.h>
  24. #else
  25. # ifdef HAVE_STRINGS_H
  26. #  include <strings.h>
  27. # endif
  28. # ifdef HAVE_MEMORY_H
  29. #  include <memory.h>
  30. # endif
  31. #endif
  32. #ifdef STDC_HEADERS
  33. # include <stdlib.h>
  34. #else
  35. # ifdef HAVE_MALLOC_H
  36. #  include <malloc.h>
  37. # endif
  38. #endif
  39. #include "compat/memcpy.h"
  40. #include "compat/memmove.h"
  41. #include "compat/strdup.h"
  42. #include "xstring.h"
  43. #include "common/setup_after.h"
  44. extern char * strtolower(char * str)
  45. {
  46. unsigned int i;
  47. unsigned char ch;
  48. if (!str) return NULL;
  49. for (i=0; (ch=str[i]); i++) {
  50. if ((isupper(ch))) str[i]=ch+('a'-'A');
  51. }
  52. return str;
  53. }
  54. extern unsigned char xtoi(unsigned char ch)
  55. {
  56. unsigned char retval;
  57. if (isalpha(ch)) retval=tolower(ch);
  58. else retval=ch;
  59. if (retval < 'A') retval -= ('0'-0);
  60. else retval -= ('a' - 0xa);
  61. return retval;
  62. }
  63. extern char * str_strip_affix(char * str, char const * affix)
  64. {
  65. unsigned int i, j, n;
  66. int match;
  67. if (!str) return NULL;
  68. if (!affix) return str;
  69. for (i=0; str[i]; i++) {
  70. match=0;
  71. for (n=0; affix[n]; n++) {
  72. if (str[i]==affix[n]) {
  73. match=1;
  74. break;
  75. }
  76. }
  77. if (!match) break;
  78. }
  79. for (j=strlen(str)-1; j>=i; j--) {
  80. match=0;
  81. for (n=0; affix[n]; n++) {
  82. if (str[j]==affix[n]) {
  83. match=1;
  84. break;
  85. }
  86. }
  87. if (!match) break;
  88. }
  89. if (i>j) {
  90. str[0]='';
  91. } else {
  92. memmove(str,str+i,j-i+1);
  93. str[j-i+1]='';
  94. }
  95. return str;
  96. }
  97. extern char * hexstrdup(unsigned char const * src)
  98. {
  99. char * dest;
  100. int len;
  101. if (!src) return NULL;
  102. if (!(dest=strdup(src))) return NULL;
  103. len=hexstrtoraw(src,dest,strlen(dest)+1);
  104. dest[len]='';
  105. return dest;
  106. }
  107. extern unsigned int hexstrtoraw(unsigned char const * src, char * data, unsigned int datalen)
  108. {
  109. unsigned char ch;
  110. unsigned int i, j;
  111. for (i=0, j=0; j<datalen; i++) {
  112. ch=src[i];
  113. if (!ch) break;
  114. if (ch=='\') {
  115. i++;
  116. ch=src[i];
  117. if (!ch) {
  118. break;
  119. } else if (ch=='\') {
  120. data[j++]=ch;
  121. } else if (ch=='x') {
  122. if (isxdigit(src[i+1])) { 
  123. if (isxdigit(src[i+2])) {
  124. data[j++]=xtoi(src[i+1]) * 0x10 + xtoi(src[i+2]);
  125. i+=2;
  126. } else {
  127. data[j++]=xtoi(src[i+1]);
  128. i++;
  129. }
  130. } else {
  131. data[j++]=ch;
  132. }
  133. } else if (ch=='n') {
  134. data[j++]='n';
  135. } else if (ch=='r') {
  136. data[j++]='r';
  137. } else if (ch=='a') {
  138. data[j++]='a';
  139. } else if (ch=='t') {
  140. data[j++]='t';
  141. } else if (ch=='b') {
  142. data[j++]='b';
  143. } else if (ch=='f') {
  144. data[j++]='f';
  145. } else if (ch=='v') {
  146. data[j++]='v';
  147. } else {
  148. data[j++]=ch;
  149. }
  150. } else {
  151. data[j++]=ch;
  152. continue;
  153. }
  154. }
  155. return j;
  156. }
  157. #define SPLIT_STRING_INIT_COUNT 32
  158. #define SPLIT_STRING_INCREASEMENT 32
  159. extern char * * strtoarray(char const * str, char const * delim, int * count)
  160. {
  161. int i ,n, index_size;
  162. int in_delim, match;
  163. char * temp, * result;
  164. int * pindex;
  165. char * pd;
  166. char const * ps;
  167. char * realloc_tmp;
  168. if (!str || !delim || !count) return NULL;
  169. temp=malloc(strlen(str)+1);
  170. if (!temp) return NULL;
  171. n = SPLIT_STRING_INIT_COUNT;
  172. pindex=malloc(sizeof(char *) * n);
  173. if (!pindex) {
  174. free(temp);
  175. return NULL;
  176. }
  177. *count=0;
  178. in_delim=1;
  179. ps=str;
  180. pd=temp;
  181. pindex[0]=0;
  182. while (*ps!='') {
  183. match=0;
  184. for (i=0; delim[i]!=''; i++) {
  185. if ( *ps == delim[i]) {
  186. match=1;
  187. if (!in_delim) {
  188. *pd = '';
  189. pd++;
  190. (*count)++;
  191. in_delim=1;
  192. }
  193. break;
  194. }
  195. }
  196. if (!match) {
  197. if (in_delim) {
  198. if (*count>=n) {
  199. n += SPLIT_STRING_INCREASEMENT;
  200. if (!(realloc_tmp=realloc(pindex,n * sizeof(char *)))) {
  201. free(pindex);
  202. free(temp);
  203. return NULL;
  204. }
  205. pindex=(int *)realloc_tmp;
  206. }
  207. pindex[*count]= pd-temp;
  208. in_delim = 0;
  209. }
  210. *pd = * ps;
  211. pd++;
  212. }
  213. ps++;
  214. }
  215. if (!in_delim) {
  216. *pd='';
  217. pd++;
  218. (*count)++;
  219. }
  220. index_size=*count * sizeof(char *);
  221. if (!index_size) {
  222. free(temp);
  223. free(pindex);
  224. return NULL;
  225. }
  226. result=malloc(pd-temp+index_size);
  227. if (!result) {
  228. free(temp);
  229. free(pindex);
  230. return NULL;
  231. }
  232. memcpy(result+index_size,temp,pd-temp);
  233. for (i=0; i< *count; i++) {
  234. pindex[i]+=(int)result+index_size;
  235. }
  236. memcpy(result,pindex,index_size);
  237. free(temp);
  238. free(pindex);
  239. return (char **) result;
  240. }
  241. extern char * * strtoargv(char const * str, unsigned int * count)
  242. {
  243. unsigned int n, index_size;
  244. char * temp;
  245. unsigned int i;
  246. int j;
  247. int * pindex;
  248. char * result;
  249. char * realloc_tmp;
  250. if (!str || !count) return NULL;
  251. temp=malloc(strlen(str)+1);
  252. if (!temp) return NULL;
  253. n = SPLIT_STRING_INIT_COUNT;
  254. pindex=malloc(n * sizeof (char *));
  255. if (!pindex) return NULL;
  256. i=j=0;
  257. *count=0;
  258. while (str[i]) {
  259. while (str[i]==' ' || str[i]=='t') i++;
  260. if (!str[i]) break;
  261. if (*count >=n ) {
  262. n += SPLIT_STRING_INCREASEMENT;
  263. if (!(realloc_tmp=realloc(pindex,n * sizeof(char *)))) {
  264. free(pindex);
  265. free(temp);
  266. return NULL;
  267. }
  268. pindex=(int *)realloc_tmp;
  269. }
  270. pindex[*count]=j;
  271. (*count)++;
  272. if (str[i]=='"') {
  273. i++;
  274. while (str[i]) {
  275. if (str[i]=='\') {
  276. i++;
  277. if (!str[i]) break;
  278. } else if (str[i]=='"') {
  279. i++;
  280. break;
  281. }
  282. temp[j++]=str[i++];
  283. }
  284. } else {
  285. while (str[i] && str[i] != ' ' && str[i] != 't') {
  286. temp[j++]=str[i++];
  287. }
  288. }
  289. temp[j++]='';
  290. }
  291. index_size= *count * sizeof(char *);
  292. if (!index_size) {
  293. free(temp);
  294. free(pindex);
  295. return NULL;
  296. }
  297. result=malloc(j+index_size);
  298. if (!result) {
  299. free(temp);
  300. free(pindex);
  301. return NULL;
  302. }
  303. memcpy(result+index_size,temp,j);
  304. for (i=0; i< *count; i++) {
  305. pindex[i] +=(int)result+index_size;
  306. }
  307. memcpy(result,pindex,index_size);
  308. free(temp);
  309. free(pindex);
  310. return (char * *)result;
  311. }
  312. #define COMBINE_STRING_INIT_LEN 1024
  313. #define COMBINE_STRING_INCREASEMENT 1024
  314. extern char * arraytostr(char * * array, char const * delim, int count)
  315. {
  316. int i;
  317. unsigned int n;
  318. char * result;
  319. char * realloc_tmp;
  320. int need_delim;
  321. if (!delim || !array) return NULL;
  322. n=COMBINE_STRING_INIT_LEN;
  323. result=malloc(n);
  324. if (!result) return NULL;
  325. result[0]='';
  326. need_delim=0;
  327. for (i=0; i<count; i++) {
  328. if (!array[i]) continue;
  329. if (strlen(result)+strlen(array[i])+strlen(delim)>=n) {
  330. n+=COMBINE_STRING_INCREASEMENT;
  331. if (!(realloc_tmp=realloc(result,n))) {
  332. free(result);
  333. return NULL;
  334. }
  335. result=realloc_tmp;
  336. }
  337. if (need_delim) {
  338. strcat(result,delim);
  339. }
  340. strcat(result,array[i]);
  341. need_delim=1;
  342. }
  343. if (!(realloc_tmp=realloc(result,strlen(result)+1))) {
  344. return result;
  345. }
  346. result=realloc_tmp;
  347. return result;
  348. }