[PATCH 3/8] hex-escape: add function to decode escaped string in-place
authorJani Nikula <jani@nikula.org>
Sat, 31 Mar 2012 22:17:23 +0000 (01:17 +0300)
committerW. Trevor King <wking@tremily.us>
Fri, 7 Nov 2014 17:45:55 +0000 (09:45 -0800)
f7/a5e58a80cc6e0fff8db0e72af22b0664449f12 [new file with mode: 0644]

diff --git a/f7/a5e58a80cc6e0fff8db0e72af22b0664449f12 b/f7/a5e58a80cc6e0fff8db0e72af22b0664449f12
new file mode 100644 (file)
index 0000000..21e9aeb
--- /dev/null
@@ -0,0 +1,184 @@
+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