|
Lines 72-80
Link Here
|
| 72 |
static int |
72 |
static int |
| 73 |
isquote(int ch) |
73 |
isquote(int ch) |
| 74 |
{ |
74 |
{ |
| 75 |
return (ch == '\'' || ch == '"'); |
75 |
return (ch == '\''); |
| 76 |
} |
76 |
} |
| 77 |
|
77 |
|
|
|
78 |
static int |
| 79 |
isdquote(int ch) |
| 80 |
{ |
| 81 |
return (ch == '"'); |
| 82 |
} |
| 83 |
|
| 78 |
int |
84 |
int |
| 79 |
parse(int *argc, char ***argv, char *str) |
85 |
parse(int *argc, char ***argv, char *str) |
| 80 |
{ |
86 |
{ |
|
Lines 81-91
Link Here
|
| 81 |
int ac; |
87 |
int ac; |
| 82 |
char *val, *p, *q, *copy = NULL; |
88 |
char *val, *p, *q, *copy = NULL; |
| 83 |
size_t i = 0; |
89 |
size_t i = 0; |
| 84 |
char token, tmp, quote, *buf; |
90 |
char token, tmp, quote, dquote, *buf; |
| 85 |
enum { STR, VAR, WHITE } state; |
91 |
enum { STR, VAR, WHITE } state; |
| 86 |
|
92 |
|
| 87 |
ac = *argc = 0; |
93 |
ac = *argc = 0; |
| 88 |
quote = 0; |
94 |
dquote = quote = 0; |
| 89 |
if (!str || (p = copy = backslash(str)) == NULL) |
95 |
if (!str || (p = copy = backslash(str)) == NULL) |
| 90 |
return 1; |
96 |
return 1; |
| 91 |
|
97 |
|
|
Lines 105-113
Link Here
|
| 105 |
buf[i++] = *p++; |
111 |
buf[i++] = *p++; |
| 106 |
} else if (isquote(*p)) { |
112 |
} else if (isquote(*p)) { |
| 107 |
quote = quote ? 0 : *p; |
113 |
quote = quote ? 0 : *p; |
| 108 |
++p; |
114 |
if (dquote) { /* keep quote */ |
|
|
115 |
PARSE_FAIL(i == (PARSE_BUFSIZE - 1)); |
| 116 |
buf[i++] = *p++; |
| 117 |
} else |
| 118 |
++p; |
| 119 |
} else if (isdquote(*p)) { |
| 120 |
dquote = dquote ? 0 : *p; |
| 121 |
if (quote) { /* keep dquote */ |
| 122 |
PARSE_FAIL(i == (PARSE_BUFSIZE - 1)); |
| 123 |
buf[i++] = *p++; |
| 124 |
} else |
| 125 |
++p; |
| 109 |
} |
126 |
} |
| 110 |
else if (isspace(*p) && !quote) { |
127 |
else if (isspace(*p) && !quote && !dquote) { |
| 111 |
state = WHITE; |
128 |
state = WHITE; |
| 112 |
if (i) { |
129 |
if (i) { |
| 113 |
buf[i] = '\0'; |
130 |
buf[i] = '\0'; |
|
Lines 115-121
Link Here
|
| 115 |
i = 0; |
132 |
i = 0; |
| 116 |
} |
133 |
} |
| 117 |
++p; |
134 |
++p; |
| 118 |
} else if (*p == '$') { |
135 |
} else if (*p == '$' && !quote) { |
| 119 |
token = isdelim(*(p + 1)); |
136 |
token = isdelim(*(p + 1)); |
| 120 |
if (token) |
137 |
if (token) |
| 121 |
p += 2; |
138 |
p += 2; |
|
Lines 157-162
Link Here
|
| 157 |
break; |
174 |
break; |
| 158 |
} |
175 |
} |
| 159 |
} |
176 |
} |
|
|
177 |
/* missing terminating ' or " */ |
| 178 |
PARSE_FAIL(quote || dquote); |
| 160 |
/* If at end of token, add it */ |
179 |
/* If at end of token, add it */ |
| 161 |
if (i && state == STR) { |
180 |
if (i && state == STR) { |
| 162 |
buf[i] = '\0'; |
181 |
buf[i] = '\0'; |