[master] 95c2094 Polish the generated C code a bit, new order:
Poul-Henning Kamp
phk at FreeBSD.org
Wed Jun 17 09:55:00 CEST 2015
commit 95c209470655ca6a8339c854368e1c3b5d8d5b4b
Author: Poul-Henning Kamp <phk at FreeBSD.org>
Date: Wed Jun 17 07:53:18 2015 +0000
Polish the generated C code a bit, new order:
Boilerplate .h files.
Source code copy
Location tables
Generated .h
Generated .c
Added a few more "---===###" separators to make this clear
diff --git a/lib/libvcc/vcc_compile.c b/lib/libvcc/vcc_compile.c
index 21fc395..34657d4 100644
--- a/lib/libvcc/vcc_compile.c
+++ b/lib/libvcc/vcc_compile.c
@@ -250,15 +250,41 @@ EncToken(struct vsb *sb, const struct token *t)
*/
static void
-LocTable(const struct vcc *tl)
+EmitCoordinates(const struct vcc *tl, struct vsb *vsb)
{
struct token *t;
unsigned lin, pos;
struct source *sp;
const char *p;
- Fh(tl, 0, "\n#define VGC_NREFS %u\n", tl->cnt + 1);
- Fc(tl, 0, "\nstatic struct vrt_ref VGC_ref[VGC_NREFS] = {\n");
+ VSB_printf(vsb, "/* ---===### Source Code ###===---*/\n");
+
+ VSB_printf(vsb, "\n#define VGC_NSRCS %u\n", tl->nsources);
+
+ VSB_printf(vsb, "\nstatic const char *srcname[VGC_NSRCS] = {\n");
+ VTAILQ_FOREACH(sp, &tl->sources, list) {
+ VSB_printf(vsb, "\t");
+ EncString(vsb, sp->name, NULL, 0);
+ VSB_printf(vsb, ",\n");
+ }
+ VSB_printf(vsb, "};\n");
+
+ VSB_printf(vsb, "\nstatic const char *srcbody[%u] = {\n", tl->nsources);
+ VTAILQ_FOREACH(sp, &tl->sources, list) {
+ VSB_printf(vsb, " /* ");
+ EncString(vsb, sp->name, NULL, 0);
+ VSB_printf(vsb, "*/\n");
+ VSB_printf(vsb, "\t");
+ EncString(vsb, sp->b, sp->e, 1);
+ VSB_printf(vsb, ",\n");
+ }
+ VSB_printf(vsb, "};\n\n");
+
+ VSB_printf(vsb, "/* ---===### Location Counters ###===---*/\n");
+
+ VSB_printf(vsb, "\n#define VGC_NREFS %u\n", tl->cnt + 1);
+
+ VSB_printf(vsb, "\nstatic struct vrt_ref VGC_ref[VGC_NREFS] = {\n");
lin = 1;
pos = 0;
sp = 0;
@@ -286,14 +312,14 @@ LocTable(const struct vcc *tl)
pos++;
}
- Fc(tl, 0, " [%3u] = { %d, %8tu, %4u, %3u, 0, ",
+ VSB_printf(vsb, " [%3u] = { %d, %8tu, %4u, %3u, 0, ",
t->cnt, sp->idx, t->b - sp->b, lin, pos + 1);
if (t->tok == CSRC)
- Fc(tl, 0, " \"C{\"},\n");
+ VSB_printf(vsb, " \"C{\"},\n");
else
- Fc(tl, 0, " \"%.*s\" },\n", PF(t));
+ VSB_printf(vsb, " \"%.*s\" },\n", PF(t));
}
- Fc(tl, 0, "};\n");
+ VSB_printf(vsb, "};\n\n");
}
/*--------------------------------------------------------------------
@@ -375,36 +401,13 @@ EmitInitFini(const struct vcc *tl)
static void
EmitStruct(const struct vcc *tl)
{
- struct source *sp;
-
- Fc(tl, 0, "\nextern const char *srcname[];\n");
- Fc(tl, 0, "\nconst char *srcname[%u] = {\n", tl->nsources);
- VTAILQ_FOREACH(sp, &tl->sources, list) {
- Fc(tl, 0, "\t");
- EncString(tl->fc, sp->name, NULL, 0);
- Fc(tl, 0, ",\n");
- }
- Fc(tl, 0, "};\n");
-
- Fc(tl, 0, "\nextern const char *srcbody[];\n");
- Fc(tl, 0, "\nconst char *srcbody[%u] = {\n", tl->nsources);
- VTAILQ_FOREACH(sp, &tl->sources, list) {
- Fc(tl, 0, " /* ");
- EncString(tl->fc, sp->name, NULL, 0);
- Fc(tl, 0, "*/\n");
- Fc(tl, 0, "\t");
- EncString(tl->fc, sp->b, sp->e, 1);
- Fc(tl, 0, ",\n");
- }
- Fc(tl, 0, "};\n");
-
Fc(tl, 0, "\nconst struct VCL_conf VCL_conf = {\n");
Fc(tl, 0, "\t.magic = VCL_CONF_MAGIC,\n");
Fc(tl, 0, "\t.event_vcl = VGC_Event,\n");
Fc(tl, 0, "\t.default_director = &%s,\n", tl->default_director);
Fc(tl, 0, "\t.ref = VGC_ref,\n");
Fc(tl, 0, "\t.nref = VGC_NREFS,\n");
- Fc(tl, 0, "\t.nsrc = %u,\n", tl->nsources);
+ Fc(tl, 0, "\t.nsrc = VGC_NSRCS,\n");
Fc(tl, 0, "\t.srcname = srcname,\n");
Fc(tl, 0, "\t.srcbody = srcbody,\n");
#define VCL_MET_MAC(l,u,b) \
@@ -606,12 +609,17 @@ vcc_CompileSource(const struct vcc *tl0, struct vsb *sb, struct source *sp)
struct vcc *tl;
struct symbol *sym;
const struct var *v;
+ struct vsb *vsb;
+
char *of;
int i;
tl = vcc_NewVcc(tl0);
tl->sb = sb;
+ vsb = VSB_new_auto();
+ AN(vsb);
+
vcc_Expr_Init(tl);
for (v = tl->vars; v->name != NULL; v++) {
@@ -630,8 +638,9 @@ vcc_CompileSource(const struct vcc *tl0, struct vsb *sb, struct source *sp)
sym = VCC_AddSymbolStr(tl, "storage.", SYM_WILDCARD);
sym->wildcard = vcc_Stv_Wildcard;
- vcl_output_lang_h(tl->fh);
- Fh(tl, 0, "/* ---===### VCC generated code ###===---*/\n");
+ vcl_output_lang_h(vsb);
+ Fh(tl, 0, "/* ---===### VCC generated .h code ###===---*/\n");
+ Fc(tl, 0, "\n/* ---===### VCC generated .c code ###===---*/\n");
Fh(tl, 0, "\nextern const struct VCL_conf VCL_conf;\n");
/* Register and lex the main source */
@@ -691,9 +700,10 @@ vcc_CompileSource(const struct vcc *tl0, struct vsb *sb, struct source *sp)
return (vcc_DestroyTokenList(tl, NULL));
/* Emit method functions */
+ Fh(tl, 1, "\n");
for (i = 1; i < VCL_MET_MAX; i++) {
- Fh(tl, 1, "\nint __match_proto__(vcl_func_f)\n");
Fh(tl, 1,
+ "int __match_proto__(vcl_func_f) "
"VGC_function_%s(VRT_CTX);\n",
method_tab[i].name);
Fc(tl, 1, "\nint __match_proto__(vcl_func_f)\n");
@@ -715,20 +725,27 @@ vcc_CompileSource(const struct vcc *tl0, struct vsb *sb, struct source *sp)
Fc(tl, 1, "}\n");
}
- LocTable(tl);
-
EmitInitFini(tl);
EmitStruct(tl);
- /* Combine it all in the fh vsb */
- AZ(VSB_finish(tl->fc));
- VSB_cat(tl->fh, VSB_data(tl->fc));
+ /* Combine it all in the vsb */
+
+ EmitCoordinates(tl, vsb);
+
AZ(VSB_finish(tl->fh));
+ VSB_cat(vsb, VSB_data(tl->fh));
- of = strdup(VSB_data(tl->fh));
+ AZ(VSB_finish(tl->fc));
+ VSB_cat(vsb, VSB_data(tl->fc));
+
+ AZ(VSB_finish(vsb));
+
+ of = strdup(VSB_data(vsb));
AN(of);
+ VSB_delete(vsb);
+
/* done */
return (vcc_DestroyTokenList(tl, of));
}
More information about the varnish-commit
mailing list