Module Name: src Committed By: agc Date: Sat Jun 25 00:37:45 UTC 2011
Modified Files: src/crypto/external/bsd/netpgp/dist/src/lib: keyring.c netpgp.c packet-print.c src/crypto/external/bsd/netpgp/dist/src/libmj: libmj.3 mj.c mj.h src/crypto/external/bsd/netpgp/libmj: shlib_version Log Message: change mj library to take an additional argument for a string type, denoting its length. this allows binary strings to be encoded using libmj. escape magic characters in json strings in a more efficient manner. the previous method was not scalable. update callers to suit bump libmj major version number add examples to the libmj(3) man page To generate a diff of this commit: cvs rdiff -u -r1.49 -r1.50 \ src/crypto/external/bsd/netpgp/dist/src/lib/keyring.c cvs rdiff -u -r1.89 -r1.90 \ src/crypto/external/bsd/netpgp/dist/src/lib/netpgp.c cvs rdiff -u -r1.40 -r1.41 \ src/crypto/external/bsd/netpgp/dist/src/lib/packet-print.c cvs rdiff -u -r1.3 -r1.4 \ src/crypto/external/bsd/netpgp/dist/src/libmj/libmj.3 cvs rdiff -u -r1.4 -r1.5 src/crypto/external/bsd/netpgp/dist/src/libmj/mj.c cvs rdiff -u -r1.2 -r1.3 src/crypto/external/bsd/netpgp/dist/src/libmj/mj.h cvs rdiff -u -r1.1 -r1.2 src/crypto/external/bsd/netpgp/libmj/shlib_version Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/crypto/external/bsd/netpgp/dist/src/lib/keyring.c diff -u src/crypto/external/bsd/netpgp/dist/src/lib/keyring.c:1.49 src/crypto/external/bsd/netpgp/dist/src/lib/keyring.c:1.50 --- src/crypto/external/bsd/netpgp/dist/src/lib/keyring.c:1.49 Mon Nov 15 08:50:32 2010 +++ src/crypto/external/bsd/netpgp/dist/src/lib/keyring.c Sat Jun 25 00:37:44 2011 @@ -57,7 +57,7 @@ #if defined(__NetBSD__) __COPYRIGHT("@(#) Copyright (c) 2009 The NetBSD Foundation, Inc. All rights reserved."); -__RCSID("$NetBSD: keyring.c,v 1.49 2010/11/15 08:50:32 agc Exp $"); +__RCSID("$NetBSD: keyring.c,v 1.50 2011/06/25 00:37:44 agc Exp $"); #endif #ifdef HAVE_FCNTL_H @@ -1039,7 +1039,7 @@ if (pgp_get_debug_level(__FILE__)) { char *s; - mj_asprint(&s, obj); + mj_asprint(&s, obj, MJ_JSON_ENCODE); (void) fprintf(stderr, "pgp_keyring_json: '%s'\n", s); free(s); } Index: src/crypto/external/bsd/netpgp/dist/src/lib/netpgp.c diff -u src/crypto/external/bsd/netpgp/dist/src/lib/netpgp.c:1.89 src/crypto/external/bsd/netpgp/dist/src/lib/netpgp.c:1.90 --- src/crypto/external/bsd/netpgp/dist/src/lib/netpgp.c:1.89 Mon Jan 3 05:34:53 2011 +++ src/crypto/external/bsd/netpgp/dist/src/lib/netpgp.c Sat Jun 25 00:37:44 2011 @@ -34,7 +34,7 @@ #if defined(__NetBSD__) __COPYRIGHT("@(#) Copyright (c) 2009 The NetBSD Foundation, Inc. All rights reserved."); -__RCSID("$NetBSD: netpgp.c,v 1.89 2011/01/03 05:34:53 agc Exp $"); +__RCSID("$NetBSD: netpgp.c,v 1.90 2011/06/25 00:37:44 agc Exp $"); #endif #include <sys/types.h> @@ -509,7 +509,8 @@ static void pobj(FILE *fp, mj_t *obj, int depth) { - unsigned i; + unsigned i; + char *s; if (obj == NULL) { (void) fprintf(stderr, "No object found\n"); @@ -528,7 +529,10 @@ p(fp, obj->value.s, NULL); break; case MJ_STRING: - (void) fprintf(fp, "%.*s", (int)(obj->c), obj->value.s); + if ((i = mj_asprint(&s, obj, MJ_HUMAN)) > 2) { + (void) fprintf(fp, "%.*s", (int)i - 2, &s[1]); + free(s); + } break; case MJ_ARRAY: for (i = 0 ; i < obj->c ; i++) { @@ -582,7 +586,7 @@ int i; if (pgp_get_debug_level(__FILE__)) { - mj_asprint(&s, obj); + mj_asprint(&s, obj, MJ_HUMAN); (void) fprintf(stderr, "formatobj: json is '%s'\n", s); free(s); } @@ -919,7 +923,7 @@ return pgp_keyring_list(netpgp->io, netpgp->pubring, psigs); } -/* list the keys in a keyring, returning a JSON string */ +/* list the keys in a keyring, returning a JSON encoded string */ int netpgp_list_keys_json(netpgp_t *netpgp, char **json, const int psigs) { @@ -935,7 +939,7 @@ (void) fprintf(stderr, "No keys in keyring\n"); return 0; } - ret = mj_asprint(json, &obj); + ret = mj_asprint(json, &obj, MJ_JSON_ENCODE); mj_delete(&obj); return ret; } @@ -1033,7 +1037,7 @@ k += 1; } } while (key != NULL); - ret = mj_asprint(json, &id_array); + ret = mj_asprint(json, &id_array, MJ_JSON_ENCODE); mj_delete(&id_array); return ret; } Index: src/crypto/external/bsd/netpgp/dist/src/lib/packet-print.c diff -u src/crypto/external/bsd/netpgp/dist/src/lib/packet-print.c:1.40 src/crypto/external/bsd/netpgp/dist/src/lib/packet-print.c:1.41 --- src/crypto/external/bsd/netpgp/dist/src/lib/packet-print.c:1.40 Mon Nov 15 08:50:32 2010 +++ src/crypto/external/bsd/netpgp/dist/src/lib/packet-print.c Sat Jun 25 00:37:44 2011 @@ -58,7 +58,7 @@ #if defined(__NetBSD__) __COPYRIGHT("@(#) Copyright (c) 2009 The NetBSD Foundation, Inc. All rights reserved."); -__RCSID("$NetBSD: packet-print.c,v 1.40 2010/11/15 08:50:32 agc Exp $"); +__RCSID("$NetBSD: packet-print.c,v 1.41 2011/06/25 00:37:44 agc Exp $"); #endif #include <string.h> @@ -493,12 +493,12 @@ } (void) memset(keyjson, 0x0, sizeof(*keyjson)); mj_create(keyjson, "object"); - mj_append_field(keyjson, "header", "string", header); + mj_append_field(keyjson, "header", "string", header, -1); mj_append_field(keyjson, "key bits", "integer", (int64_t) numkeybits(pubkey)); - mj_append_field(keyjson, "pka", "string", pgp_show_pka(pubkey->alg)); - mj_append_field(keyjson, "key id", "string", strhexdump(keyid, key->sigid, PGP_KEY_ID_SIZE, "")); + mj_append_field(keyjson, "pka", "string", pgp_show_pka(pubkey->alg), -1); + mj_append_field(keyjson, "key id", "string", strhexdump(keyid, key->sigid, PGP_KEY_ID_SIZE, ""), -1); mj_append_field(keyjson, "fingerprint", "string", - strhexdump(fp, key->sigfingerprint.fingerprint, key->sigfingerprint.length, " ")); + strhexdump(fp, key->sigfingerprint.fingerprint, key->sigfingerprint.length, " "), -1); mj_append_field(keyjson, "birthtime", "integer", pubkey->birthtime); mj_append_field(keyjson, "duration", "integer", pubkey->duration); for (i = 0; i < key->uidc; i++) { @@ -508,8 +508,8 @@ } (void) memset(&sub_obj, 0x0, sizeof(sub_obj)); mj_create(&sub_obj, "array"); - mj_append(&sub_obj, "string", key->uids[i]); - mj_append(&sub_obj, "string", (r >= 0) ? "[REVOKED]" : ""); + mj_append(&sub_obj, "string", key->uids[i], -1); + mj_append(&sub_obj, "string", (r >= 0) ? "[REVOKED]" : "", -1); mj_append_field(keyjson, "uid", "array", &sub_obj); mj_delete(&sub_obj); for (j = 0 ; j < key->subsigc ; j++) { @@ -530,21 +530,21 @@ key->subsigs[j].sig.info.type == PGP_SIG_SUBKEY) { mj_append(&sub_obj, "integer", (int64_t)numkeybits(&key->enckey)); mj_append(&sub_obj, "string", - (const char *)pgp_show_pka(key->enckey.alg)); + (const char *)pgp_show_pka(key->enckey.alg), -1); mj_append(&sub_obj, "string", - strhexdump(keyid, key->encid, PGP_KEY_ID_SIZE, "")); + strhexdump(keyid, key->encid, PGP_KEY_ID_SIZE, ""), -1); mj_append(&sub_obj, "integer", (int64_t)key->enckey.birthtime); mj_append_field(keyjson, "encryption", "array", &sub_obj); mj_delete(&sub_obj); } else { mj_append(&sub_obj, "string", - strhexdump(keyid, key->subsigs[j].sig.info.signer_id, PGP_KEY_ID_SIZE, "")); + strhexdump(keyid, key->subsigs[j].sig.info.signer_id, PGP_KEY_ID_SIZE, ""), -1); mj_append(&sub_obj, "integer", (int64_t)(key->subsigs[j].sig.info.birthtime)); from = 0; trustkey = pgp_getkeybyid(io, keyring, key->subsigs[j].sig.info.signer_id, &from, NULL); mj_append(&sub_obj, "string", - (trustkey) ? (char *)trustkey->uids[trustkey->uid0] : "[unknown]"); + (trustkey) ? (char *)trustkey->uids[trustkey->uid0] : "[unknown]", -1); mj_append_field(keyjson, "sig", "array", &sub_obj); mj_delete(&sub_obj); } @@ -553,7 +553,7 @@ if (pgp_get_debug_level(__FILE__)) { char *buf; - mj_asprint(&buf, keyjson); + mj_asprint(&buf, keyjson, 1); (void) fprintf(stderr, "pgp_sprint_mj: '%s'\n", buf); free(buf); } Index: src/crypto/external/bsd/netpgp/dist/src/libmj/libmj.3 diff -u src/crypto/external/bsd/netpgp/dist/src/libmj/libmj.3:1.3 src/crypto/external/bsd/netpgp/dist/src/libmj/libmj.3:1.4 --- src/crypto/external/bsd/netpgp/dist/src/libmj/libmj.3:1.3 Wed Sep 8 22:17:27 2010 +++ src/crypto/external/bsd/netpgp/dist/src/libmj/libmj.3 Sat Jun 25 00:37:44 2011 @@ -1,4 +1,4 @@ -.\" $NetBSD: libmj.3,v 1.3 2010/09/08 22:17:27 wiz Exp $ +.\" $NetBSD: libmj.3,v 1.4 2011/06/25 00:37:44 agc Exp $ .\" .\" Copyright (c) 2010 Alistair Crooks <a...@netbsd.org> .\" All rights reserved. @@ -23,7 +23,7 @@ .\" (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF .\" THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. .\" -.Dd August 5, 2010 +.Dd June 22, 2011 .Dt LIBMJ 3 .Os .Sh NAME @@ -90,6 +90,10 @@ .Fo mj_pretty .Fa "mj_t *atom" "void *stream" "unsigned depth" "const char *trailer" .Fc +.Ft const char * +.Fo mj_string_rep +.Fa "mj_t *atom" +.Fc .Sh DESCRIPTION .Nm is a small library interface to allow JSON text to be created and parsed. @@ -208,6 +212,57 @@ and the first match after the starting point will be returned. For objects, an incremental value of 2 should be used, and an even start value should be specified. +.Pp +String values should be created and appended using two parameters in +the stdarg fields, that of the string itself, and its length in bytes +immediately after the string. +A value of +.Dv -1 +may be used if the string length is not known. +.Sh EXAMPLES +The follow code fragment will make a JSON object +out of the string +.Dq Hello <USERNAME>\en +in the +buffer called +.Dq buf +where +.Dq USERNAME +is the name of the user taken from the runtime environment. +The encoded text will be in an allocated buffer called +.Dq s +.Bd -literal -offset indent +mj_t atom; +char buf[BUFSIZ]; +char *s; +int cc; + +(void) memset(\*[Am]atom, 0x0, sizeof(atom)); +cc = snprintf(buf, sizeof(buf), "Hello %s\en", getenv("USER")); +mj_create(\*[Am]atom, "string", buf, cc); +cc = mj_asprint(\*[Am]s, \*[Am]atom, MJ_JSON_ENCODE); +.Ed +.Pp +and the following example will take the (binary) text which has been encoded into +JSON and is in the buffer +.Dq buf , +such as in the previous example, and re-create the original text: +.Bd -literal -offset indent +int from, to, tok, cc; +char *s; +mj_t atom; + +(void) memset(\*[Am]atom, 0x0, sizeof(atom)); +from = to = tok = 0; +mj_parse(\*[Am]atom, buf, \*[Am]from, \*[Am]to, \*[Am]tok); +cc = mj_asprint(\*[Am]s, \*[Am]atom, MJ_HUMAN); +printf("%.*s", cc, s); +.Ed +.Pp +The +.Dv s +pointer points to allocated storage with the original NUL-terminated string +in it. .Sh SEE ALSO .Xr calloc 3 , .Xr free 3 Index: src/crypto/external/bsd/netpgp/dist/src/libmj/mj.c diff -u src/crypto/external/bsd/netpgp/dist/src/libmj/mj.c:1.4 src/crypto/external/bsd/netpgp/dist/src/libmj/mj.c:1.5 --- src/crypto/external/bsd/netpgp/dist/src/libmj/mj.c:1.4 Wed Sep 8 03:21:22 2010 +++ src/crypto/external/bsd/netpgp/dist/src/libmj/mj.c Sat Jun 25 00:37:44 2011 @@ -37,7 +37,7 @@ /* save 'n' chars of 's' in malloc'd memory */ static char * -strnsave(const char *s, int n, unsigned esc) +strnsave(const char *s, int n, unsigned encoded) { char *newc; char *cp; @@ -46,16 +46,25 @@ if (n < 0) { n = (int)strlen(s); } - NEWARRAY(char, cp, (n * 2) + 1, "strnsave", return NULL); - if (esc) { + NEWARRAY(char, cp, n + n + 1, "strnsave", return NULL); + if (encoded) { newc = cp; for (i = 0 ; i < n ; i++) { - if (*s == '\\') { - *newc++ = *s++; + if ((uint8_t)*s == 0xac) { + *newc++ = (char)0xac; + *newc++ = '1'; + s += 1; } else if (*s == '"') { - *newc++ = '\\'; + *newc++ = (char)0xac; + *newc++ = '2'; + s += 1; + } else if (*s == 0x0) { + *newc++ = (char)0xac; + *newc++ = '0'; + s += 1; + } else { + *newc++ = *s++; } - *newc++ = *s++; } *newc = 0x0; } else { @@ -87,7 +96,7 @@ atom->type = MJ_NUMBER; atom->c = snprintf(number, sizeof(number), "%g", d); - atom->value.s = strnsave(number, (int)atom->c, 0); + atom->value.s = strnsave(number, (int)atom->c, MJ_HUMAN); } /* create an integer */ @@ -98,15 +107,15 @@ atom->type = MJ_NUMBER; atom->c = snprintf(number, sizeof(number), "%" PRIi64, i); - atom->value.s = strnsave(number, (int)atom->c, 0); + atom->value.s = strnsave(number, (int)atom->c, MJ_HUMAN); } /* create a string */ static void -create_string(mj_t *atom, const char *s) +create_string(mj_t *atom, const char *s, ssize_t len) { atom->type = MJ_STRING; - atom->value.s = strnsave(s, -1, 1); + atom->value.s = strnsave(s, (int)len, MJ_JSON_ENCODE); atom->c = (unsigned)strlen(atom->value.s); } @@ -180,6 +189,8 @@ mj_create(mj_t *atom, const char *type, ...) { va_list args; + ssize_t len; + char *s; if (strcmp(type, "false") == 0) { atom->type = MJ_FALSE; @@ -199,8 +210,10 @@ va_end(args); } else if (strcmp(type, "string") == 0) { va_start(args, type); - create_string(atom, (char *)va_arg(args, char *)); + s = (char *)va_arg(args, char *); + len = (size_t)va_arg(args, size_t); va_end(args); + create_string(atom, s, len); } else if (strcmp(type, "array") == 0) { atom->type = MJ_ARRAY; } else if (strcmp(type, "object") == 0) { @@ -214,10 +227,12 @@ /* put a JSON tree into a text string */ int -mj_snprint(char *buf, size_t size, mj_t *atom) +mj_snprint(char *buf, size_t size, mj_t *atom, int encoded) { - unsigned i; - int cc; + unsigned i; + char *s; + char *bp; + int cc; switch(atom->type) { case MJ_NULL: @@ -229,11 +244,41 @@ case MJ_NUMBER: return snprintf(buf, size, "%s", atom->value.s); case MJ_STRING: - return snprintf(buf, size, "\"%s\"", atom->value.s); + if (encoded) { + return snprintf(buf, size, "\"%s\"", atom->value.s); + } + for (bp = buf, *bp++ = '"', s = atom->value.s ; + (size_t)(bp - buf) < size && (unsigned)(s - atom->value.s) < atom->c ; ) { + if ((uint8_t)*s == 0xac) { + switch(s[1]) { + case '0': + *bp++ = 0x0; + s += 2; + break; + case '1': + *bp++ = (char)0xac; + s += 2; + break; + case '2': + *bp++ = '"'; + s += 2; + break; + default: + (void) fprintf(stderr, "unrecognised character '%02x'\n", (uint8_t)s[1]); + s += 1; + break; + } + } else { + *bp++ = *s++; + } + } + *bp++ = '"'; + *bp = 0x0; + return (int)(bp - buf) - 1; case MJ_ARRAY: cc = snprintf(buf, size, "[ "); for (i = 0 ; i < atom->c ; i++) { - cc += mj_snprint(&buf[cc], size - cc, &atom->value.v[i]); + cc += mj_snprint(&buf[cc], size - cc, &atom->value.v[i], encoded); if (i < atom->c - 1) { cc += snprintf(&buf[cc], size - cc, ", "); } @@ -242,9 +287,9 @@ case MJ_OBJECT: cc = snprintf(buf, size, "{ "); for (i = 0 ; i < atom->c ; i += 2) { - cc += mj_snprint(&buf[cc], size - cc, &atom->value.v[i]); + cc += mj_snprint(&buf[cc], size - cc, &atom->value.v[i], encoded); cc += snprintf(&buf[cc], size - cc, ":"); - cc += mj_snprint(&buf[cc], size - cc, &atom->value.v[i + 1]); + cc += mj_snprint(&buf[cc], size - cc, &atom->value.v[i + 1], encoded); if (i + 1 < atom->c - 1) { cc += snprintf(&buf[cc], size - cc, ", "); } @@ -258,7 +303,7 @@ /* allocate and print the atom */ int -mj_asprint(char **buf, mj_t *atom) +mj_asprint(char **buf, mj_t *atom, int encoded) { int size; @@ -266,8 +311,7 @@ if ((*buf = calloc(1, (unsigned)(size + 1))) == NULL) { return -1; } - (void) mj_snprint(*buf, (unsigned)(size + 1), atom); - return size + 1; + return mj_snprint(*buf, (unsigned)(size + 1), atom, encoded) + 1; } /* read into a JSON tree from a string */ @@ -278,11 +322,11 @@ switch(atom->type = *tok = gettok(s, from, to, tok)) { case MJ_NUMBER: - atom->value.s = strnsave(&s[*from], *to - *from, 1); + atom->value.s = strnsave(&s[*from], *to - *from, MJ_JSON_ENCODE); atom->c = atom->size = (unsigned)strlen(atom->value.s); return gettok(s, from, to, tok); case MJ_STRING: - atom->value.s = strnsave(&s[*from + 1], *to - *from - 2, 1); + atom->value.s = strnsave(&s[*from + 1], *to - *from - 2, MJ_HUMAN); atom->c = atom->size = (unsigned)strlen(atom->value.s); return gettok(s, from, to, tok); case MJ_NULL: @@ -364,7 +408,7 @@ case MJ_STRING: case MJ_NUMBER: (void) memcpy(dst, src, sizeof(*dst)); - dst->value.s = strnsave(src->value.s, -1, 0); + dst->value.s = strnsave(src->value.s, -1, MJ_HUMAN); dst->c = dst->size = (unsigned)strlen(dst->value.s); return 1; case MJ_ARRAY: @@ -399,6 +443,7 @@ for (i = 0 ; i < atom->c ; i++) { mj_delete(&atom->value.v[i]); } + /* XXX - agc - causing problems? free(atom->value.v); */ break; default: break; @@ -449,6 +494,8 @@ mj_append(mj_t *atom, const char *type, ...) { va_list args; + ssize_t len; + char *s; if (atom->type != MJ_ARRAY && atom->type != MJ_OBJECT) { return 0; @@ -456,7 +503,9 @@ ALLOC(mj_t, atom->value.v, atom->size, atom->c, 10, 10, "mj_append()", return 0); va_start(args, type); if (strcmp(type, "string") == 0) { - create_string(&atom->value.v[atom->c++], (char *)va_arg(args, char *)); + s = (char *)va_arg(args, char *); + len = (ssize_t)va_arg(args, ssize_t); + create_string(&atom->value.v[atom->c++], s, len); } else if (strcmp(type, "integer") == 0) { create_integer(&atom->value.v[atom->c++], (int64_t)va_arg(args, int64_t)); } else if (strcmp(type, "object") == 0 || strcmp(type, "array") == 0) { @@ -473,15 +522,19 @@ mj_append_field(mj_t *atom, const char *name, const char *type, ...) { va_list args; + ssize_t len; + char *s; if (atom->type != MJ_OBJECT) { return 0; } - mj_append(atom, "string", name); + mj_append(atom, "string", name, -1); ALLOC(mj_t, atom->value.v, atom->size, atom->c, 10, 10, "mj_append_field()", return 0); va_start(args, type); if (strcmp(type, "string") == 0) { - create_string(&atom->value.v[atom->c++], (char *)va_arg(args, char *)); + s = (char *)va_arg(args, char *); + len = (ssize_t)va_arg(args, ssize_t); + create_string(&atom->value.v[atom->c++], s, len); } else if (strcmp(type, "integer") == 0) { create_integer(&atom->value.v[atom->c++], (int64_t)va_arg(args, int64_t)); } else if (strcmp(type, "object") == 0 || strcmp(type, "array") == 0) { @@ -541,6 +594,7 @@ { unsigned i; FILE *fp; + char *s; fp = (FILE *)vp; switch(mj->type) { @@ -552,7 +606,9 @@ break; case MJ_STRING: indent(fp, depth, NULL); - (void) fprintf(fp, "\"%s\"", mj->value.s); + mj_asprint(&s, mj, MJ_HUMAN); + (void) fprintf(fp, "\"%s\"", s); + free(s); break; case MJ_ARRAY: indent(fp, depth, "[\n"); @@ -573,3 +629,25 @@ indent(fp, 0, trailer); return 1; } + +/* show the contents of the simple atom as a string representation */ +const char * +mj_string_rep(mj_t *atom) +{ + if (atom == NULL) { + return 0; + } + switch(atom->type) { + case MJ_STRING: + case MJ_NUMBER: + return atom->value.s; + case MJ_NULL: + return "null"; + case MJ_FALSE: + return "false"; + case MJ_TRUE: + return "true"; + default: + return NULL; + } +} Index: src/crypto/external/bsd/netpgp/dist/src/libmj/mj.h diff -u src/crypto/external/bsd/netpgp/dist/src/libmj/mj.h:1.2 src/crypto/external/bsd/netpgp/dist/src/libmj/mj.h:1.3 --- src/crypto/external/bsd/netpgp/dist/src/libmj/mj.h:1.2 Wed Sep 8 03:21:22 2010 +++ src/crypto/external/bsd/netpgp/dist/src/libmj/mj.h Sat Jun 25 00:37:44 2011 @@ -1,5 +1,5 @@ /*- - * Copyright (c) 2010 Alistair Crooks <a...@netbsd.org> + * Copyright (c) 2010,2011 Alistair Crooks <a...@netbsd.org> * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -23,7 +23,7 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef MJ_H_ -#define MJ_H_ 20100718 +#define MJ_H_ 20110607 enum { MJ_NULL = 1, @@ -32,7 +32,12 @@ MJ_NUMBER = 4, MJ_STRING = 5, MJ_ARRAY = 6, - MJ_OBJECT = 7 + MJ_OBJECT = 7, + + MJ_LAST = MJ_OBJECT, + + MJ_HUMAN = 0, /* human readable, not encoded */ + MJ_JSON_ENCODE = 1 /* encoded JSON */ }; /* a minimalist JSON node */ @@ -47,23 +52,28 @@ } mj_t; /* creation and deletion */ -int mj_create(mj_t *, const char *, ...); -int mj_parse(mj_t *, const char *, int *, int *, int *); -int mj_append(mj_t *, const char *, ...); -int mj_append_field(mj_t *, const char *, const char *, ...); -int mj_deepcopy(mj_t *, mj_t *); -void mj_delete(mj_t *); +int mj_create(mj_t */*atom*/, const char */*type*/, .../*value*/); +int mj_parse(mj_t */*atom*/, const char */*s*/, int */*from*/, + int */*to*/, int */*token*/); +int mj_append(mj_t */*atom*/, const char */*type*/, .../*value*/); +int mj_append_field(mj_t */*atom*/, const char */*name*/, const char */*type*/, + .../*value*/); +int mj_deepcopy(mj_t */*dst*/, mj_t */*src*/); +void mj_delete(mj_t */*atom*/); /* JSON object access */ -int mj_arraycount(mj_t *); -int mj_object_find(mj_t *, const char *, const unsigned, const unsigned); -mj_t *mj_get_atom(mj_t *, ...); -int mj_lint(mj_t *); +int mj_arraycount(mj_t */*atom*/); +int mj_object_find(mj_t */*atom*/, const char */*name*/, + const unsigned /*from*/, const unsigned /*incr*/); +mj_t *mj_get_atom(mj_t */*atom*/, ...); +int mj_lint(mj_t */*atom*/); /* textual output */ -int mj_snprint(char *, size_t, mj_t *); -int mj_asprint(char **, mj_t *); -int mj_string_size(mj_t *); -int mj_pretty(mj_t *, void *, unsigned, const char *); +int mj_snprint(char */*buf*/, size_t /*size*/, mj_t */*atom*/, int /*encoded*/); +int mj_asprint(char **/*bufp*/, mj_t */*atom*/, int /*encoded*/); +int mj_string_size(mj_t */*atom*/); +int mj_pretty(mj_t */*atom*/, void */*fp*/, unsigned /*depth*/, + const char */*trailer*/); +const char *mj_string_rep(mj_t */*atom*/); #endif Index: src/crypto/external/bsd/netpgp/libmj/shlib_version diff -u src/crypto/external/bsd/netpgp/libmj/shlib_version:1.1 src/crypto/external/bsd/netpgp/libmj/shlib_version:1.2 --- src/crypto/external/bsd/netpgp/libmj/shlib_version:1.1 Sat Aug 7 04:17:49 2010 +++ src/crypto/external/bsd/netpgp/libmj/shlib_version Sat Jun 25 00:37:44 2011 @@ -1,2 +1,2 @@ -major=0 +major=1 minor=0