diff options
author | Sergey Poznyakoff <gray@gnu.org.ua> | 2016-01-21 17:25:55 +0200 |
---|---|---|
committer | Sergey Poznyakoff <gray@gnu.org.ua> | 2016-07-04 15:41:59 +0300 |
commit | 8e541ddaffcab6eaa36faf86304b51a0bc6a92a1 (patch) | |
tree | fc909de2e7322c9ad04e8d51d0f9e5213b552cb1 /include | |
parent | 17d95ceb6d3f749e9ce20747197703e40e453759 (diff) | |
download | grecs-8e541ddaffcab6eaa36faf86304b51a0bc6a92a1.tar.gz grecs-8e541ddaffcab6eaa36faf86304b51a0bc6a92a1.tar.bz2 |
Split declarations between several header files.
* Makefile.am (SUBDIRS): Add include
* am/grecs.m4 (GRECS_INCLUDES): Update
(GRECS_COND_BUILD_INSTALL)
(GRECS_COND_BUILD_SHARED)
(GRECS_COND_BUILD_STATIC): New conditions.
Build include/Makefile and include/grecs/Makefile.
* configure.ac: Use src/grecs-gram.y as a source
validity marker
* include/Makefile.a: New file.
* src/grecs.hin: Remove. Split into include/*. See below.
* include/grecs.h: New file.
* include/grecs/.gitignore: New file.
* include/grecs/Makefile.am: New file.
* include/grecs/doc.h: New file.
* include/grecs/error.h: New file.
* include/grecs/format.h: New file.
* include/grecs/lex.h: New file.
* include/grecs/list.h: New file.
* include/grecs/mem.h: New file.
* include/grecs/node.h: New file.
* include/grecs/parser.h: New file.
* include/grecs/preproc.h: New file.
* include/grecs/sockaddr.h: New file.
* include/grecs/symtab.h: New file.
* include/grecs/table.h: New file.
* include/grecs/tree.h: New file.
* include/grecs/txtacc.h: New file.
* include/grecs/types.h.in: New file.
* include/grecs/util.h: New file.
* include/grecs/value.h: New file.
* include/grecs/version.h: New file.
* src/grecs-locus.h: Move to ...
* include/grecs/locus.h: ... here
* src/grecsopt.h: Move to ...
* include/grecs/opt.h: ... here
* src/json.h: Move to ...
* include/grecs/json.h: ... here
* src/wordsplit.h: Move to ...
* include/wordsplit.h: ... here
* src/Make-inst.am (include_HEADERS): Remove.
* src/Make-shared.am (grecsinclude_HEADERS)
(noinst_HEADERS): Remove.
* src/Make-static.am (noinst_HEADERS): Remove.
* src/Make.am: Remove header-related stuff
* src/bind-gram.y: Fix includes.
* src/bind-lex.l: Likewise.
* src/cidr.c: Likewise.
* src/dhcpd-gram.y: Likewise.
* src/dhcpd-lex.l: Likewise.
* src/diag.c: Likewise.
* src/format.c: Likewise.
* src/grecs-gram.y: Likewise.
* src/grecs-lex.l: Likewise.
* src/json-gram.y: Likewise.
* src/json-lex.l: Likewise.
* src/jsonfmt.c: Likewise.
* src/lookup.c: Likewise.
* src/meta1-gram.y: Likewise.
* src/meta1-lex.l: Likewise.
* src/opthelp.c: Likewise.
* src/preproc.c: Likewise.
* src/sockaddr.c: Likewise.
* src/txtacc.c: Likewise.
* src/version.c: Likewise.
* tests/gcfenum.c: Likewise.
* tests/gcffmt.c: Likewise.
* tests/gcfpeek.c: Likewise.
* tests/gcfset.c: Likewise.
* tests/gcfver.c: Likewise.
* tests/json.c: Likewise.
Diffstat (limited to 'include')
-rw-r--r-- | include/Makefile.am | 19 | ||||
-rw-r--r-- | include/grecs.h | 40 | ||||
-rw-r--r-- | include/grecs/.gitignore | 1 | ||||
-rw-r--r-- | include/grecs/Makefile.am | 43 | ||||
-rw-r--r-- | include/grecs/doc.h | 32 | ||||
-rw-r--r-- | include/grecs/error.h | 38 | ||||
-rw-r--r-- | include/grecs/format.h | 62 | ||||
-rw-r--r-- | include/grecs/json.h | 99 | ||||
-rw-r--r-- | include/grecs/lex.h | 51 | ||||
-rw-r--r-- | include/grecs/list.h | 55 | ||||
-rw-r--r-- | include/grecs/locus.h | 80 | ||||
-rw-r--r-- | include/grecs/mem.h | 33 | ||||
-rw-r--r-- | include/grecs/node.h | 62 | ||||
-rw-r--r-- | include/grecs/opt.h | 58 | ||||
-rw-r--r-- | include/grecs/parser.h | 53 | ||||
-rw-r--r-- | include/grecs/preproc.h | 46 | ||||
-rw-r--r-- | include/grecs/sockaddr.h | 66 | ||||
-rw-r--r-- | include/grecs/symtab.h | 52 | ||||
-rw-r--r-- | include/grecs/table.h | 98 | ||||
-rw-r--r-- | include/grecs/tree.h | 71 | ||||
-rw-r--r-- | include/grecs/txtacc.h | 36 | ||||
-rw-r--r-- | include/grecs/types.h.in | 24 | ||||
-rw-r--r-- | include/grecs/util.h | 26 | ||||
-rw-r--r-- | include/grecs/value.h | 52 | ||||
-rw-r--r-- | include/grecs/version.h | 40 | ||||
-rw-r--r-- | include/wordsplit.h | 250 |
26 files changed, 1487 insertions, 0 deletions
diff --git a/include/Makefile.am b/include/Makefile.am new file mode 100644 index 0000000..21a51e7 --- /dev/null +++ b/include/Makefile.am @@ -0,0 +1,19 @@ +SUBDIRS = grecs +GRECS_HDR = grecs.h wordsplit.h + +if GRECS_COND_BUILD_INSTALL + include_HEADERS = $(GRECS_HDR) +endif + +if GRECS_COND_BUILD_SHARED + if GRECS_COND_INSTALLHEADERS + grecsincludedir = @GRECS_INCLUDE_DIR@ + grecsinclude_HEADERS = $(GRECS_HDR) + else + noinst_HEADERS = $(GRECS_HDR) + endif +endif + +if GRECS_COND_BUILD_STATIC + noinst_HEADERS = $(GRECS_HDR) +endif diff --git a/include/grecs.h b/include/grecs.h new file mode 100644 index 0000000..eac11d4 --- /dev/null +++ b/include/grecs.h @@ -0,0 +1,40 @@ +/* grecs - Gray's Extensible Configuration System -*- c -*- + Copyright (C) 2007-2016 Sergey Poznyakoff + + Grecs is free software; you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by the + Free Software Foundation; either version 3 of the License, or (at your + option) any later version. + + Grecs is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with Grecs. If not, see <http://www.gnu.org/licenses/>. */ + +#ifndef _GRECS_H +#define _GRECS_H + +#include <grecs/types.h> +#include <grecs/version.h> +#include <grecs/doc.h> +#include <grecs/error.h> +#include <grecs/format.h> +#include <grecs/lex.h> +#include <grecs/list.h> +#include <grecs/locus.h> +#include <grecs/mem.h> +#include <grecs/node.h> +#include <grecs/parser.h> +#include <grecs/preproc.h> +#include <grecs/sockaddr.h> +#include <grecs/symtab.h> +#include <grecs/table.h> +#include <grecs/tree.h> +#include <grecs/txtacc.h> +#include <grecs/util.h> +#include <grecs/value.h> + +#endif diff --git a/include/grecs/.gitignore b/include/grecs/.gitignore new file mode 100644 index 0000000..8cb8a05 --- /dev/null +++ b/include/grecs/.gitignore @@ -0,0 +1 @@ +types.h diff --git a/include/grecs/Makefile.am b/include/grecs/Makefile.am new file mode 100644 index 0000000..c239c1b --- /dev/null +++ b/include/grecs/Makefile.am @@ -0,0 +1,43 @@ +GRECS_PKG_HDR =\ + doc.h\ + error.h\ + format.h\ + lex.h\ + list.h\ + locus.h\ + mem.h\ + node.h\ + opt.h\ + parser.h\ + preproc.h\ + sockaddr.h\ + symtab.h\ + table.h\ + tree.h\ + txtacc.h\ + types.h\ + util.h\ + value.h\ + version.h + +if GRECS_COND_JSON + GRECS_PKG_HDR += json.h +endif + +if GRECS_COND_BUILD_INSTALL + grecsincludedir = @GRECS_INCLUDE_DIR@ + grecsinclude_HEADERS = $(GRECS_PKG_HDR) +endif + +if GRECS_COND_BUILD_SHARED + if GRECS_COND_INSTALLHEADERS + grecsincludedir = @GRECS_INCLUDE_DIR@ + grecsinclude_HEADERS = $(GRECS_PKG_HDR) + else + noinst_HEADERS = $(GRECS_PKG_HDR) + endif +endif + +if GRECS_COND_BUILD_STATIC + noinst_HEADERS = $(GRECS_PKG_HDR) +endif diff --git a/include/grecs/doc.h b/include/grecs/doc.h new file mode 100644 index 0000000..b2514fb --- /dev/null +++ b/include/grecs/doc.h @@ -0,0 +1,32 @@ +/* grecs - Gray's Extensible Configuration System -*- c -*- + Copyright (C) 2007-2016 Sergey Poznyakoff + + Grecs is free software; you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by the + Free Software Foundation; either version 3 of the License, or (at your + option) any later version. + + Grecs is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with Grecs. If not, see <http://www.gnu.org/licenses/>. */ + +#ifndef _GRECS_DOC_H +#define _GRECS_DOC_H + +#include <stdio.h> +#include <grecs/table.h> + +void grecs_print_docstring(const char *docstring, unsigned level, + FILE *stream); +void grecs_print_simple_statement(struct grecs_keyword *kwp, + unsigned level, FILE *stream); +void grecs_print_block_statement(struct grecs_keyword *kwp, + unsigned level, FILE *stream); +void grecs_print_statement_array(struct grecs_keyword *kwp, + unsigned n, + unsigned level, FILE *stream); +#endif diff --git a/include/grecs/error.h b/include/grecs/error.h new file mode 100644 index 0000000..8630b8a --- /dev/null +++ b/include/grecs/error.h @@ -0,0 +1,38 @@ +/* grecs - Gray's Extensible Configuration System -*- c -*- + Copyright (C) 2007-2016 Sergey Poznyakoff + + Grecs is free software; you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by the + Free Software Foundation; either version 3 of the License, or (at your + option) any later version. + + Grecs is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with Grecs. If not, see <http://www.gnu.org/licenses/>. */ + +#ifndef _GRECS_ERROR_H +#define _GRECS_ERROR_H + +#include <grecs/locus.h> + +extern int grecs_log_to_stderr; +extern void (*grecs_log_setup_hook)(void); + +extern void (*grecs_print_diag_fun)(grecs_locus_t const *, int, int, + const char*); + +void grecs_warning(grecs_locus_t const *locus, + int errcode, const char *fmt, ...) + __attribute__ ((__format__ (__printf__, 3, 4))); +void grecs_error(grecs_locus_t const *locus, int errcode, + const char *fmt, ...) + __attribute__ ((__format__ (__printf__, 3, 4))); + +int grecs_asprint_locus(char **locstr, size_t *size, + grecs_locus_t const *locus); + +#endif diff --git a/include/grecs/format.h b/include/grecs/format.h new file mode 100644 index 0000000..7ac8458 --- /dev/null +++ b/include/grecs/format.h @@ -0,0 +1,62 @@ +/* grecs - Gray's Extensible Configuration System -*- c -*- + Copyright (C) 2007-2016 Sergey Poznyakoff + + Grecs is free software; you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by the + Free Software Foundation; either version 3 of the License, or (at your + option) any later version. + + Grecs is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with Grecs. If not, see <http://www.gnu.org/licenses/>. */ + +#ifndef _GRECS_FORMAT_H +#define _GRECS_FORMAT_H + +#include <grecs/value.h> +#include <grecs/locus.h> +#include <grecs/node.h> +#include <grecs/txtacc.h> + +struct grecs_format_closure { + int (*fmtfun)(const char *, void *); + void *data; +}; + +void grecs_format_locus(grecs_locus_t *locus, struct grecs_format_closure *fp); +void grecs_format_node_path(struct grecs_node *node, int flag, + struct grecs_format_closure *fp); +void grecs_format_value(struct grecs_value *val, int flags, + struct grecs_format_closure *fp); + +#define GRECS_NODE_FLAG_PATH 0x00100 +#define GRECS_NODE_FLAG_VALUE 0x00200 +#define GRECS_NODE_FLAG_DESCEND 0x01000 +#define GRECS_NODE_FLAG_LOCUS 0x02000 +#define GRECS_NODE_FLAG_QUOTE 0x04000 +#define GRECS_NODE_FLAG_NOQUOTE 0x08000 +#define GRECS_NODE_FLAG_QUOTE_HEX 0x10000 + +#define _GRECS_NODE_MASK_DELIM 0x000ff +#define _GRECS_NODE_MASK_OUTPUT 0x00f00 + +#define GRECS_NODE_FLAG_DEFAULT \ + (GRECS_NODE_FLAG_PATH|GRECS_NODE_FLAG_VALUE|\ + GRECS_NODE_FLAG_DESCEND|GRECS_NODE_FLAG_QUOTE) +int grecs_format_node(struct grecs_node *node, int flags, + struct grecs_format_closure *fp); + +void grecs_print_locus(grecs_locus_t *locus, FILE *fp); +void grecs_print_node_path(struct grecs_node *node, int flag, FILE *fp); +void grecs_print_value(struct grecs_value *val, int flags, FILE *fp); + +int grecs_print_node(struct grecs_node *node, int flags, FILE *fp); + +void grecs_txtacc_format_value(struct grecs_value *val, int flags, + grecs_txtacc_t acc); + +#endif diff --git a/include/grecs/json.h b/include/grecs/json.h new file mode 100644 index 0000000..f8402e7 --- /dev/null +++ b/include/grecs/json.h @@ -0,0 +1,99 @@ +/* This file is part of Grecs. + Copyright (C) 2012-2016 Sergey Poznyakoff. + + Grecs is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3, or (at your option) + any later version. + + Grecs is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with Grecs. If not, see <http://www.gnu.org/licenses/>. */ + +#include <grecs.h> + +enum json_value_type +{ + json_null, + json_bool, + json_number, + json_string, + json_arr, + json_object +}; + +struct json_value; +struct json_array { + size_t oc; + struct json_value **ov; + struct grecs_list *ol; +}; + +struct json_value { + enum json_value_type type; + union { + int b; /* json_bool */ + double n; /* json_number */ + char *s; /* json_string */ + struct json_array *a; /* json_arr */ + struct grecs_symtab *o; /* json_object */ + } v; +}; + +struct json_pair { + char *k; + struct json_value *v; +}; + +extern char const *json_err_diag; +extern struct grecs_locus json_err_locus; +extern struct json_value *json_return_obj; + +void jsonlex_setup(char const *s, size_t l); +void jsonlex_diag(const char *s); +int json_unescape(char c, char *o); + +struct json_value *json_value_create(int type); +struct grecs_symtab *json_assoc_create(void); +void json_value_free(struct json_value *obj); + +struct json_value *json_parse_string(char const *input, size_t len); + +struct json_value *json_value_lookup(struct json_value *obj, + const char *ident); + + +struct json_format +{ + size_t indent; + int precision; + void (*write) (void *, char const *, size_t); + void *data; +}; + +void json_format_value(struct json_value *obj, struct json_format *fmt); + +struct json_value *json_new_null(void); +struct json_value *json_new_bool(int b); +struct json_value *json_new_number(double n); +struct json_value *json_new_string(char const *str); + +struct json_value *json_new_object(void); +int json_object_set(struct json_value *obj, char const *name, + struct json_value *val); +int json_object_get(struct json_value *obj, char const *name, + struct json_value **retval); + +struct json_value *json_new_array(void); +size_t json_array_size(struct json_value *j); +void json_array_flatten(struct json_value *j); +int json_array_insert(struct json_value *j, size_t idx, struct json_value *v); +int json_array_append(struct json_value *j, struct json_value *v); +int json_array_set(struct json_value *j, size_t idx, struct json_value *v); +int json_array_get(struct json_value *j, size_t idx, + struct json_value **retval); + diff --git a/include/grecs/lex.h b/include/grecs/lex.h new file mode 100644 index 0000000..fe2365f --- /dev/null +++ b/include/grecs/lex.h @@ -0,0 +1,51 @@ +/* grecs - Gray's Extensible Configuration System -*- c -*- + Copyright (C) 2007-2016 Sergey Poznyakoff + + Grecs is free software; you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by the + Free Software Foundation; either version 3 of the License, or (at your + option) any later version. + + Grecs is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with Grecs. If not, see <http://www.gnu.org/licenses/>. */ + +#ifndef _GRECS_LEX_H +#define _GRECS_LEX_H + +int grecs_lex_begin(const char*, int); +void grecs_lex_end(int err); + +char *grecs_install_text(const char *str); +void grecs_destroy_text(void); +struct grecs_symtab *grecs_text_table(void); + +void grecs_parse_line_directive(char *text, grecs_locus_t *ploc, + struct grecs_locus_point *ppoint, + size_t *pxlines); +void grecs_parse_line_directive_cpp(char *text, grecs_locus_t *ploc, + struct grecs_locus_point *ppoint, + size_t *pxlines); + +void grecs_line_acc_create(void); +void grecs_line_acc_free(void); +void grecs_line_acc_grow_char(int c); +void grecs_line_acc_grow_char_unescape(int c); +void grecs_line_acc_grow(const char *text, size_t len); +void grecs_line_acc_grow_unescape_last(char *text, size_t len); + +void grecs_line_begin(void); +#define grecs_line_add grecs_line_acc_grow +char *grecs_line_finish(void); + +int grecs_str_is_ipv4(const char *addr); +int grecs_str_is_num(const char *s); +int grecs_str_is_ipv6(const char *addr); +int grecs_str_is_num(const char *s); +int grecs_str_is_ipaddr(const char *addr); + +#endif diff --git a/include/grecs/list.h b/include/grecs/list.h new file mode 100644 index 0000000..efccd56 --- /dev/null +++ b/include/grecs/list.h @@ -0,0 +1,55 @@ +/* grecs - Gray's Extensible Configuration System -*- c -*- + Copyright (C) 2007-2016 Sergey Poznyakoff + + Grecs is free software; you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by the + Free Software Foundation; either version 3 of the License, or (at your + option) any later version. + + Grecs is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with Grecs. If not, see <http://www.gnu.org/licenses/>. */ + +#ifndef _GRECS_LIST_H +#define _GRECS_LIST_H + +typedef struct grecs_list_entry *grecs_list_entry_t; +typedef struct grecs_list *grecs_list_t; + +struct grecs_list_entry { + struct grecs_list_entry *next, *prev; + void *data; +}; + +struct grecs_list { + struct grecs_list_entry *head, *tail; + size_t count; + int (*cmp)(const void *, const void *); + void (*free_entry)(void *); +}; + +grecs_list_t grecs_list_create(void); +size_t grecs_list_size(grecs_list_t); +void grecs_list_append(grecs_list_t, void *); +void grecs_list_push(grecs_list_t, void *); +void *grecs_list_pop(grecs_list_t); +void *grecs_list_locate(grecs_list_t, void *); +void *grecs_list_index(grecs_list_t, size_t); +void *grecs_list_remove_tail(grecs_list_t); +void grecs_list_remove_entry(grecs_list_t, grecs_list_entry_t); +void grecs_list_clear(grecs_list_t); +void grecs_list_free(grecs_list_t); +void grecs_list_add(grecs_list_t, grecs_list_t); + +/* FIXME */ +struct grecs_list *_grecs_simple_list_create(int dispose); +struct grecs_list *grecs_value_list_create(void); + + + + +#endif diff --git a/include/grecs/locus.h b/include/grecs/locus.h new file mode 100644 index 0000000..4ca6d21 --- /dev/null +++ b/include/grecs/locus.h @@ -0,0 +1,80 @@ +/* grecs - Gray's Extensible Configuration System + Copyright (C) 2007-2016 Sergey Poznyakoff + + Grecs is free software; you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by the + Free Software Foundation; either version 3 of the License, or (at your + option) any later version. + + Grecs is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with Grecs. If not, see <http://www.gnu.org/licenses/>. */ + +#ifndef _GRECS_LOCUS_H +#define _GRECS_LOCUS_H + +struct grecs_locus_point { + char *file; + unsigned line; + unsigned col; +}; + +#define grecs_locus_point_advance_line(loc) do { \ + (loc).line++; \ + (loc).col = 0; \ + } while (0) + +#define GRECS_LOCUS_POINT_EQ(a,b) \ + ((strcmp((a)->file, (b)->file) == 0) && ((a)->line == (b)->line)) + +typedef struct grecs_locus { + struct grecs_locus_point beg; + struct grecs_locus_point end; +} grecs_locus_t; + +#define YYLTYPE grecs_locus_t + +#define YYLLOC_DEFAULT(Current, Rhs, N) \ + do { \ + if (N) { \ + (Current).beg = YYRHSLOC(Rhs, 1).beg; \ + (Current).end = YYRHSLOC(Rhs, N).end; \ + } else { \ + (Current).beg = YYRHSLOC(Rhs, 0).end; \ + (Current).end = (Current).beg; \ + } \ + } while (0) + +#define YY_LOCATION_PRINT(File, Loc) do { \ + if ((Loc).beg.col == 0) \ + fprintf(File, "%s:%u", \ + (Loc).beg.file, \ + (Loc).beg.line); \ + else if (strcmp((Loc).beg.file, (Loc).end.file)) \ + fprintf(File, "%s:%u.%u-%s:%u.%u", \ + (Loc).beg.file, \ + (Loc).beg.line, (Loc).beg.col, \ + (Loc).end.file, \ + (Loc).end.line, (Loc).end.col); \ + else if ((Loc).beg.line != (Loc).end.line) \ + fprintf(File, "%s:%u.%u-%u.%u", \ + (Loc).beg.file, \ + (Loc).beg.line, (Loc).beg.col, \ + (Loc).end.line, (Loc).end.col); \ + else if ((Loc).beg.col != (Loc).end.col) \ + fprintf(File, "%s:%u.%u-%u", \ + (Loc).beg.file, \ + (Loc).beg.line, (Loc).beg.col, \ + (Loc).end.col); \ + else \ + fprintf(File, "%s:%u.%u", \ + (Loc).beg.file, \ + (Loc).beg.line, \ + (Loc).beg.col); \ + } while (0) + +#endif diff --git a/include/grecs/mem.h b/include/grecs/mem.h new file mode 100644 index 0000000..de46b32 --- /dev/null +++ b/include/grecs/mem.h @@ -0,0 +1,33 @@ +/* grecs - Gray's Extensible Configuration System -*- c -*- + Copyright (C) 2007-2016 Sergey Poznyakoff + + Grecs is free software; you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by the + Free Software Foundation; either version 3 of the License, or (at your + option) any later version. + + Grecs is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with Grecs. If not, see <http://www.gnu.org/licenses/>. */ + +#ifndef _GRECS_MEM_H +#define _GRECS_MEM_H + +extern void *(*grecs_malloc_fun)(size_t size); +extern void *(*grecs_realloc_fun)(void *ptr, size_t size); +extern void (*grecs_alloc_die_fun)(void); +extern void (*grecs_free_fun)(void *ptr); + +void *grecs_malloc(size_t size); +void *grecs_zalloc(size_t size); +void *grecs_calloc(size_t nmemb, size_t size); +void *grecs_realloc(void *ptr, size_t size); +void grecs_alloc_die(void); +char *grecs_strdup(const char *str); +void grecs_free(void *ptr); + +#endif diff --git a/include/grecs/node.h b/include/grecs/node.h new file mode 100644 index 0000000..5bbe9dc --- /dev/null +++ b/include/grecs/node.h @@ -0,0 +1,62 @@ +/* grecs - Gray's Extensible Configuration System -*- c -*- + Copyright (C) 2007-2016 Sergey Poznyakoff + + Grecs is free software; you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by the + Free Software Foundation; either version 3 of the License, or (at your + option) any later version. + + Grecs is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with Grecs. If not, see <http://www.gnu.org/licenses/>. */ + +#ifndef _GRECS_NODE_H +#define _GRECS_NODE_H + +#include <grecs/locus.h> +#include <grecs/symtab.h> +#include <grecs/value.h> + +enum grecs_node_type { + grecs_node_root, + grecs_node_stmt, + grecs_node_block +}; + +typedef struct grecs_node { + enum grecs_node_type type; + grecs_locus_t locus; + struct grecs_node *up; + struct grecs_node *down; + struct grecs_node *next; + struct grecs_node *prev; + char *ident; + grecs_locus_t idloc; + union { + grecs_value_t *value; + grecs_symtab_t texttab; + } v; +} grecs_node_t; + +void grecs_node_free(struct grecs_node *node); +struct grecs_node *grecs_node_create(enum grecs_node_type type, + grecs_locus_t *loc); +struct grecs_node *grecs_node_create_points(enum grecs_node_type type, + struct grecs_locus_point beg, + struct grecs_locus_point end); +void grecs_node_bind(struct grecs_node *master, struct grecs_node *node, + int dn); +int grecs_node_eq(struct grecs_node *a, struct grecs_node *b); +int grecs_node_unlink(struct grecs_node *node); + +struct grecs_node *grecs_node_from_path(const char *path, const char *value); +struct grecs_node *grecs_node_from_path_locus(const char *path, + const char *value, + grecs_locus_t *locus, + grecs_locus_t *vallocus); + +#endif diff --git a/include/grecs/opt.h b/include/grecs/opt.h new file mode 100644 index 0000000..5153033 --- /dev/null +++ b/include/grecs/opt.h @@ -0,0 +1,58 @@ +/* grecs - Gray's Extensible Configuration System + Copyright (C) 2007-2016 Sergey Poznyakoff + + Grecs is free software; you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by the + Free Software Foundation; either version 3 of the License, or (at your + option) any later version. + + Grecs is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with Grecs. If not, see <http://www.gnu.org/licenses/>. */ + +#ifndef _GRECS_OPT_H +#define _GRECS_OPT_H + +struct grecs_proginfo { + const char *progname; + char **subcmd; + const char *docstring; + const char *args_doc; + struct grecs_opthelp *opthelp; + size_t optcount; + void (*print_help_hook)(FILE *stream); + void (*print_version_hook)(FILE *stream); + const char *package; + const char *version; + const char *license; + const char *copyright_year; + const char *copyright_holder; + const char **authors; + const char *bug_address; + const char *url; + const char *epilogue; +}; + +struct grecs_opthelp { + const char *opt; + const char *arg; + int is_optional; + const char *descr; +}; + +#define DESCRCOLUMN 30 +#define RMARGIN 79 +#define GROUPCOLUMN 2 +#define USAGECOLUMN 13 + +void grecs_print_help(struct grecs_proginfo *pinfo); +void grecs_print_usage(struct grecs_proginfo *pinfo); +void grecs_print_version_only(struct grecs_proginfo *pinfo, FILE *stream); +void grecs_print_version(struct grecs_proginfo *pinfo, FILE *stream); + +#endif + diff --git a/include/grecs/parser.h b/include/grecs/parser.h new file mode 100644 index 0000000..00878f4 --- /dev/null +++ b/include/grecs/parser.h @@ -0,0 +1,53 @@ +/* grecs - Gray's Extensible Configuration System -*- c -*- + Copyright (C) 2007-2016 Sergey Poznyakoff + + Grecs is free software; you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by the + Free Software Foundation; either version 3 of the License, or (at your + option) any later version. + + Grecs is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with Grecs. If not, see <http://www.gnu.org/licenses/>. */ + +#ifndef _GRECS_PARSER_H +#define _GRECS_PARSER_H + +typedef struct grecs_node *(*grecs_parser_t)(const char *name, int trace); + +#define GRECS_TRACE_GRAM 0x01 +#define GRECS_TRACE_LEX 0x02 + +extern int grecs_trace_flags; +extern grecs_parser_t grecs_parser_fun; +extern int grecs_default_port; + +extern struct grecs_locus_point grecs_current_locus_point; +extern grecs_locus_t grecs_locus; +extern int grecs_adjust_string_locations; +extern int grecs_error_count; + +/* Main entry point */ +struct grecs_node *grecs_parse(const char *name); +void grecs_gram_trace(int n); +void grecs_lex_trace(int n); + +/* Parsers: */ +struct grecs_node *grecs_grecs_parser(const char *name, int traceflags); +struct grecs_node *grecs_meta1_parser(const char *name, int traceflags); +struct grecs_node *grecs_bind_parser(const char *name, int traceflags); +struct grecs_node *grecs_dhcpd_parser(const char *name, int traceflags); +struct grecs_node *grecs_git_parser(const char *name, int traceflags); +struct grecs_node *grecs_path_parser(const char *name, int traceflags); + + +/* Parser database */ +int grecs_enumerate_parsers(int (*fun)(const char *, grecs_parser_t, void *), + void *); +grecs_parser_t grecs_get_parser_by_type(const char *type); + +#endif diff --git a/include/grecs/preproc.h b/include/grecs/preproc.h new file mode 100644 index 0000000..798e879 --- /dev/null +++ b/include/grecs/preproc.h @@ -0,0 +1,46 @@ +/* grecs - Gray's Extensible Configuration System -*- c -*- + Copyright (C) 2007-2016 Sergey Poznyakoff + + Grecs is free software; you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by the + Free Software Foundation; either version 3 of the License, or (at your + option) any later version. + + Grecs is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with Grecs. If not, see <http://www.gnu.org/licenses/>. */ + +#ifndef _GRECS_PREPROC_H +#define _GRECS_PREPROC_H + +#include <sys/types.h> |