From ce05175372a9ddca1a225db0765ace1127a39293 Mon Sep 17 00:00:00 2001 From: Nicholas Date: Fri, 12 Nov 2021 09:22:01 -0800 Subject: chore: simplified organizational structure --- src/cmd/walk/rules.mk | 15 +++++++++ src/cmd/walk/walk.c | 84 +++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 99 insertions(+) create mode 100644 src/cmd/walk/rules.mk create mode 100644 src/cmd/walk/walk.c (limited to 'src/cmd/walk') diff --git a/src/cmd/walk/rules.mk b/src/cmd/walk/rules.mk new file mode 100644 index 0000000..cb9768c --- /dev/null +++ b/src/cmd/walk/rules.mk @@ -0,0 +1,15 @@ +include share/push.mk + +# local sources +SRCS_$(d):=$(d)/walk.c + +# local outputs +BINS_$(d):=$(d)/walk + +include share/paths.mk + +# Local rules +$(BINS_$(d)): $(OBJS_$(d)) $(OBJ_DIR)/base/base.a + $(COMPLINK) + +include share/pop.mk diff --git a/src/cmd/walk/walk.c b/src/cmd/walk/walk.c new file mode 100644 index 0000000..c68d6e0 --- /dev/null +++ b/src/cmd/walk/walk.c @@ -0,0 +1,84 @@ +#include +#include + +static char buf[4*1024], *c = buf; /* should be greater or equal to PATH_MAX */ + +static +void +flush(void) +{ + *c = 0; + puts(buf); + c = buf; +} + +static +int +print(void *data, char *rel, char *abs, io·Stat *info) +{ +copy: + while (*abs && c < (arrend(buf)-2)) + *c++ = *abs++; + + if (*abs) { + flush(); + goto copy; + } + *c++ = '\n'; + + return 0; +} + +static +void +usage(void) +{ + fprintf(stderr, "usage: walk [-dlpv] file ...\n"); + exit(1); +} + +int +main(int argc, char *argv[]) +{ + int i, f = fs·nolinks, err, max = 0; + char *p; + static fs·Walker walker; + + ARGBEGIN{ + case 'd': + max = atoi(ARGF()); + break; + case 'l': + f ^= fs·nolinks; + break; + case 'p': + f |= fs·preorder; + break; + case 'v': + f |= fs·verbose; + break; + default: + usage(); + }ARGEND; + + walker.flags = f; + walker.func = print; + walker.data = nil; + walker.max = max; + + if (argc == 0) { + fs·init(&walker, ""); + fs·walk(&walker); + return(err = walker.err); + } else { + err = 0; + for (i=0; i