socsvn commit: r272600 - soc2014/zkorchev/freebsd_head/lib/libsol

zkorchev at FreeBSD.org zkorchev at FreeBSD.org
Mon Aug 18 10:31:39 UTC 2014


Author: zkorchev
Date: Mon Aug 18 10:31:38 2014
New Revision: 272600
URL: http://svnweb.FreeBSD.org/socsvn/?view=rev&rev=272600

Log:
  xml special characters handling

Modified:
  soc2014/zkorchev/freebsd_head/lib/libsol/sol.c

Modified: soc2014/zkorchev/freebsd_head/lib/libsol/sol.c
==============================================================================
--- soc2014/zkorchev/freebsd_head/lib/libsol/sol.c	Mon Aug 18 10:23:41 2014	(r272599)
+++ soc2014/zkorchev/freebsd_head/lib/libsol/sol.c	Mon Aug 18 10:31:38 2014	(r272600)
@@ -52,6 +52,32 @@
 
 // TODO track whether a key or a value is expected and generate error when appropriate?
 
+static void xml_tag(const char *tag)
+{
+	for(; *tag; ++tag)
+		switch (*tag)
+		{
+		case ' ':
+			putchar('_');
+			break;
+		case '(':
+		case ')':
+			break;
+		case '%':
+			fputs(" percent", stdout);
+			break;
+		case '|':
+			fputs(" or ", stdout);
+			break;
+		case '/':
+			putchar('.');
+			break;
+		default:
+			putchar(*tag);
+			break;
+		}
+}
+
 static void xml_open(struct sol_stream *restrict stream)
 {
 	const char *tag;
@@ -62,8 +88,11 @@
 	if (!tag && (stream->ctx.c.depth > 1))
 		tag = stream->ctx.c.stack[stream->ctx.c.depth - 2];
 
-	if (tag)
-		printf("<%s>", tag);
+	if (tag) {
+		putchar('<');
+		xml_tag(tag);
+		putchar('>');
+	}
 	else
 		printf("<item>");
 }
@@ -86,7 +115,9 @@
 
 	if (tag)
 	{
-		printf("</%s>", tag);
+		fputs("</", stdout);
+		xml_tag(tag);
+		putchar('>');
 		if (clean) free(tag);
 	}
 	else


More information about the svn-soc-all mailing list