version 1.15, 2000/09/14 13:32:07 |
version 1.16, 2000/09/14 13:35:38 |
|
|
return(argv); |
return(argv); |
} |
} |
|
|
|
/* Iterate through a string word by word, |
|
* without needing to copy anything. |
|
* More light-weight than brk_string, handles \ ' " as well. |
|
* |
|
* position = s; |
|
* while ((begin = iterate_words(&position)) != NULL) { |
|
* do_something_with_word_interval(begin, position); |
|
* } |
|
*/ |
|
const char * |
|
iterate_words(end) |
|
const char **end; |
|
{ |
|
const char *start, *p; |
|
char state = 0; |
|
start = *end; |
|
|
|
while (isspace(*start)) |
|
start++; |
|
if (*start == '\0') |
|
return NULL; |
|
|
|
for (p = start;; p++) |
|
switch(*p) { |
|
case '\\': |
|
if (p[1] != '\0') |
|
p++; |
|
break; |
|
case '\'': |
|
case '"': |
|
if (state == *p) |
|
state = 0; |
|
else if (state == 0) |
|
state = *p; |
|
break; |
|
case ' ': |
|
case '\t': |
|
if (state != 0) |
|
break; |
|
/* FALLTHROUGH */ |
|
case '\0': |
|
*end = p; |
|
return start; |
|
default: |
|
break; |
|
} |
|
} |
|
|
/* |
/* |
* Str_Match -- |
* Str_Match -- |
* |
* |
|
|
s[end-begin] = '\0'; |
s[end-begin] = '\0'; |
return s; |
return s; |
} |
} |
|
|
|
/* copy interval, skipping characters in the set. */ |
|
char * |
|
escape_dup(begin, end, set) |
|
const char *begin; |
|
const char *end; |
|
const char *set; |
|
{ |
|
char *s, *t; |
|
|
|
t = s = emalloc(end - begin + 1); |
|
while (begin != end) { |
|
if (*begin == '\\') { |
|
begin++; |
|
if (begin == end) { |
|
*t++ = '\\'; |
|
break; |
|
} |
|
if (strchr(set, *begin) == NULL) |
|
*t++ = '\\'; |
|
} |
|
*t++ = *begin++; |
|
} |
|
*t++ = '\0'; |
|
return s; |
|
} |
|
|