aboutsummaryrefslogtreecommitdiff
path: root/include
diff options
context:
space:
mode:
authorSergey Poznyakoff <gray@gnu.org.ua>2016-01-21 17:25:55 +0200
committerSergey Poznyakoff <gray@gnu.org.ua>2016-07-04 15:41:59 +0300
commit8e541ddaffcab6eaa36faf86304b51a0bc6a92a1 (patch)
treefc909de2e7322c9ad04e8d51d0f9e5213b552cb1 /include
parent17d95ceb6d3f749e9ce20747197703e40e453759 (diff)
downloadgrecs-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.am19
-rw-r--r--include/grecs.h40
-rw-r--r--include/grecs/.gitignore1
-rw-r--r--include/grecs/Makefile.am43
-rw-r--r--include/grecs/doc.h32
-rw-r--r--include/grecs/error.h38
-rw-r--r--include/grecs/format.h62
-rw-r--r--include/grecs/json.h99
-rw-r--r--include/grecs/lex.h51
-rw-r--r--include/grecs/list.h55
-rw-r--r--include/grecs/locus.h80
-rw-r--r--include/grecs/mem.h33
-rw-r--r--include/grecs/node.h62
-rw-r--r--include/grecs/opt.h58
-rw-r--r--include/grecs/parser.h53
-rw-r--r--include/grecs/preproc.h46
-rw-r--r--include/grecs/sockaddr.h66
-rw-r--r--include/grecs/symtab.h52
-rw-r--r--include/grecs/table.h98
-rw-r--r--include/grecs/tree.h71
-rw-r--r--include/grecs/txtacc.h36
-rw-r--r--include/grecs/types.h.in24
-rw-r--r--include/grecs/util.h26
-rw-r--r--include/grecs/value.h52
-rw-r--r--include/grecs/version.h40
-rw-r--r--include/wordsplit.h250
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>