mirror of
https://github.com/jart/cosmopolitan.git
synced 2025-03-03 15:38:22 +00:00
Introduce double quote support in cocmd.com shell
This commit is contained in:
parent
27b5deefb1
commit
0b5f84dd20
1 changed files with 33 additions and 3 deletions
|
@ -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;
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue