version 1.17, 2009/12/30 23:54:52 |
version 1.21, 2011/08/16 16:25:15 |
|
|
#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; |
} |
} |
|
|
|
|
|
|
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)); |
} |
} |