Package: release.debian.org Severity: normal User: release.debian.org@packages.debian.org Usertags: unblock Please unblock package getdns Dear release team, when I was first packaging 1.1.0~a2 release, I took the source from github repository instead of upstream tarball (that was created later). And because getdns upstream uses patched version of jsmn, and I have used verbatim upstream sources of jsmn, a #849577 is born. So, 1.1.0~a2-2 release contains getdns version of jsmn, and so it's same as 1.1.0-a2 getdns upstream (as it should be). Please consider unblocking this package, so we don't ship broken getdns in stretch. unblock getdns/1.1.0~a2-2 -- System Information: Debian Release: 9.0 APT prefers testing APT policy: (990, 'testing'), (500, 'unstable-debug'), (500, 'testing-debug'), (500, 'unstable'), (1, 'experimental-debug'), (1, 'experimental') Architecture: amd64 (x86_64) Kernel: Linux 4.4.0-67-generic (SMP w/24 CPU cores) Locale: LANG=en_DK.UTF-8, LC_CTYPE=en_DK.UTF-8 (charmap=UTF-8) Shell: /bin/sh linked to /bin/dash Init: systemd (via /run/systemd/system)
diff -Nru getdns-1.1.0~a2/debian/changelog getdns-1.1.0~a2/debian/changelog
--- getdns-1.1.0~a2/debian/changelog 2016-11-06 21:56:21.000000000 +0100
+++ getdns-1.1.0~a2/debian/changelog 2017-03-08 11:48:09.000000000 +0100
@@ -1,3 +1,9 @@
+getdns (1.1.0~a2-2) unstable; urgency=medium
+
+ * Use upstream provided src/jsmn/ (Closes: #849577)
+
+ -- Ondřej Surý <ondrej@debian.org> Wed, 08 Mar 2017 11:48:09 +0100
+
getdns (1.1.0~a2-1) unstable; urgency=medium
* Fix CURRENT_DATE generation for reproducible builds (Closes: #797215)
diff -Nru getdns-1.1.0~a2/debian/patches/0001-Add-src-jsmn-to-sources.patch getdns-1.1.0~a2/debian/patches/0001-Add-src-jsmn-to-sources.patch
--- getdns-1.1.0~a2/debian/patches/0001-Add-src-jsmn-to-sources.patch 2016-11-06 21:56:21.000000000 +0100
+++ getdns-1.1.0~a2/debian/patches/0001-Add-src-jsmn-to-sources.patch 2017-03-08 11:48:09.000000000 +0100
@@ -3,27 +3,15 @@
Subject: Add src/jsmn/ to sources
---
- src/jsmn/LICENSE | 20 +++
- src/jsmn/README.md | 167 +++++++++++++++++++
- src/jsmn/example/jsondump.c | 126 +++++++++++++++
- src/jsmn/example/simple.c | 76 +++++++++
- src/jsmn/jsmn.c | 311 ++++++++++++++++++++++++++++++++++++
- src/jsmn/jsmn.h | 76 +++++++++
- src/jsmn/library.json | 16 ++
- src/jsmn/test/test.h | 27 ++++
- src/jsmn/test/tests.c | 378 ++++++++++++++++++++++++++++++++++++++++++++
- src/jsmn/test/testutil.h | 94 +++++++++++
- 10 files changed, 1291 insertions(+)
+ src/jsmn/LICENSE | 20 +++
+ src/jsmn/README.md | 167 ++++++++++++++++++++++++++
+ src/jsmn/jsmn.c | 347 +++++++++++++++++++++++++++++++++++++++++++++++++++++
+ src/jsmn/jsmn.h | 76 ++++++++++++
+ 4 files changed, 610 insertions(+)
create mode 100644 src/jsmn/LICENSE
create mode 100644 src/jsmn/README.md
- create mode 100644 src/jsmn/example/jsondump.c
- create mode 100644 src/jsmn/example/simple.c
create mode 100644 src/jsmn/jsmn.c
create mode 100644 src/jsmn/jsmn.h
- create mode 100644 src/jsmn/library.json
- create mode 100644 src/jsmn/test/test.h
- create mode 100644 src/jsmn/test/tests.c
- create mode 100644 src/jsmn/test/testutil.h
diff --git a/src/jsmn/LICENSE b/src/jsmn/LICENSE
new file mode 100644
@@ -224,226 +212,12 @@
+
+[1]: http://www.json.org/
+[2]: http://zserge.com/jsmn.html
-diff --git a/src/jsmn/example/jsondump.c b/src/jsmn/example/jsondump.c
-new file mode 100644
-index 0000000..cf08c5c
---- /dev/null
-+++ b/src/jsmn/example/jsondump.c
-@@ -0,0 +1,126 @@
-+#include <stdio.h>
-+#include <stdlib.h>
-+#include <unistd.h>
-+#include <string.h>
-+#include <errno.h>
-+#include "../jsmn.h"
-+
-+/* Function realloc_it() is a wrapper function for standart realloc()
-+ * with one difference - it frees old memory pointer in case of realloc
-+ * failure. Thus, DO NOT use old data pointer in anyway after call to
-+ * realloc_it(). If your code has some kind of fallback algorithm if
-+ * memory can't be re-allocated - use standart realloc() instead.
-+ */
-+static inline void *realloc_it(void *ptrmem, size_t size) {
-+ void *p = realloc(ptrmem, size);
-+ if (!p) {
-+ free (ptrmem);
-+ fprintf(stderr, "realloc(): errno=%d\n", errno);
-+ }
-+ return p;
-+}
-+
-+/*
-+ * An example of reading JSON from stdin and printing its content to stdout.
-+ * The output looks like YAML, but I'm not sure if it's really compatible.
-+ */
-+
-+static int dump(const char *js, jsmntok_t *t, size_t count, int indent) {
-+ int i, j, k;
-+ if (count == 0) {
-+ return 0;
-+ }
-+ if (t->type == JSMN_PRIMITIVE) {
-+ printf("%.*s", t->end - t->start, js+t->start);
-+ return 1;
-+ } else if (t->type == JSMN_STRING) {
-+ printf("'%.*s'", t->end - t->start, js+t->start);
-+ return 1;
-+ } else if (t->type == JSMN_OBJECT) {
-+ printf("\n");
-+ j = 0;
-+ for (i = 0; i < t->size; i++) {
-+ for (k = 0; k < indent; k++) printf(" ");
-+ j += dump(js, t+1+j, count-j, indent+1);
-+ printf(": ");
-+ j += dump(js, t+1+j, count-j, indent+1);
-+ printf("\n");
-+ }
-+ return j+1;
-+ } else if (t->type == JSMN_ARRAY) {
-+ j = 0;
-+ printf("\n");
-+ for (i = 0; i < t->size; i++) {
-+ for (k = 0; k < indent-1; k++) printf(" ");
-+ printf(" - ");
-+ j += dump(js, t+1+j, count-j, indent+1);
-+ printf("\n");
-+ }
-+ return j+1;
-+ }
-+ return 0;
-+}
-+
-+int main() {
-+ int r;
-+ int eof_expected = 0;
-+ char *js = NULL;
-+ size_t jslen = 0;
-+ char buf[BUFSIZ];
-+
-+ jsmn_parser p;
-+ jsmntok_t *tok;
-+ size_t tokcount = 2;
-+
-+ /* Prepare parser */
-+ jsmn_init(&p);
-+
-+ /* Allocate some tokens as a start */
-+ tok = malloc(sizeof(*tok) * tokcount);
-+ if (tok == NULL) {
-+ fprintf(stderr, "malloc(): errno=%d\n", errno);
-+ return 3;
-+ }
-+
-+ for (;;) {
-+ /* Read another chunk */
-+ r = fread(buf, 1, sizeof(buf), stdin);
-+ if (r < 0) {
-+ fprintf(stderr, "fread(): %d, errno=%d\n", r, errno);
-+ return 1;
-+ }
-+ if (r == 0) {
-+ if (eof_expected != 0) {
-+ return 0;
-+ } else {
-+ fprintf(stderr, "fread(): unexpected EOF\n");
-+ return 2;
-+ }
-+ }
-+
-+ js = realloc_it(js, jslen + r + 1);
-+ if (js == NULL) {
-+ return 3;
-+ }
-+ strncpy(js + jslen, buf, r);
-+ jslen = jslen + r;
-+
-+again:
-+ r = jsmn_parse(&p, js, jslen, tok, tokcount);
-+ if (r < 0) {
-+ if (r == JSMN_ERROR_NOMEM) {
-+ tokcount = tokcount * 2;
-+ tok = realloc_it(tok, sizeof(*tok) * tokcount);
-+ if (tok == NULL) {
-+ return 3;
-+ }
-+ goto again;
-+ }
-+ } else {
-+ dump(js, tok, p.toknext, 0);
-+ eof_expected = 1;
-+ }
-+ }
-+
-+ return 0;
-+}
-diff --git a/src/jsmn/example/simple.c b/src/jsmn/example/simple.c
-new file mode 100644
-index 0000000..de44883
---- /dev/null
-+++ b/src/jsmn/example/simple.c
-@@ -0,0 +1,76 @@
-+#include <stdio.h>
-+#include <stdlib.h>
-+#include <string.h>
-+#include "../jsmn.h"
-+
-+/*
-+ * A small example of jsmn parsing when JSON structure is known and number of
-+ * tokens is predictable.
-+ */
-+
-+const char *JSON_STRING =
-+ "{\"user\": \"johndoe\", \"admin\": false, \"uid\": 1000,\n "
-+ "\"groups\": [\"users\", \"wheel\", \"audio\", \"video\"]}";
-+
-+static int jsoneq(const char *json, jsmntok_t *tok, const char *s) {
-+ if (tok->type == JSMN_STRING && (int) strlen(s) == tok->end - tok->start &&
-+ strncmp(json + tok->start, s, tok->end - tok->start) == 0) {
-+ return 0;
-+ }
-+ return -1;
-+}
-+
-+int main() {
-+ int i;
-+ int r;
-+ jsmn_parser p;
-+ jsmntok_t t[128]; /* We expect no more than 128 tokens */
-+
-+ jsmn_init(&p);
-+ r = jsmn_parse(&p, JSON_STRING, strlen(JSON_STRING), t, sizeof(t)/sizeof(t[0]));
-+ if (r < 0) {
-+ printf("Failed to parse JSON: %d\n", r);
-+ return 1;
-+ }
-+
-+ /* Assume the top-level element is an object */
-+ if (r < 1 || t[0].type != JSMN_OBJECT) {
-+ printf("Object expected\n");
-+ return 1;
-+ }
-+
-+ /* Loop over all keys of the root object */
-+ for (i = 1; i < r; i++) {
-+ if (jsoneq(JSON_STRING, &t[i], "user") == 0) {
-+ /* We may use strndup() to fetch string value */
-+ printf("- User: %.*s\n", t[i+1].end-t[i+1].start,
-+ JSON_STRING + t[i+1].start);
-+ i++;
-+ } else if (jsoneq(JSON_STRING, &t[i], "admin") == 0) {
-+ /* We may additionally check if the value is either "true" or "false" */
-+ printf("- Admin: %.*s\n", t[i+1].end-t[i+1].start,
-+ JSON_STRING + t[i+1].start);
-+ i++;
-+ } else if (jsoneq(JSON_STRING, &t[i], "uid") == 0) {
-+ /* We may want to do strtol() here to get numeric value */
-+ printf("- UID: %.*s\n", t[i+1].end-t[i+1].start,
-+ JSON_STRING + t[i+1].start);
-+ i++;
-+ } else if (jsoneq(JSON_STRING, &t[i], "groups") == 0) {
-+ int j;
-+ printf("- Groups:\n");
-+ if (t[i+1].type != JSMN_ARRAY) {
-+ continue; /* We expect groups to be an array of strings */
-+ }
-+ for (j = 0; j < t[i+1].size; j++) {
-+ jsmntok_t *g = &t[i+j+2];
-+ printf(" * %.*s\n", g->end - g->start, JSON_STRING + g->start);
-+ }
-+ i += t[i+1].size + 1;
-+ } else {
-+ printf("Unexpected key: %.*s\n", t[i].end-t[i].start,
-+ JSON_STRING + t[i].start);
-+ }
-+ }
-+ return 0;
-+}
diff --git a/src/jsmn/jsmn.c b/src/jsmn/jsmn.c
new file mode 100644
-index 0000000..e7765eb
+index 0000000..c5f47cb
--- /dev/null
+++ b/src/jsmn/jsmn.c
-@@ -0,0 +1,311 @@
+@@ -0,0 +1,347 @@
+#include "jsmn.h"
+
+/**
@@ -487,11 +261,18 @@
+
+ for (; parser->pos < len && js[parser->pos] != '\0'; parser->pos++) {
+ switch (js[parser->pos]) {
-+#ifndef JSMN_STRICT
++#if !defined(JSMN_STRICT) && !defined(JSMN_GETDNS)
+ /* In strict mode primitive must be followed by "," or "}" or "]" */
+ case ':':
++#elif defined(JSMN_GETDNS)
++ case ':':
++ if (tokens[parser->toksuper].type != JSMN_OBJECT)
++ break;
+#endif
+ case '\t' : case '\r' : case '\n' : case ' ' :
++#ifdef JSMN_GETDNS
++ case '>':
++#endif
+ case ',' : case ']' : case '}' :
+ goto found;
+ }
@@ -500,7 +281,7 @@
+ return JSMN_ERROR_INVAL;
+ }
+ }
-+#ifdef JSMN_STRICT
++#if defined(JSMN_STRICT)
+ /* In strict mode primitive must be followed by a comma/object/array */
+ parser->pos = start;
+ return JSMN_ERROR_PART;
@@ -679,6 +460,9 @@
+ tokens[parser->toksuper].size++;
+ break;
+ case '\t' : case '\r' : case '\n' : case ' ':
++#ifdef JSMN_GETDNS
++ case '>':
++#endif
+ break;
+ case ':':
+ parser->toksuper = parser->toknext - 1;
@@ -701,6 +485,32 @@
+#endif
+ }
+ break;
++#ifdef JSMN_GETDNS
++ case '<':
++ if (parser->pos + 14 < len &&
++ js[parser->pos+ 1] == 'b' &&
++ js[parser->pos+ 2] == 'i' &&
++ js[parser->pos+ 3] == 'n' &&
++ js[parser->pos+ 4] == 'd' &&
++ js[parser->pos+ 5] == 'a' &&
++ js[parser->pos+ 6] == 't' &&
++ js[parser->pos+ 7] == 'a' &&
++ js[parser->pos+ 8] == ' ') {
++ if (js[parser->pos+ 9] == 'o' &&
++ js[parser->pos+10] == 'f' &&
++ js[parser->pos+11] == ' ') {
++ parser->pos += 11;
++ break;
++
++ } else if (js[parser->pos+ 9] == 'f' &&
++ js[parser->pos+10] == 'o' &&
++ js[parser->pos+11] == 'r' &&
++ js[parser->pos+12] == ' ') {
++ parser->pos += 12;
++ break;
++ }
++ }
++#endif
+#ifdef JSMN_STRICT
+ /* In strict mode primitives are: numbers and booleans */
+ case '-': case '0': case '1' : case '2': case '3' : case '4':
@@ -837,542 +647,3 @@
+#endif
+
+#endif /* __JSMN_H_ */
-diff --git a/src/jsmn/library.json b/src/jsmn/library.json
-new file mode 100644
-index 0000000..8e2f5c2
---- /dev/null
-+++ b/src/jsmn/library.json
-@@ -0,0 +1,16 @@
-+{
-+ "name": "jsmn",
-+ "keywords": "json",
-+ "description": "Minimalistic JSON parser/tokenizer in C. It can be easily integrated into resource-limited or embedded projects",
-+ "repository":
-+ {
-+ "type": "git",
-+ "url": "https://github.com/zserge/jsmn.git"
-+ },
-+ "frameworks": "*",
-+ "platforms": "*",
-+ "examples": [
-+ "example/*.c"
-+ ],
-+ "exclude": "test"
-+}
-diff --git a/src/jsmn/test/test.h b/src/jsmn/test/test.h
-new file mode 100644
-index 0000000..930ebaf
---- /dev/null
-+++ b/src/jsmn/test/test.h
-@@ -0,0 +1,27 @@
-+#ifndef __TEST_H__
-+#define __TEST_H__
-+
-+static int test_passed = 0;
-+static int test_failed = 0;
-+
-+/* Terminate current test with error */
-+#define fail() return __LINE__
-+
-+/* Successfull end of the test case */
-+#define done() return 0
-+
-+/* Check single condition */
-+#define check(cond) do { if (!(cond)) fail(); } while (0)
-+
-+/* Test runner */
-+static void test(int (*func)(void), const char *name) {
-+ int r = func();
-+ if (r == 0) {
-+ test_passed++;
-+ } else {
-+ test_failed++;
-+ printf("FAILED: %s (at line %d)\n", name, r);
-+ }
-+}
-+
-+#endif /* __TEST_H__ */
-diff --git a/src/jsmn/test/tests.c b/src/jsmn/test/tests.c
-new file mode 100644
-index 0000000..a72689e
---- /dev/null
-+++ b/src/jsmn/test/tests.c
-@@ -0,0 +1,378 @@
-+#include <stdio.h>
-+#include <stdlib.h>
-+#include <string.h>
-+#include <stdarg.h>
-+
-+#include "test.h"
-+#include "testutil.h"
-+
-+int test_empty(void) {
-+ check(parse("{}", 1, 1,
-+ JSMN_OBJECT, 0, 2, 0));
-+ check(parse("[]", 1, 1,
-+ JSMN_ARRAY, 0, 2, 0));
-+ check(parse("[{},{}]", 3, 3,
-+ JSMN_ARRAY, 0, 7, 2,
-+ JSMN_OBJECT, 1, 3, 0,
-+ JSMN_OBJECT, 4, 6, 0));
-+ return 0;
-+}
-+
-+int test_object(void) {
-+ check(parse("{\"a\":0}", 3, 3,
-+ JSMN_OBJECT, 0, 7, 1,
-+ JSMN_STRING, "a", 1,
-+ JSMN_PRIMITIVE, "0"));
-+ check(parse("{\"a\":[]}", 3, 3,
-+ JSMN_OBJECT, 0, 8, 1,
-+ JSMN_STRING, "a", 1,
-+ JSMN_ARRAY, 5, 7, 0));
-+ check(parse("{\"a\":{},\"b\":{}}", 5, 5,
-+ JSMN_OBJECT, -1, -1, 2,
-+ JSMN_STRING, "a", 1,
-+ JSMN_OBJECT, -1, -1, 0,
-+ JSMN_STRING, "b", 1,
-+ JSMN_OBJECT, -1, -1, 0));
-+ check(parse("{\n \"Day\": 26,\n \"Month\": 9,\n \"Year\": 12\n }", 7, 7,
-+ JSMN_OBJECT, -1, -1, 3,
-+ JSMN_STRING, "Day", 1,
-+ JSMN_PRIMITIVE, "26",
-+ JSMN_STRING, "Month", 1,
-+ JSMN_PRIMITIVE, "9",
-+ JSMN_STRING, "Year", 1,
-+ JSMN_PRIMITIVE, "12"));
-+ check(parse("{\"a\": 0, \"b\": \"c\"}", 5, 5,
-+ JSMN_OBJECT, -1, -1, 2,
-+ JSMN_STRING, "a", 1,
-+ JSMN_PRIMITIVE, "0",
-+ JSMN_STRING, "b", 1,
-+ JSMN_STRING, "c", 0));
-+
-+#ifdef JSMN_STRICT
-+ check(parse("{\"a\"\n0}", JSMN_ERROR_INVAL, 3));
-+ check(parse("{\"a\", 0}", JSMN_ERROR_INVAL, 3));
-+ check(parse("{\"a\": {2}}", JSMN_ERROR_INVAL, 3));
-+ check(parse("{\"a\": {2: 3}}", JSMN_ERROR_INVAL, 3));
-+ check(parse("{\"a\": {\"a\": 2 3}}", JSMN_ERROR_INVAL, 5));
-+ /* FIXME */
-+ /*check(parse("{\"a\"}", JSMN_ERROR_INVAL, 2));*/
-+ /*check(parse("{\"a\": 1, \"b\"}", JSMN_ERROR_INVAL, 4));*/
-+ /*check(parse("{\"a\",\"b\":1}", JSMN_ERROR_INVAL, 4));*/
-+ /*check(parse("{\"a\":1,}", JSMN_ERROR_INVAL, 4));*/
-+ /*check(parse("{\"a\":\"b\":\"c\"}", JSMN_ERROR_INVAL, 4));*/
-+ /*check(parse("{,}", JSMN_ERROR_INVAL, 4));*/
-+#endif
-+ return 0;
-+}
-+
-+int test_array(void) {
-+ /* FIXME */
-+ /*check(parse("[10}", JSMN_ERROR_INVAL, 3));*/
-+ /*check(parse("[1,,3]", JSMN_ERROR_INVAL, 3)*/
-+ check(parse("[10]", 2, 2,
-+ JSMN_ARRAY, -1, -1, 1,
-+ JSMN_PRIMITIVE, "10"));
-+ check(parse("{\"a\": 1]", JSMN_ERROR_INVAL, 3));
-+ /* FIXME */
-+ /*check(parse("[\"a\": 1]", JSMN_ERROR_INVAL, 3));*/
-+ return 0;
-+}
-+
-+int test_primitive(void) {
-+ check(parse("{\"boolVar\" : true }", 3, 3,
-+ JSMN_OBJECT, -1, -1, 1,
-+ JSMN_STRING, "boolVar", 1,
-+ JSMN_PRIMITIVE, "true"));
-+ check(parse("{\"boolVar\" : false }", 3, 3,
-+ JSMN_OBJECT, -1, -1, 1,
-+ JSMN_STRING, "boolVar", 1,
-+ JSMN_PRIMITIVE, "false"));
-+ check(parse("{\"nullVar\" : null }", 3, 3,
-+ JSMN_OBJECT, -1, -1, 1,
-+ JSMN_STRING, "nullVar", 1,
-+ JSMN_PRIMITIVE, "null"));
-+ check(parse("{\"intVar\" : 12}", 3, 3,
-+ JSMN_OBJECT, -1, -1, 1,
-+ JSMN_STRING, "intVar", 1,
-+ JSMN_PRIMITIVE, "12"));
-+ check(parse("{\"floatVar\" : 12.345}", 3, 3,
-+ JSMN_OBJECT, -1, -1, 1,
-+ JSMN_STRING, "floatVar", 1,
-+ JSMN_PRIMITIVE, "12.345"));
-+ return 0;
-+}
-+
-+int test_string(void) {
-+ check(parse("{\"strVar\" : \"hello world\"}", 3, 3,
-+ JSMN_OBJECT, -1, -1, 1,
-+ JSMN_STRING, "strVar", 1,
-+ JSMN_STRING, "hello world", 0));
-+ check(parse("{\"strVar\" : \"escapes: \\/\\r\\n\\t\\b\\f\\\"\\\\\"}", 3, 3,
-+ JSMN_OBJECT, -1, -1, 1,
-+ JSMN_STRING, "strVar", 1,
-+ JSMN_STRING, "escapes: \\/\\r\\n\\t\\b\\f\\\"\\\\", 0));
-+ check(parse("{\"strVar\": \"\"}", 3, 3,
-+ JSMN_OBJECT, -1, -1, 1,
-+ JSMN_STRING, "strVar", 1,
-+ JSMN_STRING, "", 0));
-+ check(parse("{\"a\":\"\\uAbcD\"}", 3, 3,
-+ JSMN_OBJECT, -1, -1, 1,
-+ JSMN_STRING, "a", 1,
-+ JSMN_STRING, "\\uAbcD", 0));
-+ check(parse("{\"a\":\"str\\u0000\"}", 3, 3,
-+ JSMN_OBJECT, -1, -1, 1,
-+ JSMN_STRING, "a", 1,
-+ JSMN_STRING, "str\\u0000", 0));
-+ check(parse("{\"a\":\"\\uFFFFstr\"}", 3, 3,
-+ JSMN_OBJECT, -1, -1, 1,
-+ JSMN_STRING, "a", 1,
-+ JSMN_STRING, "\\uFFFFstr", 0));
-+ check(parse("{\"a\":[\"\\u0280\"]}", 4, 4,
-+ JSMN_OBJECT, -1, -1, 1,
-+ JSMN_STRING, "a", 1,
-+ JSMN_ARRAY, -1, -1, 1,
-+ JSMN_STRING, "\\u0280", 0));
-+
-+ check(parse("{\"a\":\"str\\uFFGFstr\"}", JSMN_ERROR_INVAL, 3));
-+ check(parse("{\"a\":\"str\\u@FfF\"}", JSMN_ERROR_INVAL, 3));
-+ check(parse("{{\"a\":[\"\\u028\"]}", JSMN_ERROR_INVAL, 4));
-+ return 0;
-+}
-+
-+int test_partial_string(void) {
-+ int i;
-+ int r;
-+ jsmn_parser p;
-+ jsmntok_t tok[5];
-+ const char *js = "{\"x\": \"va\\\\ue\", \"y\": \"value y\"}";
-+
-+ jsmn_init(&p);
-+ for (i = 1; i <= strlen(js); i++) {
-+ r = jsmn_parse(&p, js, i, tok, sizeof(tok)/sizeof(tok[0]));
-+ if (i == strlen(js)) {
-+ check(r == 5);
-+ check(tokeq(js, tok, 5,
-+ JSMN_OBJECT, -1, -1, 2,
-+ JSMN_STRING, "x", 1,
-+ JSMN_STRING, "va\\\\ue", 0,
-+ JSMN_STRING, "y", 1,
-+ JSMN_STRING, "value y", 0));
-+ } else {
-+ check(r == JSMN_ERROR_PART);
-+ }
-+ }
-+ return 0;
-+}
-+
-+int test_partial_array(void) {
-+#ifdef JSMN_STRICT
-+ int r;
-+ int i;
-+ jsmn_parser p;
-+ jsmntok_t tok[10];
-+ const char *js = "[ 1, true, [123, \"hello\"]]";
-+
-+ jsmn_init(&p);
-+ for (i = 1; i <= strlen(js); i++) {
-+ r = jsmn_parse(&p, js, i, tok, sizeof(tok)/sizeof(tok[0]));
-+ if (i == strlen(js)) {
-+ check(r == 6);
-+ check(tokeq(js, tok, 6,
-+ JSMN_ARRAY, -1, -1, 3,
-+ JSMN_PRIMITIVE, "1",
-+ JSMN_PRIMITIVE, "true",
-+ JSMN_ARRAY, -1, -1, 2,
-+ JSMN_PRIMITIVE, "123",
-+ JSMN_STRING, "hello", 0));
-+ } else {
-+ check(r == JSMN_ERROR_PART);
-+ }
-+ }
-+#endif
-+ return 0;
-+}
-+
-+int test_array_nomem(void) {
-+ int i;
-+ int r;
-+ jsmn_parser p;
-+ jsmntok_t toksmall[10], toklarge[10];
-+ const char *js;
-+
-+ js = " [ 1, true, [123, \"hello\"]]";
-+
-+ for (i = 0; i < 6; i++) {
-+ jsmn_init(&p);
-+ memset(toksmall, 0, sizeof(toksmall));
-+ memset(toklarge, 0, sizeof(toklarge));
-+ r = jsmn_parse(&p, js, strlen(js), toksmall, i);
-+ check(r == JSMN_ERROR_NOMEM);
-+
-+ memcpy(toklarge, toksmall, sizeof(toksmall));
-+
-+ r = jsmn_parse(&p, js, strlen(js), toklarge, 10);
-+ check(r >= 0);
-+ check(tokeq(js, toklarge, 4,
-+ JSMN_ARRAY, -1, -1, 3,
-+ JSMN_PRIMITIVE, "1",
-+ JSMN_PRIMITIVE, "true",
-+ JSMN_ARRAY, -1, -1, 2,
-+ JSMN_PRIMITIVE, "123",
-+ JSMN_STRING, "hello", 0));
-+ }
-+ return 0;
-+}
-+
-+int test_unquoted_keys(void) {
-+#ifndef JSMN_STRICT
-+ int r;
-+ jsmn_parser p;
-+ jsmntok_t tok[10];
-+ const char *js;
-+
-+ jsmn_init(&p);
-+ js = "key1: \"value\"\nkey2 : 123";
-+
-+ r = jsmn_parse(&p, js, strlen(js), tok, 10);
-+ check(r >= 0);
-+ check(tokeq(js, tok, 4,
-+ JSMN_PRIMITIVE, "key1",
-+ JSMN_STRING, "value", 0,
-+ JSMN_PRIMITIVE, "key2",
-+ JSMN_PRIMITIVE, "123"));
-+#endif
-+ return 0;
-+}
-+
-+int test_issue_22(void) {
-+ int r;
-+ jsmn_parser p;
-+ jsmntok_t tokens[128];
-+ const char *js;
-+
-+ js = "{ \"height\":10, \"layers\":[ { \"data\":[6,6], \"height\":10, "
-+ "\"name\":\"Calque de Tile 1\", \"opacity\":1, \"type\":\"tilelayer\", "
-+ "\"visible\":true, \"width\":10, \"x\":0, \"y\":0 }], "
-+ "\"orientation\":\"orthogonal\", \"properties\": { }, \"tileheight\":32, "
-+ "\"tilesets\":[ { \"firstgid\":1, \"image\":\"..\\/images\\/tiles.png\", "
-+ "\"imageheight\":64, \"imagewidth\":160, \"margin\":0, \"name\":\"Tiles\", "
-+ "\"properties\":{}, \"spacing\":0, \"tileheight\":32, \"tilewidth\":32 }], "
-+ "\"tilewidth\":32, \"version\":1, \"width\":10 }";
-+ jsmn_init(&p);
-+ r = jsmn_parse(&p, js, strlen(js), tokens, 128);
-+ check(r >= 0);
-+ return 0;
-+}
-+
-+int test_issue_27(void) {
-+ const char *js =
-+ "{ \"name\" : \"Jack\", \"age\" : 27 } { \"name\" : \"Anna\", ";
-+ check(parse(js, JSMN_ERROR_PART, 8));
-+ return 0;
-+}
-+
-+int test_input_length(void) {
-+ const char *js;
-+ int r;
-+ jsmn_parser p;
-+ jsmntok_t tokens[10];
-+
-+ js = "{\"a\": 0}garbage";
-+
-+ jsmn_init(&p);
-+ r = jsmn_parse(&p, js, 8, tokens, 10);
-+ check(r == 3);
-+ check(tokeq(js, tokens, 3,
-+ JSMN_OBJECT, -1, -1, 1,
-+ JSMN_STRING, "a", 1,
-+ JSMN_PRIMITIVE, "0"));
-+ return 0;
-+}
-+
-+int test_count(void) {
-+ jsmn_parser p;
-+ const char *js;
-+
-+ js = "{}";
-+ jsmn_init(&p);
-+ check(jsmn_parse(&p, js, strlen(js), NULL, 0) == 1);
-+
-+ js = "[]";
-+ jsmn_init(&p);
-+ check(jsmn_parse(&p, js, strlen(js), NULL, 0) == 1);
-+
-+ js = "[[]]";
-+ jsmn_init(&p);
-+ check(jsmn_parse(&p, js, strlen(js), NULL, 0) == 2);
-+
-+ js = "[[], []]";
-+ jsmn_init(&p);
-+ check(jsmn_parse(&p, js, strlen(js), NULL, 0) == 3);
-+
-+ js = "[[], []]";
-+ jsmn_init(&p);
-+ check(jsmn_parse(&p, js, strlen(js), NULL, 0) == 3);
-+
-+ js = "[[], [[]], [[], []]]";
-+ jsmn_init(&p);
-+ check(jsmn_parse(&p, js, strlen(js), NULL, 0) == 7);
-+
-+ js = "[\"a\", [[], []]]";
-+ jsmn_init(&p);
-+ check(jsmn_parse(&p, js, strlen(js), NULL, 0) == 5);
-+
-+ js = "[[], \"[], [[]]\", [[]]]";
-+ jsmn_init(&p);
-+ check(jsmn_parse(&p, js, strlen(js), NULL, 0) == 5);
-+
-+ js = "[1, 2, 3]";
-+ jsmn_init(&p);
-+ check(jsmn_parse(&p, js, strlen(js), NULL, 0) == 4);
-+
-+ js = "[1, 2, [3, \"a\"], null]";
-+ jsmn_init(&p);
-+ check(jsmn_parse(&p, js, strlen(js), NULL, 0) == 7);
-+
-+ return 0;
-+}
-+
-+
-+int test_nonstrict(void) {
-+#ifndef JSMN_STRICT
-+ const char *js;
-+ js = "a: 0garbage";
-+ check(parse(js, 2, 2,
-+ JSMN_PRIMITIVE, "a",
-+ JSMN_PRIMITIVE, "0garbage"));
-+
-+ js = "Day : 26\nMonth : Sep\n\nYear: 12";
-+ check(parse(js, 6, 6,
-+ JSMN_PRIMITIVE, "Day",
-+ JSMN_PRIMITIVE, "26",
-+ JSMN_PRIMITIVE, "Month",
-+ JSMN_PRIMITIVE, "Sep",
-+ JSMN_PRIMITIVE, "Year",
-+ JSMN_PRIMITIVE, "12"));
-+#endif
-+ return 0;
-+}
-+
-+int main(void) {
-+ test(test_empty, "test for a empty JSON objects/arrays");
-+ test(test_object, "test for a JSON objects");
-+ test(test_array, "test for a JSON arrays");
-+ test(test_primitive, "test primitive JSON data types");
-+ test(test_string, "test string JSON data types");
-+
-+ test(test_partial_string, "test partial JSON string parsing");
-+ test(test_partial_array, "test partial array reading");
-+ test(test_array_nomem, "test array reading with a smaller number of tokens");
-+ test(test_unquoted_keys, "test unquoted keys (like in JavaScript)");
-+ test(test_input_length, "test strings that are not null-terminated");
-+ test(test_issue_22, "test issue #22");
-+ test(test_issue_27, "test issue #27");
-+ test(test_count, "test tokens count estimation");
-+ test(test_nonstrict, "test for non-strict mode");
-+ printf("\nPASSED: %d\nFAILED: %d\n", test_passed, test_failed);
-+ return (test_failed > 0);
-+}
-diff --git a/src/jsmn/test/testutil.h b/src/jsmn/test/testutil.h
-new file mode 100644
-index 0000000..9a1eb2d
---- /dev/null
-+++ b/src/jsmn/test/testutil.h
-@@ -0,0 +1,94 @@
-+#ifndef __TEST_UTIL_H__
-+#define __TEST_UTIL_H__
-+
-+#include "../jsmn.c"
-+
-+static int vtokeq(const char *s, jsmntok_t *t, int numtok, va_list ap) {
-+ if (numtok > 0) {
-+ int i, start, end, size;
-+ int type;
-+ char *value;
-+
-+ size = -1;
-+ value = NULL;
-+ for (i = 0; i < numtok; i++) {
-+ type = va_arg(ap, int);
-+ if (type == JSMN_STRING) {
-+ value = va_arg(ap, char *);
-+ size = va_arg(ap, int);
-+ start = end = -1;
-+ } else if (type == JSMN_PRIMITIVE) {
-+ value = va_arg(ap, char *);
-+ start = end = size = -1;
-+ } else {
-+ start = va_arg(ap, int);
-+ end = va_arg(ap, int);
-+ size = va_arg(ap, int);
-+ value = NULL;
-+ }
-+ if (t[i].type != type) {
-+ printf("token %d type is %d, not %d\n", i, t[i].type, type);
-+ return 0;
-+ }
-+ if (start != -1 && end != -1) {
-+ if (t[i].start != start) {
-+ printf("token %d start is %d, not %d\n", i, t[i].start, start);
-+ return 0;
-+ }
-+ if (t[i].end != end ) {
-+ printf("token %d end is %d, not %d\n", i, t[i].end, end);
-+ return 0;
-+ }
-+ }
-+ if (size != -1 && t[i].size != size) {
-+ printf("token %d size is %d, not %d\n", i, t[i].size, size);
-+ return 0;
-+ }
-+
-+ if (s != NULL && value != NULL) {
-+ const char *p = s + t[i].start;
-+ if (strlen(value) != t[i].end - t[i].start ||
-+ strncmp(p, value, t[i].end - t[i].start) != 0) {
-+ printf("token %d value is %.*s, not %s\n", i, t[i].end-t[i].start,
-+ s+t[i].start, value);
-+ return 0;
-+ }
-+ }
-+ }
-+ }
-+ return 1;
-+}
-+
-+static int tokeq(const char *s, jsmntok_t *tokens, int numtok, ...) {
-+ int ok;
-+ va_list args;
-+ va_start(args, numtok);
-+ ok = vtokeq(s, tokens, numtok, args);
-+ va_end(args);
-+ return ok;
-+}
-+
-+static int parse(const char *s, int status, int numtok, ...) {
-+ int r;
-+ int ok = 1;
-+ va_list args;
-+ jsmn_parser p;
-+ jsmntok_t *t = malloc(numtok * sizeof(jsmntok_t));
-+
-+ jsmn_init(&p);
-+ r = jsmn_parse(&p, s, strlen(s), t, numtok);
-+ if (r != status) {
-+ printf("status is %d, not %d\n", r, status);
-+ return 0;
-+ }
-+
-+ if (status >= 0) {
-+ va_start(args, numtok);
-+ ok = vtokeq(s, t, numtok, args);
-+ va_end(args);
-+ }
-+ free(t);
-+ return ok;
-+}
-+
-+#endif /* __TEST_UTIL_H__ */
-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA512 Format: 3.0 (quilt) Source: getdns Binary: libgetdns-dev, libgetdns1, getdns-utils Architecture: any Version: 1.1.0~a2-2 Maintainer: Debian DNS Packaging <pkg-dns-devel@lists.alioth.debian.org> Uploaders: Ondřej Surý <ondrej@debian.org>, Scott Kitterman <scott@kitterman.com>, Daniel Kahn Gillmor <dkg@fifthhorseman.net> Homepage: https://getdnsapi.net/ Standards-Version: 3.9.8 Vcs-Browser: https://anonscm.debian.org/git/pkg-dns/getdns.git Vcs-Git: https://anonscm.debian.org/git/pkg-dns/getdns.git Build-Depends: autotools-dev, check, debhelper (>= 9), dh-autoreconf, libev-dev, libevent-dev, libexpat-dev, libidn11-dev, libldns-dev, libunbound-dev, libuv1-dev, unbound-anchor Package-List: getdns-utils deb libs extra arch=any libgetdns-dev deb libdevel extra arch=any libgetdns1 deb libs extra arch=any Checksums-Sha1: 4a20a83884a9ce6027441f9d0c0be58280fd0364 658110 getdns_1.1.0~a2.orig.tar.gz 28fbe8bd20a628bddbcab158a3fc092966c2eb9e 19836 getdns_1.1.0~a2-2.debian.tar.xz Checksums-Sha256: 49204cfe1958e181c149926bbf65d0e30b62359bc8a2e739c6512416dbdac3f6 658110 getdns_1.1.0~a2.orig.tar.gz ac18616f733fde8436fa28ead07854fcf54a9402a442231516a35341dd7108bf 19836 getdns_1.1.0~a2-2.debian.tar.xz Files: d8e93059508fc0898da554bec81d630f 658110 getdns_1.1.0~a2.orig.tar.gz 8c62e360e14de5f7464c0eb4f59fdf07 19836 getdns_1.1.0~a2-2.debian.tar.xz -----BEGIN PGP SIGNATURE----- iQKTBAEBCgB9FiEEMLkz2A/OPZgaLTj7DJm3DvT8uwcFAli/5I5fFIAAAAAALgAo aXNzdWVyLWZwckBub3RhdGlvbnMub3BlbnBncC5maWZ0aGhvcnNlbWFuLm5ldDMw QjkzM0Q4MEZDRTNEOTgxQTJEMzhGQjBDOTlCNzBFRjRGQ0JCMDcACgkQDJm3DvT8 uwdyKhAA7jfEOsmTUG/13vQuczWtXUdBUbmlItxgWLr7a7pMnqyn2BItpFGa9rr4 eWYg+yw2cvPMEv7OmDFpt6Dd+p46KGVFK1GkHJbc7IDdUglLx0I4R2fgRSh6Cs76 cxFGcXxJKBW4OA551fMNuZ1iBqOiPICkj7NX7OTQ67j+PrLWKdmGzOB104O/nq7J 7W1CXl/D9F2M4Ctef/Vqe01E48NRKYPaQcG77dHoWmSN4aVyz09bI9edczEtrHh/ q3ji0hqRFYLl/9cvx+H1WtjLFog0DWSGN9F23p8zFCGiAhUFJ1pTtnx+FJzLw4+u JpOp05x0qD+2G9IcLizSQ7fqU0EdiqMR8tO7PXJRsIDGYj7Y3GpIFbKdVz/7Q1GF Hd4/EKd6vCtVSWbS8Mvfn7YWBSGzCKjs8Ii56HlUH0ViFUy+QETOBkGflD1vYO6e v0oRcF7+dL81txTR5MtDXBD2sebgn/cJxtqW0wDl/MOkaTD8em4fkk+nowrDgcLO DgvHtW4tT6Zxq7aleaqpXq75G7gZgtv/1gJNOM6gopLC7DgZIf3e2oJAUjO7Yxjz JwmhsSIR1UeoGiiS83oi2t/kwwOiEszPMJ/fk5v/X+c87rBsXP/ANg3Re11h9aDl 8jsflc5myu8d76UU8tpxZojd5WFjJ3hhlkDtoQhGbu7wYyKhsRk= =RKHx -----END PGP SIGNATURE-----
Attachment:
getdns_1.1.0~a2-2.debian.tar.xz
Description: application/xz
-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA512 Format: 1.8 Date: Wed, 08 Mar 2017 11:48:09 +0100 Source: getdns Binary: libgetdns-dev libgetdns1 getdns-utils Architecture: source Version: 1.1.0~a2-2 Distribution: unstable Urgency: medium Maintainer: Debian DNS Packaging <pkg-dns-devel@lists.alioth.debian.org> Changed-By: Ondřej Surý <ondrej@debian.org> Description: getdns-utils - modern asynchronous DNS API (utils) libgetdns-dev - modern asynchronous DNS API (development) libgetdns1 - modern asynchronous DNS API (shared library) Closes: 849577 Changes: getdns (1.1.0~a2-2) unstable; urgency=medium . * Use upstream provided src/jsmn/ (Closes: #849577) Checksums-Sha1: 3a6c0917e921180c987446e5c1d5408c86393451 2370 getdns_1.1.0~a2-2.dsc 28fbe8bd20a628bddbcab158a3fc092966c2eb9e 19836 getdns_1.1.0~a2-2.debian.tar.xz 5d7181e1e8c04a674555f1b947186c61818082e9 6486 getdns_1.1.0~a2-2_amd64.buildinfo Checksums-Sha256: bb00bcf568c664fbc50d15111e0af49b2f1cf1507db619f92674d4b1701f8487 2370 getdns_1.1.0~a2-2.dsc ac18616f733fde8436fa28ead07854fcf54a9402a442231516a35341dd7108bf 19836 getdns_1.1.0~a2-2.debian.tar.xz 7b9d2a712d785dfbc370451c643a7cedaf8e91a4e64dfeda5352b7fbfdb0623e 6486 getdns_1.1.0~a2-2_amd64.buildinfo Files: e79c972b279141fce0428388d793499d 2370 libs extra getdns_1.1.0~a2-2.dsc 8c62e360e14de5f7464c0eb4f59fdf07 19836 libs extra getdns_1.1.0~a2-2.debian.tar.xz e5a0ad31cb8b7623ad9e360f5be7e27c 6486 libs extra getdns_1.1.0~a2-2_amd64.buildinfo -----BEGIN PGP SIGNATURE----- iQKTBAEBCgB9FiEEMLkz2A/OPZgaLTj7DJm3DvT8uwcFAli/5I9fFIAAAAAALgAo aXNzdWVyLWZwckBub3RhdGlvbnMub3BlbnBncC5maWZ0aGhvcnNlbWFuLm5ldDMw QjkzM0Q4MEZDRTNEOTgxQTJEMzhGQjBDOTlCNzBFRjRGQ0JCMDcACgkQDJm3DvT8 uwf0VhAA47ruDJjcha0bIoNGrxq7yOvJWcfavK86YTq7CDJTp2aDiZUAylDe5srr mMylJTVOysPQLeAtifrYgNM1kRN5coqOVl/qAK0UFVHXggiPGyBPJSdAOo9FIySp aH0PutYF5LfFcCq/2dwD6/UKJ/lP3jUlOmkOlyyTSd3MpSFBTfc3O11ZWu8ISOoi /8jfu4Fmvrq/QmyQcwxEMW8YVvJmjYIeVao0I7NrXw/rEPMqmkT/kseclhmB3YUx A56A2jcSnb/fh1A2RRHBFWlbI1IYSz5RhmBaohLn4CTECFiuhYB4MpWqFYY00i7t Zdyih4NCP5jv7+lQKFUWTdsDdu++EFf3xuzDiPQWhtNkdCdxNadSoquTelA7pysx V1Du/HE8A3Zz8i4JIZjEV/DHVOesQdaSgghlnKjmfwWcHDDi2ckqNyWA+HU9tHCX Q9cqJdGagBwHbxZ8nRleuMQl5sFYkl/PU4jMFKFGEcnCbKyRtIYjdsQdT0/NmeEf CAuPkMq5pjG6Pbno/do5jQE11vRL6+33jPuFV3mgicewOwFq/Ue/zPJ36TmhDJ5Y hx6pg00UZ9BNNMMPogYJXjsQbCsay9AZS7wM7n9GvgtXHnajUoLIqeQ/PpU9VIOb IJaRmmg99NBavvayhpSiQyx5f7XLSYevH2Cbrc8egwCDABeycFU= =D7UR -----END PGP SIGNATURE-----