TAILQ_HEAD(, storage) store;
};
+enum handling {
+ HND_Error = (1 << 0),
+ HND_Pipe = (1 << 1),
+ HND_Pass = (1 << 2),
+ HND_Lookup = (1 << 3),
+ HND_Fetch = (1 << 4),
+ HND_Insert = (1 << 5),
+ HND_Deliver = (1 << 6),
+};
struct sess {
int fd;
/* HTTP request */
struct http *http;
- enum {
- HND_Unclass,
- HND_Deliver,
- HND_Pass,
- HND_Pipe,
- HND_Lookup,
- HND_Fetch,
- HND_Insert
- } handling;
+ enum handling handling;
char done;
int string_match(const char *, const char *);
int VCL_rewrite(const char *, const char *);
void VCL_error(VCL_FARGS, unsigned, const char *);
-void VCL_pass(VCL_FARGS);
-void VCL_fetch(VCL_FARGS);
-void VCL_insert(VCL_FARGS);
int VCL_switch_config(const char *);
typedef void vcl_init_f(void);
unsigned nref;
unsigned busy;
};
+
+#define VCL_done(sess, hand) \
+ do { \
+ sess->handling = hand; \
+ sess->done = 1; \
+ return; \
+ } while (0)
sbuf_printf(tl->fc, "VCL_no_cache(VCL_PASS_ARGS);\n");
return;
case T_DELIVER:
- I(tl);
- sbuf_printf(tl->fc, "VCL_deliver(VCL_PASS_ARGS);\n");
- I(tl); sbuf_printf(tl->fc, "sess->done = 1;\n");
- I(tl); sbuf_printf(tl->fc, "return;\n");
+ I(tl); sbuf_printf(tl->fc, "VCL_done(sess, HND_Deliver);\n");
+ return;
+ case T_LOOKUP:
+ I(tl); sbuf_printf(tl->fc, "VCL_done(sess, HND_Lookup);\n");
return;
case T_PASS:
- I(tl);
- sbuf_printf(tl->fc, "VCL_pass(VCL_PASS_ARGS);\n");
- I(tl); sbuf_printf(tl->fc, "sess->done = 1;\n");
- I(tl); sbuf_printf(tl->fc, "return;\n");
+ I(tl); sbuf_printf(tl->fc, "VCL_done(sess, HND_Pass);\n");
return;
case T_FETCH:
- I(tl);
- sbuf_printf(tl->fc, "VCL_fetch(VCL_PASS_ARGS);\n");
- I(tl); sbuf_printf(tl->fc, "sess->done = 1;\n");
- I(tl); sbuf_printf(tl->fc, "return;\n");
+ I(tl); sbuf_printf(tl->fc, "VCL_done(sess, HND_Fetch);\n");
return;
case T_INSERT:
- I(tl);
- sbuf_printf(tl->fc, "VCL_insert(VCL_PASS_ARGS);\n");
- I(tl); sbuf_printf(tl->fc, "sess->done = 1;\n");
- I(tl); sbuf_printf(tl->fc, "return;\n");
+ I(tl); sbuf_printf(tl->fc, "VCL_done(sess, HND_Insert);\n");
return;
case T_ERROR:
if (tl->t->tok == CNUM)
NextToken(tl);
} else
sbuf_printf(tl->fc, "(const char *)0);\n");
- I(tl); sbuf_printf(tl->fc, "sess->done = 1;\n");
- I(tl); sbuf_printf(tl->fc, "return;\n");
+ I(tl); sbuf_printf(tl->fc, "VCL_done(sess, HND_Error);\n");
return;
case T_SWITCH_CONFIG:
ExpectErr(tl, ID);
return (T_IF);
}
return (0);
+ case 'l':
+ if (p[0] == 'l' && p[1] == 'o' && p[2] == 'o' &&
+ p[3] == 'k' && p[4] == 'u' && p[5] == 'p'
+ && !isvar(p[6])) {
+ *q = p + 6;
+ return (T_LOOKUP);
+ }
+ return (0);
case 'n':
if (p[0] == 'n' && p[1] == 'o' && p[2] == '_' &&
p[3] == 'n' && p[4] == 'e' && p[5] == 'w' &&
vcl_tnames[T_INCR] = "+=";
vcl_tnames[T_INSERT] = "insert";
vcl_tnames[T_LEQ] = "<=";
+ vcl_tnames[T_LOOKUP] = "lookup";
vcl_tnames[T_MUL] = "*=";
vcl_tnames[T_NEQ] = "!=";
vcl_tnames[T_NO_CACHE] = "no_cache";
fputs("\n", f);
fputs(" TAILQ_HEAD(, storage) store;\n", f);
fputs("};\n", f);
+ fputs("enum handling {\n", f);
+ fputs(" HND_Error = (1 << 0),\n", f);
+ fputs(" HND_Pipe = (1 << 1),\n", f);
+ fputs(" HND_Pass = (1 << 2),\n", f);
+ fputs(" HND_Lookup = (1 << 3),\n", f);
+ fputs(" HND_Fetch = (1 << 4),\n", f);
+ fputs(" HND_Insert = (1 << 5),\n", f);
+ fputs(" HND_Deliver = (1 << 6),\n", f);
+ fputs("};\n", f);
fputs("\n", f);
fputs("struct sess {\n", f);
fputs(" int fd;\n", f);
fputs(" /* HTTP request */\n", f);
fputs(" struct http *http;\n", f);
fputs("\n", f);
- fputs(" enum {\n", f);
- fputs(" HND_Unclass,\n", f);
- fputs(" HND_Deliver,\n", f);
- fputs(" HND_Pass,\n", f);
- fputs(" HND_Pipe,\n", f);
- fputs(" HND_Lookup,\n", f);
- fputs(" HND_Fetch,\n", f);
- fputs(" HND_Insert\n", f);
- fputs(" } handling;\n", f);
+ fputs(" enum handling handling;\n", f);
fputs("\n", f);
fputs(" char done;\n", f);
fputs("\n", f);
fputs("int string_match(const char *, const char *);\n", f);
fputs("int VCL_rewrite(const char *, const char *);\n", f);
fputs("void VCL_error(VCL_FARGS, unsigned, const char *);\n", f);
- fputs("void VCL_pass(VCL_FARGS);\n", f);
- fputs("void VCL_fetch(VCL_FARGS);\n", f);
- fputs("void VCL_insert(VCL_FARGS);\n", f);
fputs("int VCL_switch_config(const char *);\n", f);
fputs("\n", f);
fputs("typedef void vcl_init_f(void);\n", f);
fputs(" unsigned nref;\n", f);
fputs(" unsigned busy;\n", f);
fputs("};\n", f);
+ fputs("\n", f);
+ fputs("#define VCL_done(sess, hand) \\\n", f);
+ fputs(" do { \\\n", f);
+ fputs(" sess->handling = hand; \\\n", f);
+ fputs(" sess->done = 1; \\\n", f);
+ fputs(" return; \\\n", f);
+ fputs(" } while (0)\n", f);
}