#include "kernel/param.h" #include "kernel/types.h" #include "user/user.h" static inline int is_ws(const char ch) { return ch == ' ' || ch == '\t' || ch == '\n' || ch == '\r'; } int main(int argc, char** argv) { int STDIN = 0; char linebuf[1024]; char* p = linebuf; char* _argv[MAXARG]; while (read(STDIN, p, 1) > 0) { if (*p == '\n') { int i; int in_ws = 1; for (i = 0; i < argc - 1; ++i) { _argv[i] = argv[i + 1]; } for (char* p0 = linebuf; p0 <= p; ++p0) { if (is_ws(*p0)) { if (!in_ws) { in_ws = 1; i++; } *p0 = '\0'; } else if (in_ws) { in_ws = 0; _argv[i] = p0; } if (i >= MAXARG) { printf("warning: too many arguments"); break; } } *p = '\0'; _argv[i] = 0; // for (int j = 0; j < i; ++ j) { // printf("%s\n", _argv[j]); // } if (fork() == 0) { exec(_argv[0], _argv); exit(0); } else { p = linebuf; while (wait(0) != -1) ; } } else { p++; if (p >= linebuf + sizeof(linebuf)) { printf("line buffer exceeded\n"); exit(0); } } } exit(0); }