[PATCH v2 2/5] util: Function to parse boolean term queries
authorAustin Clements <amdragon@MIT.EDU>
Wed, 26 Dec 2012 03:48:40 +0000 (22:48 +1900)
committerW. Trevor King <wking@tremily.us>
Fri, 7 Nov 2014 17:52:48 +0000 (09:52 -0800)
81/70b8efd689922d71d26d332c9626523fa34de0 [new file with mode: 0644]

diff --git a/81/70b8efd689922d71d26d332c9626523fa34de0 b/81/70b8efd689922d71d26d332c9626523fa34de0
new file mode 100644 (file)
index 0000000..81db42e
--- /dev/null
@@ -0,0 +1,163 @@
+Return-Path: <amdragon@mit.edu>\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 8EE61431FBF\r
+       for <notmuch@notmuchmail.org>; Tue, 25 Dec 2012 19:49:00 -0800 (PST)\r
+X-Virus-Scanned: Debian amavisd-new at olra.theworths.org\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 deUZlYMmh2AO for <notmuch@notmuchmail.org>;\r
+       Tue, 25 Dec 2012 19:48:58 -0800 (PST)\r
+Received: from dmz-mailsec-scanner-5.mit.edu (DMZ-MAILSEC-SCANNER-5.MIT.EDU\r
+       [18.7.68.34])\r
+       by olra.theworths.org (Postfix) with ESMTP id 58DE2431FAE\r
+       for <notmuch@notmuchmail.org>; Tue, 25 Dec 2012 19:48:58 -0800 (PST)\r
+X-AuditID: 12074422-b7f616d000000e7c-17-50da73a900d4\r
+Received: from mailhub-auth-3.mit.edu ( [18.9.21.43])\r
+       by dmz-mailsec-scanner-5.mit.edu (Symantec Messaging Gateway) with SMTP\r
+       id C1.4B.03708.9A37AD05; Tue, 25 Dec 2012 22:48:57 -0500 (EST)\r
+Received: from outgoing.mit.edu (OUTGOING-AUTH.MIT.EDU [18.7.22.103])\r
+       by mailhub-auth-3.mit.edu (8.13.8/8.9.2) with ESMTP id qBQ3muQ1025518; \r
+       Tue, 25 Dec 2012 22:48:56 -0500\r
+Received: from drake.dyndns.org (c-76-21-105-205.hsd1.ca.comcast.net\r
+       [76.21.105.205]) (authenticated bits=0)\r
+       (User authenticated as amdragon@ATHENA.MIT.EDU)\r
+       by outgoing.mit.edu (8.13.6/8.12.4) with ESMTP id qBQ3mrh5013182\r
+       (version=TLSv1/SSLv3 cipher=AES256-SHA bits=256 verify=NOT);\r
+       Tue, 25 Dec 2012 22:48:55 -0500 (EST)\r
+Received: from amthrax by drake.dyndns.org with local (Exim 4.77)\r
+       (envelope-from <amdragon@mit.edu>)\r
+       id 1Tnhz8-0002yy-O5; Tue, 25 Dec 2012 22:48:50 -0500\r
+From: Austin Clements <amdragon@MIT.EDU>\r
+To: notmuch@notmuchmail.org\r
+Subject: [PATCH v2 2/5] util: Function to parse boolean term queries\r
+Date: Tue, 25 Dec 2012 22:48:40 -0500\r
+Message-Id: <1356493723-11085-3-git-send-email-amdragon@mit.edu>\r
+X-Mailer: git-send-email 1.7.10.4\r
+In-Reply-To: <1356493723-11085-1-git-send-email-amdragon@mit.edu>\r
+References: <1356493723-11085-1-git-send-email-amdragon@mit.edu>\r
+X-Brightmail-Tracker:\r
+ H4sIAAAAAAAAA+NgFjrPIsWRmVeSWpSXmKPExsUixCmqrbuy+FaAwazPRhY3WrsZLZqmO1us\r
+       nstjcf3mTGYHFo+ds+6ye9y6/5rd49mqW8weWw69Zw5gieKySUnNySxLLdK3S+DKOHXuMWPB\r
+       E5GKJ5c+szUwPuXvYuTkkBAwkbjRtIoNwhaTuHBvPZDNxSEksI9R4tvfbhYIZwOjxORfz1kh\r
+       nItMEt+unmaHcOYySvw7uJ4ZpJ9NQENi2/7ljCC2iIC0xM67s1lBbGaBPImHj7ayg9jCAi4S\r
+       d879YgGxWQRUJRYe+Qlm8wo4SPTufMoOcYeiRPezCUB3cHBwCjhK7HxQBxIWAiqZ+PA80wRG\r
+       /gWMDKsYZVNyq3RzEzNzilOTdYuTE/PyUot0TfVyM0v0UlNKNzGCwo3dRWkH48+DSocYBTgY\r
+       lXh4N3y/GSDEmlhWXJl7iFGSg0lJlHd7wa0AIb6k/JTKjMTijPii0pzU4kOMEhzMSiK8zh+B\r
+       ynlTEiurUovyYVLSHCxK4rzXUm76CwmkJ5akZqemFqQWwWRlODiUJHg3FwENFSxKTU+tSMvM\r
+       KUFIM3FwggznARp+E6SGt7ggMbc4Mx0if4pRUUqc9wJIQgAkkVGaB9cLSwevGMWBXhHm3QNS\r
+       xQNMJXDdr4AGMwENjuW7ATK4JBEhJdUAjE3VbX8XztT72cIwa47oneUPZyTuT/F4sKmg0Mzq\r
+       Rc4n6VJD2Ujb6w9yF8s1fte4Gp92YsKUN3u3FbC8UerX0BfYpTix5bUA92S3Sbf0vH8oHmCx\r
+       OFV1alKjFYNbBpcTwyJunoN8jG9eRyzRm/TqkUirSyrni+V1PvsWeef8iJ+YpKXwzk5MiaU4\r
+       I9FQi7moOBEA49dt/+ICAAA=\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: Wed, 26 Dec 2012 03:49:01 -0000\r
+\r
+This parses the subset of Xapian's boolean term quoting rules that are\r
+used by make_boolean_term.  This is provided as a generic string\r
+utility, but will be used shortly in notmuch restore to parse and\r
+optimize for ID queries.\r
+---\r
+ util/string-util.c |   51 +++++++++++++++++++++++++++++++++++++++++++++++++++\r
+ util/string-util.h |   11 +++++++++++\r
+ 2 files changed, 62 insertions(+)\r
+\r
+diff --git a/util/string-util.c b/util/string-util.c\r
+index e4bea21..db01b4b 100644\r
+--- a/util/string-util.c\r
++++ b/util/string-util.c\r
+@@ -96,3 +96,54 @@ make_boolean_term (void *ctx, const char *prefix, const char *term,\r
\r
+     return 0;\r
+ }\r
++\r
++int\r
++parse_boolean_term (void *ctx, const char *str,\r
++                  char **prefix_out, char **term_out)\r
++{\r
++    *prefix_out = *term_out = NULL;\r
++\r
++    /* Parse prefix */\r
++    const char *pos = strchr (str, ':');\r
++    if (! pos)\r
++      goto FAIL;\r
++    *prefix_out = talloc_strndup (ctx, str, pos - str);\r
++    ++pos;\r
++\r
++    /* Implement de-quoting compatible with make_boolean_term. */\r
++    if (*pos == '"') {\r
++      char *out = talloc_strdup (ctx, pos + 1);\r
++      int closed = 0;\r
++      /* Find the closing quote and un-double doubled internal\r
++       * quotes. */\r
++      for (pos = *term_out = out; *pos; ) {\r
++          if (*pos == '"') {\r
++              ++pos;\r
++              if (*pos != '"') {\r
++                  /* Found the closing quote. */\r
++                  closed = 1;\r
++                  break;\r
++              }\r
++          }\r
++          *out++ = *pos++;\r
++      }\r
++      /* Did the term terminate without a closing quote or is there\r
++       * trailing text after the closing quote? */\r
++      if (!closed || *pos)\r
++          goto FAIL;\r
++      *out = '\0';\r
++    } else {\r
++      *term_out = talloc_strdup (ctx, pos);\r
++      /* Check for text after the boolean term. */\r
++      while (*pos > ' ' && *pos != ')')\r
++          ++pos;\r
++      if (*pos)\r
++          goto FAIL;\r
++    }\r
++    return 0;\r
++\r
++ FAIL:\r
++    talloc_free (*prefix_out);\r
++    talloc_free (*term_out);\r
++    return 1;\r
++}\r
+diff --git a/util/string-util.h b/util/string-util.h\r
+index 7475e2c..aff2d65 100644\r
+--- a/util/string-util.h\r
++++ b/util/string-util.h\r
+@@ -28,4 +28,15 @@ char *strtok_len (char *s, const char *delim, size_t *len);\r
+ int make_boolean_term (void *talloc_ctx, const char *prefix, const char *term,\r
+                      char **buf, size_t *len);\r
\r
++/* Parse a boolean term query produced by make_boolean_term, returning\r
++ * the prefix in *prefix_out and the term in *term_out.  *prefix_out\r
++ * and *term_out will be talloc'd with context ctx.\r
++ *\r
++ * Return: 0 on success, non-zero on parse error (including trailing\r
++ * data in str).\r
++ */\r
++int\r
++parse_boolean_term (void *ctx, const char *str,\r
++                  char **prefix_out, char **term_out);\r
++\r
+ #endif\r
+-- \r
+1.7.10.4\r
+\r