tech-kern archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

libprop w/o JSON support experiment



Since a few ramdisks / images over various "size challenged" architectures
recently did grow I wondered about the recent addition of JSON support
to libprop. The library is common kernel/userland code but AFAICT there is
no use for JSON in the kernel variant.

So I did the patch below and tried to find out how easy it is to separate
this feature (for userland only and also avoid it in size challenged cruchned
ramdisks). I only did test mips and amd64 sizes for now, but the results
were discuraging: savings were less thank 1k overall. And the patch is
quite ugly.

Maybe I overlooked something and there were more savings possible - or maybe
it is just not worth the obfuscation.

Martin


Index: common/include/prop/prop_object.h
===================================================================
RCS file: /cvsroot/src/common/include/prop/prop_object.h,v
retrieving revision 1.9
diff -u -p -r1.9 prop_object.h
--- common/include/prop/prop_object.h	23 Apr 2025 02:58:52 -0000	1.9
+++ common/include/prop/prop_object.h	9 May 2025 18:40:40 -0000
@@ -55,7 +55,9 @@ typedef enum {
 
 typedef enum {
 	PROP_FORMAT_XML		=	0,
+#ifdef _PROPLIB_WITH_JSON
 	PROP_FORMAT_JSON	=	1
+#endif
 } prop_format_t;
 
 __BEGIN_DECLS
Index: common/lib/libprop/prop_array.c
===================================================================
RCS file: /cvsroot/src/common/lib/libprop/prop_array.c,v
retrieving revision 1.24
diff -u -p -r1.24 prop_array.c
--- common/lib/libprop/prop_array.c	26 Apr 2025 17:13:23 -0000	1.24
+++ common/lib/libprop/prop_array.c	9 May 2025 18:40:40 -0000
@@ -55,9 +55,11 @@ _PROP_MALLOC_DEFINE(M_PROP_ARRAY, "prop 
 
 static const struct _prop_object_type_tags _prop_array_type_tags = {
 	.xml_tag		=	"array",
+#ifdef _PROPLIB_WITH_JSON
 	.json_open_tag		=	"[",
 	.json_close_tag		=	"]",
 	.json_empty_sep		=	" ",
+#endif
 };
 
 struct _prop_array_iterator {
@@ -161,10 +163,15 @@ _prop_array_externalize(struct _prop_obj
 	struct _prop_array_iterator *pai;
 	bool rv = false;
 	const char * const sep =
-	    ctx->poec_format == PROP_FORMAT_JSON ? "," : NULL;
+#ifdef _PROPLIB_WITH_JSON
+	    ctx->poec_format == PROP_FORMAT_JSON ? "," :
+#endif
+		 NULL;
 
+#ifdef _PROPLIB_WITH_JSON
 	_PROP_ASSERT(ctx->poec_format == PROP_FORMAT_XML ||
 		     ctx->poec_format == PROP_FORMAT_JSON);
+#endif
 
 	_PROP_RWLOCK_RDLOCK(pa->pa_rwlock);
 
@@ -827,6 +834,7 @@ _prop_array_internalize_continue(prop_st
 	 *
 	 * (FWIW, RFC 8259 section 9 seems to specifically allow this.)
 	 */
+#ifdef _PROPLIB_WITH_JSON
 	if (ctx->poic_format == PROP_FORMAT_JSON) {
 		ctx->poic_cp =
 		    _prop_object_internalize_skip_whitespace(ctx->poic_cp);
@@ -834,6 +842,7 @@ _prop_array_internalize_continue(prop_st
 			ctx->poic_cp++;
 		}
 	}
+#endif
 	return (_prop_array_internalize_body(stack, obj, ctx));
 
  bad:
@@ -850,6 +859,7 @@ _prop_array_internalize_body(prop_stack_
 
 	_PROP_ASSERT(array != NULL);
 
+#ifdef _PROPLIB_WITH_JSON
 	if (ctx->poic_format == PROP_FORMAT_JSON) {
 		ctx->poic_cp =
 		    _prop_object_internalize_skip_whitespace(ctx->poic_cp);
@@ -860,7 +870,9 @@ _prop_array_internalize_body(prop_stack_
 			ctx->poic_cp++;
 			return true;
 		}
-	} else {
+	} else
+#endif
+	 {
 		/* Fetch the next tag. */
 		if (_prop_object_internalize_find_tag(ctx, NULL,
 					_PROP_TAG_TYPE_EITHER) == false)
Index: common/lib/libprop/prop_bool.c
===================================================================
RCS file: /cvsroot/src/common/lib/libprop/prop_bool.c,v
retrieving revision 1.21
diff -u -p -r1.21 prop_bool.c
--- common/lib/libprop/prop_bool.c	26 Apr 2025 17:13:23 -0000	1.21
+++ common/lib/libprop/prop_bool.c	9 May 2025 18:40:40 -0000
@@ -45,11 +45,15 @@ static const char falsestr[] = "false";
 
 static const struct _prop_object_type_tags _prop_bool_true_type_tags = {
 	.xml_tag	=	truestr,
+#ifdef _PROPLIB_WITH_JSON
 	.json_open_tag	=	truestr,
+#endif
 };
 static const struct _prop_object_type_tags _prop_bool_false_type_tags = {
 	.xml_tag	=	falsestr,
+#ifdef _PROPLIB_WITH_JSON
 	.json_open_tag	=	falsestr,
+#endif
 };
 
 static _prop_object_free_rv_t
Index: common/lib/libprop/prop_data.c
===================================================================
RCS file: /cvsroot/src/common/lib/libprop/prop_data.c,v
retrieving revision 1.20
diff -u -p -r1.20 prop_data.c
--- common/lib/libprop/prop_data.c	26 Apr 2025 17:13:23 -0000	1.20
+++ common/lib/libprop/prop_data.c	9 May 2025 18:40:40 -0000
@@ -112,6 +112,7 @@ _prop_data_externalize(struct _prop_obje
 	uint8_t output[4];
 	uint8_t input[3];
 
+#ifdef _PROPLIB_WITH_JSON
 	_PROP_ASSERT(ctx->poec_format == PROP_FORMAT_XML ||
 		     ctx->poec_format == PROP_FORMAT_JSON);
 
@@ -121,6 +122,7 @@ _prop_data_externalize(struct _prop_obje
 	if (ctx->poec_format == PROP_FORMAT_JSON) {
 		return false;
 	}
+#endif
 
 	if (pd->pd_size == 0)
 		return (_prop_object_externalize_empty_tag(ctx,
@@ -637,10 +639,12 @@ _prop_data_internalize(prop_stack_t stac
 	uint8_t *buf;
 	size_t len, alen;
 
+#ifdef _PROPLIB_WITH_JSON
 	/* No JSON binary data object representation. */
 	if (ctx->poic_format == PROP_FORMAT_JSON) {
 		return true;
 	}
+#endif
 
 	/*
 	 * We don't accept empty elements.
Index: common/lib/libprop/prop_dictionary.c
===================================================================
RCS file: /cvsroot/src/common/lib/libprop/prop_dictionary.c,v
retrieving revision 1.48
diff -u -p -r1.48 prop_dictionary.c
--- common/lib/libprop/prop_dictionary.c	26 Apr 2025 17:13:23 -0000	1.48
+++ common/lib/libprop/prop_dictionary.c	9 May 2025 18:40:40 -0000
@@ -103,15 +103,19 @@ _PROP_MALLOC_DEFINE(M_PROP_DICT, "prop d
 
 static const struct _prop_object_type_tags _prop_dictionary_type_tags = {
 	.xml_tag		=	"dict",
+#ifdef _PROPLIB_WITH_JSON
 	.json_open_tag		=	"{",
 	.json_close_tag		=	"}",
 	.json_empty_sep		=	" ",
+#endif
 };
 
 static const struct _prop_object_type_tags _prop_dict_key_type_tags = {
 	.xml_tag		=	"key",
+#ifdef _PROPLIB_WITH_JSON
 	.json_open_tag		=	"\"",
 	.json_close_tag		=	"\"",
+#endif
 };
 
 struct _prop_dictionary_iterator {
@@ -445,6 +449,7 @@ _prop_dictionary_externalize_one(struct 
 		return false;
 	}
 
+#ifdef _PROPLIB_WITH_JSON
 	switch (ctx->poec_format) {
 	case PROP_FORMAT_JSON:
 		if (_prop_object_externalize_append_cstring(ctx,
@@ -454,12 +459,15 @@ _prop_dictionary_externalize_one(struct 
 		break;
 	
 	default:		/* XML */
+#endif
 		if (_prop_object_externalize_end_line(ctx, NULL) == false ||
 		    _prop_object_externalize_start_line(ctx) == false) {
 			return false;
 		}
+#ifdef _PROPLIB_WITH_JSON
 		break;
 	}
+#endif
 
 	return (*po->po_type->pot_extern)(ctx, po);
 }
@@ -474,10 +482,15 @@ _prop_dictionary_externalize(struct _pro
 	struct _prop_dictionary_iterator *pdi;
 	bool rv = false;
 	const char * const sep =
-	    ctx->poec_format == PROP_FORMAT_JSON ? "," : NULL;
+#ifdef _PROPLIB_WITH_JSON
+	    ctx->poec_format == PROP_FORMAT_JSON ? "," :
+#endif
+		 NULL;
 
+#ifdef _PROPLIB_WITH_JSON
 	_PROP_ASSERT(ctx->poec_format == PROP_FORMAT_XML ||
 		     ctx->poec_format == PROP_FORMAT_JSON);
+#endif
 
 	_PROP_RWLOCK_RDLOCK(pd->pd_rwlock);
 
@@ -1361,6 +1374,7 @@ _prop_dictionary_internalize_continue(pr
 	 *
 	 * (FWIW, RFC 8259 section 9 seems to specifically allow this.)
 	 */
+#ifdef _PROPLIB_WITH_JSON
 	if (ctx->poic_format == PROP_FORMAT_JSON) {
 		ctx->poic_cp =
 		    _prop_object_internalize_skip_whitespace(ctx->poic_cp);
@@ -1368,6 +1382,7 @@ _prop_dictionary_internalize_continue(pr
 			ctx->poic_cp++;
 		}
 	}
+#endif
 	return _prop_dictionary_internalize_body(stack, obj, ctx, tmpkey);
 }
 
@@ -1378,6 +1393,7 @@ _prop_dictionary_internalize_body(prop_s
 	prop_dictionary_t dict = *obj;
 	size_t keylen;
 
+#ifdef _PROPLIB_WITH_JSON
 	if (ctx->poic_format == PROP_FORMAT_JSON) {
 		ctx->poic_cp =
 		    _prop_object_internalize_skip_whitespace(ctx->poic_cp);
@@ -1399,7 +1415,9 @@ _prop_dictionary_internalize_body(prop_s
 		if (*ctx->poic_cp == '"') {
 			goto bad;
 		}
-	} else {
+	} else
+#endif
+	 {
 		/* Fetch the next tag. */
 		if (_prop_object_internalize_find_tag(ctx, NULL,
 					_PROP_TAG_TYPE_EITHER) == false)
@@ -1427,6 +1445,7 @@ _prop_dictionary_internalize_body(prop_s
 	_PROP_ASSERT(keylen <= PDK_MAXKEY);
 	tmpkey[keylen] = '\0';
 
+#ifdef _PROPLIB_WITH_JSON
 	if (ctx->poic_format == PROP_FORMAT_JSON) {
 		if (*ctx->poic_cp != '"') {
 			goto bad;
@@ -1443,7 +1462,9 @@ _prop_dictionary_internalize_body(prop_s
 			goto bad;
 		}
 		ctx->poic_cp++;
-	} else {
+	} else
+#endif
+	 {
 		if (_prop_object_internalize_find_tag(ctx, "key",
 					_PROP_TAG_TYPE_END) == false)
 			goto bad;
Index: common/lib/libprop/prop_number.c
===================================================================
RCS file: /cvsroot/src/common/lib/libprop/prop_number.c,v
retrieving revision 1.36
diff -u -p -r1.36 prop_number.c
--- common/lib/libprop/prop_number.c	26 Apr 2025 17:13:23 -0000	1.36
+++ common/lib/libprop/prop_number.c	9 May 2025 18:40:40 -0000
@@ -200,10 +200,12 @@ _prop_number_externalize(struct _prop_ob
 {
 	prop_number_t pn = v;
 	char tmpstr[32];
+#ifdef _PROPLIB_WITH_JSON
 	const bool json = ctx->poec_format == PROP_FORMAT_JSON;
 
 	_PROP_ASSERT(ctx->poec_format == PROP_FORMAT_XML ||
 		     ctx->poec_format == PROP_FORMAT_JSON);
+#endif
 
 	/*
 	 * For unsigned numbers, we output in hex for XML, decimal for JSON.
@@ -211,7 +213,10 @@ _prop_number_externalize(struct _prop_ob
 	 */
 	if (pn->pn_value.pnv_is_unsigned) {
 		snprintf(tmpstr, sizeof(tmpstr),
-		    json ? "%" PRIu64 : "0x%" PRIx64,
+#ifdef _PROPLIB_WITH_JSON
+		    json ? "%" PRIu64 :
+#endif
+			 "0x%" PRIx64,
 		    pn->pn_value.pnv_unsigned);
 	} else {
 		snprintf(tmpstr, sizeof(tmpstr), "%" PRIi64,
@@ -684,7 +689,11 @@ _prop_number_internalize(prop_stack_t st
 	struct _prop_number_value pnv;
 
 	/* JSON numbers are always base-10. */
-	const int base = ctx->poic_format == PROP_FORMAT_JSON ? 10 : 0;
+	const int base =
+#ifdef _PROPLIB_WITH_JSON
+		 ctx->poic_format == PROP_FORMAT_JSON ? 10 :
+#endif
+		 0;
 
 	memset(&pnv, 0, sizeof(pnv));
 
@@ -704,7 +713,10 @@ _prop_number_internalize(prop_stack_t st
 			return (true);
 	} else if (ctx->poic_cp[0] == '0' && ctx->poic_cp[1] == 'x') {
 		/* No hex numbers in JSON. */
-		if (ctx->poic_format == PROP_FORMAT_JSON ||
+		if (
+#ifdef _PROPLIB_WITH_JSON
+			ctx->poic_format == PROP_FORMAT_JSON ||
+#endif
 		    _prop_number_internalize_unsigned(ctx, &pnv, 16) == false)
 			return (true);
 	} else {
@@ -714,7 +726,10 @@ _prop_number_internalize(prop_stack_t st
 	}
 
 	/* No end tag to advance over in JSON. */
-	if (ctx->poic_format != PROP_FORMAT_JSON &&
+	if (
+#ifdef _PROPLIB_WITH_JSON
+		ctx->poic_format != PROP_FORMAT_JSON &&
+#endif
 	    _prop_object_internalize_find_tag(ctx, "integer",
 					      _PROP_TAG_TYPE_END) == false)
 		return (true);
Index: common/lib/libprop/prop_object.c
===================================================================
RCS file: /cvsroot/src/common/lib/libprop/prop_object.c,v
retrieving revision 1.39
diff -u -p -r1.39 prop_object.c
--- common/lib/libprop/prop_object.c	26 Apr 2025 17:13:23 -0000	1.39
+++ common/lib/libprop/prop_object.c	9 May 2025 18:40:40 -0000
@@ -143,6 +143,7 @@ _prop_object_externalize_start_tag(
 {
 	bool rv;
 
+#ifdef _PROPLIB_WITH_JSON
 	_PROP_ASSERT(ctx->poec_format == PROP_FORMAT_XML ||
 		     ctx->poec_format == PROP_FORMAT_JSON);
 
@@ -154,6 +155,7 @@ _prop_object_externalize_start_tag(
 		break;
 
 	default:		/* XML */
+#endif
 		rv = _prop_object_externalize_append_char(ctx, '<') &&
 		     _prop_object_externalize_append_cstring(ctx,
 							     tags->xml_tag) &&
@@ -162,8 +164,10 @@ _prop_object_externalize_start_tag(
 		       _prop_object_externalize_append_cstring(ctx,
 							       tagattrs))) &&
 		     _prop_object_externalize_append_char(ctx, '>');
+#ifdef _PROPLIB_WITH_JSON
 		break;
 	}
+#endif
 
 	return rv;
 }
@@ -179,6 +183,7 @@ _prop_object_externalize_end_tag(
 {
 	bool rv;
 
+#ifdef _PROPLIB_WITH_JSON
 	_PROP_ASSERT(ctx->poec_format == PROP_FORMAT_XML ||
 		     ctx->poec_format == PROP_FORMAT_JSON);
 
@@ -190,13 +195,16 @@ _prop_object_externalize_end_tag(
 		break;
 	
 	default:		/* XML */
+#endif
 		rv = _prop_object_externalize_append_char(ctx, '<') &&
 		     _prop_object_externalize_append_char(ctx, '/') &&
 		     _prop_object_externalize_append_cstring(ctx,
 							     tags->xml_tag) &&
 		     _prop_object_externalize_append_char(ctx, '>');
+#ifdef _PROPLIB_WITH_JSON
 		break;
 	}
+#endif
 
 	return rv;
 }
@@ -212,6 +220,7 @@ _prop_object_externalize_empty_tag(
 {
 	bool rv;
 
+#ifdef _PROPLIB_WITH_JSON
 	_PROP_ASSERT(ctx->poec_format == PROP_FORMAT_XML ||
 		     ctx->poec_format == PROP_FORMAT_JSON);
 
@@ -236,13 +245,16 @@ _prop_object_externalize_empty_tag(
 		break;
 
 	default:		/* XML */
+#endif
 		rv = _prop_object_externalize_append_char(ctx, '<') &&
 		     _prop_object_externalize_append_cstring(ctx,
 							     tags->xml_tag) &&
 		     _prop_object_externalize_append_char(ctx, '/') &&
 		     _prop_object_externalize_append_char(ctx, '>');
+#ifdef _PROPLIB_WITH_JSON
 		break;
 	}
+#endif
 
 	return rv;
 }
@@ -304,6 +316,7 @@ _prop_object_externalize_append_encoded_
 	return (true);
 }
 
+#ifdef _PROPLIB_WITH_JSON
 static bool
 _prop_object_externalize_append_escu(
     struct _prop_object_externalize_context *ctx, uint16_t val)
@@ -399,11 +412,13 @@ _prop_object_externalize_append_encoded_
 
 	return true;
 }
+#endif
 
 bool
 _prop_object_externalize_append_encoded_cstring(
     struct _prop_object_externalize_context *ctx, const char *cp)
 {
+#ifdef _PROPLIB_WITH_JSON
 	_PROP_ASSERT(ctx->poec_format == PROP_FORMAT_XML ||
 		     ctx->poec_format == PROP_FORMAT_JSON);
 
@@ -412,9 +427,12 @@ _prop_object_externalize_append_encoded_
 		return _prop_object_externalize_append_encoded_cstring_json(ctx,
 									    cp);
 	default:
+#endif
 		return _prop_object_externalize_append_encoded_cstring_xml(ctx,
 									   cp);
+#ifdef _PROPLIB_WITH_JSON
 	}
+#endif
 }
 
 #define	BUF_EXPAND		256
@@ -462,9 +480,11 @@ _prop_object_externalize_header(struct _
 "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
 "<!DOCTYPE plist PUBLIC \"-//Apple Computer//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\";>\n";
 
+#ifdef _PROPLIB_WITH_JSON
 	if (ctx->poec_format != PROP_FORMAT_XML) {
 		return true;
 	}
+#endif
 
 	if (_prop_object_externalize_append_cstring(ctx,
 						 _plist_xml_header) == false ||
@@ -489,13 +509,17 @@ _prop_object_externalize_footer(struct _
 		return false;
 	}
 
+#ifdef _PROPLIB_WITH_JSON
 	if (ctx->poec_format == PROP_FORMAT_XML) {
+#endif
 		if (_prop_object_externalize_end_tag(ctx,
 					&_plist_type_tags) == false ||
 		    _prop_object_externalize_end_line(ctx, NULL) == false) {
 			return false;
 		}
+#ifdef _PROPLIB_WITH_JSON
 	}
+#endif
 
 	return _prop_object_externalize_append_char(ctx, '\0');
 }
@@ -519,7 +543,9 @@ _prop_object_externalize_context_alloc(p
 		ctx->poec_len = 0;
 		ctx->poec_capacity = BUF_EXPAND;
 		ctx->poec_depth = 0;
+#ifdef _PROPLIB_WITH_JSON
 		ctx->poec_format = fmt;
+#endif
 	}
 	return (ctx);
 }
@@ -552,9 +578,11 @@ _prop_object_externalize(struct _prop_ob
 	if (obj == NULL || obj->po_type->pot_extern == NULL) {
 		return NULL;
 	}
+#ifdef _PROPLIB_WITH_JSON
 	if (fmt != PROP_FORMAT_XML && fmt != PROP_FORMAT_JSON) {
 		return NULL;
 	}
+#endif
 
 	ctx = _prop_object_externalize_context_alloc(fmt);
 	if (ctx == NULL) {
@@ -823,6 +851,8 @@ _prop_object_internalize_decode_string_x
 	return (true);
 }
 
+#ifdef _PROPLIB_WITH_JSON
+
 static unsigned int
 _prop_object_decode_string_uesc_getu16(const char *src, unsigned int idx,
     uint16_t *valp)
@@ -1039,6 +1069,7 @@ _prop_object_internalize_decode_string_j
 }
 
 #undef ADDCHAR
+#endif
 
 bool
 _prop_object_internalize_decode_string(
@@ -1046,6 +1077,7 @@ _prop_object_internalize_decode_string(
 				char *target, size_t targsize, size_t *sizep,
 				const char **cpp)
 {
+#ifdef _PROPLIB_WITH_JSON
 	_PROP_ASSERT(ctx->poic_format == PROP_FORMAT_XML ||
 		     ctx->poic_format == PROP_FORMAT_JSON);
 
@@ -1055,9 +1087,12 @@ _prop_object_internalize_decode_string(
 		    target, targsize, sizep, cpp);
 
 	default:		/* XML */
+#endif
 		return _prop_object_internalize_decode_string_xml(ctx,
 		    target, targsize, sizep, cpp);
+#ifdef _PROPLIB_WITH_JSON
 	}
+#endif
 }
 
 /*
@@ -1353,7 +1388,11 @@ _prop_object_internalize(const char *dat
 		return NULL;
 	}
 
+#ifdef _PROPLIB_WITH_JSON
 	fmt = *data == '<' ? PROP_FORMAT_XML : PROP_FORMAT_JSON;
+#else
+	fmt = PROP_FORMAT_XML;
+#endif
 
 	ctx = _prop_object_internalize_context_alloc(data, fmt);
 	if (ctx == NULL) {
@@ -1389,7 +1428,9 @@ _prop_object_internalize_context_alloc(c
 	if (ctx == NULL)
 		return (NULL);
 
+#ifdef _PROPLIB_WITH_JSON
 	ctx->poic_format = fmt;
+#endif
 	ctx->poic_data = ctx->poic_cp = data;
 
 	/*
@@ -1397,6 +1438,7 @@ _prop_object_internalize_context_alloc(c
 	 * skip it, if present.  We should never see one, but we're
 	 * allowed to detect and ignore it.  (RFC 8259 section 8.1)
 	 */
+#ifdef _PROPLIB_WITH_JSON
 	if (fmt == PROP_FORMAT_JSON) {
 		if (((unsigned char)data[0] == 0xff &&
 		     (unsigned char)data[1] == 0xfe) ||
@@ -1408,6 +1450,7 @@ _prop_object_internalize_context_alloc(c
 		/* No additional processing work to do for JSON. */
 		return ctx;
 	}
+#endif
 
 	/*
 	 * Skip any whitespace and XML preamble stuff that we don't
Index: common/lib/libprop/prop_object_impl.h
===================================================================
RCS file: /cvsroot/src/common/lib/libprop/prop_object_impl.h,v
retrieving revision 1.38
diff -u -p -r1.38 prop_object_impl.h
--- common/lib/libprop/prop_object_impl.h	26 Apr 2025 17:13:23 -0000	1.38
+++ common/lib/libprop/prop_object_impl.h	9 May 2025 18:40:40 -0000
@@ -51,14 +51,18 @@ struct _prop_object_externalize_context 
 	size_t		poec_capacity;		/* capacity of buffer */
 	size_t		poec_len;		/* current length of string */
 	unsigned int	poec_depth;		/* nesting depth */
+#ifdef _PROPLIB_WITH_JSON
 	prop_format_t	poec_format;		/* output format */
+#endif
 };
 
 struct _prop_object_type_tags {
 	const char	*xml_tag;
+#ifdef _PROPLIB_WITH_JSON
 	const char	*json_open_tag;
 	const char	*json_close_tag;
 	const char	*json_empty_sep;
+#endif
 };
 
 bool		_prop_object_externalize_start_line(
@@ -107,7 +111,9 @@ typedef enum {
 } _prop_tag_type_t;
 
 struct _prop_object_internalize_context {
+#ifdef _PROPLIB_WITH_JSON
 	prop_format_t poic_format;
+#endif
 
 	const char *poic_data;
 	const char *poic_cp;
Index: common/lib/libprop/prop_string.c
===================================================================
RCS file: /cvsroot/src/common/lib/libprop/prop_string.c,v
retrieving revision 1.21
diff -u -p -r1.21 prop_string.c
--- common/lib/libprop/prop_string.c	26 Apr 2025 17:13:23 -0000	1.21
+++ common/lib/libprop/prop_string.c	9 May 2025 18:40:40 -0000
@@ -61,8 +61,10 @@ _PROP_MALLOC_DEFINE(M_PROP_STRING, "prop
 
 static const struct _prop_object_type_tags _prop_string_type_tags = {
 	.xml_tag		=	"string",
+#ifdef _PROPLIB_WITH_JSON
 	.json_open_tag		=	"\"",
 	.json_close_tag		=	"\"",
+#endif
 };
 
 static _prop_object_free_rv_t
@@ -696,13 +698,16 @@ _prop_string_internalize(prop_stack_t st
 	}
 	str[len] = '\0';
 
+#ifdef _PROPLIB_WITH_JSON
 	if (ctx->poic_format == PROP_FORMAT_JSON) {
 		if (*ctx->poic_cp != '"') {
 			_PROP_FREE(str, M_PROP_STRING);
 			return (true);
 		}
 		ctx->poic_cp++;
-	} else {
+	} else
+#endif
+	 {
 		if (_prop_object_internalize_find_tag(ctx, "string",
 					      _PROP_TAG_TYPE_END) == false) {
 			_PROP_FREE(str, M_PROP_STRING);
Index: lib/libprop/Makefile
===================================================================
RCS file: /cvsroot/src/lib/libprop/Makefile,v
retrieving revision 1.23
diff -u -p -r1.23 Makefile
--- lib/libprop/Makefile	26 Apr 2025 17:13:23 -0000	1.23
+++ lib/libprop/Makefile	9 May 2025 18:40:40 -0000
@@ -11,6 +11,9 @@ PROPLIBDIR=${NETBSDSRCDIR}/common/lib/li
 
 CPPFLAGS+=-D_LIBPROP
 CPPFLAGS+=-D_REENTRANT -I${NETBSDSRCDIR}/lib/libc/include
+.if !defined(SMALL)
+CPPFLAGS+=-D_PROPLIB_WITH_JSON
+.endif
 
 .for src in ${SRCS}
 COPTS.${src}+=	-fvisibility=hidden


Home | Main Index | Thread Index | Old Index