aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/Makefile.am2
-rw-r--r--src/format.c39
-rw-r--r--src/grecs-gram.y172
-rw-r--r--src/grecs-lex.l113
-rw-r--r--src/grecs.h0
-rw-r--r--src/list.c19
-rw-r--r--src/preproc.c222
-rw-r--r--src/text.c6
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
33INCLUDES = -I$(srcdir) @GRECS_INCLUDES@ 33INCLUDES = -I$(srcdir) @GRECS_INCLUDES@
34AM_YFLAGS = -dtv 34AM_YFLAGS = -dtv
35AM_LFLAGS = -dvp 35AM_LFLAGS = -d
36# Use a modified ylwrap implementation that understands the --prefix option. 36# Use a modified ylwrap implementation that understands the --prefix option.
37YLWRAP = $(top_srcdir)/$(grex_topdir)grecs/build-aux/ylwrap --prefix yy_grecs 37YLWRAP = $(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 @@
26const char * 26const char *
27grecs_data_type_string (enum grecs_data_type type) 27grecs_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);