[PATCH] simplify unhex_and_quote

Subject: [PATCH] simplify unhex_and_quote

Date: Sat, 22 Dec 2012 22:59:30 -0400

To: notmuch@notmuchmail.org

Cc: David Bremner

From: david@tethera.net


From: David Bremner <bremner@unb.ca>

the overgeneral definition of a prefix can be replaced by lower case
alphabetic, and still work fine with current notmuch query syntax.

token_len++ is moved to the end, and we restore the delimiter just so
we can leave the string as as we found it.
---

As always, Jani has a keen eye for muddle. Except he's wrong about 
tok_len - prefix_len, and Mark and I are right. Hopefully ;).

Restoring the delimiter at the end might be pointless (since the rest
of the input line is modified), but it is one less surprise for somebody 
repurposing the function.

Patches 5 and 6 can be ignored now.
 tag-util.c |   12 ++++++++----
 1 file changed, 8 insertions(+), 4 deletions(-)

diff --git a/tag-util.c b/tag-util.c
index b0a846b..ee28512 100644
--- a/tag-util.c
+++ b/tag-util.c
@@ -78,11 +78,13 @@ unhex_and_quote (void *ctx, char *encoded, const char *line_for_error,
 	size_t prefix_len;
 	char delim = *(tok + tok_len);
 
-	*(tok + tok_len++) = '\0';
+	*(tok + tok_len) = '\0';
 
-	prefix_len = hex_invariant (tok, tok_len);
+	/* The following matches a superset of prefixes currently
+	 * used by notmuch */
+	prefix_len = strspn (tok, "abcdefghijklmnopqrstuvwxyz");
 
-	if ((strcmp (tok, "*") == 0) || prefix_len >= tok_len - 1) {
+	if ((strcmp (tok, "*") == 0) || prefix_len == tok_len) {
 
 	    /* pass some things through without quoting or decoding.
 	     * Note for '*' this is mandatory.
@@ -98,7 +100,7 @@ unhex_and_quote (void *ctx, char *encoded, const char *line_for_error,
 
 	} else {
 	    /* potential prefix: one for ':', then something after */
-	    if ((tok_len - prefix_len > 2) && *(tok + prefix_len) == ':') {
+	    if ((tok_len - prefix_len >= 2) && *(tok + prefix_len) == ':') {
 		if (! (*query_string = talloc_strndup_append (*query_string,
 							      tok,
 							      prefix_len + 1))) {
@@ -129,6 +131,8 @@ unhex_and_quote (void *ctx, char *encoded, const char *line_for_error,
 		goto DONE;
 	    }
 	}
+	/* restore the string and skip delimiter */
+	*(tok + tok_len++) = delim;
     }
 
   DONE:
-- 
1.7.10.4


Thread: