aboutsummaryrefslogtreecommitdiff
path: root/src/format.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/format.c')
-rw-r--r--src/format.c117
1 files changed, 100 insertions, 17 deletions
diff --git a/src/format.c b/src/format.c
index fc6c8d6..11b405a 100644
--- a/src/format.c
+++ b/src/format.c
@@ -68,14 +68,14 @@ grecs_data_type_string (enum grecs_data_type type)
68} 68}
69 69
70static void 70static void
71format_level(FILE *stream, unsigned level) 71format_level(unsigned level, FILE *stream)
72{ 72{
73 while (level--) 73 while (level--)
74 fprintf(stream, " "); 74 fprintf(stream, " ");
75} 75}
76 76
77void 77void
78grecs_format_docstring(FILE *stream, const char *docstring, unsigned level) 78grecs_format_docstring(const char *docstring, unsigned level, FILE *stream)
79{ 79{
80 size_t len = strlen(docstring); 80 size_t len = strlen(docstring);
81 int width = 78 - level * 2; 81 int width = 78 - level * 2;
@@ -101,7 +101,7 @@ grecs_format_docstring(FILE *stream, const char *docstring, unsigned level)
101 if (seglen == 0 || *p == 0) 101 if (seglen == 0 || *p == 0)
102 seglen = p - docstring; 102 seglen = p - docstring;
103 103
104 format_level(stream, level); 104 format_level(level, stream);
105 fprintf(stream, "# "); 105 fprintf(stream, "# ");
106 fwrite(docstring, seglen, 1, stream); 106 fwrite(docstring, seglen, 1, stream);
107 fputc('\n', stream); 107 fputc('\n', stream);
@@ -119,14 +119,14 @@ grecs_format_docstring(FILE *stream, const char *docstring, unsigned level)
119} 119}
120 120
121void 121void
122grecs_format_simple_statement(FILE *stream, struct grecs_keyword *kwp, 122grecs_format_simple_statement(struct grecs_keyword *kwp, unsigned level,
123 unsigned level) 123 FILE *stream)
124{ 124{
125 const char *argstr; 125 const char *argstr;
126 126
127 if (kwp->docstring) 127 if (kwp->docstring)
128 grecs_format_docstring(stream, kwp->docstring, level); 128 grecs_format_docstring(kwp->docstring, level, stream);
129 format_level(stream, level); 129 format_level(level, stream);
130 130
131 if (kwp->argname) 131 if (kwp->argname)
132 argstr = kwp->argname; 132 argstr = kwp->argname;
@@ -151,34 +151,117 @@ grecs_format_simple_statement(FILE *stream, struct grecs_keyword *kwp,
151} 151}
152 152
153void 153void
154grecs_format_block_statement(FILE *stream, struct grecs_keyword *kwp, 154grecs_format_block_statement(struct grecs_keyword *kwp, unsigned level,
155 unsigned level) 155 FILE *stream)
156{ 156{
157 if (kwp->docstring) 157 if (kwp->docstring)
158 grecs_format_docstring(stream, kwp->docstring, level); 158 grecs_format_docstring(kwp->docstring, level, stream);
159 format_level(stream, level); 159 format_level(level, stream);
160 fprintf(stream, "%s", kwp->ident); 160 fprintf(stream, "%s", kwp->ident);
161 if (kwp->argname) 161 if (kwp->argname)
162 fprintf(stream, " <%s>", gettext(kwp->argname)); 162 fprintf(stream, " <%s>", gettext(kwp->argname));
163 fprintf(stream, " {\n"); 163 fprintf(stream, " {\n");
164 grecs_format_statement_array(stream, kwp->kwd, 0, level + 1); 164 grecs_format_statement_array(kwp->kwd, 0, level + 1, stream);
165 format_level(stream, level); 165 format_level(level, stream);
166 fprintf(stream, "}\n"); 166 fprintf(stream, "}\n");
167} 167}
168 168
169void 169void
170grecs_format_statement_array(FILE *stream, struct grecs_keyword *kwp, 170grecs_format_statement_array(struct grecs_keyword *kwp,
171 unsigned n, 171 unsigned n,
172 unsigned level) 172 unsigned level,
173 FILE *stream)
173{ 174{
174 for (; kwp->ident; kwp++, n++) { 175 for (; kwp->ident; kwp++, n++) {
175 if (n) 176 if (n)
176 fputc('\n', stream); 177 fputc('\n', stream);
177 if (kwp->type == grecs_type_section) 178 if (kwp->type == grecs_type_section)
178 grecs_format_block_statement(stream, kwp, level); 179 grecs_format_block_statement(kwp, level, stream);
179 else 180 else
180 grecs_format_simple_statement(stream, kwp, level); 181 grecs_format_simple_statement(kwp, level, stream);
181 } 182 }
182} 183}
183 184
184 185
186void
187grecs_format_locus(grecs_locus_t *locus, FILE *fp)
188{
189 fprintf(fp, "%s:%d:", locus->file, locus->line);
190}
191
192void
193grecs_format_node_ident(struct grecs_node *node, int delim, FILE *fp)
194{
195 if (node->up)
196 grecs_format_node_ident(node->up, delim, fp);
197 fputc(delim, fp);
198 fprintf(fp, "%s", node->ident);
199 if (node->type == grecs_node_block &&
200 !GRECS_VALUE_EMPTY_P(&node->value)) {
201 fputc('=', fp);
202 grecs_format_value(&node->value, fp);
203 }
204}
205
206void
207grecs_format_value(struct grecs_value *val, FILE *fp)
208{
209 int i;
210 struct grecs_list_entry *ep;
211
212 switch (val->type) {
213 case GRECS_TYPE_STRING:
214 fprintf(fp, "\"%s\"", val->v.string); /*FIXME: Quoting*/
215 break;
216
217 case GRECS_TYPE_LIST:
218 fputc('(', fp);
219 for (ep = val->v.list->head; ep; ep = ep->next) {
220 grecs_format_value(ep->data, fp);
221 if (ep->next) {
222 fputc(',', fp);
223 fputc(' ', fp);
224 }
225 }
226 fputc(')', fp);
227 break;
228
229 case GRECS_TYPE_ARRAY:
230 for (i = 0; i < val->v.arg.c; i++) {
231 if (i)
232 fputc(' ', fp);
233 grecs_format_value(&val->v.arg.v[i], fp);
234 }
235 }
236}
237
238void
239grecs_format_node(struct grecs_node *node, int flags, FILE *fp)
240{
241 int delim = flags & 0xff;
242
243 if (!delim)
244 delim = '.';
245 switch (node->type) {
246 case grecs_node_block:
247 for (node = node->down; node; node = node->next) {
248 grecs_format_node(node, flags, fp);
249 if (node->next)
250 fputc('\n', fp);
251 }
252 break;
253
254 case grecs_node_stmt:
255 if (flags & GRECS_NODE_FLAG_LOCUS) {
256 grecs_format_locus(&node->locus, fp);
257 fputc(' ', fp);
258 }
259 grecs_format_node_ident(node, delim, fp);
260 fputc(':', fp);
261 fputc(' ', fp);
262 grecs_format_value(&node->value, fp);
263 }
264}
265
266
267

Return to:

Send suggestions and report system problems to the System administrator.