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