Re: [PATCH v5 02/12] ctype: support iscntrl, ispunct, isxdigit and isprint
- From
René Scharfe <rene.scharfe@lsrfire.ath.cx>
- Date
- Oct 14, 2012, 12:59 UTC
- Message-ID
- <507AB73D.8010406@lsrfire.ath.cx>
- In-Reply-To
- <1350182110-25936-3-git-send-email-pclouds@gmail.com>
Am 14.10.2012 04:35, schrieb Nguyễn Thái Ngọc Duy:
Show 30 quoted lines
>
> Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
> ---
> ctype.c | 18 ++++++++++++++++++
> git-compat-util.h | 13 +++++++++++++
> 2 files changed, 31 insertions(+)
>
> diff --git a/ctype.c b/ctype.c
> index faeaf34..b4bf48a 100644
> --- a/ctype.c
> +++ b/ctype.c
> @@ -26,6 +26,24 @@ const unsigned char sane_ctype[256] = {
> /* Nothing in the 128.. range */
> };
>
> +enum {
> + CN = GIT_CNTRL,
> + PU = GIT_PUNCT,
> + XD = GIT_XDIGIT,
> +};
> +
> +const unsigned char sane_ctype2[256] = {
> + CN, CN, CN, CN, CN, CN, CN, CN, CN, CN, CN, CN, CN, CN, CN, CN, /* 0..15 */
> + CN, CN, CN, CN, CN, CN, CN, CN, CN, CN, CN, CN, CN, CN, CN, CN, /* 16..31 */
> + 0, PU, PU, PU, PU, PU, PU, PU, PU, PU, PU, PU, PU, PU, PU, PU, /* 32..47 */
> + XD, XD, XD, XD, XD, XD, XD, XD, XD, XD, PU, PU, PU, PU, PU, PU, /* 48..63 */
> + PU, 0, XD, 0, XD, 0, XD, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 64..79 */
> + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, PU, PU, PU, PU, PU, /* 80..95 */
> + PU, 0, XD, 0, XD, 0, XD, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 96..111 */
> + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, PU, PU, PU, PU, CN, /* 112..127 */Shouldn't [ace] (65, 67, 69) and [ACE] (97, 99, 101) be xdigits as well?
But how about using the existing hexval_table instead, like this:
#define isxdigit(x) (hexval_table[(x)] != -1)
With that, couldn't you squeeze the other two classes into the existing sane_type?
By the way, I'm working on a patch series for implementing a lot more character classes with table lookups. It grew out of a desire to make bad_ref_char() faster but perhaps got a bit out of hand by now; it's at 24 patches and still not finished. I'm curious how long we have until it escapes. ;-)
Show 5 quoted lines
> #define is_regex_special(x) sane_istest(x,GIT_GLOB_SPECIAL | GIT_REGEX_SPECIAL) > +#define iscntrl(x) sane_istest2(x, GIT_CNTRL) > +#define ispunct(x) sane_istest2(x, GIT_PUNCT) > +#define isxdigit(x) sane_istest2(x, GIT_XDIGIT) > +#define isprint(x) (isalnum(x) || isspace(x) || ispunct(x))
If a single table is used, you can do with a single table lookup by adding the bits for the component classes, like isalnum and is_regex_special do.
René