diff options
-rw-r--r-- | src/Makefile.am | 2 | ||||
-rw-r--r-- | src/format.c | 39 | ||||
-rw-r--r-- | src/grecs-gram.y | 172 | ||||
-rw-r--r-- | src/grecs-lex.l | 113 | ||||
-rw-r--r-- | src/grecs.h | 0 | ||||
-rw-r--r-- | src/list.c | 19 | ||||
-rw-r--r-- | src/preproc.c | 222 | ||||
-rw-r--r-- | src/text.c | 6 |
8 files changed, 228 insertions, 345 deletions
diff --git a/src/Makefile.am b/src/Makefile.am index 2f35f52..759716b 100644 --- a/src/Makefile.am +++ b/src/Makefile.am | |||
@@ -32,7 +32,7 @@ EXTRA_DIST=grecs-gram.h $(PP_SETUP_FILE) | |||
32 | 32 | ||
33 | INCLUDES = -I$(srcdir) @GRECS_INCLUDES@ | 33 | INCLUDES = -I$(srcdir) @GRECS_INCLUDES@ |
34 | AM_YFLAGS = -dtv | 34 | AM_YFLAGS = -dtv |
35 | AM_LFLAGS = -dvp | 35 | AM_LFLAGS = -d |
36 | # Use a modified ylwrap implementation that understands the --prefix option. | 36 | # Use a modified ylwrap implementation that understands the --prefix option. |
37 | YLWRAP = $(top_srcdir)/$(grex_topdir)grecs/build-aux/ylwrap --prefix yy_grecs | 37 | YLWRAP = $(top_srcdir)/$(grex_topdir)grecs/build-aux/ylwrap --prefix yy_grecs |
38 | 38 | ||
diff --git a/src/format.c b/src/format.c index a1aa67d..fc6c8d6 100644 --- a/src/format.c +++ b/src/format.c | |||
@@ -26,8 +26,7 @@ | |||
26 | const char * | 26 | const char * |
27 | grecs_data_type_string (enum grecs_data_type type) | 27 | grecs_data_type_string (enum grecs_data_type type) |
28 | { | 28 | { |
29 | switch (type) | 29 | switch (type) { |
30 | { | ||
31 | case grecs_type_void: | 30 | case grecs_type_void: |
32 | return "void"; | 31 | return "void"; |
33 | 32 | ||
@@ -81,21 +80,18 @@ grecs_format_docstring (FILE *stream, const char *docstring, unsigned level) | |||
81 | size_t len = strlen(docstring); | 80 | size_t len = strlen(docstring); |
82 | int width = 78 - level * 2; | 81 | int width = 78 - level * 2; |
83 | 82 | ||
84 | if (width < 0) | 83 | if (width < 0) { |
85 | { | ||
86 | width = 78; | 84 | width = 78; |
87 | level = 0; | 85 | level = 0; |
88 | } | 86 | } |
89 | 87 | ||
90 | while (len) | 88 | while (len) { |
91 | { | ||
92 | size_t seglen; | 89 | size_t seglen; |
93 | const char *p; | 90 | const char *p; |
94 | 91 | ||
95 | for (seglen = 0, p = docstring; p < docstring + width && *p; p++) | 92 | for (seglen = 0, p = docstring; p < docstring + width && *p; |
96 | { | 93 | p++) { |
97 | if (*p == '\n') | 94 | if (*p == '\n') { |
98 | { | ||
99 | seglen = p - docstring; | 95 | seglen = p - docstring; |
100 | break; | 96 | break; |
101 | } | 97 | } |
@@ -111,14 +107,11 @@ grecs_format_docstring (FILE *stream, const char *docstring, unsigned level) | |||
111 | fputc('\n', stream); | 107 | fputc('\n', stream); |
112 | len -= seglen; | 108 | len -= seglen; |
113 | docstring += seglen; | 109 | docstring += seglen; |
114 | if (*docstring == '\n') | 110 | if (*docstring == '\n') { |
115 | { | ||
116 | docstring++; | 111 | docstring++; |
117 | len--; | 112 | len--; |
118 | } | 113 | } else |
119 | else | 114 | while (*docstring && isspace(*docstring)) { |
120 | while (*docstring && isspace (*docstring)) | ||
121 | { | ||
122 | docstring++; | 115 | docstring++; |
123 | len--; | 116 | len--; |
124 | } | 117 | } |
@@ -144,14 +137,15 @@ grecs_format_simple_statement (FILE *stream, struct grecs_keyword *kwp, | |||
144 | fprintf(stream, "%s %s;\n", kwp->ident, gettext(argstr)); | 137 | fprintf(stream, "%s %s;\n", kwp->ident, gettext(argstr)); |
145 | else if (strchr (argstr, ':')) | 138 | else if (strchr (argstr, ':')) |
146 | fprintf (stream, "%s <%s>;\n", kwp->ident, gettext(argstr)); | 139 | fprintf (stream, "%s <%s>;\n", kwp->ident, gettext(argstr)); |
147 | else | 140 | else { |
148 | { | ||
149 | fprintf(stream, "%s <%s: ", kwp->ident, gettext(argstr)); | 141 | fprintf(stream, "%s <%s: ", kwp->ident, gettext(argstr)); |
150 | if (GRECS_IS_LIST(kwp->type)) | 142 | if (GRECS_IS_LIST(kwp->type)) |
151 | fprintf(stream, "list of %s", | 143 | fprintf(stream, "list of %s", |
152 | gettext (grecs_data_type_string (GRECS_TYPE (kwp->type)))); | 144 | gettext(grecs_data_type_string( |
145 | GRECS_TYPE (kwp->type)))); | ||
153 | else | 146 | else |
154 | fprintf (stream, "%s", gettext (grecs_data_type_string (kwp->type))); | 147 | fprintf(stream, "%s", |
148 | gettext(grecs_data_type_string(kwp->type))); | ||
155 | fprintf(stream, ">;\n"); | 149 | fprintf(stream, ">;\n"); |
156 | } | 150 | } |
157 | } | 151 | } |
@@ -177,8 +171,7 @@ grecs_format_statement_array (FILE *stream, struct grecs_keyword *kwp, | |||
177 | unsigned n, | 171 | unsigned n, |
178 | unsigned level) | 172 | unsigned level) |
179 | { | 173 | { |
180 | for (; kwp->ident; kwp++, n++) | 174 | for (; kwp->ident; kwp++, n++) { |
181 | { | ||
182 | if (n) | 175 | if (n) |
183 | fputc('\n', stream); | 176 | fputc('\n', stream); |
184 | if (kwp->type == grecs_type_section) | 177 | if (kwp->type == grecs_type_section) |
@@ -187,3 +180,5 @@ grecs_format_statement_array (FILE *stream, struct grecs_keyword *kwp, | |||
187 | grecs_format_simple_statement(stream, kwp, level); | 180 | grecs_format_simple_statement(stream, kwp, level); |
188 | } | 181 | } |
189 | } | 182 | } |
183 | |||
184 | |||
diff --git a/src/grecs-gram.y b/src/grecs-gram.y index 0edea13..f65e2dd 100644 --- a/src/grecs-gram.y +++ b/src/grecs-gram.y | |||
@@ -99,7 +99,8 @@ ident : IDENT | |||
99 | { | 99 | { |
100 | $$ = find_keyword($1); | 100 | $$ = find_keyword($1); |
101 | if (!$$) | 101 | if (!$$) |
102 | grecs_error(&grecs_current_locus, 0, _("Unknown keyword")); | 102 | grecs_error(&grecs_current_locus, 0, |
103 | _("Unknown keyword")); | ||
103 | } | 104 | } |
104 | ; | 105 | ; |
105 | 106 | ||
@@ -115,18 +116,16 @@ vallist : vlist | |||
115 | { | 116 | { |
116 | size_t n; | 117 | size_t n; |
117 | 118 | ||
118 | if ((n = grecs_list_size ($1)) == 1) | 119 | if ((n = grecs_list_size($1)) == 1) { |
119 | { | ||
120 | $$ = *(grecs_value_t *)grecs_list_index($1, 0); | 120 | $$ = *(grecs_value_t *)grecs_list_index($1, 0); |
121 | } | 121 | } else { |
122 | else | ||
123 | { | ||
124 | size_t i; | 122 | size_t i; |
125 | struct grecs_list_entry *ep; | 123 | struct grecs_list_entry *ep; |
126 | 124 | ||
127 | $$.type = GRECS_TYPE_ARRAY; | 125 | $$.type = GRECS_TYPE_ARRAY; |
128 | $$.v.arg.c = n; | 126 | $$.v.arg.c = n; |
129 | $$.v.arg.v = grecs_malloc (n * sizeof ($$.v.arg.v[0])); | 127 | $$.v.arg.v = grecs_malloc(n * |
128 | sizeof($$.v.arg.v[0])); | ||
130 | for (i = 0, ep = $1->head; ep; i++, ep = ep->next) | 129 | for (i = 0, ep = $1->head; ep; i++, ep = ep->next) |
131 | $$.v.arg.v[i] = *(grecs_value_t *)ep->data; | 130 | $$.v.arg.v[i] = *(grecs_value_t *)ep->data; |
132 | } | 131 | } |
@@ -253,8 +252,7 @@ grecs_vasprintf (char **pbuf, size_t *psize, const char *fmt, va_list ap) | |||
253 | size_t buflen = *psize; | 252 | size_t buflen = *psize; |
254 | int rc = 0; | 253 | int rc = 0; |
255 | 254 | ||
256 | if (!buf) | 255 | if (!buf) { |
257 | { | ||
258 | if (buflen == 0) | 256 | if (buflen == 0) |
259 | buflen = 512; /* Initial allocation */ | 257 | buflen = 512; /* Initial allocation */ |
260 | 258 | ||
@@ -263,35 +261,28 @@ grecs_vasprintf (char **pbuf, size_t *psize, const char *fmt, va_list ap) | |||
263 | return ENOMEM; | 261 | return ENOMEM; |
264 | } | 262 | } |
265 | 263 | ||
266 | for (;;) | 264 | for (;;) { |
267 | { | ||
268 | ssize_t n = vsnprintf(buf, buflen, fmt, ap); | 265 | ssize_t n = vsnprintf(buf, buflen, fmt, ap); |
269 | if (n < 0 || n >= buflen || !memchr (buf, '\0', n + 1)) | 266 | if (n < 0 || n >= buflen || !memchr(buf, '\0', n + 1)) { |
270 | { | ||
271 | char *newbuf; | 267 | char *newbuf; |
272 | size_t newlen = buflen * 2; | 268 | size_t newlen = buflen * 2; |
273 | if (newlen < buflen) | 269 | if (newlen < buflen) { |
274 | { | ||
275 | rc = ENOMEM; | 270 | rc = ENOMEM; |
276 | break; | 271 | break; |
277 | } | 272 | } |
278 | newbuf = realloc(buf, newlen); | 273 | newbuf = realloc(buf, newlen); |
279 | if (newbuf == NULL) | 274 | if (newbuf == NULL) { |
280 | { | ||
281 | rc = ENOMEM; | 275 | rc = ENOMEM; |
282 | break; | 276 | break; |
283 | } | 277 | } |
284 | buflen = newlen; | 278 | buflen = newlen; |
285 | buf = newbuf; | 279 | buf = newbuf; |
286 | } | 280 | } else |
287 | else | ||
288 | break; | 281 | break; |
289 | } | 282 | } |
290 | 283 | ||
291 | if (rc) | 284 | if (rc) { |
292 | { | 285 | if (!*pbuf) { |
293 | if (!*pbuf) | ||
294 | { | ||
295 | /* We made first allocation, now free it */ | 286 | /* We made first allocation, now free it */ |
296 | free(buf); | 287 | free(buf); |
297 | buf = NULL; | 288 | buf = NULL; |
@@ -360,8 +351,7 @@ grecs_parse (const char *name) | |||
360 | if (grecs_lex_begin(name)) | 351 | if (grecs_lex_begin(name)) |
361 | return 1; | 352 | return 1; |
362 | cursect = &config_keywords; | 353 | cursect = &config_keywords; |
363 | if (sections) | 354 | if (sections) { |
364 | { | ||
365 | grecs_list_free(sections); |