static void parse_error(struct vcc *tl) { vcc_NextToken(tl); Fb(tl, 1, "VRT_error(sp,\n"); if (tl->t->tok == '(') { vcc_NextToken(tl); vcc_Expr(tl, INT); if (tl->t->tok == ',') { Fb(tl, 1, ",\n"); vcc_NextToken(tl); vcc_Expr(tl, STRING); } else Fb(tl, 1, ", 0\n"); SkipToken(tl, ')'); } else { vcc_Expr(tl, INT); if (tl->t->tok != ';') { Fb(tl, 1, ",\n"); vcc_Expr(tl, STRING); } else Fb(tl, 1, ", 0\n"); } Fb(tl, 1, ");\n"); Fb(tl, 1, "VRT_done(sp, VCL_RET_ERROR);\n"); }
static void parse_set(struct vcc *tl) { const struct var *vp; const struct arith *ap; enum var_type fmt; vcc_NextToken(tl); ExpectErr(tl, ID); vp = vcc_FindVar(tl, tl->t, 1, "cannot be set"); ERRCHK(tl); assert(vp != NULL); Fb(tl, 1, "%s", vp->lname); vcc_NextToken(tl); fmt = vp->fmt; for (ap = arith; ap->type != VOID; ap++) { if (ap->type != fmt) continue; if (ap->oper != tl->t->tok) continue; if (ap->oper != '=') Fb(tl, 0, "%s %c ", vp->rname, *tl->t->b); vcc_NextToken(tl); fmt = ap->want; break; } if (ap->type == VOID) SkipToken(tl, ap->oper); if (fmt == STRING) { vcc_Expr(tl, STRING_LIST); } else { vcc_Expr(tl, fmt); } Fb(tl, 1, ");\n"); }
static void parse_set(struct vcc *tl) { const struct symbol *sym; const struct arith *ap; vcc_type_t fmt; vcc_NextToken(tl); ExpectErr(tl, ID); sym = vcc_FindVar(tl, tl->t, 1, "cannot be set"); ERRCHK(tl); assert(sym != NULL); if (vcc_IdIs(tl->t, "bereq.body")) { VSB_printf(tl->sb, "bereq.body cannot be set.\n"); vcc_ErrWhere(tl, tl->t); return; } Fb(tl, 1, "%s\n", sym->lname); tl->indent += INDENT; vcc_NextToken(tl); fmt = sym->fmt; for (ap = arith; ap->type != VOID; ap++) { if (ap->type != fmt) continue; if (ap->oper != tl->t->tok) continue; if (ap->oper != '=') Fb(tl, 1, "%s %c ", sym->rname, *tl->t->b); vcc_NextToken(tl); fmt = ap->want; break; } if (ap->type == VOID) SkipToken(tl, ap->oper); if (fmt == HEADER) { vcc_Expr(tl, STRING_LIST); } else if (fmt == STRING) { vcc_Expr(tl, STRING_LIST); } else if (fmt == BODY) { vcc_Expr(tl, STRING_LIST); } else { vcc_Expr(tl, fmt); } tl->indent -= INDENT; Fb(tl, 1, ");\n"); }
static void parse_synthetic(struct vcc *tl) { vcc_NextToken(tl); Fb(tl, 1, "VRT_synth_page(sp, 0, "); vcc_Expr(tl, STRING_LIST); ERRCHK(tl); Fb(tl, 0, ");\n"); }
static void parse_panic(struct vcc *tl) { vcc_NextToken(tl); Fb(tl, 1, "VRT_panic(sp, "); vcc_Expr(tl, STRING); ERRCHK(tl); Fb(tl, 0, ", vrt_magic_string_end);\n"); }
static void vcc_Conditional(struct vcc *tl) { SkipToken(tl, '('); Fb(tl, 0, "(\n"); L(tl, vcc_Expr(tl, BOOL)); ERRCHK(tl); Fb(tl, 1, ")\n"); SkipToken(tl, ')'); }
static void parse_hash_data(struct vcc *tl) { vcc_NextToken(tl); SkipToken(tl, '('); Fb(tl, 1, "VRT_hashdata(ctx, "); vcc_Expr(tl, STRING_LIST); ERRCHK(tl); Fb(tl, 0, ");\n"); SkipToken(tl, ')'); }
static void parse_return_synth(struct vcc *tl) { ExpectErr(tl, '('); vcc_NextToken(tl); Fb(tl, 1, "VRT_synth(ctx,\n"); tl->indent += INDENT; vcc_Expr(tl, INT); ERRCHK(tl); Fb(tl, 1, ",\n"); if (tl->t->tok == ',') { vcc_NextToken(tl); vcc_Expr(tl, STRING); ERRCHK(tl); } else { Fb(tl, 1, "(const char*)0\n"); } tl->indent -= INDENT; ExpectErr(tl, ')'); vcc_NextToken(tl); Fb(tl, 1, ");\n"); }
static void parse_ban_url(struct vcc *tl) { vcc_NextToken(tl); ExpectErr(tl, '('); vcc_NextToken(tl); Fb(tl, 1, "VRT_ban(sp, \"req.url\", \"~\", "); vcc_Expr(tl, STRING); ERRCHK(tl); ExpectErr(tl, ')'); vcc_NextToken(tl); Fb(tl, 0, ", 0);\n"); }
static void parse_return_pass(struct vcc *tl) { ExpectErr(tl, '('); vcc_NextToken(tl); Fb(tl, 1, "VRT_hit_for_pass(ctx,\n"); tl->indent += INDENT; vcc_Expr(tl, DURATION); ERRCHK(tl); ExpectErr(tl, ')'); vcc_NextToken(tl); Fb(tl, 1, ");\n"); tl->indent -= INDENT; }
static void parse_ban(struct vcc *tl) { vcc_NextToken(tl); ExpectErr(tl, '('); vcc_NextToken(tl); Fb(tl, 1, "VRT_ban_string(sp, "); vcc_Expr(tl, STRING); ERRCHK(tl); Fb(tl, 0, ");\n"); ExpectErr(tl, ')'); vcc_NextToken(tl); }
static void parse_synthetic(struct vcc *tl) { vcc_NextToken(tl); ExpectErr(tl, '('); ERRCHK(tl); vcc_NextToken(tl); Fb(tl, 1, "VRT_synth_page(ctx, "); vcc_Expr(tl, STRING_LIST); ERRCHK(tl); Fb(tl, 1, ");\n"); ExpectErr(tl, ')'); vcc_NextToken(tl); ERRCHK(tl); }
static void parse_ban(struct vcc *tl) { vcc_NextToken(tl); ExpectErr(tl, '('); vcc_NextToken(tl); Fb(tl, 1, "VRT_ban_string(ctx, \n"); tl->indent += INDENT; vcc_Expr(tl, STRING); tl->indent -= INDENT; ERRCHK(tl); Fb(tl, 1, ");\n"); ExpectErr(tl, ')'); vcc_NextToken(tl); }
static void parse_return(struct vcc *tl) { int retval = 0; vcc_NextToken(tl); ExpectErr(tl, '('); vcc_NextToken(tl); ExpectErr(tl, ID); /* 'error' gets special handling, to allow optional status/response */ if (vcc_IdIs(tl->t, "synth")) { vcc_NextToken(tl); if (tl->t->tok == ')') { VSB_printf(tl->sb, "Syntax has changed, use:\n" "\treturn(synth(999));\n" "or\n" "\treturn(synth(999, \"Response text\"));\n"); vcc_ErrWhere(tl, tl->t); return; } ExpectErr(tl, '('); vcc_NextToken(tl); Fb(tl, 1, "VRT_error(ctx,\n"); tl->indent += INDENT; vcc_Expr(tl, INT); ERRCHK(tl); Fb(tl, 1, ",\n"); if (tl->t->tok == ',') { vcc_NextToken(tl); vcc_Expr(tl, STRING); ERRCHK(tl); } else { Fb(tl, 1, "(const char*)0\n"); } tl->indent -= INDENT; ExpectErr(tl, ')'); vcc_NextToken(tl); Fb(tl, 1, ");\n"); Fb(tl, 1, "VRT_handling(ctx, VCL_RET_SYNTH);\n"); Fb(tl, 1, "return (1);\n"); vcc_ProcAction(tl->curproc, VCL_RET_SYNTH, tl->t); ExpectErr(tl, ')'); vcc_NextToken(tl); return; } #define VCL_RET_MAC(l, U, B) \ do { \ if (vcc_IdIs(tl->t, #l)) { \ Fb(tl, 1, "VRT_handling(ctx, VCL_RET_" #U ");\n"); \ Fb(tl, 1, "return (1);\n"); \ vcc_ProcAction(tl->curproc, VCL_RET_##U, tl->t);\ retval = 1; \ } \ } while (0); #include "tbl/vcl_returns.h" #undef VCL_RET_MAC if (!retval) { VSB_printf(tl->sb, "Expected return action name.\n"); vcc_ErrWhere(tl, tl->t); ERRCHK(tl); } vcc_NextToken(tl); ExpectErr(tl, ')'); vcc_NextToken(tl); }