From ccdafafb818b8714f2f1cfced187955ba0aad85b Mon Sep 17 00:00:00 2001
From: David Robillard <d@drobilla.net>
Date: Fri, 13 Nov 2020 12:17:29 +0100
Subject: Improve IRI reading performance

This allows the compiler to construct a jump table, and avoids a branch.
---
 src/n3.c | 23 +++++++++++++----------
 1 file changed, 13 insertions(+), 10 deletions(-)

(limited to 'src')

diff --git a/src/n3.c b/src/n3.c
index f2c42081..81ec5d56 100644
--- a/src/n3.c
+++ b/src/n3.c
@@ -690,7 +690,8 @@ read_IRIREF(SerdReader* reader, Ref* dest)
 	while (!st) {
 		const int c = eat_byte_safe(reader, peek_byte(reader));
 		switch (c) {
-		case '"': case '<': case '^': case '`': case '{': case '|': case '}':
+		case '"':
+		case '<':
 			*dest = pop_node(reader, *dest);
 			return r_err(reader, SERD_ERR_BAD_SYNTAX,
 			             "invalid IRI character `%c'\n", c);
@@ -711,17 +712,19 @@ read_IRIREF(SerdReader* reader, Ref* dest)
 				break;
 			}
 			break;
+		case '^':
+		case '`':
+		case '{':
+		case '|':
+		case '}':
+			*dest = pop_node(reader, *dest);
+			return r_err(reader, SERD_ERR_BAD_SYNTAX,
+			             "invalid IRI character `%c'\n", c);
 		default:
 			if (c <= 0x20) {
-				if (is_print(c)) {
-					r_err(reader, SERD_ERR_BAD_SYNTAX,
-					      "invalid IRI character `%c' (escape %%%02X)\n",
-					      c, (unsigned)c);
-				} else {
-					r_err(reader, SERD_ERR_BAD_SYNTAX,
-					      "invalid IRI character (escape %%%02X)\n",
-					      (unsigned)c);
-				}
+				r_err(reader, SERD_ERR_BAD_SYNTAX,
+				      "invalid IRI character (escape %%%02X)\n",
+				      (unsigned)c);
 				if (reader->strict) {
 					*dest = pop_node(reader, *dest);
 					return SERD_ERR_BAD_SYNTAX;
-- 
cgit v1.2.1