59 lines
1.6 KiB
C
59 lines
1.6 KiB
C
#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);
|
|
} |