diff options
| author | Bruce Hill <bruce@bruce-hill.com> | 2020-09-12 20:05:55 -0700 |
|---|---|---|
| committer | Bruce Hill <bruce@bruce-hill.com> | 2020-09-12 20:05:55 -0700 |
| commit | 877526b5df3c73310f1029e56c9dff1c0374c7a2 (patch) | |
| tree | 856a93dc8d372e66ca240c50cc5fb0e4e0c84ca1 | |
| parent | c18eb4c9968289c4808d70f7124c0b6bed5eb022 (diff) | |
Fixes for CLI flags
| -rw-r--r-- | bpeg.c | 21 | ||||
| -rw-r--r-- | utils.c | 10 | ||||
| -rw-r--r-- | utils.h | 1 |
3 files changed, 23 insertions, 9 deletions
@@ -78,11 +78,11 @@ int main(int argc, char *argv[]) int fd; if ((fd=open("/etc/xdg/bpeg/builtins.bpeg", O_RDONLY)) >= 0) - load_grammar(g, readfile(fd)); + load_grammar(g, readfile(fd)); // Keep in memory for debugging output char path[PATH_MAX] = {0}; sprintf(path, "%s/.config/bpeg/builtins.bpeg", getenv("HOME")); if ((fd=open(path, O_RDONLY)) >= 0) - load_grammar(g, readfile(fd)); + load_grammar(g, readfile(fd)); // Keep in memory for debugging output int i, npatterns = 0; for (i = 1; i < argc; i++) { @@ -94,8 +94,6 @@ int main(int argc, char *argv[]) return 0; } else if (FLAG("--verbose") || FLAG("-v")) { verbose = 1; - } else if (FLAG("--pattern") || FLAG("-p")) { - rule = flag; } else if (FLAG("--replace") || FLAG("-r")) { vm_op_t *p = bpeg_replacement(bpeg_pattern("pattern"), flag); check(p, "Replacement failed to compile"); @@ -117,7 +115,7 @@ int main(int argc, char *argv[]) } check(fd >= 0, "Couldn't find grammar: %s", flag); } - load_grammar(g, readfile(fd)); + load_grammar(g, readfile(fd)); // Keep in memory for debug output } else if (FLAG("--define") || FLAG("-d")) { char *def = flag; char *eq = strchr(def, '='); @@ -129,9 +127,14 @@ int main(int argc, char *argv[]) add_def(g, src, def, pat); } else if (FLAG("--escaped") || FLAG("-e")) { check(npatterns == 0, "Cannot define multiple patterns"); - vm_op_t *p = bpeg_pattern(argv[i]); + vm_op_t *p = bpeg_pattern(flag); + check(p, "Pattern failed to compile: '%s'", flag); + add_def(g, flag, "pattern", p); + ++npatterns; + } else if (FLAG("--string") || FLAG("-s")) { + vm_op_t *p = bpeg_stringpattern(flag); check(p, "Pattern failed to compile"); - add_def(g, argv[i], "pattern", p); + add_def(g, flag, "pattern", p); ++npatterns; } else if (argv[i][0] != '-') { if (npatterns > 0) break; @@ -139,6 +142,9 @@ int main(int argc, char *argv[]) check(p, "Pattern failed to compile"); add_def(g, argv[i], "pattern", p); ++npatterns; + } else { + printf("Unrecognized flag: %s\n%s\n", argv[i], usage); + return 1; } } @@ -180,6 +186,7 @@ int main(int argc, char *argv[]) print_match(m, "\033[0m", verbose); //printf("\033[0;2m%s\n", m->end); } + freefile(input); } return 0; @@ -154,19 +154,25 @@ size_t unescape_string(char *dest, const char *src, size_t bufsize) } /* - * Read an entire file into memory. + * Read an entire file into memory. (Guaranteeing that ret[-1] == '\0') */ char *readfile(int fd) { size_t capacity = 1000, len = 0; char *buf = calloc(sizeof(char), capacity+1); + buf[len++] = '\0'; ssize_t just_read; while ((just_read=read(fd, &buf[len], capacity-len)) > 0) { len += (size_t)just_read; if (len >= capacity) buf = realloc(buf, sizeof(char)*(capacity *= 2)); } - return buf; + return &buf[1]; +} + +void freefile(char *f) +{ + free(&f[-1]); } // vim: ts=4 sw=0 et cino=L2,l1,(0,W4,m1 @@ -18,6 +18,7 @@ #define debug(...) do { if (verbose) fprintf(stderr, __VA_ARGS__); } while(0) char *readfile(int fd); +void freefile(char *f); char unescapechar(const char *escaped, const char **end); const char *after_name(const char *str); const char *after_spaces(const char *str); |
