mirror of
https://github.com/jart/cosmopolitan.git
synced 2025-06-27 23:08:31 +00:00
Add glob to cocmd (#740)
This commit is contained in:
parent
2b6261a52d
commit
94dcf81954
2 changed files with 25 additions and 3 deletions
|
@ -36,6 +36,7 @@
|
||||||
#include "libc/sysv/consts/sig.h"
|
#include "libc/sysv/consts/sig.h"
|
||||||
#include "libc/sysv/consts/timer.h"
|
#include "libc/sysv/consts/timer.h"
|
||||||
#include "third_party/awk/cmd.h"
|
#include "third_party/awk/cmd.h"
|
||||||
|
#include "third_party/musl/glob.h"
|
||||||
#include "third_party/sed/cmd.h"
|
#include "third_party/sed/cmd.h"
|
||||||
#include "third_party/tr/cmd.h"
|
#include "third_party/tr/cmd.h"
|
||||||
#include "tool/curl/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) {
|
int _cocmd(int argc, char **argv, char **envp) {
|
||||||
char *arg;
|
char *arg;
|
||||||
size_t i, j;
|
size_t i, j;
|
||||||
|
size_t globCount = 0;
|
||||||
|
int globFlags = 0;
|
||||||
|
glob_t globTheBuilder;
|
||||||
prog = argc > 0 ? argv[0] : "cocmd.com";
|
prog = argc > 0 ? argv[0] : "cocmd.com";
|
||||||
|
|
||||||
for (i = 1; i < 32; ++i) {
|
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;
|
||||||
unsupported[')'] = true;
|
unsupported[')'] = true;
|
||||||
unsupported['{'] = true;
|
unsupported['{'] = true;
|
||||||
unsupported['}'] = true;
|
unsupported['}'] = true;
|
||||||
|
if (!_weaken(glob)) {
|
||||||
|
unsupported['*'] = true;
|
||||||
unsupported['?'] = true;
|
unsupported['?'] = true;
|
||||||
|
}
|
||||||
|
|
||||||
if (argc != 3) {
|
if (argc != 3) {
|
||||||
Wexit(10, prog, ": error: wrong number of args\n", 0);
|
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] == '<') {
|
} else if (arg[0] == '<') {
|
||||||
Open(GetRedirectArg(prog, arg, 1), 0, O_RDONLY);
|
Open(GetRedirectArg(prog, arg, 1), 0, O_RDONLY);
|
||||||
} else {
|
} else {
|
||||||
|
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++] = arg;
|
||||||
|
}
|
||||||
args[n] = 0;
|
args[n] = 0;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -18,6 +18,8 @@
|
||||||
╚─────────────────────────────────────────────────────────────────────────────*/
|
╚─────────────────────────────────────────────────────────────────────────────*/
|
||||||
#include "libc/runtime/runtime.h"
|
#include "libc/runtime/runtime.h"
|
||||||
|
|
||||||
|
STATIC_YOINK("glob");
|
||||||
|
|
||||||
int main(int argc, char **argv, char **envp) {
|
int main(int argc, char **argv, char **envp) {
|
||||||
return _cocmd(argc, argv, envp);
|
return _cocmd(argc, argv, envp);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue