aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Makefile5
-rw-r--r--bpeg.c16
-rw-r--r--grammar.c45
3 files changed, 14 insertions, 52 deletions
diff --git a/Makefile b/Makefile
index 7636bce..0eb9b9e 100644
--- a/Makefile
+++ b/Makefile
@@ -27,7 +27,9 @@ install: $(NAME)
read prefix; \
fi; \
[ ! "$$prefix" ] && prefix="/usr/local"; \
+ [ ! "$$sysconfdir" ] && sysconfdir=/etc; \
mkdir -pv -m 755 "$$prefix/share/man/man1" "$$prefix/bin" \
+ && cp -rv grammars/* "$$sysconfdir/xdg/bpeg/" \
&& cp -v $(NAME).1 "$$prefix/share/man/man1/" \
&& rm -f "$$prefix/bin/$(NAME)" \
&& cp -v $(NAME) "$$prefix/bin/"
@@ -39,8 +41,9 @@ uninstall:
read prefix; \
fi; \
[ ! "$$prefix" ] && prefix="/usr/local"; \
+ [ ! "$$sysconfdir" ] && sysconfdir=/etc; \
echo "Deleting..."; \
- rm -rvf "$$prefix/bin/$(NAME)" "$$prefix/share/man/man1/$(NAME).1" ; \
+ rm -rvf "$$prefix/bin/$(NAME)" "$$prefix/share/man/man1/$(NAME).1" "$$sysconfdir/xdg/bpeg"; \
printf "\033[1mIf you created any config files in ~/.config/$(NAME), you may want to delete them manually.\033[0m\n"
.PHONY: all, clean, install, uninstall
diff --git a/bpeg.c b/bpeg.c
index 0d64902..e4e585c 100644
--- a/bpeg.c
+++ b/bpeg.c
@@ -75,6 +75,12 @@ int main(int argc, char *argv[])
grammar_t *g = new_grammar();
+ int fd;
+ if ((fd=open("/etc/xdg/bpeg/builtins.bpeg", O_RDONLY)) >= 0)
+ load_grammar(g, readfile(fd));
+ if ((fd=open("/etc/xdg/bpeg/builtins.bpeg", O_RDONLY)) >= 0)
+ load_grammar(g, readfile(fd));
+
int i, npatterns = 0;
for (i = 1; i < argc; i++) {
if (streq(argv[i], "--")) {
@@ -93,17 +99,15 @@ int main(int argc, char *argv[])
add_def(g, flag, "replacement", p);
rule = "replace-all";
} else if (FLAG("--grammar") || FLAG("-g")) {
+ int fd;
const char *grammarfile = flag;
- // load grammar from a file (semicolon mode)
- char *grammar;
if (streq(grammarfile, "-")) {
- grammar = readfile(STDIN_FILENO);
+ fd = STDIN_FILENO;
} else {
- int fd = open(grammarfile, O_RDONLY);
+ fd = open(grammarfile, O_RDONLY);
check(fd >= 0, "Couldn't open file: %s", argv[2]);
- grammar = readfile(fd);
}
- load_grammar(g, grammar);
+ load_grammar(g, readfile(fd));
} else if (FLAG("--define") || FLAG("-d")) {
char *def = flag;
char *eq = strchr(def, '=');
diff --git a/grammar.c b/grammar.c
index 84bada7..2be7cd5 100644
--- a/grammar.c
+++ b/grammar.c
@@ -6,55 +6,10 @@
#include "compiler.h"
#include "utils.h"
-const char *BPEG_BUILTIN_GRAMMAR = (
- // Meta-rules for acting on everything
- "pattern = !(/);\n" // Not defined by default
- "replacement = {!(/)=>};\n" // Not defined by default
- "replace-all = *&&@replacement &&$$;\n"
- "find-all = *(matching-line / {&&(\\n/$$)=>});\n"
- "matching-line = +&@pattern *. $ ?\\n;\n"
- "only-matches = *{&&@pattern=>'@1\\n'};\n"
-
- // Helper definitions (commonly used)
- "crlf=\\r\\n;\n"
- "cr=\\r;\n" "r=\\r;\n"
- "anglebraces=`< *(anglebraces / ~~`>) `>;\n"
- "brackets=`[ *(brackets / ~~`]) `];\n"
- "braces=`{ *(braces / ~~`}) `};\n"
- "parens=`( *(parens / ~~`)) `);\n"
- "id=(`a-z/`A-Z/`_) *(`a-z/`A-Z/`_/`0-9);\n"
- "HEX=`0-9/`A-F;\n"
- "Hex=`0-9/`a-f/`A-F;\n"
- "hex=`0-9/`a-f;\n"
- "number=+`0-9 ?(`. *`0-9) / `. +`0-9;\n"
- "int=+`0-9;\n"
- "digit=`0-9;\n"
- "Abc=`a-z/`A-Z;\n"
- "ABC=`A-Z;\n"
- "abc=`a-z;\n"
- "esc=\\e;\n" "e=\\e;\n"
- "tab=\\t;\n" "t=\\t;\n"
- "nl=\\n;\n" "lf=\\n;\n" "n=\\n;\n"
- "c-block-comment='/*' &&'*/';\n"
- "c-line-comment='//' &$;\n"
- "c-comment=c-line-comment / c-block-comment;\n"
- "hash-comment=`# &$;\n"
- "comment=!(/);\n" // No default definition, can be overridden
- "WS=` /\\t/\\n/\\r/comment;\n"
- "ws=` /\\t;\n"
- "$$=!$.;\n"
- "$=!.;\n"
- "^^=!<$.;\n"
- "^=!<.;\n"
- "__=*(` /\\t/\\n/\\r/comment);\n"
- "_=*(` /\\t);\n"
- );
-
grammar_t *new_grammar(void)
{
grammar_t *g = calloc(sizeof(grammar_t), 1);
g->definitions = calloc(sizeof(def_t), (g->capacity = 128));
- load_grammar(g, BPEG_BUILTIN_GRAMMAR);
return g;
}