[4.0] 9e5b06f Move querysort into its own file
Federico G. Schwindt
fgsch at lodoss.net
Tue Jun 24 11:31:57 CEST 2014
commit 9e5b06f94dab9c52089587724ae42d26d5fb6a30
Author: Federico G. Schwindt <fgsch at lodoss.net>
Date: Mon Jun 23 23:33:19 2014 +0100
Move querysort into its own file
diff --git a/lib/libvmod_std/Makefile.am b/lib/libvmod_std/Makefile.am
index c005b85..47dd5dc 100644
--- a/lib/libvmod_std/Makefile.am
+++ b/lib/libvmod_std/Makefile.am
@@ -17,20 +17,20 @@ libvmod_std_la_LDFLAGS = $(AM_LDFLAGS) -module -export-dynamic -avoid-version -s
libvmod_std_la_SOURCES = \
vmod_std.c \
+ vmod_std_conversions.c \
vmod_std_fileread.c \
- vmod_std_conversions.c
+ vmod_std_querysort.c
nodist_libvmod_std_la_SOURCES = \
vcc_if.c \
vcc_if.h
# BUILT_SOURCES is only a hack and dependency tracking does not help for the first build
-vmod_std.lo vmod_std_fileread.lo vmod_std_conversions.lo: vcc_if.h
+$(libvmod_std_la_OBJECTS): vcc_if.h
vcc_if.c vcc_if.h vmod_std.rst vmod_std.man.rst: $(vmodtool) $(vmod_srcdir)/vmod.vcc
@PYTHON@ $(vmodtool) $(vmodtoolargs) $(vmod_srcdir)/vmod.vcc
-
EXTRA_DIST = vmod.vcc
CLEANFILES = $(builddir)/vcc_if.c $(builddir)/vcc_if.h \
diff --git a/lib/libvmod_std/vmod_std.c b/lib/libvmod_std/vmod_std.c
index 98ed54d..233c2da 100644
--- a/lib/libvmod_std/vmod_std.c
+++ b/lib/libvmod_std/vmod_std.c
@@ -225,98 +225,3 @@ vmod_timestamp(const struct vrt_ctx *ctx, VCL_STRING label)
VSLb_ts_req(ctx->req, label, VTIM_real());
}
}
-
-/*
- * Boltsort
- * Author: Naren Venkataraman of Vimeo Inc.
- * Included here with permission.
- */
-
-#define QS_MAX_PARAM_COUNT 32
-#define QS_EQUALS(a, b) \
- ((a) == (b) || ((a) == '\0' && (b) == '&') || ((a) == '&' && (b) == '\0'))
-
-static ssize_t
-param_compare(const char *s, const char *t)
-{
- for (; QS_EQUALS(*s, *t); s++, t++) {
- if (*s == '&' || *s == '\0')
- return (0);
- }
- return (*s - *t);
-}
-
-static size_t
-param_copy(char *dst, const char *src)
-{
- size_t len;
- len = strcspn(src, "&");
- memcpy(dst, src, len);
- return (len);
-}
-
-VCL_STRING __match_proto__(td_std_querysort)
-vmod_querysort(const struct vrt_ctx *ctx, VCL_STRING url)
-{
- char *param, *params[QS_MAX_PARAM_COUNT];
- char *p, *r;
- size_t len;
- int param_count;
- int i, n;
-
- CHECK_OBJ_NOTNULL(ctx, VRT_CTX_MAGIC);
-
- if (url == NULL)
- return (NULL);
-
- p = strchr(url, '?');
- if (p == NULL)
- return (url);
-
- param_count = 0;
- params[param_count++] = ++p;
- len = p - url;
-
- while ((p = strchr(p, '&')) != NULL) {
- param = ++p;
-
- for (i = 0; i < param_count; i++) {
- if (param[0] < params[i][0] ||
- param_compare(param, params[i]) < 0) {
- for (n = param_count; n > i; n--)
- params[n] = params[n - 1];
- break;
- }
- }
- params[i] = param;
- param_count++;
-
- if (param_count == QS_MAX_PARAM_COUNT)
- return (url);
- }
-
- if (param_count == 1)
- return (url);
-
- r = WS_Alloc(ctx->ws, strchr(param, '\0') - url + 1);
- if (r == NULL)
- return (url);
-
- p = memcpy(r, url, len);
- p += len;
-
- for (i = 0; i < param_count - 1; i++) {
- if (params[i][0] != '\0' && params[i][0] != '&')
- break;
- }
-
- for (; i < param_count - 1; i++) {
- p += param_copy(p, params[i]);
- *p++ = '&';
- }
-
- p += param_copy(p, params[i]);
- *p = '\0';
-
- return (r);
-}
diff --git a/lib/libvmod_std/vmod_std_querysort.c b/lib/libvmod_std/vmod_std_querysort.c
new file mode 100644
index 0000000..8aac9df
--- /dev/null
+++ b/lib/libvmod_std/vmod_std_querysort.c
@@ -0,0 +1,124 @@
+/*-
+ * Copyright (c) 2010-2014 Varnish Software AS
+ * All rights reserved.
+ *
+ * Author: Naren Venkataraman of Vimeo Inc.
+ *
+ * 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.
+ */
+
+#include "config.h"
+
+#include "vrt.h"
+
+#include "cache/cache.h"
+
+#include "vcc_if.h"
+
+#define QS_MAX_PARAM_COUNT 32
+#define QS_EQUALS(a, b) \
+ ((a) == (b) || ((a) == '\0' && (b) == '&') || ((a) == '&' && (b) == '\0'))
+
+static ssize_t
+param_compare(const char *s, const char *t)
+{
+ for (; QS_EQUALS(*s, *t); s++, t++) {
+ if (*s == '&' || *s == '\0')
+ return (0);
+ }
+ return (*s - *t);
+}
+
+static size_t
+param_copy(char *dst, const char *src)
+{
+ size_t len;
+ len = strcspn(src, "&");
+ memcpy(dst, src, len);
+ return (len);
+}
+
+VCL_STRING __match_proto__(td_std_querysort)
+vmod_querysort(const struct vrt_ctx *ctx, VCL_STRING url)
+{
+ char *param, *params[QS_MAX_PARAM_COUNT];
+ char *p, *r;
+ size_t len;
+ int param_count;
+ int i, n;
+
+ CHECK_OBJ_NOTNULL(ctx, VRT_CTX_MAGIC);
+
+ if (url == NULL)
+ return (NULL);
+
+ p = strchr(url, '?');
+ if (p == NULL)
+ return (url);
+
+ param_count = 0;
+ params[param_count++] = ++p;
+ len = p - url;
+
+ while ((p = strchr(p, '&')) != NULL) {
+ param = ++p;
+
+ for (i = 0; i < param_count; i++) {
+ if (param[0] < params[i][0] ||
+ param_compare(param, params[i]) < 0) {
+ for (n = param_count; n > i; n--)
+ params[n] = params[n - 1];
+ break;
+ }
+ }
+ params[i] = param;
+ param_count++;
+
+ if (param_count == QS_MAX_PARAM_COUNT)
+ return (url);
+ }
+
+ if (param_count == 1)
+ return (url);
+
+ r = WS_Alloc(ctx->ws, strchr(param, '\0') - url + 1);
+ if (r == NULL)
+ return (url);
+
+ p = memcpy(r, url, len);
+ p += len;
+
+ for (i = 0; i < param_count - 1; i++) {
+ if (params[i][0] != '\0' && params[i][0] != '&')
+ break;
+ }
+
+ for (; i < param_count - 1; i++) {
+ p += param_copy(p, params[i]);
+ *p++ = '&';
+ }
+
+ p += param_copy(p, params[i]);
+ *p = '\0';
+
+ return (r);
+}
More information about the varnish-commit
mailing list