]> err.no Git - varnish/commitdiff
Add a base64 decoder.
authorphk <phk@d4fa192b-c00b-0410-8231-f00ffab90ce4>
Fri, 15 Sep 2006 19:25:06 +0000 (19:25 +0000)
committerphk <phk@d4fa192b-c00b-0410-8231-f00ffab90ce4>
Fri, 15 Sep 2006 19:25:06 +0000 (19:25 +0000)
git-svn-id: svn+ssh://projects.linpro.no/svn/varnish/trunk@996 d4fa192b-c00b-0410-8231-f00ffab90ce4

varnish-cache/include/varnishapi.h
varnish-cache/lib/libvarnishapi/Makefile.am
varnish-cache/lib/libvarnishapi/base64.c [new file with mode: 0644]

index 87145bac048dce398c9b9df45824e3dae3206deb..a160a7c560137fdeec218bad5f11912f6600154c 100644 (file)
@@ -7,6 +7,10 @@
 
 #define V_DEAD __attribute__ ((noreturn))
 
+/* base64.c */
+void base64_init(void);
+int base64_decode(char *d, unsigned dlen, const char *s);
+
 /* shmlog.c */
 typedef int vsl_handler(void *priv, unsigned tag, unsigned fd, unsigned len, unsigned spec, const char *ptr);
 #define VSL_S_CLIENT   (1 << 0)
index 0187acb79e176fce3671b4346eb64209d81cbd20..d86811515f2d4fce591bef1b0e4049b225526d71 100644 (file)
@@ -5,6 +5,7 @@ INCLUDES = -I$(top_srcdir)/include
 lib_LTLIBRARIES = libvarnishapi.la
 
 libvarnishapi_la_SOURCES = \
+       base64.c \
        shmlog.c
 
 libvarnishapi_la_CFLAGS = -include config.h
diff --git a/varnish-cache/lib/libvarnishapi/base64.c b/varnish-cache/lib/libvarnishapi/base64.c
new file mode 100644 (file)
index 0000000..5f2cf25
--- /dev/null
@@ -0,0 +1,78 @@
+/* $Id$ */
+
+static const char *b64 =
+    "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
+
+static char i64[256];
+
+void
+base64_init(void)
+{
+       int i;
+       const char *p;
+
+       for (i = 0; i < 256; i++)
+               i64[i] = -1;
+       for (p = b64, i = 0; *p; p++, i++)
+               i64[*p] = i;
+       i64['='] = 0;
+}
+
+int
+base64_decode(char *d, unsigned dlen, const char *s)
+{
+       unsigned u, v, l;
+       int i;
+
+       l = 0;
+       while (*s) {
+               for (v = 0; v < 4; v++) {
+                       if (!*s)
+                               break;
+                       i = i64[*s++];
+                       if (i < 0)
+                               return (-1);
+                       u <<= 6;
+                       u |= i;
+               }
+               for (v = 0; v < 3; v++) {
+                       if (l >= dlen - 1)
+                               return (-1);
+                       *d = (u >> 16) & 0xff;
+                       u <<= 8;
+                       l++;
+                       d++;
+               }
+       }
+       printf("\n");
+       *d = '\0';
+       return (0);
+}
+
+#ifdef TEST_DRIVER
+#include <stdio.h>
+
+const char *test1 =
+"TWFuIGlzIGRpc3Rpbmd1aXNoZWQsIG5vdCBvbmx5IGJ5IGhpcyByZWFzb24sIGJ1dCBieSB0aGlz"
+"IHNpbmd1bGFyIHBhc3Npb24gZnJvbSBvdGhlciBhbmltYWxzLCB3aGljaCBpcyBhIGx1c3Qgb2Yg"
+"dGhlIG1pbmQsIHRoYXQgYnkgYSBwZXJzZXZlcmFuY2Ugb2YgZGVsaWdodCBpbiB0aGUgY29udGlu"
+"dWVkIGFuZCBpbmRlZmF0aWdhYmxlIGdlbmVyYXRpb24gb2Yga25vd2xlZGdlLCBleGNlZWRzIHRo"
+"ZSBzaG9ydCB2ZWhlbWVuY2Ugb2YgYW55IGNhcm5hbCBwbGVhc3VyZS4=";
+
+int
+main(int argc, char **argv)
+{
+       int i;
+       char buf[BUFSIZ];
+       unsigned l;
+
+       (void)argc;
+       (void)argv;
+
+       base64_init();
+       l = sizeof buf;
+       base64_decode(buf, &l, test1);
+       printf("%s\n", buf);
+       return (0);
+}
+#endif