From 3144649efb05dd2e024276dee32aa647aaed1d58 Mon Sep 17 00:00:00 2001 From: phk Date: Fri, 15 Feb 2008 10:34:42 +0000 Subject: [PATCH] Add VLU (Varnish Line Up) a copy of LineUp from my private utility library: A set of simple functions for cutting a byte stream into text-lines and calling a function for each of them, as the they become available. git-svn-id: svn+ssh://projects.linpro.no/svn/varnish/trunk@2471 d4fa192b-c00b-0410-8231-f00ffab90ce4 --- varnish-cache/include/vlu.h | 41 +++++++ varnish-cache/lib/libvarnish/Makefile.am | 1 + varnish-cache/lib/libvarnish/vlu.c | 129 +++++++++++++++++++++++ 3 files changed, 171 insertions(+) create mode 100644 varnish-cache/include/vlu.h create mode 100644 varnish-cache/lib/libvarnish/vlu.c diff --git a/varnish-cache/include/vlu.h b/varnish-cache/include/vlu.h new file mode 100644 index 00000000..307f57f2 --- /dev/null +++ b/varnish-cache/include/vlu.h @@ -0,0 +1,41 @@ +/*- + * Copyright (c) 2005-2008 Poul-Henning Kamp + * All rights reserved. + * + * 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 AUTHORS 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 THE AUTHORS 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. + * + * $Id: vpf.h 1410 2007-05-11 11:17:09Z des $ + * + * Functions for assembling a bytestream into text-lines and calling + * a function on each. + */ + +#ifndef VLU_H_INCLUDED +#define VLU_H_INCLUDED + +typedef int (vlu_f)(void *, const char *); +struct vlu *VLU_New(void *priv, vlu_f *func); +int VLU_Fd(int fd, struct vlu *l); +int VLU_File(FILE *f, struct vlu *l); +void VLU_Destroy(struct vlu *l); + +#endif diff --git a/varnish-cache/lib/libvarnish/Makefile.am b/varnish-cache/lib/libvarnish/Makefile.am index a0c2ff7c..7ce015ae 100644 --- a/varnish-cache/lib/libvarnish/Makefile.am +++ b/varnish-cache/lib/libvarnish/Makefile.am @@ -15,6 +15,7 @@ libvarnish_la_SOURCES = \ num.c \ time.c \ version.c \ + vlu.c \ vpf.c \ vsb.c \ vss.c \ diff --git a/varnish-cache/lib/libvarnish/vlu.c b/varnish-cache/lib/libvarnish/vlu.c new file mode 100644 index 00000000..5f6c89a2 --- /dev/null +++ b/varnish-cache/lib/libvarnish/vlu.c @@ -0,0 +1,129 @@ +/*- + * Copyright (c) 2005-2008 Poul-Henning Kamp + * All rights reserved. + * + * 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 AUTHORS 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 THE AUTHORS 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. + * + * $Id: vpf.h 1410 2007-05-11 11:17:09Z des $ + * + * Functions for assembling a bytestream into text-lines and calling + * a function on each. + */ + +#include +#include +#include +#include +#include +#include "vlu.h" +#include "miniobj.h" + +struct vlu { + unsigned magic; +#define LINEUP_MAGIC 0x8286661 + char *buf; + unsigned bufl; + unsigned bufp; + void *priv; + vlu_f *func; +}; + +struct vlu * +VLU_New(void *priv, vlu_f *func) +{ + struct vlu *l; + + ALLOC_OBJ(l, LINEUP_MAGIC); + if (l != NULL) { + l->func = func; + l->priv = priv; + l->bufl = BUFSIZ - 1; + l->buf = malloc(l->bufl + 1); + if (l->buf == NULL) { + FREE_OBJ(l); + l = NULL; + } + } + return (l); +} + +void +VLU_Destroy(struct vlu *l) +{ + + CHECK_OBJ_NOTNULL(l, LINEUP_MAGIC); + free(l->buf); + FREE_OBJ(l); +} + +static int +LineUpProcess(struct vlu *l) +{ + char *p, *q; + int i; + + l->buf[l->bufp] = '\0'; + for (p = l->buf; *p != '\0'; p = q) { + q = strchr(p, '\n'); + if (q == NULL) + break; + *q++ = '\0'; + i = l->func(l->priv, p); + if (i != 0) + return (i); + } + if (*p != '\0') { + q = strchr(p, '\0'); + assert(q != NULL); + l->bufp = (unsigned)(q - p); + memmove(l->buf, p, l->bufp); + l->buf[l->bufp] = '\0'; + } else + l->bufp = 0; + return (0); +} + +int +VLU_Fd(int fd, struct vlu *l) +{ + int i; + + CHECK_OBJ_NOTNULL(l, LINEUP_MAGIC); + i = read(fd, l->buf + l->bufp, l->bufl - l->bufp); + if (i <= 0) + return (-1); + l->bufp += i; + return (LineUpProcess(l)); +} + +int +VLU_File(FILE *f, struct vlu *l) +{ + char *p; + + CHECK_OBJ_NOTNULL(l, LINEUP_MAGIC); + p = fgets(l->buf + l->bufp, l->bufl - l->bufp, f); + if (p == NULL) + return (-1); + l->bufp = strlen(l->buf); + return (LineUpProcess(l)); +} -- 2.39.5