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'; |