ssplit.c
上传用户:qunlip
上传日期:2007-01-04
资源大小:203k
文件大小:3k
源码类别:

代理服务器

开发平台:

Visual C++

  1. char *ssplit_rcs = "$Id: ssplit.c,v 1.6 1998/10/27 16:25:07 ACJC Exp $";
  2. /* Written and copyright 1997 Anonymous Coders and Junkbusters Corporation.
  3.  * Distributed under the GNU General Public License; see the README file.
  4.  * This code comes with NO WARRANTY. http://www.junkbusters.com/ht/en/gpl.html
  5.  */
  6. /* ssplit() - split a string (in-place) into fields
  7.  *      s = string to split
  8.  *      c = list of characters to be used as field separators
  9.  *          (if NULL, use default separators of space, tab, and newline)
  10.  *
  11.  *      v = vector into which field pointers are placed
  12.  *      n = number of fields in vector
  13.  *
  14.  *      m = flag indicating whether to treat strings of field
  15.  *          separators as indicating multiple fields
  16.  *
  17.  *      l = flag indicating whether to ignore leading field separators
  18.  */
  19. #include <string.h>
  20. int ssplit(char *s, char *c, char *v[], int n, int m, int l)
  21. {
  22.     char t[256];
  23.     char **x = NULL;
  24.     int xsize = 0;
  25.     unsigned char *p, b;
  26.     int xi = 0;
  27.     int vi = 0;
  28.     int i;
  29.     int last_was_null;
  30.     if (!s)
  31. return (-1);
  32.     memset(t, '', sizeof(t));
  33.     p = (unsigned char *) c;
  34.     if (!p)
  35. p = (unsigned char *) " t"; /* default field separators */
  36.     while (*p)
  37. t[*p++] = 1; /* separator  */
  38.     t[''] = 2; /* terminator */
  39.     t['n'] = 2; /* terminator */
  40.     p = (unsigned char *) s;
  41.     if(l) { /* are we to skip leading separators ? */
  42.      while((b = t[*p]) != 2) {
  43. if(b != 1) break;
  44. p++;
  45. }
  46.     }
  47.     xsize = 256;
  48.     x = (char **) zalloc((xsize) * sizeof(char *));
  49.     x[xi++] = (char *) p; /* first pointer is the beginning of string */
  50.     /* first pass:  save pointers to the field separators */
  51.     while((b = t[*p]) != 2) {
  52.      if(b == 1) { /* if the char is a separator ... */
  53. *p++    = ''; /* null terminate the substring */
  54. if(xi == xsize) {
  55. /* get another chunk */
  56. int new_xsize = xsize + 256;
  57. char **new_x = (char **)
  58. zalloc((new_xsize) * sizeof(char *));
  59. for(i=0; i < xsize; i++) new_x[i] = x[i];
  60. free(x);
  61. xsize = new_xsize;
  62. x     = new_x;
  63. }
  64. x[xi++] = (char *) p; /* save pointer to beginning of next string */
  65. } else {
  66. p++;
  67. }
  68.     }
  69.     *p = ''; /* null terminate the substring */
  70. #ifdef DEBUG
  71. print(x, xi); /* debugging */
  72. #endif
  73.     /* second pass: copy the relevant pointers to the output vector */
  74.     last_was_null = 0;
  75.     for(i=0 ; i < xi; i++) {
  76. if(m) {
  77. /* there are NO null fields */
  78. if(*x[i] == 0) continue;
  79. }
  80. if(vi < n) {
  81. v[vi++] = x[i];
  82. } else {
  83. free(x);
  84. return(-1); /* overflow */
  85. }
  86.     }
  87.     free(x);
  88. #ifdef DEBUG
  89. print(v, vi); /* debugging  */
  90. #endif
  91.     return (vi);
  92. }
  93. #ifdef DEBUG
  94. print(char **v, int n)
  95. {
  96. int i;
  97. printf("dump %d stringsn", n);
  98. for(i=0; i < n; i++) {
  99. printf("%d '%s'n", i, v[i]);
  100. }
  101. }
  102. #endif