Am 14.10.2012 04:35, schrieb Nguyễn Thái Ngọc Duy:

Signed-off-by: Nguyễn Thái Ngọc Duy <pclo...@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. ;-)

 #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é

--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to