[master] f0ad3c0df Un-special-case the 'default' more.
Poul-Henning Kamp
phk at FreeBSD.org
Wed May 15 11:00:15 UTC 2019
commit f0ad3c0dfd11cb19dc6f7e8b11addad804eba560
Author: Poul-Henning Kamp <phk at FreeBSD.org>
Date: Wed May 15 10:58:50 2019 +0000
Un-special-case the 'default' more.
diff --git a/lib/libvcc/vcc_expr.c b/lib/libvcc/vcc_expr.c
index 1c1f659ad..e8fd18a28 100644
--- a/lib/libvcc/vcc_expr.c
+++ b/lib/libvcc/vcc_expr.c
@@ -302,55 +302,6 @@ vcc_expr_tostring(struct vcc *tl, struct expr **e, vcc_type_t fmt)
}
}
-/*--------------------------------------------------------------------
- */
-
-static void v_matchproto_(sym_expr_t)
-vcc_Eval_Regsub(struct vcc *tl, struct expr **e, struct token *t,
- struct symbol *sym, vcc_type_t fmt)
-{
- struct expr *e2;
- int all = sym->eval_priv == NULL ? 0 : 1;
- char buf[128];
- struct vsb vsb;
-
- (void)t;
- (void)fmt;
- SkipToken(tl, '(');
- vcc_expr0(tl, &e2, STRING);
- ERRCHK(tl);
- SkipToken(tl, ',');
- ExpectErr(tl, CSTR);
-
- AN(VSB_new(&vsb, buf, sizeof buf, VSB_FIXEDLEN));
- VSB_printf(&vsb, "VRT_regsub(ctx, %d,\v+\n\v1,\n", all);
- vcc_regexp(tl, &vsb);
- ERRCHK(tl);
- AZ(VSB_finish(&vsb));
- *e = vcc_expr_edit(tl, STRING, VSB_data(&vsb), e2, NULL);
- SkipToken(tl, ',');
- vcc_expr0(tl, &e2, STRING);
- ERRCHK(tl);
- *e = vcc_expr_edit(tl, STRINGS, "\v1,\n\v2)\v-", *e, e2);
- (*e)->nstr = 1;
- SkipToken(tl, ')');
-}
-
-/*--------------------------------------------------------------------
- */
-
-static void v_matchproto_(sym_expr_t)
-vcc_Eval_BoolConst(struct vcc *tl, struct expr **e, struct token *t,
- struct symbol *sym, vcc_type_t fmt)
-{
-
- (void)t;
- (void)tl;
- (void)fmt;
- *e = vcc_mk_expr(BOOL, "(0==%d)", sym->eval_priv == NULL ? 1 : 0);
- (*e)->constant = EXPR_CONST;
-}
-
/*--------------------------------------------------------------------
*/
@@ -734,17 +685,6 @@ vcc_expr4(struct vcc *tl, struct expr **e, vcc_type_t fmt)
}
switch (tl->t->tok) {
case ID:
- if (vcc_IdIs(tl->t, "default") && fmt == PROBE) {
- vcc_NextToken(tl);
- *e = vcc_mk_expr(PROBE, "%s", vcc_default_probe(tl));
- return;
- }
- if (vcc_IdIs(tl->t, "default") && fmt == BACKEND) {
- vcc_NextToken(tl);
- *e = vcc_mk_expr(BACKEND,
- "*(VCL_conf.default_director)");
- return;
- }
t = tl->t;
sym = VCC_SymbolGet(tl, SYM_NONE, "Symbol not found",
XREF_REF);
@@ -1399,6 +1339,77 @@ vcc_Act_Call(struct vcc *tl, struct token *t, struct symbol *sym)
}
vcc_delete_expr(e);
}
+/*--------------------------------------------------------------------
+ */
+
+static void v_matchproto_(sym_expr_t)
+vcc_Eval_Regsub(struct vcc *tl, struct expr **e, struct token *t,
+ struct symbol *sym, vcc_type_t fmt)
+{
+ struct expr *e2;
+ int all = sym->eval_priv == NULL ? 0 : 1;
+ char buf[128];
+ struct vsb vsb;
+
+ (void)t;
+ (void)fmt;
+ SkipToken(tl, '(');
+ vcc_expr0(tl, &e2, STRING);
+ ERRCHK(tl);
+ SkipToken(tl, ',');
+ ExpectErr(tl, CSTR);
+
+ AN(VSB_new(&vsb, buf, sizeof buf, VSB_FIXEDLEN));
+ VSB_printf(&vsb, "VRT_regsub(ctx, %d,\v+\n\v1,\n", all);
+ vcc_regexp(tl, &vsb);
+ ERRCHK(tl);
+ AZ(VSB_finish(&vsb));
+ *e = vcc_expr_edit(tl, STRING, VSB_data(&vsb), e2, NULL);
+ SkipToken(tl, ',');
+ vcc_expr0(tl, &e2, STRING);
+ ERRCHK(tl);
+ *e = vcc_expr_edit(tl, STRINGS, "\v1,\n\v2)\v-", *e, e2);
+ (*e)->nstr = 1;
+ SkipToken(tl, ')');
+}
+
+/*--------------------------------------------------------------------
+ */
+
+static void v_matchproto_(sym_expr_t)
+vcc_Eval_BoolConst(struct vcc *tl, struct expr **e, struct token *t,
+ struct symbol *sym, vcc_type_t fmt)
+{
+
+ (void)t;
+ (void)tl;
+ (void)fmt;
+ *e = vcc_mk_expr(BOOL, "(0==%d)", sym->eval_priv == NULL ? 1 : 0);
+ (*e)->constant = EXPR_CONST;
+}
+
+/*--------------------------------------------------------------------
+ */
+
+static void v_matchproto_(sym_expr_t)
+vcc_Eval_Default(struct vcc *tl, struct expr **e, struct token *t,
+ struct symbol *sym, vcc_type_t fmt)
+{
+ (void)e;
+ (void)fmt;
+ (void)sym;
+ (void)t;
+
+ if (fmt == PROBE)
+ *e = vcc_mk_expr(PROBE, "%s", vcc_default_probe(tl));
+ else if (fmt == BACKEND)
+ *e = vcc_mk_expr(BACKEND, "*(VCL_conf.default_director)");
+ else {
+ VSB_printf(tl->sb,
+ "Symbol 'default' is a reserved word.\n");
+ vcc_ErrWhere(tl, t);
+ }
+}
/*--------------------------------------------------------------------
*/
@@ -1431,4 +1442,9 @@ vcc_Expr_Init(struct vcc *tl)
sym->type = BOOL;
sym->eval = vcc_Eval_BoolConst;
sym->eval_priv = NULL;
+
+ sym = VCC_MkSym(tl, "default", SYM_FUNC, VCL_LOW, VCL_HIGH);
+ AN(sym);
+ sym->type = BACKEND; // ... can also (sometimes) deliver PROBE
+ sym->eval = vcc_Eval_Default;
}
diff --git a/lib/libvcc/vcc_parse.c b/lib/libvcc/vcc_parse.c
index 1e0bbd355..ce0deb08c 100644
--- a/lib/libvcc/vcc_parse.c
+++ b/lib/libvcc/vcc_parse.c
@@ -357,7 +357,6 @@ static struct toplev {
{ "probe", vcc_ParseProbe, VCL_41, VCL_HIGH },
{ "import", vcc_ParseImport, VCL_41, VCL_HIGH },
{ "vcl", vcc_ParseVcl, VCL_41, VCL_HIGH },
- { "default", NULL, VCL_40, VCL_HIGH },
{ NULL, NULL }
};
diff --git a/lib/libvcc/vcc_symb.c b/lib/libvcc/vcc_symb.c
index 1ff8a4943..e898c884b 100644
--- a/lib/libvcc/vcc_symb.c
+++ b/lib/libvcc/vcc_symb.c
@@ -240,11 +240,7 @@ VCC_SymbolGet(struct vcc *tl, vcc_kind_t kind, const char *e, const char *x)
if (kind != SYM_NONE && kind != sym->kind) {
VSB_printf(tl->sb, "Symbol ");
vcc_ErrToken(tl, tl->t);
- if (sym->kind == SYM_NONE)
- VSB_printf(tl->sb, " is a reserved word.");
- else
- VSB_printf(tl->sb, " has wrong type (%s): ",
- sym->kind->name);
+ VSB_printf(tl->sb, " has wrong type (%s): ", sym->kind->name);
VSB_cat(tl->sb, "\nAt: ");
vcc_ErrWhere(tl, tl->t);
if (sym->def_b != NULL) {
More information about the varnish-commit
mailing list