[BACK]Return to tokenizer.c CVS log [TXT][DIR] Up to [cvs.NetBSD.org] / src / lib / libedit

Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.

Diff for /src/lib/libedit/tokenizer.c between version 1.17 and 1.21

version 1.17, 2009/12/30 23:54:52 version 1.21, 2011/08/16 16:25:15
Line 68  typedef enum {
Line 68  typedef enum {
 #define tok_strdup(a)           Strdup(a)  #define tok_strdup(a)           Strdup(a)
   
   
 struct FUNW(tokenizer) {  struct TYPE(tokenizer) {
         Char    *ifs;           /* In field separator                    */          Char    *ifs;           /* In field separator                    */
         int      argc, amax;    /* Current and maximum number of args    */          size_t   argc, amax;    /* Current and maximum number of args    */
         Char   **argv;          /* Argument list                         */          Char   **argv;          /* Argument list                         */
         Char    *wptr, *wmax;   /* Space and limit on the word buffer    */          Char    *wptr, *wmax;   /* Space and limit on the word buffer    */
         Char    *wstart;        /* Beginning of next word                */          Char    *wstart;        /* Beginning of next word                */
Line 106  FUN(tok,finish)(TYPE(Tokenizer) *tok)
Line 106  FUN(tok,finish)(TYPE(Tokenizer) *tok)
 public TYPE(Tokenizer) *  public TYPE(Tokenizer) *
 FUN(tok,init)(const Char *ifs)  FUN(tok,init)(const Char *ifs)
 {  {
         TYPE(Tokenizer) *tok = tok_malloc(sizeof(TYPE(Tokenizer)));          TYPE(Tokenizer) *tok = tok_malloc(sizeof(*tok));
   
         if (tok == NULL)          if (tok == NULL)
                 return NULL;                  return NULL;
         tok->ifs = tok_strdup(ifs ? ifs : IFS);          tok->ifs = tok_strdup(ifs ? ifs : IFS);
         if (tok->ifs == NULL) {          if (tok->ifs == NULL) {
                 tok_free((ptr_t)tok);                  tok_free(tok);
                 return NULL;                  return NULL;
         }          }
         tok->argc = 0;          tok->argc = 0;
         tok->amax = AINCR;          tok->amax = AINCR;
         tok->argv = tok_malloc(sizeof(*tok->argv) * tok->amax);          tok->argv = tok_malloc(sizeof(*tok->argv) * tok->amax);
         if (tok->argv == NULL) {          if (tok->argv == NULL) {
                 tok_free((ptr_t)tok->ifs);                  tok_free(tok->ifs);
                 tok_free((ptr_t)tok);                  tok_free(tok);
                 return NULL;                  return NULL;
         }          }
         tok->argv[0] = NULL;          tok->argv[0] = NULL;
         tok->wspace = tok_malloc(WINCR * sizeof(*tok->wspace));          tok->wspace = tok_malloc(WINCR * sizeof(*tok->wspace));
         if (tok->wspace == NULL) {          if (tok->wspace == NULL) {
                 tok_free((ptr_t)tok->argv);                  tok_free(tok->argv);
                 tok_free((ptr_t)tok->ifs);                  tok_free(tok->ifs);
                 tok_free((ptr_t)tok);                  tok_free(tok);
                 return NULL;                  return NULL;
         }          }
         tok->wmax = tok->wspace + WINCR;          tok->wmax = tok->wspace + WINCR;
Line 137  FUN(tok,init)(const Char *ifs)
Line 137  FUN(tok,init)(const Char *ifs)
         tok->flags = 0;          tok->flags = 0;
         tok->quote = Q_none;          tok->quote = Q_none;
   
         return (tok);          return tok;
 }  }
   
   
Line 163  public void
Line 163  public void
 FUN(tok,end)(TYPE(Tokenizer) *tok)  FUN(tok,end)(TYPE(Tokenizer) *tok)
 {  {
   
         tok_free((ptr_t) tok->ifs);          tok_free(tok->ifs);
         tok_free((ptr_t) tok->wspace);          tok_free(tok->wspace);
         tok_free((ptr_t) tok->argv);          tok_free(tok->argv);
         tok_free((ptr_t) tok);          tok_free(tok);
 }  }
   
   
Line 201  FUN(tok,line)(TYPE(Tokenizer) *tok, cons
Line 201  FUN(tok,line)(TYPE(Tokenizer) *tok, cons
                 if (ptr >= line->lastchar)                  if (ptr >= line->lastchar)
                         ptr = STR("");                          ptr = STR("");
                 if (ptr == line->cursor) {                  if (ptr == line->cursor) {
                         cc = tok->argc;                          cc = (int)tok->argc;
                         co = (int)(tok->wptr - tok->wstart);                          co = (int)(tok->wptr - tok->wstart);
                 }                  }
                 switch (*ptr) {                  switch (*ptr) {
Line 233  FUN(tok,line)(TYPE(Tokenizer) *tok, cons
Line 233  FUN(tok,line)(TYPE(Tokenizer) *tok, cons
                                 break;                                  break;
   
                         default:                          default:
                                 return (-1);                                  return -1;
                         }                          }
                         break;                          break;
   
Line 264  FUN(tok,line)(TYPE(Tokenizer) *tok, cons
Line 264  FUN(tok,line)(TYPE(Tokenizer) *tok, cons
                                 break;                                  break;
   
                         default:                          default:
                                 return (-1);                                  return -1;
                         }                          }
                         break;                          break;
   
Line 295  FUN(tok,line)(TYPE(Tokenizer) *tok, cons
Line 295  FUN(tok,line)(TYPE(Tokenizer) *tok, cons
                                 break;                                  break;
   
                         default:                          default:
                                 return (-1);                                  return -1;
                         }                          }
                         break;                          break;
   
Line 321  FUN(tok,line)(TYPE(Tokenizer) *tok, cons
Line 321  FUN(tok,line)(TYPE(Tokenizer) *tok, cons
                                 break;                                  break;
   
                         default:                          default:
                                 return (0);                                  return 0;
                         }                          }
                         break;                          break;
   
Line 331  FUN(tok,line)(TYPE(Tokenizer) *tok, cons
Line 331  FUN(tok,line)(TYPE(Tokenizer) *tok, cons
                                 /* Finish word and return */                                  /* Finish word and return */
                                 if (tok->flags & TOK_EAT) {                                  if (tok->flags & TOK_EAT) {
                                         tok->flags &= ~TOK_EAT;                                          tok->flags &= ~TOK_EAT;
                                         return (3);                                          return 3;
                                 }                                  }
                                 goto tok_line_outok;                                  goto tok_line_outok;
   
                         case Q_single:                          case Q_single:
                                 return (1);                                  return 1;
   
                         case Q_double:                          case Q_double:
                                 return (2);                                  return 2;
   
                         case Q_doubleone:                          case Q_doubleone:
                                 tok->quote = Q_double;                                  tok->quote = Q_double;
Line 352  FUN(tok,line)(TYPE(Tokenizer) *tok, cons
Line 352  FUN(tok,line)(TYPE(Tokenizer) *tok, cons
                                 break;                                  break;
   
                         default:                          default:
                                 return (-1);                                  return -1;
                         }                          }
                         break;                          break;
   
Line 384  FUN(tok,line)(TYPE(Tokenizer) *tok, cons
Line 384  FUN(tok,line)(TYPE(Tokenizer) *tok, cons
                                 break;                                  break;
   
                         default:                          default:
                                 return (-1);                                  return -1;
   
                         }                          }
                         break;                          break;
                 }                  }
   
                 if (tok->wptr >= tok->wmax - 4) {                  if (tok->wptr >= tok->wmax - 4) {
                         size_t size = tok->wmax - tok->wspace + WINCR;                          size_t size = (size_t)(tok->wmax - tok->wspace + WINCR);
                         Char *s = tok_realloc(tok->wspace,                          Char *s = tok_realloc(tok->wspace,
                             size * sizeof(*s));                              size * sizeof(*s));
                         if (s == NULL)                          if (s == NULL)
                                 return (-1);                                  return -1;
   
                         if (s != tok->wspace) {                          if (s != tok->wspace) {
                                 int i;                                  size_t i;
                                 for (i = 0; i < tok->argc; i++) {                                  for (i = 0; i < tok->argc; i++) {
                                     tok->argv[i] =                                      tok->argv[i] =
                                         (tok->argv[i] - tok->wspace) + s;                                          (tok->argv[i] - tok->wspace) + s;
Line 414  FUN(tok,line)(TYPE(Tokenizer) *tok, cons
Line 414  FUN(tok,line)(TYPE(Tokenizer) *tok, cons
                         tok->amax += AINCR;                          tok->amax += AINCR;
                         p = tok_realloc(tok->argv, tok->amax * sizeof(*p));                          p = tok_realloc(tok->argv, tok->amax * sizeof(*p));
                         if (p == NULL)                          if (p == NULL)
                                 return (-1);                                  return -1;
                         tok->argv = p;                          tok->argv = p;
                 }                  }
         }          }
  tok_line_outok:   tok_line_outok:
         if (cc == -1 && co == -1) {          if (cc == -1 && co == -1) {
                 cc = tok->argc;                  cc = (int)tok->argc;
                 co = (int)(tok->wptr - tok->wstart);                  co = (int)(tok->wptr - tok->wstart);
         }          }
         if (cursorc != NULL)          if (cursorc != NULL)
Line 429  FUN(tok,line)(TYPE(Tokenizer) *tok, cons
Line 429  FUN(tok,line)(TYPE(Tokenizer) *tok, cons
                 *cursoro = co;                  *cursoro = co;
         FUN(tok,finish)(tok);          FUN(tok,finish)(tok);
         *argv = (const Char **)tok->argv;          *argv = (const Char **)tok->argv;
         *argc = tok->argc;          *argc = (int)tok->argc;
         return (0);          return 0;
 }  }
   
 /* FUN(tok,str)():  /* FUN(tok,str)():
Line 446  FUN(tok,str)(TYPE(Tokenizer) *tok, const
Line 446  FUN(tok,str)(TYPE(Tokenizer) *tok, const
         memset(&li, 0, sizeof(li));          memset(&li, 0, sizeof(li));
         li.buffer = line;          li.buffer = line;
         li.cursor = li.lastchar = Strchr(line, '\0');          li.cursor = li.lastchar = Strchr(line, '\0');
         return (FUN(tok,line)(tok, &li, argc, argv, NULL, NULL));          return FUN(tok,line(tok, &li, argc, argv, NULL, NULL));
 }  }

Legend:
Removed from v.1.17  
changed lines
  Added in v.1.21

CVSweb <webmaster@jp.NetBSD.org>