source: lib/libvcl/vcc_compile.h @ 673080

Revision 673080, 5.5 KB checked in by Poul-Henning Kamp <phk@…>, 7 years ago (diff)

Use an enum instead of magic '1' and '2' values to VRT_GetHdr.

Remove bogus "has_string" variable marking, it can be derived from the type.

Make obj.* variables valid in vcl_timeout() and vcl_discard()

git-svn-id:  http://www.varnish-cache.org/svn/trunk/varnish-cache@1554 d4fa192b-c00b-0410-8231-f00ffab90ce4

  • Property mode set to 100644
Line 
1/*-
2 * Copyright (c) 2006 Verdens Gang AS
3 * Copyright (c) 2006-2007 Linpro AS
4 * All rights reserved.
5 *
6 * Author: Poul-Henning Kamp <phk@phk.freebsd.dk>
7 *
8 * Redistribution and use in source and binary forms, with or without
9 * modification, are permitted provided that the following conditions
10 * are met:
11 * 1. Redistributions of source code must retain the above copyright
12 *    notice, this list of conditions and the following disclaimer.
13 * 2. Redistributions in binary form must reproduce the above copyright
14 *    notice, this list of conditions and the following disclaimer in the
15 *    documentation and/or other materials provided with the distribution.
16 *
17 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
18 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20 * ARE DISCLAIMED.  IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE
21 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
23 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
24 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
26 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
27 * SUCH DAMAGE.
28 *
29 * $Id$
30 */
31
32#include "queue.h"
33#include "vcl_returns.h"
34
35#define INDENT          2
36
37struct membit {
38        TAILQ_ENTRY(membit)     list;
39        void                    *ptr;
40};
41
42struct source {
43        TAILQ_ENTRY(source)     list;
44        char                    *name;
45        const char              *b;
46        const char              *e;
47        unsigned                idx;
48};
49
50struct token {
51        unsigned                tok;
52        const char              *b;
53        const char              *e;
54        struct source           *src;
55        TAILQ_ENTRY(token)      list;
56        unsigned                cnt;
57        char                    *dec;
58};
59
60TAILQ_HEAD(tokenhead, token);
61
62struct tokenlist {
63        struct tokenhead        tokens;
64        TAILQ_HEAD(, source)    sources;
65        TAILQ_HEAD(, membit)    membits;
66        unsigned                nsources;
67        struct source           *src;
68        struct token            *t;
69        int                     indent;
70        int                     hindent;
71        int                     iindent;
72        int                     findent;
73        unsigned                cnt;
74        struct vsb              *fc, *fh, *fi, *ff, *fb;
75        struct vsb              *fm[N_METHODS];
76        TAILQ_HEAD(, ref)       refs;
77        struct vsb              *sb;
78        int                     err;
79        int                     nbackend;
80        TAILQ_HEAD(, proc)      procs;
81        struct proc             *curproc;
82        struct proc             *mprocs[N_METHODS];
83
84        unsigned                recnt;
85};
86
87enum var_type {
88        BACKEND,
89        BOOL,
90        INT,
91        FLOAT,
92        SIZE,
93        RATE,
94        TIME,
95        STRING,
96        IP,
97        HOSTNAME,
98        PORTNAME,
99        HASH,
100        HEADER
101};
102
103enum ref_type {
104        R_FUNC,
105        R_ACL,
106        R_BACKEND
107};
108
109struct ref {
110        enum ref_type           type;
111        struct token            *name;
112        unsigned                defcnt;
113        unsigned                refcnt;
114        TAILQ_ENTRY(ref)        list;
115};
116
117struct var {
118        const char              *name;
119        enum var_type           fmt;
120        unsigned                len;
121        const char              *rname;
122        const char              *lname;
123        unsigned                methods;
124};
125
126struct method {
127        const char              *name;
128        unsigned                returns;
129        unsigned                bitval;
130};
131
132/*--------------------------------------------------------------------*/
133
134/* vcc_acl.c */
135
136void vcc_Acl(struct tokenlist *tl);
137void vcc_Cond_Ip(struct var *vp, struct tokenlist *tl);
138
139/* vcc_action.c */
140void vcc_ParseAction(struct tokenlist *tl);
141
142/* vcc_backend.c */
143void vcc_ParseBackend(struct tokenlist *tl);
144
145/* vcc_compile.c */
146extern struct method method_tab[];
147void Fh(const struct tokenlist *tl, int indent, const char *fmt, ...);
148void Fc(const struct tokenlist *tl, int indent, const char *fmt, ...);
149void Fb(const struct tokenlist *tl, int indent, const char *fmt, ...);
150void Fi(const struct tokenlist *tl, int indent, const char *fmt, ...);
151void Ff(const struct tokenlist *tl, int indent, const char *fmt, ...);
152void EncToken(struct vsb *sb, const struct token *t);
153int IsMethod(const struct token *t);
154void *TlAlloc(struct tokenlist *tl, unsigned len);
155
156/* vcc_obj.c */
157extern struct var vcc_be_vars[];
158extern struct var vcc_vars[];
159
160/* vcc_parse.c */
161void vcc_Parse(struct tokenlist *tl);
162void vcc_RateVal(struct tokenlist *tl);
163void vcc_TimeVal(struct tokenlist *tl);
164void vcc_SizeVal(struct tokenlist *tl);
165unsigned vcc_UintVal(struct tokenlist *tl);
166double vcc_DoubleVal(struct tokenlist *tl);
167
168/* vcc_token.c */
169void vcc_ErrToken(const struct tokenlist *tl, const struct token *t);
170void vcc_ErrWhere(struct tokenlist *tl, const struct token *t);
171void vcc__Expect(struct tokenlist *tl, unsigned tok, int line);
172int vcc_Teq(const struct token *t1, const struct token *t2);
173int vcc_IdIs(const struct token *t, const char *p);
174void vcc_Lexer(struct tokenlist *tl, struct source *sp);
175void vcc_NextToken(struct tokenlist *tl);
176void vcc__ErrInternal(struct tokenlist *tl, const char *func, unsigned line);
177void vcc_AddToken(struct tokenlist *tl, unsigned tok, const char *b, const char *e);
178void vcc_FreeToken(struct token *t);
179
180/* vcc_var.c */
181void vcc_StringVal(struct tokenlist *tl);
182struct var *vcc_FindVar(struct tokenlist *tl, const struct token *t, struct var *vl);
183
184/* vcc_xref.c */
185void vcc_AddDef(struct tokenlist *tl, struct token *t, enum ref_type type);
186void vcc_AddRef(struct tokenlist *tl, struct token *t, enum ref_type type);
187int vcc_CheckReferences(struct tokenlist *tl);
188
189void vcc_AddCall(struct tokenlist *tl, struct token *t);
190struct proc *vcc_AddProc(struct tokenlist *tl, struct token *t);
191void vcc_ProcAction(struct proc *p, unsigned action, struct token *t);
192int vcc_CheckAction(struct tokenlist *tl);
193void vcc_AddUses(struct tokenlist *tl, struct var *v);
194int vcc_CheckUses(struct tokenlist *tl);
195
196#define ERRCHK(tl)      do { if ((tl)->err) return; } while (0)
197#define ErrInternal(tl) vcc__ErrInternal(tl, __func__, __LINE__)
198#define Expect(a, b) vcc__Expect(a, b, __LINE__)
199#define ExpectErr(a, b) do { vcc__Expect(a, b, __LINE__); ERRCHK(a);} while (0)
200
Note: See TracBrowser for help on using the repository browser.