source: lib/libvcl/vcc_gen_fixed_token.tcl @ 84baed

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

Add vcl_deliver() method where touch-up's to the returned reply can
be performed.

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

  • Property mode set to 100755
Line 
1#!/usr/local/bin/tclsh8.4
2#-
3# Copyright (c) 2006 Verdens Gang AS
4# Copyright (c) 2006-2007 Linpro AS
5# All rights reserved.
6#
7# Author: Poul-Henning Kamp <phk@phk.freebsd.dk>
8#
9# Redistribution and use in source and binary forms, with or without
10# modification, are permitted provided that the following conditions
11# are met:
12# 1. Redistributions of source code must retain the above copyright
13#    notice, this list of conditions and the following disclaimer.
14# 2. Redistributions in binary form must reproduce the above copyright
15#    notice, this list of conditions and the following disclaimer in the
16#    documentation and/or other materials provided with the distribution.
17#
18# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
19# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
20# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
21# ARE DISCLAIMED.  IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE
22# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
23# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
24# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
25# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
26# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
27# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
28# SUCH DAMAGE.
29#
30# Generate various .c and .h files for the VCL compiler and the interfaces
31# for it.
32
33# These are the metods which can be called in the VCL program.
34# Second element is list of valid return actions.
35#
36set methods {
37        {recv           {error pass pipe lookup}}
38        {pipe           {error pipe}}
39        {pass           {error pass}}
40        {hash           {hash}}
41        {miss           {error pass fetch}}
42        {hit            {error pass deliver}}
43        {fetch          {error pass insert}}
44        {deliver        {error deliver}}
45        {timeout        {fetch discard}}
46        {discard        {discard keep}}
47}
48
49# These are the return actions
50#
51set returns {
52        error
53        lookup
54        hash
55        pipe
56        pass
57        fetch
58        insert
59        deliver
60        discard
61        keep
62}
63
64# Language keywords
65#
66set keywords {
67        include 
68
69        if else elseif elsif
70
71        sub
72
73        acl
74
75        backend
76}
77
78# Non-word tokens
79#
80set magic {
81        {"++"   INC}
82        {"--"   DEC}
83        {"&&"   CAND}
84        {"||"   COR}
85        {"<="   LEQ}
86        {"=="   EQ}
87        {"!="   NEQ}
88        {">="   GEQ}
89        {">>"   SHR}
90        {"<<"   SHL}
91        {"+="   INCR}
92        {"-="   DECR}
93        {"*="   MUL}
94        {"/="   DIV}
95}
96
97# Single char tokens
98#
99set char {{}()*+-/%><=;!&.|~,}
100
101# Other token identifiers
102#
103set extras {ID VAR CNUM CSTR EOI CSRC}
104
105#----------------------------------------------------------------------
106# Boilerplate warning for all generated files.
107
108proc warns {fd} {
109
110        puts $fd "/*"
111        puts $fd { * $Id$}
112        puts $fd " *"
113        puts $fd " * NB:  This file is machine generated, DO NOT EDIT!"
114        puts $fd " *"
115        puts $fd " * Edit vcc_gen_fixed_token.tcl instead"
116        puts $fd " */"
117        puts $fd ""
118}
119
120#----------------------------------------------------------------------
121# Build the vcl.h #include file
122
123set fo [open ../../include/vcl.h w]
124warns $fo
125puts $fo {struct sess;
126
127typedef void vcl_init_f(void);
128typedef void vcl_fini_f(void);
129typedef int vcl_func_f(struct sess *sp);
130}
131puts $fo "struct VCL_conf {"
132puts $fo {      unsigned        magic;
133#define VCL_CONF_MAGIC  0x7406c509      /* from /dev/random */
134
135        struct backend  **backend;
136        unsigned        nbackend;
137        struct vrt_ref  *ref;
138        unsigned        nref;
139        unsigned        busy;
140
141        unsigned        nsrc;
142        const char      **srcname;
143        const char      **srcbody;
144
145        void            *priv;
146
147        vcl_init_f      *init_func;
148        vcl_fini_f      *fini_func;
149}
150foreach m $methods {
151        puts $fo "\tvcl_func_f\t*[lindex $m 0]_func;"
152}
153puts $fo "};"
154
155close $fo
156
157#----------------------------------------------------------------------
158# Build the vcl_returns.h #include file
159
160set for [open "../../include/vcl_returns.h" w]
161warns $for
162puts $for "#ifdef VCL_RET_MAC"
163set i 0
164foreach k $returns {
165        if {$k == "error"} {
166                puts $for "#ifdef VCL_RET_MAC_E"
167                puts $for "VCL_RET_MAC_E($k, [string toupper $k], (1 << $i), $i)"
168                puts $for "#endif"
169        } else {
170                puts $for "VCL_RET_MAC($k, [string toupper $k], (1 << $i), $i)"
171        }
172        incr i
173}
174puts $for "#else"
175set i 0
176foreach k $returns {
177        puts $for "#define VCL_RET_[string toupper $k]  (1 << $i)"
178        incr i
179}
180puts $for "#define VCL_RET_MAX $i"
181puts $for "#endif"
182puts $for ""
183puts $for "#ifdef VCL_MET_MAC"
184set u 0
185foreach m $methods {
186        puts -nonewline $for "VCL_MET_MAC([lindex $m 0]"
187        puts -nonewline $for ",[string toupper [lindex $m 0]]"
188        set l [lindex $m 1]
189        puts -nonewline $for ",(VCL_RET_[string toupper [lindex $l 0]]"
190        foreach r [lrange $l 1 end] {
191                puts -nonewline $for "|VCL_RET_[string toupper $r]"
192        }
193        puts -nonewline $for ")"
194        puts $for ")"
195        incr u
196}
197puts $for "#else"
198set u 0
199foreach m $methods {
200        puts $for "#define VCL_MET_[string toupper [lindex $m 0]]\t(1 << $u)"
201        incr u
202}
203puts $for "#endif"
204puts $for "#define N_METHODS $u"
205close $for
206
207#----------------------------------------------------------------------
208# Build the compiler token table and recognizers
209
210set fo [open "vcc_fixed_token.c" w]
211warns $fo
212
213set foh [open "vcc_token_defs.h" w]
214warns $foh
215
216puts $fo "#include <stdio.h>"
217puts $fo "#include <ctype.h>"
218puts $fo "#include \"vcc_priv.h\""
219puts $fo "#include \"vsb.h\""
220
221set tn 128
222puts $foh "#define LOW_TOKEN $tn"
223
224
225proc add_token {tok str alpha} {
226        global tokens tn fixed foh
227
228        lappend tokens [list $tok $str]
229        puts $foh "#define $tok $tn"
230        incr tn
231        lappend fixed [list $str $tok $alpha]
232}
233
234proc mk_token {tok str alpha} {
235        set tok T_[string toupper $tok]
236        add_token $tok $str $alpha
237}
238
239foreach k $keywords { mk_token $k $k 1 }
240foreach k $magic { mk_token [lindex $k 1] [lindex $k 0] 0 }
241foreach k $extras {
242        set t [string toupper $k]
243        lappend tokens [list $t $t]
244        puts $foh "#define [string toupper $k] $tn"
245        incr tn
246}
247for {set i 0} {$i < [string length $char]} {incr i} {
248        set t [string index $char $i]
249        lappend token2 [list '$t' T$t]
250        lappend fixed [list "$t" '$t' 0]
251}
252
253set tokens [lsort $tokens]
254set token2 [lsort $token2]
255
256# We want to output in ascii order: create sorted first char list
257foreach t $fixed {
258        set xx([string index [lindex $t 0] 0]) 1
259}
260set seq [lsort [array names xx]]
261
262set ll 0
263
264puts $fo {
265unsigned
266vcl_fixed_token(const char *p, const char **q)}
267puts $fo "{"
268puts $fo ""
269puts $fo "      switch (p\[0\]) {"
270
271foreach ch "$seq" {
272        # Now find all tokens starting with ch
273        set l ""
274        foreach t $fixed {
275                if {[string index [lindex $t 0] 0] == $ch} {
276                        lappend l $t
277                }
278        }
279        # And do then in reverse order to match longest first
280        set l [lsort -index 0 -decreasing $l]
281        scan "$ch" "%c" cx
282        if {$cx != $ll} {
283                if {$ll} {
284                        puts $fo "              return (0);"
285                }
286       
287                puts $fo "      case '$ch':"
288                set ll $cx
289        }
290        foreach tt $l {
291                set k [lindex $tt 0]
292                puts -nonewline $fo "           if ("
293                for {set i 0} {$i < [string length $k]} {incr i} {
294                        if {$i > 0} {
295                                puts -nonewline $fo " && "
296                                if {![expr $i % 3]} {
297                                        puts -nonewline $fo "\n\t\t    "
298                                }
299                        }
300                        puts -nonewline $fo "p\[$i\] == '[string index $k $i]'"
301                }
302                if {[lindex $tt 2]} {
303                        if {![expr $i % 3]} {
304                                puts -nonewline $fo "\n\t\t    "
305                        }
306                        puts -nonewline $fo " && !isvar(p\[$i\])"
307                }
308                puts $fo ") {"
309                puts $fo "                      *q = p + [string length $k];"
310                puts $fo "                      return ([lindex $tt 1]);"
311                puts $fo "              }"
312        }
313} 
314puts $fo "              return (0);"
315puts $fo "      default:"
316puts $fo "              return (0);"
317puts $fo "      }"
318puts $fo "}"
319
320puts $fo ""
321puts $fo "const char *vcl_tnames\[256\];\n"
322puts $fo "void"
323puts $fo "vcl_init_tnames(void)"
324puts $fo "{"
325foreach i $token2 {
326        puts $fo "\tvcl_tnames\[[lindex $i 0]\] = \"[lindex $i 0]\";"
327}
328foreach i $tokens {
329        puts $fo "\tvcl_tnames\[[lindex $i 0]\] = \"[lindex $i 1]\";"
330}
331puts $fo "}"
332
333#----------------------------------------------------------------------
334# Create the C-code which emits the boilerplate definitions for the
335# generated C code output
336
337proc copy_include {n} {
338        global fo
339
340        set fi [open $n]
341        while {[gets $fi a] >= 0} {
342                regsub -all {\\} $a {\\\\} a
343                puts $fo "\tvsb_cat(sb, \"$a\\n\");"
344        }
345        close $fi
346}
347
348puts $fo ""
349puts $fo "void"
350puts $fo "vcl_output_lang_h(struct vsb *sb)"
351puts $fo "{"
352set i 0
353foreach k $returns {
354        puts $fo "\tvsb_cat(sb, \"#define VCL_RET_[string toupper $k]  (1 << $i)\\n\");"
355        incr i
356}
357
358copy_include ../../include/vcl.h
359copy_include ../../include/vrt.h
360copy_include ../../include/vrt_obj.h
361
362puts $fo "}"
363
364close $foh
365close $fo
Note: See TracBrowser for help on using the repository browser.