struct cmd* parseline(char **ps, char *es) { struct cmd *cmd; cmd = parsepipe(ps, es); return cmd; }
struct cmd* parsepipe(char** ps, char* es) { struct cmd* cmd = parseexec(ps, es); if (peek(ps, es, "|")) { gettoken(ps, es, 0, 0); cmd = pipecmd(cmd, parsepipe(ps, es)); } return cmd; }
struct cmd* parseline(char** ps, char* es) { struct cmd* cmd = parsepipe(ps, es); while (peek(ps, es, "&")) { gettoken(ps, es, 0, 0); cmd = backcmd(cmd); } if (peek(ps, es, ";")) { gettoken(ps, es, 0, 0); cmd = listcmd(cmd, parseline(ps, es)); } return cmd; }
struct cmd* parsecmd(char *s) { char *es; struct cmd *cmd; es = s + strlen(s); cmd = parsepipe(&s, es); if(s != es) { fprintf(stderr, "leftovers: %s", s); exit(-1); } return cmd; }
struct cmd* parsepipe(char **ps, char *es) { struct cmd *cmd; char *q, *eq; if( 1 == scan(ps, es, "|", &q, &eq) ) { cmd = parseexec(&q, eq); (*ps)++; cmd = pipecmd(cmd, parsepipe(ps, es)); } else { cmd = parseexec(&q, eq); } return cmd; }