r5147 - trunk/varnish-cache/lib/libvmod_std
phk at varnish-cache.org
phk at varnish-cache.org
Mon Aug 30 13:04:38 CEST 2010
Author: phk
Date: 2010-08-30 13:04:38 +0200 (Mon, 30 Aug 2010)
New Revision: 5147
Modified:
trunk/varnish-cache/lib/libvmod_std/vmod.py
trunk/varnish-cache/lib/libvmod_std/vmod.spec
trunk/varnish-cache/lib/libvmod_std/vmod_std.c
Log:
Flesh out the toupper and tolower functions.
Emit a VCC friendly specification string for each functions.
Modified: trunk/varnish-cache/lib/libvmod_std/vmod.py
===================================================================
--- trunk/varnish-cache/lib/libvmod_std/vmod.py 2010-08-30 09:15:15 UTC (rev 5146)
+++ trunk/varnish-cache/lib/libvmod_std/vmod.py 2010-08-30 11:04:38 UTC (rev 5147)
@@ -73,21 +73,22 @@
pinit = ""
tdl = ""
plist = ""
+slist = ""
def do_func(fname, rval, args):
global pstruct
global pinit
global plist
+ global slist
global tdl
print(fname, rval, args)
- proto = ctypes[rval] + " vmod_" + fname + "("
- sproto = ctypes[rval] + " td_" + fname + "("
- s=""
+ proto = ctypes[rval] + " vmod_" + fname + "(struct sess *"
+ sproto = ctypes[rval] + " td_" + fname + "(struct sess *"
+ s=", "
for i in args:
proto += s + ctypes[i]
sproto += s + ctypes[i]
- s = ", "
proto += ")"
sproto += ")"
@@ -97,6 +98,13 @@
pstruct += "\ttd_" + fname + "\t*" + fname + ";\n"
pinit += "\tvmod_" + fname + ",\n"
+ s = modname + '.' + fname + "\\0"
+ s += "Vmod_Func_" + modname + "." + fname + "\\0"
+ s += type_tab[rval]
+ for i in args:
+ s += type_tab[i]
+ slist += '\t"' + s + '",\n'
+
#######################################################################
f = open(specfile, "r")
@@ -151,14 +159,22 @@
fc = open("vmod.c", "w")
fh = open("vmod.h", "w")
+fh.write('struct sess;\n')
+fh.write("\n");
+
fh.write(plist)
fc.write('#include "vmod.h"\n')
fc.write("\n");
+fc.write('struct sess;\n')
+fc.write("\n");
+
fc.write(tdl);
fc.write("\n");
+fc.write('const char Vmod_Name[] = "' + modname + '";\n')
+
fc.write("const struct Vmod_Func_" + modname + " {\n")
fc.write(pstruct + "} Vmod_Func = {\n" + pinit + "};\n")
fc.write("\n");
@@ -174,4 +190,4 @@
fc.write('\t;\n')
fc.write("\n");
-fc.write('const char Vmod_Name[] = "' + modname + '";\n')
+fc.write('const char *Vmod_Spec[] = {\n' + slist + '\t0\n};\n')
Modified: trunk/varnish-cache/lib/libvmod_std/vmod.spec
===================================================================
--- trunk/varnish-cache/lib/libvmod_std/vmod.spec 2010-08-30 09:15:15 UTC (rev 5146)
+++ trunk/varnish-cache/lib/libvmod_std/vmod.spec 2010-08-30 11:04:38 UTC (rev 5147)
@@ -1,4 +1,3 @@
Module std
Function STRING toupper(STRING_LIST)
-Function STRING tolower ( STRING_LIST)
-Function REAL real(STRING, REAL)
+Function STRING tolower(STRING_LIST)
Modified: trunk/varnish-cache/lib/libvmod_std/vmod_std.c
===================================================================
--- trunk/varnish-cache/lib/libvmod_std/vmod_std.c 2010-08-30 09:15:15 UTC (rev 5146)
+++ trunk/varnish-cache/lib/libvmod_std/vmod_std.c 2010-08-30 11:04:38 UTC (rev 5147)
@@ -1,26 +1,72 @@
+#include <ctype.h>
+#include <stdarg.h>
+#include "vrt.h"
+#include "../../bin/varnishd/cache.h"
+
#include "vmod.h"
const char *
-vmod_toupper(const char *s, ...)
+vmod_toupper(struct sess *sp, const char *s, ...)
{
+ va_list ap;
+ unsigned u;
+ char *b, *e;
+ const char *p;
- (void)s;
- return ("UPPER");
+ CHECK_OBJ_NOTNULL(sp, SESS_MAGIC);
+ va_start(ap, s);
+ u = WS_Reserve(sp->wrk->ws, 0);
+ e = b = sp->wrk->ws->f;
+ e += u;
+ p = s;
+ while (p != vrt_magic_string_end && b < e) {
+ for (; b < e && *p != '\0'; p++)
+ *b++ = toupper(*p);
+ p = va_arg(ap, const char *);
+ }
+ if (b < e)
+ *b = '\0';
+ b++;
+ if (b > e) {
+ WS_Release(sp->wrk->ws, 0);
+ return (NULL);
+ } else {
+ e = b;
+ b = sp->wrk->ws->f;
+ WS_Release(sp->wrk->ws, e - b);
+ return (b);
+ }
}
const char *
-vmod_tolower(const char *s, ...)
+vmod_tolower(struct sess *sp, const char *s, ...)
{
+ va_list ap;
+ unsigned u;
+ char *b, *e;
+ const char *p;
- (void)s;
- return ("LOWER");
+ CHECK_OBJ_NOTNULL(sp, SESS_MAGIC);
+ va_start(ap, s);
+ u = WS_Reserve(sp->wrk->ws, 0);
+ e = b = sp->wrk->ws->f;
+ e += u;
+ p = s;
+ while (p != vrt_magic_string_end && b < e) {
+ for (; b < e && *p != '\0'; p++)
+ *b++ = tolower(*p);
+ p = va_arg(ap, const char *);
+ }
+ if (b < e)
+ *b = '\0';
+ b++;
+ if (b > e) {
+ WS_Release(sp->wrk->ws, 0);
+ return (NULL);
+ } else {
+ e = b;
+ b = sp->wrk->ws->f;
+ WS_Release(sp->wrk->ws, e - b);
+ return (b);
+ }
}
-
-double
-vmod_real(const char *s, double d)
-{
-
- (void)s;
- (void)d;
- return (3.1415);
-}
More information about the varnish-commit
mailing list