diff options
author | Mole Shang <[email protected]> | 2024-02-13 19:39:56 +0800 |
---|---|---|
committer | Mole Shang <[email protected]> | 2024-02-13 19:39:56 +0800 |
commit | 89ef6f717ed4b3e702e5f6f906f58fe1ea27d366 (patch) | |
tree | 760cce316675479a6cca77551438e8d2cc5fe9ae /user/xargs.c | |
parent | cfae93475dfb4cb5cfe264f4c029136e1447c262 (diff) | |
parent | 4a6593f1a6f666c618d303a4858c4c6d31b41c63 (diff) | |
download | xv6-labs-89ef6f717ed4b3e702e5f6f906f58fe1ea27d366.tar.gz xv6-labs-89ef6f717ed4b3e702e5f6f906f58fe1ea27d366.tar.bz2 xv6-labs-89ef6f717ed4b3e702e5f6f906f58fe1ea27d366.zip |
Merge branch 'cow' into net
Conflicts:
.gitignore
Makefile
conf/lab.mk
kernel/defs.h
kernel/syscall.c
kernel/vm.c
user/pingpong.c
user/user.h
user/usys.pl
Diffstat (limited to 'user/xargs.c')
-rw-r--r-- | user/xargs.c | 60 |
1 files changed, 60 insertions, 0 deletions
diff --git a/user/xargs.c b/user/xargs.c new file mode 100644 index 0000000..b5b9bee --- /dev/null +++ b/user/xargs.c @@ -0,0 +1,60 @@ +#include "kernel/types.h" + +#include "kernel/param.h" +#include "kernel/stat.h" +#include "user/user.h" + +#define is_blank(chr) (chr == ' ' || chr == '\t') + +int +main(int argc, char* argv[]) +{ + char buf[2048], ch; + char* p = buf; + char* v[MAXARG]; + int c; + int blanks = 0; + int offset = 0; + + if (argc <= 1) { + fprintf(2, "usage: xargs <command> [argv...]\n"); + exit(1); + } + + for (c = 1; c < argc; c++) { + v[c - 1] = argv[c]; + } + --c; + + while (read(0, &ch, 1) > 0) { + if (is_blank(ch)) { + blanks++; + continue; + } + + if (blanks) { + buf[offset++] = 0; + + v[c++] = p; + p = buf + offset; + + blanks = 0; + } + + if (ch != '\n') { + buf[offset++] = ch; + } else { + v[c++] = p; + p = buf + offset; + + if (!fork()) { + exit(exec(v[0], v)); + } + wait(0); + + c = argc - 1; + } + } + + exit(0); +} |