source: lib/libvcl/vcc_compile.h @ 177be9

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

Move variable related stuff to vcc_var.c

git-svn-id:  http://www.varnish-cache.org/svn/trunk/varnish-cache@1553 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                has_string;
124        unsigned                methods;
125};
126
127struct method {
128        const char              *name;
129        unsigned                returns;
130        unsigned                bitval;
131};
132
133/*--------------------------------------------------------------------*/
134
135/* vcc_acl.c */
136
137void vcc_Acl(struct tokenlist *tl);
138void vcc_Cond_Ip(struct var *vp, struct tokenlist *tl);
139
140/* vcc_action.c */
141void vcc_ParseAction(struct tokenlist *tl);
142
143/* vcc_backend.c */
144void vcc_ParseBackend(struct tokenlist *tl);
145
146/* vcc_compile.c */
147extern struct method method_tab[];
148void Fh(const struct tokenlist *tl, int indent, const char *fmt, ...);
149void Fc(const struct tokenlist *tl, int indent, const char *fmt, ...);
150void Fb(const struct tokenlist *tl, int indent, const char *fmt, ...);
151void Fi(const struct tokenlist *tl, int indent, const char *fmt, ...);
152void Ff(const struct tokenlist *tl, int indent, const char *fmt, ...);
153void EncToken(struct vsb *sb, const struct token *t);
154int IsMethod(const struct token *t);
155void *TlAlloc(struct tokenlist *tl, unsigned len);
156
157/* vcc_obj.c */
158extern struct var vcc_be_vars[];
159extern struct var vcc_vars[];
160
161/* vcc_parse.c */
162void vcc_Parse(struct tokenlist *tl);
163void vcc_RateVal(struct tokenlist *tl);
164void vcc_TimeVal(struct tokenlist *tl);
165void vcc_SizeVal(struct tokenlist *tl);
166unsigned vcc_UintVal(struct tokenlist *tl);
167double vcc_DoubleVal(struct tokenlist *tl);
168
169/* vcc_token.c */
170void vcc_ErrToken(const struct tokenlist *tl, const struct token *t);
171void vcc_ErrWhere(struct tokenlist *tl, const struct token *t);
172void vcc__Expect(struct tokenlist *tl, unsigned tok, int line);
173int vcc_Teq(const struct token *t1, const struct token *t2);
174int vcc_IdIs(const struct token *t, const char *p);
175void vcc_Lexer(struct tokenlist *tl, struct source *sp);
176void vcc_NextToken(struct tokenlist *tl);
177void vcc__ErrInternal(struct tokenlist *tl, const char *func, unsigned line);
178void vcc_AddToken(struct tokenlist *tl, unsigned tok, const char *b, const char *e);
179void vcc_FreeToken(struct token *t);
180
181/* vcc_var.c */
182void vcc_StringVal(struct tokenlist *tl);
183struct var *vcc_FindVar(struct tokenlist *tl, const struct token *t, struct var *vl);
184
185/* vcc_xref.c */
186void vcc_AddDef(struct tokenlist *tl, struct token *t, enum ref_type type);
187void vcc_AddRef(struct tokenlist *tl, struct token *t, enum ref_type type);
188int vcc_CheckReferences(struct tokenlist *tl);
189
190void vcc_AddCall(struct tokenlist *tl, struct token *t);
191struct proc *vcc_AddProc(struct tokenlist *tl, struct token *t);
192void vcc_ProcAction(struct proc *p, unsigned action, struct token *t);
193int vcc_CheckAction(struct tokenlist *tl);
194void vcc_AddUses(struct tokenlist *tl, struct var *v);
195int vcc_CheckUses(struct tokenlist *tl);
196
197#define ERRCHK(tl)      do { if ((tl)->err) return; } while (0)
198#define ErrInternal(tl) vcc__ErrInternal(tl, __func__, __LINE__)
199#define Expect(a, b) vcc__Expect(a, b, __LINE__)
200#define ExpectErr(a, b) do { vcc__Expect(a, b, __LINE__); ERRCHK(a);} while (0)
201
Note: See TracBrowser for help on using the repository browser.