Introduce double quote support in cocmd.com shell

This commit is contained in:
Justine Tunney 2022-10-02 07:03:52 -07:00
parent 27b5deefb1
commit 0b5f84dd20
No known key found for this signature in database
GPG key ID: BE714B4575D6E328

View file

@ -35,6 +35,7 @@
#define STATE_SHELL 0
#define STATE_STR 1
#define STATE_QUO 2
char *p;
char *q;
@ -112,8 +113,8 @@ void Pipe(void) {
}
char *Tokenize(void) {
int t;
char *r;
int c, t;
while (*p == ' ' || *p == '\t' || *p == '\n' ||
(p[0] == '\\' && p[1] == '\n')) {
++p;
@ -130,6 +131,8 @@ char *Tokenize(void) {
if (!*p || *p == ' ' || *p == '\t') {
*q++ = 0;
return r;
} else if (*p == '"') {
t = STATE_QUO;
} else if (*p == '\'') {
t = STATE_STR;
} else if (*p == '\\') {
@ -150,7 +153,7 @@ char *Tokenize(void) {
case STATE_STR:
if (!*p) {
Write("cmd: error: unterminated string\n", 0);
Write("cmd: error: unterminated single string\n", 0);
exit(6);
}
if (*p == '\'') {
@ -160,6 +163,34 @@ char *Tokenize(void) {
}
break;
case STATE_QUO:
if (!*p) {
Write("cmd: error: unterminated quoted string\n", 0);
exit(6);
}
if (*p == '"') {
t = STATE_SHELL;
} else if (p[0] == '\\') {
switch ((c = *++p)) {
case 0:
UnsupportedSyntax('\\');
case '\n':
break;
case '$':
case '`':
case '"':
*q++ = c;
break;
default:
*q++ = '\\';
*q++ = c;
break;
}
} else {
*q++ = *p;
}
break;
default:
unreachable;
}
@ -187,7 +218,6 @@ int main(int argc, char *argv[]) {
unsupported['{'] = true;
unsupported['}'] = true;
unsupported[';'] = true;
unsupported['"'] = true;
unsupported['?'] = true;
unsupported['!'] = true;