--- /dev/null
+Return-Path: <jani@nikula.org>\r
+X-Original-To: notmuch@notmuchmail.org\r
+Delivered-To: notmuch@notmuchmail.org\r
+Received: from localhost (localhost [127.0.0.1])\r
+ by olra.theworths.org (Postfix) with ESMTP id AC887421169\r
+ for <notmuch@notmuchmail.org>; Sat, 31 Mar 2012 15:17:49 -0700 (PDT)\r
+X-Virus-Scanned: Debian amavisd-new at olra.theworths.org\r
+X-Amavis-Alert: BAD HEADER SECTION, Duplicate header field: "References"\r
+X-Spam-Flag: NO\r
+X-Spam-Score: -0.7\r
+X-Spam-Level: \r
+X-Spam-Status: No, score=-0.7 tagged_above=-999 required=5\r
+ tests=[RCVD_IN_DNSWL_LOW=-0.7] autolearn=disabled\r
+Received: from olra.theworths.org ([127.0.0.1])\r
+ by localhost (olra.theworths.org [127.0.0.1]) (amavisd-new, port 10024)\r
+ with ESMTP id lCBKfDZhDz74 for <notmuch@notmuchmail.org>;\r
+ Sat, 31 Mar 2012 15:17:48 -0700 (PDT)\r
+Received: from mail-bk0-f53.google.com (mail-bk0-f53.google.com\r
+ [209.85.214.53]) (using TLSv1 with cipher RC4-SHA (128/128 bits))\r
+ (No client certificate requested)\r
+ by olra.theworths.org (Postfix) with ESMTPS id E5395421165\r
+ for <notmuch@notmuchmail.org>; Sat, 31 Mar 2012 15:17:47 -0700 (PDT)\r
+Received: by mail-bk0-f53.google.com with SMTP id j4so1547751bkw.26\r
+ for <notmuch@notmuchmail.org>; Sat, 31 Mar 2012 15:17:47 -0700 (PDT)\r
+X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;\r
+ d=google.com; s=20120113;\r
+ h=from:to:cc:subject:date:message-id:x-mailer:in-reply-to:references\r
+ :in-reply-to:references:x-gm-message-state;\r
+ bh=916Fk5v5PJ7EkIwyO9dergWO6FXSYYcbLohwghi2j7o=;\r
+ b=gr08jZLjNwP2siIiZVdKcMzMGtroTxxqgyZsHmsRP5TwpUvVtwBE2kT+qpuocPxqn0\r
+ UveIwHSRIy6Gr9q6ssLn8FoVj1Jk4mQRXP7Rbe6XsIGlDfoiPkN5hSt4CA6iNB6C52Sj\r
+ MYp8SoH6xByzu1ImUdhKJ7LGH19zTa3h6RBKiAm4Qa9NUFN6i9HVYNu2nvgqPqSdLPf5\r
+ xblO3mI+bT6Q9NC3dWh6V6EYP8js+OjCjuHhhwZwReNFPm+xooRdP2QzLG2kxUXZeO2q\r
+ 77HLAnPmZBTTgvt0KWn+6JOC2AULG8qpUTL+axUa+hboV0HLu3XlF3/MvnkGHJLYCRwD\r
+ 5Mgg==\r
+Received: by 10.204.154.139 with SMTP id o11mr1387845bkw.4.1333232267488;\r
+ Sat, 31 Mar 2012 15:17:47 -0700 (PDT)\r
+Received: from localhost (dsl-hkibrasgw4-fe50f800-253.dhcp.inet.fi.\r
+ [84.248.80.253])\r
+ by mx.google.com with ESMTPS id r8sm8938072bki.2.2012.03.31.15.17.45\r
+ (version=SSLv3 cipher=OTHER); Sat, 31 Mar 2012 15:17:46 -0700 (PDT)\r
+From: Jani Nikula <jani@nikula.org>\r
+To: notmuch@notmuchmail.org\r
+Subject: [PATCH 3/8] hex-escape: add function to decode escaped string\r
+ in-place\r
+Date: Sun, 1 Apr 2012 01:17:23 +0300\r
+Message-Id:\r
+ <026815054d3e01e6f29c0834d43ccabdf6eda481.1333231401.git.jani@nikula.org>\r
+X-Mailer: git-send-email 1.7.5.4\r
+In-Reply-To: <cover.1333231401.git.jani@nikula.org>\r
+References: <cover.1333231401.git.jani@nikula.org>\r
+In-Reply-To: <cover.1333231401.git.jani@nikula.org>\r
+References: <cover.1333231401.git.jani@nikula.org>\r
+X-Gm-Message-State:\r
+ ALoCoQnI9qqQyUZDdWkPmV/b3Yb/QSpGHHob+38RirpGYe7zR67zK8ucrtOzU62C7CwxuaoxC9xb\r
+X-BeenThere: notmuch@notmuchmail.org\r
+X-Mailman-Version: 2.1.13\r
+Precedence: list\r
+List-Id: "Use and development of the notmuch mail system."\r
+ <notmuch.notmuchmail.org>\r
+List-Unsubscribe: <http://notmuchmail.org/mailman/options/notmuch>,\r
+ <mailto:notmuch-request@notmuchmail.org?subject=unsubscribe>\r
+List-Archive: <http://notmuchmail.org/pipermail/notmuch>\r
+List-Post: <mailto:notmuch@notmuchmail.org>\r
+List-Help: <mailto:notmuch-request@notmuchmail.org?subject=help>\r
+List-Subscribe: <http://notmuchmail.org/mailman/listinfo/notmuch>,\r
+ <mailto:notmuch-request@notmuchmail.org?subject=subscribe>\r
+X-List-Received-Date: Sat, 31 Mar 2012 22:17:49 -0000\r
+\r
+Add function hex_decode_inplace() to decode the input string onto\r
+itself.\r
+\r
+Signed-off-by: Jani Nikula <jani@nikula.org>\r
+\r
+---\r
+\r
+This could be folded to "hex-escape: (en|de)code strings to/from\r
+restricted character set".\r
+---\r
+ util/hex-escape.c | 62 ++++++++++++++++++++++++++++++----------------------\r
+ util/hex-escape.h | 6 +++++\r
+ 2 files changed, 42 insertions(+), 26 deletions(-)\r
+\r
+diff --git a/util/hex-escape.c b/util/hex-escape.c\r
+index 9de79df..e794f98 100644\r
+--- a/util/hex-escape.c\r
++++ b/util/hex-escape.c\r
+@@ -98,38 +98,15 @@ hex_encode (void *ctx, const char *in, char **out, size_t *out_size)\r
+ return HEX_SUCCESS;\r
+ }\r
+ \r
+-hex_status_t\r
+-hex_decode (void *ctx, const char *in, char **out, size_t * out_size)\r
++/* Note: This must succeed for p == q to support hex_decode_inplace(). */\r
++static hex_status_t\r
++hex_decode_internal (const char *p, unsigned char *q)\r
+ {\r
+-\r
+ char buf[3];\r
+-\r
+- const char *p;\r
+- unsigned char *q;\r
+-\r
+- size_t escape_count = 0;\r
+- size_t needed = 0;\r
+-\r
+- assert (ctx); assert (in); assert (out); assert (out_size);\r
+-\r
+- size_t len = strlen (in);\r
+-\r
+- for (p = in; *p; p++)\r
+- escape_count += (*p == escape_char);\r
+-\r
+- needed = len - escape_count * 2 + 1;\r
+-\r
+- if (!maybe_realloc (ctx, needed, out, out_size))\r
+- return HEX_OUT_OF_MEMORY;\r
+-\r
+- p = in;\r
+- q = (unsigned char *) *out;\r
+ buf[2] = 0;\r
+ \r
+ while (*p) {\r
+-\r
+ if (*p == escape_char) {\r
+-\r
+ char *endp;\r
+ \r
+ if (!isxdigit ((unsigned char) p[1]) ||\r
+@@ -155,3 +132,36 @@ hex_decode (void *ctx, const char *in, char **out, size_t * out_size)\r
+ \r
+ return HEX_SUCCESS;\r
+ }\r
++\r
++hex_status_t\r
++hex_decode_inplace (char *p)\r
++{\r
++ return hex_decode_internal (p, (unsigned char *) p);\r
++}\r
++\r
++hex_status_t\r
++hex_decode (void *ctx, const char *in, char **out, size_t * out_size)\r
++{\r
++ const char *p;\r
++ unsigned char *q;\r
++\r
++ size_t escape_count = 0;\r
++ size_t needed = 0;\r
++\r
++ assert (ctx); assert (in); assert (out); assert (out_size);\r
++\r
++ size_t len = strlen (in);\r
++\r
++ for (p = in; *p; p++)\r
++ escape_count += (*p == escape_char);\r
++\r
++ needed = len - escape_count * 2 + 1;\r
++\r
++ if (!maybe_realloc (ctx, needed, out, out_size))\r
++ return HEX_OUT_OF_MEMORY;\r
++\r
++ p = in;\r
++ q = (unsigned char *) *out;\r
++\r
++ return hex_decode_internal (p, q);\r
++}\r
+diff --git a/util/hex-escape.h b/util/hex-escape.h\r
+index e409626..be70ad2 100644\r
+--- a/util/hex-escape.h\r
++++ b/util/hex-escape.h\r
+@@ -29,4 +29,10 @@ hex_encode (void *talloc_ctx, const char *in, char **out,\r
+ hex_status_t\r
+ hex_decode (void *talloc_ctx, const char *in, char **out,\r
+ size_t *out_size);\r
++\r
++/*\r
++ * Decode 'in' onto itself.\r
++ */\r
++hex_status_t\r
++hex_decode_inplace (char *in);\r
+ #endif\r
+-- \r
+1.7.5.4\r
+\r