aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--bpeg.c21
-rw-r--r--utils.c10
-rw-r--r--utils.h1
3 files changed, 23 insertions, 9 deletions
diff --git a/bpeg.c b/bpeg.c
index 824977e..9099c26 100644
--- a/bpeg.c
+++ b/bpeg.c
@@ -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;
diff --git a/utils.c b/utils.c
index 3a50abd..95fe0f0 100644
--- a/utils.c
+++ b/utils.c
@@ -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
diff --git a/utils.h b/utils.h
index c537853..8588d24 100644
--- a/utils.h
+++ b/utils.h
@@ -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);