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

Reply via email to