source: lib/libvcl/vcc_compile.h @ 1cc48fa

Revision 1cc48fa, 6.6 KB checked in by Dag Erling Smørgrav <des@…>, 5 years ago (diff)

Update Linpro copyright (about 3 months late). Someone should
probably s/Linpro/Redpill Linpro/ at some point.

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

  • Property mode set to 100644
Line 
1/*-
2 * Copyright (c) 2006 Verdens Gang AS
3 * Copyright (c) 2006-2009 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 "vqueue.h"
33
34#include "vcl.h"
35
36#define INDENT          2
37
38struct acl_e;
39
40struct membit {
41        VTAILQ_ENTRY(membit)    list;
42        void                    *ptr;
43};
44
45struct source {
46        VTAILQ_ENTRY(source)    list;
47        char                    *name;
48        const char              *b;
49        const char              *e;
50        unsigned                idx;
51        char                    *freeit;
52};
53
54struct token {
55        unsigned                tok;
56        const char              *b;
57        const char              *e;
58        struct source           *src;
59        VTAILQ_ENTRY(token)     list;
60        unsigned                cnt;
61        char                    *dec;
62};
63
64VTAILQ_HEAD(tokenhead, token);
65
66struct tokenlist {
67        struct tokenhead        tokens;
68        VTAILQ_HEAD(, source)   sources;
69        VTAILQ_HEAD(, membit)   membits;
70        VTAILQ_HEAD(, host)     hosts;
71        unsigned                nsources;
72        struct source           *src;
73        struct token            *t;
74        int                     indent;
75        int                     hindent;
76        int                     iindent;
77        int                     findent;
78        unsigned                cnt;
79        struct vsb              *fc, *fh, *fi, *ff, *fb;
80        struct vsb              *fm[VCL_MET_MAX];
81        VTAILQ_HEAD(, ref)      refs;
82        struct vsb              *sb;
83        int                     err;
84        int                     nbackend_host;
85        int                     ndirector;
86        VTAILQ_HEAD(, proc)     procs;
87        struct proc             *curproc;
88        struct proc             *mprocs[VCL_MET_MAX];
89
90        VTAILQ_HEAD(, acl_e)    acl;
91
92        unsigned                recnt;
93        unsigned                nhashcount;
94        unsigned                nsockaddr;
95};
96
97enum var_type {
98        BACKEND,
99        BOOL,
100        INT,
101        FLOAT,
102        SIZE,
103        TIME,
104        RTIME,
105        STRING,
106        IP,
107        HASH,
108        HEADER
109};
110
111enum var_access {
112        V_RO,
113        V_RW,
114        V_WO
115};
116
117enum ref_type {
118        R_FUNC,
119        R_ACL,
120        R_BACKEND
121};
122
123struct ref {
124        enum ref_type           type;
125        struct token            *name;
126        unsigned                defcnt;
127        unsigned                refcnt;
128        VTAILQ_ENTRY(ref)       list;
129};
130
131struct var {
132        const char              *name;
133        enum var_type           fmt;
134        unsigned                len;
135        const char              *rname;
136        const char              *lname;
137        enum var_access         access;
138        const char              *hdr;
139        unsigned                methods;
140};
141
142struct method {
143        const char              *name;
144        unsigned                ret_bitmap;
145        unsigned                bitval;
146};
147
148/*--------------------------------------------------------------------*/
149
150/* vcc_acl.c */
151
152void vcc_Acl(struct tokenlist *tl);
153void vcc_Cond_Ip(const struct var *vp, struct tokenlist *tl);
154
155/* vcc_action.c */
156void vcc_ParseAction(struct tokenlist *tl);
157
158/* vcc_backend.c */
159struct fld_spec;
160typedef void parsedirector_f(struct tokenlist *tl,
161    const struct token *t_policy, const struct token *t_dir);
162
163void vcc_ParseDirector(struct tokenlist *tl);
164void vcc_ParseBackendHost(struct tokenlist *tl, int *nbr,
165    const struct token *name, const struct token *qual, int serial);
166struct fld_spec * vcc_FldSpec(struct tokenlist *tl, const char *first, ...);
167void vcc_ResetFldSpec(struct fld_spec *f);
168void vcc_IsField(struct tokenlist *tl, struct token **t, struct fld_spec *fs);
169void vcc_FieldsOk(struct tokenlist *tl, const struct fld_spec *fs);
170
171/* vcc_compile.c */
172extern struct method method_tab[];
173void Fh(const struct tokenlist *tl, int indent, const char *fmt, ...);
174void Fc(const struct tokenlist *tl, int indent, const char *fmt, ...);
175void Fb(const struct tokenlist *tl, int indent, const char *fmt, ...);
176void Fi(const struct tokenlist *tl, int indent, const char *fmt, ...);
177void Ff(const struct tokenlist *tl, int indent, const char *fmt, ...);
178void EncToken(struct vsb *sb, const struct token *t);
179int IsMethod(const struct token *t);
180void TlFree(struct tokenlist *tl, void *p);
181void *TlAlloc(struct tokenlist *tl, unsigned len);
182
183/* vcc_dir_random.c */
184parsedirector_f vcc_ParseRandomDirector;
185
186/* vcc_dir_round_robin.c */
187parsedirector_f vcc_ParseRoundRobinDirector;
188
189/* vcc_obj.c */
190extern struct var vcc_vars[];
191
192/* vcc_parse.c */
193void vcc_Parse(struct tokenlist *tl);
194void vcc_RTimeVal(struct tokenlist *tl);
195void vcc_TimeVal(struct tokenlist *tl);
196void vcc_SizeVal(struct tokenlist *tl);
197unsigned vcc_UintVal(struct tokenlist *tl);
198double vcc_DoubleVal(struct tokenlist *tl);
199
200/* vcc_string.c */
201char *vcc_regexp(struct tokenlist *tl, int sub);
202int vcc_StringVal(struct tokenlist *tl);
203void vcc_ExpectedStringval(struct tokenlist *tl);
204
205/* vcc_token.c */
206void vcc_Coord(const struct tokenlist *tl, struct vsb *vsb,
207    const struct token *t);
208void vcc_ErrToken(const struct tokenlist *tl, const struct token *t);
209void vcc_ErrWhere(struct tokenlist *tl, const struct token *t);
210void vcc__Expect(struct tokenlist *tl, unsigned tok, int line);
211int vcc_Teq(const struct token *t1, const struct token *t2);
212int vcc_IdIs(const struct token *t, const char *p);
213void vcc_ExpectCid(struct tokenlist *tl);
214void vcc_Lexer(struct tokenlist *tl, struct source *sp);
215void vcc_NextToken(struct tokenlist *tl);
216void vcc__ErrInternal(struct tokenlist *tl, const char *func,
217    unsigned line);
218void vcc_AddToken(struct tokenlist *tl, unsigned tok, const char *b,
219    const char *e);
220
221/* vcc_var.c */
222struct var *vcc_FindVar(struct tokenlist *tl, const struct token *t,
223    struct var *vl);
224
225/* vcc_xref.c */
226void vcc_AddDef(struct tokenlist *tl, struct token *t, enum ref_type type);
227void vcc_AddRef(struct tokenlist *tl, struct token *t, enum ref_type type);
228int vcc_CheckReferences(struct tokenlist *tl);
229
230void vcc_AddCall(struct tokenlist *tl, struct token *t);
231struct proc *vcc_AddProc(struct tokenlist *tl, struct token *t);
232void vcc_ProcAction(struct proc *p, unsigned action, struct token *t);
233int vcc_CheckAction(struct tokenlist *tl);
234void vcc_AddUses(struct tokenlist *tl, struct var *v);
235int vcc_CheckUses(struct tokenlist *tl);
236
237#define ERRCHK(tl)      do { if ((tl)->err) return; } while (0)
238#define ErrInternal(tl) vcc__ErrInternal(tl, __func__, __LINE__)
239#define Expect(a, b) vcc__Expect(a, b, __LINE__)
240#define ExpectErr(a, b) do { vcc__Expect(a, b, __LINE__); ERRCHK(a);} while (0)
241
Note: See TracBrowser for help on using the repository browser.