From 7a84c43dffb3d7872c95025764e37ae7b9364174 Mon Sep 17 00:00:00 2001 From: Gavin Hayes Date: Thu, 9 Feb 2023 01:30:50 -0500 Subject: [PATCH] add glob to cocmd --- libc/runtime/cocmd.c | 26 +++++++++++++++++++++++--- tool/build/cocmd.c | 2 ++ 2 files changed, 25 insertions(+), 3 deletions(-) diff --git a/libc/runtime/cocmd.c b/libc/runtime/cocmd.c index 7039f287d..5b899f69b 100644 --- a/libc/runtime/cocmd.c +++ b/libc/runtime/cocmd.c @@ -36,6 +36,7 @@ #include "libc/sysv/consts/sig.h" #include "libc/sysv/consts/timer.h" #include "third_party/awk/cmd.h" +#include "third_party/musl/glob.h" #include "third_party/sed/cmd.h" #include "third_party/tr/cmd.h" #include "tool/curl/cmd.h" @@ -662,6 +663,9 @@ static const char *GetRedirectArg(const char *prog, const char *arg, int n) { int _cocmd(int argc, char **argv, char **envp) { char *arg; size_t i, j; + size_t globCount = 0; + int globFlags = 0; + glob_t globTheBuilder; prog = argc > 0 ? argv[0] : "cocmd.com"; for (i = 1; i < 32; ++i) { @@ -673,12 +677,14 @@ int _cocmd(int argc, char **argv, char **envp) { unsupported['~'] = true; unsupported['`'] = true; unsupported['#'] = true; - unsupported['*'] = true; unsupported['('] = true; unsupported[')'] = true; unsupported['{'] = true; unsupported['}'] = true; - unsupported['?'] = true; + if (!_weaken(glob)) { + unsupported['*'] = true; + unsupported['?'] = true; + } if (argc != 3) { Wexit(10, prog, ": error: wrong number of args\n", 0); @@ -727,7 +733,21 @@ int _cocmd(int argc, char **argv, char **envp) { } else if (arg[0] == '<') { Open(GetRedirectArg(prog, arg, 1), 0, O_RDONLY); } else { - args[n++] = arg; + int globrc = GLOB_NOMATCH; + if (_weaken(glob)) { + globrc = _weaken(glob)(arg, globFlags, NULL, &globTheBuilder); + if (globrc == 0) { + for (; globCount < globTheBuilder.gl_pathc; globCount++) { + args[n++] = globTheBuilder.gl_pathv[globCount]; + } + } else if (globrc != GLOB_NOMATCH) { + Wexit(16, prog, ": error: with glob\n", 0); + } + globFlags |= GLOB_APPEND; + } + if (globrc == GLOB_NOMATCH) { + args[n++] = arg; + } args[n] = 0; } } else { diff --git a/tool/build/cocmd.c b/tool/build/cocmd.c index 1bb6b7380..0dfab8b6f 100644 --- a/tool/build/cocmd.c +++ b/tool/build/cocmd.c @@ -18,6 +18,8 @@ ╚─────────────────────────────────────────────────────────────────────────────*/ #include "libc/runtime/runtime.h" +STATIC_YOINK("glob"); + int main(int argc, char **argv, char **envp) { return _cocmd(argc, argv, envp); }