[PATCH] util/hex-escape.[ch]: encoding/decoding strings into restricted character set
Tomi Ollila
tomi.ollila at iki.fi
Mon Dec 12 03:29:45 PST 2011
On Sun, 11 Dec 2011 12:19:44 -0400, David Bremner <david at tethera.net> wrote:
> From: David Bremner <bremner at debian.org>
>
> The character set is chosen to be suitable for pathnames, and the same
> as that used by contrib/nmbug. The new encoded/decoded strings are
> allocated using talloc.
> ---
> This isn't urgent, but it is useful for a couple projects I have
> brewing (nmbug compatible dump/restore and tag logging), so I thought
> I would get some feedback on it.
>
>
> util/Makefile.local | 4 +-
> util/hex-escape.c | 110 +++++++++++++++++++++++++++++++++++++++++++++++++++
> util/hex-escape.h | 10 +++++
> 3 files changed, 122 insertions(+), 2 deletions(-)
> create mode 100644 util/hex-escape.c
> create mode 100644 util/hex-escape.h
Like Dmitry mentioned, Makefile.local change in separate patch after
hex-escape additions.
> diff --git a/util/hex-escape.c b/util/hex-escape.c
> new file mode 100644
> index 0000000..c294bb5
> --- /dev/null
> +++ b/util/hex-escape.c
[ ... snip ... ]
> +
> +static int
> +escapes_needed (const char *str){
Opening { in separate line, like in all other source files.
> + int escapes = 0;
> +
> + while (*str) {
> + if (index (HEX_NO_ESCAPE, *str) == NULL)
strchr() instead of index()
And, like Dmitry mentioned, static const char _hex_no_escape[] = "...";
> + escapes++;
> + str++;
> + }
> +
> + return escapes;
> +}
> +
> +char *
> +hex_encode (void *ctx, const char *str) {
> + char *newstr = talloc_size (ctx, strlen (str)+3*escapes_needed (str)+1);
Consistent spacing, like Dmitry mentioned (I compared with
_optimize_tag_query () in notmuch-tag.c ).
> +
> + char *out = newstr;
> +
> + while (*str) {
> + if (index (HEX_NO_ESCAPE, *str)) {
... if (strchr ( _hex_no_escape, *str) != NULL) {
[ ... snip ... ]
> +
> +inline static int
> +_digit (char c) {
Maybe _hexdigit () ?
> + if ('0' <= c && c <= '9')
> + return c - '0';
> +
> + if ('A' <= c && c <= 'F')
> + return c - 'A';
> +
> + if ('a' <= c && c <= 'f')
> + return c - 'a';
Fix this (or change to sscanf) like Dmitry mentioned
(c - 'A' + 10 and c - 'a' + 10)
> +
> + INTERNAL_ERROR ("Illegal hex digit %c", c);
Is this too heavy ? -- but there may not be alternative.
> + /*NOTREACHED*/
> + return 0;
> +}
[ ... snip ... ]
Tomi
More information about the notmuch
mailing list