r4734 - trunk/varnish-cache/lib/libvcl
phk at varnish-cache.org
phk at varnish-cache.org
Tue Apr 27 17:18:20 CEST 2010
Author: phk
Date: 2010-04-27 17:18:19 +0200 (Tue, 27 Apr 2010)
New Revision: 4734
Removed:
trunk/varnish-cache/lib/libvcl/vcc_gen_fixed_token.tcl
Log:
Retire the tcl version of the VCC generator script
Deleted: trunk/varnish-cache/lib/libvcl/vcc_gen_fixed_token.tcl
===================================================================
--- trunk/varnish-cache/lib/libvcl/vcc_gen_fixed_token.tcl 2010-04-27 15:16:03 UTC (rev 4733)
+++ trunk/varnish-cache/lib/libvcl/vcc_gen_fixed_token.tcl 2010-04-27 15:18:19 UTC (rev 4734)
@@ -1,774 +0,0 @@
-#!/usr/local/bin/tclsh8.4
-#-
-# Copyright (c) 2006 Verdens Gang AS
-# Copyright (c) 2006-2009 Linpro AS
-# All rights reserved.
-#
-# Author: Poul-Henning Kamp <phk at phk.freebsd.dk>
-#
-# Redistribution and use in source and binary forms, with or without
-# modification, are permitted provided that the following conditions
-# are met:
-# 1. Redistributions of source code must retain the above copyright
-# notice, this list of conditions and the following disclaimer.
-# 2. Redistributions in binary form must reproduce the above copyright
-# notice, this list of conditions and the following disclaimer in the
-# documentation and/or other materials provided with the distribution.
-#
-# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
-# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-# ARE DISCLAIMED. IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE
-# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-# SUCH DAMAGE.
-#
-# Generate various .c and .h files for the VCL compiler and the interfaces
-# for it.
-
-# These are the metods which can be called in the VCL program.
-# Second element is list of valid return actions.
-#
-set methods {
- {recv {error pass pipe lookup}}
- {pipe {error pipe}}
- {pass {error restart pass}}
- {hash {hash}}
- {miss {error restart pass fetch}}
- {hit {error restart pass deliver}}
- {fetch {error restart pass deliver}}
- {deliver {restart deliver}}
- {error {restart deliver}}
-}
-
-# Language keywords
-#
-set keywords {
- include
-
- if else elseif elsif
-}
-
-# Non-word tokens
-#
-set magic {
- {"++" INC}
- {"--" DEC}
- {"&&" CAND}
- {"||" COR}
- {"<=" LEQ}
- {"==" EQ}
- {"!=" NEQ}
- {">=" GEQ}
- {">>" SHR}
- {"<<" SHL}
- {"+=" INCR}
- {"-=" DECR}
- {"*=" MUL}
- {"/=" DIV}
- {"!~" NOMATCH}
-}
-
-# Single char tokens
-#
-set char {{}()*+-/%><=;!&.|~,}
-
-# Other token identifiers
-#
-set extras {ID VAR CNUM CSTR EOI CSRC}
-
-#----------------------------------------------------------------------
-# Variables available in sessions
-# Comments are stripped from #...\n
-set spobj {
-
- # Connection related parameters
- { client.ip IP
- RO
- all
- "const struct sess *"
- }
- { server.ip IP
- RO
- all
- "struct sess *"
- }
- { server.hostname STRING
- RO
- all
- "struct sess *"
- }
- { server.identity STRING
- RO
- all
- "struct sess *"
- }
- { server.port INT
- RO
- all
- "struct sess *"
- }
- # Request paramters
- { req.request STRING
- RW
- all
- "const struct sess *"
- }
- { req.url STRING
- RW
- all
- "const struct sess *"
- }
- { req.proto STRING
- RW
- all
- "const struct sess *"
- }
- { req.http. HDR_REQ
- RW
- all
- "const struct sess *"
- }
-
- # Possibly misnamed, not really part of the request
- { req.hash HASH
- WO
- { hash error }
- "struct sess *"
- }
- { req.backend BACKEND
- RW
- all
- "struct sess *"
- }
- { req.restarts INT
- RO
- all
- "const struct sess *"
- }
- { req.grace RTIME
- RW
- all
- "struct sess *"
- }
-
- { req.xid STRING
- RO
- all
- "struct sess *"
- }
-
- { req.esi BOOL
- RW
- {recv fetch deliver error }
- "struct sess *"
- }
-
- { req.backend.healthy BOOL
- RO
- all
- "const struct sess *"
- }
-
- #######################################################################
- # Request sent to backend
- { bereq.request STRING
- RW
- { pipe pass miss fetch }
- "const struct sess *"
- }
- { bereq.url STRING
- RW
- { pipe pass miss fetch }
- "const struct sess *"
- }
- { bereq.proto STRING
- RW
- { pipe pass miss fetch }
- "const struct sess *"
- }
- { bereq.http. HDR_BEREQ
- RW
- { pipe pass miss fetch }
- "const struct sess *"
- }
- { bereq.connect_timeout RTIME
- RW
- { pass miss }
- "struct sess *"
- }
- { bereq.first_byte_timeout RTIME
- RW
- { pass miss }
- "struct sess *"
- }
- { bereq.between_bytes_timeout RTIME
- RW
- { pass miss }
- "struct sess *"
- }
-
- #######################################################################
- # Response from the backend
- { beresp.proto STRING
- RW
- { fetch }
- "const struct sess *"
- }
- { beresp.saintmode RTIME
- WO
- { fetch }
- "const struct sess *"
- }
- { beresp.status INT
- RW
- { fetch }
- "const struct sess *"
- }
- { beresp.response STRING
- RW
- { fetch }
- "const struct sess *"
- }
- { beresp.http. HDR_BERESP
- RW
- { fetch }
- "const struct sess *"
- }
- { beresp.cacheable BOOL
- RW
- { fetch }
- "const struct sess *"
- }
- { beresp.ttl RTIME
- RW
- { fetch }
- "const struct sess *"
- }
- { beresp.grace RTIME
- RW
- { fetch }
- "const struct sess *"
- }
-
- #######################################################################
- # The (possibly) cached object
- { obj.proto STRING
- RW
- { hit error }
- "const struct sess *"
- }
- { obj.status INT
- RW
- { error }
- "const struct sess *"
- }
- { obj.response STRING
- RW
- { error }
- "const struct sess *"
- }
- { obj.hits INT
- RO
- { hit deliver }
- "const struct sess *"
- }
- { obj.http. HDR_OBJ
- RW
- { hit error }
- "const struct sess *"
- }
-
- { obj.cacheable BOOL
- RW
- { hit }
- "const struct sess *"
- }
- { obj.ttl RTIME
- RW
- { hit error }
- "const struct sess *"
- }
- { obj.grace RTIME
- RW
- { hit error }
- "const struct sess *"
- }
- { obj.lastuse RTIME
- RO
- { hit deliver error }
- "const struct sess *"
- }
-
- #######################################################################
- # The response we send back
- { resp.proto STRING
- RW
- { deliver }
- "const struct sess *"
- }
- { resp.status INT
- RW
- { deliver }
- "const struct sess *"
- }
- { resp.response STRING
- RW
- { deliver }
- "const struct sess *"
- }
- { resp.http. HDR_RESP
- RW
- { deliver }
- "const struct sess *"
- }
-
- # Miscellaneous
- # XXX: I'm not happy about this one. All times should be relative
- # XXX: or delta times in VCL programs, so this shouldn't be needed /phk
- { now TIME
- RO
- all
- "const struct sess *"
- }
-}
-
-set tt(IP) "struct sockaddr *"
-set tt(STRING) "const char *"
-set tt(BOOL) "unsigned"
-set tt(BACKEND) "struct director *"
-set tt(TIME) "double"
-set tt(RTIME) "double"
-set tt(INT) "int"
-set tt(HDR_RESP) "const char *"
-set tt(HDR_OBJ) "const char *"
-set tt(HDR_REQ) "const char *"
-set tt(HDR_BEREQ) "const char *"
-set tt(HOSTNAME) "const char *"
-set tt(PORTNAME) "const char *"
-set tt(HASH) "const char *"
-set tt(SET) "struct vrt_backend_entry *"
-
-#----------------------------------------------------------------------
-# Figure out the union list of return actions
-foreach i $methods {
- foreach j [lindex $i 1] {
- set tmp($j) 1
- }
-}
-set returns [lsort [array names tmp]]
-unset tmp
-
-#----------------------------------------------------------------------
-# Boilerplate warning for all generated files.
-
-proc warns {fd} {
-
- puts $fd "/*"
- puts $fd \
- { * $Id$}
- puts $fd " *"
- puts $fd " * NB: This file is machine generated, DO NOT EDIT!"
- puts $fd " *"
- puts $fd " * Edit and run vcc_gen_fixed_token.tcl instead"
- puts $fd " */"
- puts $fd ""
-}
-
-#----------------------------------------------------------------------
-# Include a .h file as a string.
-
-proc copy_include {n} {
- global fo
-
- puts $fo "\n\t/* $n */\n"
- set fi [open $n]
- set n 0
- while {[gets $fi a] >= 0} {
- for {set b 0} {$b < [string length $a]} {incr b} {
- if {$n == 0} {
- puts -nonewline $fo "\tvsb_cat(sb, \""
- }
- set c [string index $a $b]
- if {"$c" == "\\"} {
- puts -nonewline $fo "\\\\"
- incr n
- } elseif {"$c" == "\t"} {
- puts -nonewline $fo "\\t"
- incr n
- } else {
- puts -nonewline $fo "$c"
- }
- incr n
- if {$n > 53} {
- puts $fo "\");"
- set n 0
- }
- }
- if {$n == 0} {
- puts -nonewline $fo "\tvsb_cat(sb, \""
- }
- puts -nonewline $fo "\\n"
- incr n 2
- if {$n > 30} {
- puts $fo "\");"
- set n 0
- }
- }
- if {$n > 0} {
- puts $fo "\");"
- }
- close $fi
-}
-
-#----------------------------------------------------------------------
-# Build the variable related .c and .h files
-
-set fo [open vcc_obj.c w]
-warns $fo
-set fp [open ../../include/vrt_obj.h w]
-warns $fp
-
-proc method_map {m} {
- global methods
-
- if {$m == "all"} {
- set m ""
- foreach i $methods {
- lappend m [lindex $i 0]
- }
- }
- set l1 ""
- set l2 ""
- foreach i $m {
- if {[string length $l2] > 55} {
- if {$l1 != ""} {
- append l1 "\n\t "
- }
- append l1 "$l2"
- set l2 ""
- }
- if {$l2 != "" || $l1 != ""} {
- append l2 " | "
- }
- append l2 VCL_MET_[string toupper $i]
- }
- if {$l2 != ""} {
- if {$l1 != ""} {
- append l1 "\n\t "
- }
- append l1 "$l2"
- }
- if {$l1 == ""} {
- return "0"
- }
- return $l1
-}
-
-proc vars {v pa} {
- global tt fo fp
-
- regsub -all "#\[^\n\]*\n" $v "" v
- foreach v $v {
- set n [lindex $v 0]
- regsub -all {[.]} $n "_" m
- set t [lindex $v 1]
- set a [lindex $v 2]
- if {$a == "NO"} continue
- set ty [lindex $v 4]
- if {[regexp HDR_ $t]} {
- puts $fo "\t\{ \"$n\", HEADER, [string length $n],"
- } else {
- puts $fo "\t\{ \"$n\", $t, [string length $n],"
- }
- if {$a == "RO" || $a == "RW"} {
- puts $fo "\t \"VRT_r_${m}($pa)\","
- if {![regexp HDR_ $t]} {
- puts $fp "$tt($t) VRT_r_${m}($ty);"
- }
- } else {
- puts $fo "\t NULL,"
- }
- if {$a == "WO" || $a == "RW"} {
- puts $fo "\t \"VRT_l_${m}($pa, \","
- if {[regexp HDR_ $t]} {
- } elseif {$t == "STRING"} {
- puts $fp "void VRT_l_${m}($ty, $tt($t), ...);"
- } else {
- puts $fp "void VRT_l_${m}($ty, $tt($t));"
- }
- } else {
- puts $fo "\t NULL,"
- }
- puts -nonewline $fo "\t V_$a,"
- if {![regexp HDR_ $t]} {
- puts $fo "\t 0,"
- } else {
- puts $fo "\t \"$t\","
- }
- puts $fo "\t [method_map [lindex $v 3]]"
- puts $fo "\t\},"
-
- }
- puts $fo "\t{ NULL }"
-}
-
-puts $fo "#include \"config.h\""
-puts $fo "#include <stdio.h>"
-puts $fo "#include \"vcc_compile.h\""
-puts $fo ""
-
-puts $fo "struct var vcc_vars\[\] = {"
-vars $spobj "sp"
-puts $fo "};"
-close $fp
-
-
-#----------------------------------------------------------------------
-# Build the vcl.h #include file
-
-set fo [open ../../include/vcl.h w]
-warns $fo
-puts $fo {struct sess;
-struct cli;
-
-typedef void vcl_init_f(struct cli *);
-typedef void vcl_fini_f(struct cli *);
-typedef int vcl_func_f(struct sess *sp);
-}
-
-puts $fo "/* VCL Methods */"
-set u 0
-foreach m $methods {
- if {[string length [lindex $m 0]] < 8} {
- set sp "\t"
- } else {
- set sp ""
- }
- puts -nonewline $fo "#define VCL_MET_[string toupper [lindex $m 0]]\t"
- puts $fo "${sp}(1U << $u)"
- incr u
-}
-
-puts $fo "\n#define VCL_MET_MAX\t\t$u\n"
-
-puts $fo "/* VCL Returns */"
-set i 0
-foreach k $returns {
- puts $fo "#define VCL_RET_[string toupper $k]\t\t$i"
- incr i
-}
-puts $fo "\n#define VCL_RET_MAX\t\t$i\n"
-
-puts $fo "struct VCL_conf {"
-puts $fo { unsigned magic;
-#define VCL_CONF_MAGIC 0x7406c509 /* from /dev/random */
-
- struct director **director;
- unsigned ndirector;
- struct vrt_ref *ref;
- unsigned nref;
- unsigned busy;
- unsigned discard;
-
- unsigned nsrc;
- const char **srcname;
- const char **srcbody;
-
- vcl_init_f *init_func;
- vcl_fini_f *fini_func;
-}
-foreach m $methods {
- puts $fo "\tvcl_func_f\t*[lindex $m 0]_func;"
-}
-puts $fo "};"
-
-close $fo
-
-#----------------------------------------------------------------------
-# Build the vcl_returns.h #include file
-
-set for [open "../../include/vcl_returns.h" w]
-warns $for
-puts $for "#ifdef VCL_RET_MAC"
-set i 0
-foreach k $returns {
- set u [string toupper $k]
- if {$k == "error"} {
- puts $for "VCL_RET_MAC($k, $u)"
- } else {
- puts $for "VCL_RET_MAC($k, $u)"
- }
- incr i
-}
-puts $for "#endif"
-puts $for ""
-puts $for "#ifdef VCL_MET_MAC"
-set u 0
-foreach m $methods {
- puts -nonewline $for "VCL_MET_MAC([lindex $m 0]"
- puts -nonewline $for ",[string toupper [lindex $m 0]]"
- set l [lindex $m 1]
- puts $for ","
- puts $for " ((1U << VCL_RET_[string toupper [lindex $l 0]])"
- foreach r [lrange $l 1 end] {
- puts $for " | (1U << VCL_RET_[string toupper $r])"
- }
- puts $for "))"
- incr u
-}
-puts $for "#endif"
-close $for
-
-#----------------------------------------------------------------------
-# Build the compiler token table and recognizers
-
-set fo [open "vcc_fixed_token.c" w]
-warns $fo
-
-set foh [open "vcc_token_defs.h" w]
-warns $foh
-
-puts $fo "#include \"config.h\""
-puts $fo "#include <stdio.h>"
-puts $fo "#include <ctype.h>"
-puts $fo "#include \"config.h\""
-puts $fo "#include \"vcc_priv.h\""
-puts $fo "#include \"vsb.h\""
-
-set tn 128
-
-proc add_token {tok str alpha} {
- global tokens tn fixed foh
-
- lappend tokens [list $tok $str]
- puts $foh "#define $tok $tn"
- incr tn
- lappend fixed [list $str $tok $alpha]
-}
-
-proc mk_token {tok str alpha} {
- set tok T_[string toupper $tok]
- add_token $tok $str $alpha
-}
-
-foreach k $keywords { mk_token $k $k 1 }
-foreach k $magic { mk_token [lindex $k 1] [lindex $k 0] 0 }
-foreach k $extras {
- set t [string toupper $k]
- lappend tokens [list $t $t]
- puts $foh "#define [string toupper $k] $tn"
- incr tn
-}
-for {set i 0} {$i < [string length $char]} {incr i} {
- set t [string index $char $i]
- lappend token2 [list '$t' T$t]
- lappend fixed [list "$t" '$t' 0]
-}
-
-set tokens [lsort $tokens]
-set token2 [lsort $token2]
-
-# We want to output in ascii order: create sorted first char list
-foreach t $fixed {
- set xx([string index [lindex $t 0] 0]) 1
-}
-set seq [lsort [array names xx]]
-
-puts $fo {
-#define M1() do {*q = p + 1; return (p[0]); } while (0)
-#define M2(c, t) do {if (p[1] == (c)) { *q = p + 2; return (t); }} while (0)
-
-unsigned
-vcl_fixed_token(const char *p, const char **q)}
-puts $fo "{"
-puts $fo ""
-puts $fo " switch (p\[0\]) {"
-
-foreach ch "$seq" {
- # Now find all tokens starting with ch
- set l ""
- foreach t $fixed {
- if {[string index [lindex $t 0] 0] == $ch} {
- lappend l $t
- }
- }
- # And do then in reverse order to match longest first
- set l [lsort -index 0 -decreasing $l]
- scan "$ch" "%c" cx
- puts $fo " case '$ch':"
- set retval "0"
- set m1 0
- foreach ty $l {
- set k [lindex $ty 0]
- if {[string length $k] == 1} {
- puts $fo "\t\tM1();"
- set m1 1
- continue;
- }
- if {[string length $k] == 2} {
- puts -nonewline $fo " M2("
- puts -nonewline $fo "'[string index $k 1]'"
- puts $fo ", [lindex $ty 1]);"
- continue;
- }
- puts -nonewline $fo " if ("
- for {set i 1} {$i < [string length $k]} {incr i} {
- if {$i > 1} {
- puts -nonewline $fo " &&"
- if {[expr $i % 3] == 1} {
- puts -nonewline $fo "\n\t\t "
- }
- puts -nonewline $fo " "
- }
- puts -nonewline $fo "p\[$i\] == '[string index $k $i]'"
- }
- if {[lindex $ty 2]} {
- if {[expr $i % 3] == 1} {
- puts -nonewline $fo "\n\t\t "
- }
- puts -nonewline $fo " && !isvar(p\[$i\])"
- }
- puts $fo ") {"
- puts $fo "\t\t\t*q = p + [string length $k];"
- puts $fo "\t\t\treturn ([lindex $ty 1]);"
- puts $fo "\t\t}"
- }
- if {$m1 == 0} {
- puts $fo "\t\treturn ($retval);"
- }
-}
-
-puts $fo " default:"
-puts $fo " return (0);"
-puts $fo " }"
-puts $fo "}"
-
-puts $fo ""
-puts $fo "const char * const vcl_tnames\[256\] = {"
-foreach i $token2 {
- puts $fo "\t\[[lindex $i 0]\] = \"[lindex $i 0]\","
-}
-foreach i $tokens {
- puts $fo "\t\[[lindex $i 0]\] = \"[lindex $i 1]\","
-}
-puts $fo "};"
-
-puts $fo ""
-puts $fo "void"
-puts $fo "vcl_output_lang_h(struct vsb *sb)"
-puts $fo "{"
-
-copy_include ../../include/vcl.h
-copy_include ../../include/vrt.h
-copy_include ../../include/vrt_obj.h
-
-puts $fo "}"
-
-close $foh
-close $fo
-
More information about the varnish-commit
mailing list