RPA Toolkit
Added UNICODECFG=no support in the unix build.
authorMartin Stoilov <martin@sigmadrone.org>
Thu, 30 Sep 2021 13:34:48 +0000 (15:34 +0200)
committerMartin Stoilov <martin@sigmadrone.org>
Thu, 30 Sep 2021 13:34:48 +0000 (15:34 +0200)
build/unix/config.mk
rex/rexdfa.h
rex/rexdfatypes.h
rexgrep/rexgrep.c

index cf7fc5a..f4547ae 100644 (file)
@@ -10,7 +10,7 @@ ifndef RPATK_INC_INSTALL
 RPATK_INC_INSTALL = ${RPATK_INSTALL_PREFIX}/usr/include/rpatk
 endif
 
-DEBUG ?= yes
+DEBUG ?= no
 ARCH ?= x86_64
 OS = $(shell uname | tr "[:upper:]" "[:lower:]")
 
@@ -25,6 +25,10 @@ ifeq ($(CCBLD), yes)
 CFLAGS += -fprofile-arcs -ftest-coverage
 endif
 
+ifeq ($(UNICODECFG), no)
+CFLAGS += -DREX_CHAR_TYPE="unsigned char"
+endif
+
 CFLAGS += -Wall -Wextra -Wno-unused-parameter -Wno-unused-variable -Wno-implicit-fallthrough
 
 # The gcc compiler bin path can be either defined in make command via GCC_PATH variable (> make GCC_PATH=xxx)
index 674cff8..db7a17e 100644 (file)
@@ -36,9 +36,9 @@
 extern "C" {
 #endif
 
-#define REX_DFA_HASHBITS(__bytes__, __bitsperbyte__) ((__bytes__) * (__bitsperbyte__))
-#define REX_DFA_HASHSIZE(__bytes__, __bitsperbyte__) (1 << REX_DFA_HASHBITS(__bytes__, __bitsperbyte__))
-#define REX_DFA_HASHMASK(__bytes__, __bitsperbyte__) (REX_DFA_HASHSIZE(__bytes__, __bitsperbyte__) - 1)
+#define REX_DFA_HASHBITS(__bytes__, __bitsperbyte__) ((__bytes__) * (__bitsperbyte__))                                         /* Number of hashbits */
+#define REX_DFA_HASHSIZE(__bytes__, __bitsperbyte__) (1 << REX_DFA_HASHBITS(__bytes__, __bitsperbyte__))       /* The size of the bit array in bits. */
+#define REX_DFA_HASHMASK(__bytes__, __bitsperbyte__) (REX_DFA_HASHSIZE(__bytes__, __bitsperbyte__) - 1)                /* Mask with the number of hash bits set to 1 */
 
 #define REX_BITARRAY_BYTE(__arr__, __entry__) (((unsigned char*)__arr__)[((unsigned int)(__entry__))>>3])
 #define REX_BITARRAY_GET(__arr__, __entry__) ((((unsigned char*)__arr__)[((unsigned int)(__entry__))>>3] & (1 << (((unsigned int)(__entry__)) & 0x7))) ? 1 : 0)
index b3b09e6..6e7ee21 100644 (file)
@@ -27,7 +27,6 @@ typedef unsigned int rexuint_t;
 typedef REX_UINT_TYPE rexuint_t;
 #endif
 
-
 #ifndef REX_CHAR_TYPE
 typedef unsigned int rexchar_t;
 #else
index ad713a5..9af468e 100644 (file)
@@ -147,6 +147,19 @@ do { \
        __shift__ = (__shift__ & REX_DFA_HASHMASK(__bytes__, __bitsperbyte__)); \
 } while (0)
 
+static const char* rex_grep_next_char(const char* input, const char* end)
+{
+       ruint32 wc = *input;
+       if (wc >= 0x80) {
+               int ret = r_utf8_mbtowc(&wc, (const unsigned char*)input, (const unsigned char*)end);
+               if (ret <= 0)
+                       ret = 1;
+               input += ret;
+       } else {
+               input += 1;
+       }
+       return input;
+}
 
 static int rex_grep_dfascan(rexgrep_t *pGrep, const char* start, const char* end, int alloutput)
 {
@@ -172,15 +185,11 @@ static int rex_grep_dfascan(rexgrep_t *pGrep, const char* start, const char* end
                        ret = rex_grep_dfamatch(pGrep, input, end);
 
                if (ret == 0) {
-                       ruint32 wc = *input;
-                       if (wc >= 0x80) {
-                               ret = r_utf8_mbtowc(&wc, (const unsigned char*)input, (const unsigned char*)end);
-                               if (ret <= 0)
-                                       ret = 1;
-                               input += ret;
-                       } else {
-                               input += 1;
-                       }
+                       /*
+                        * rex_grep_dfamatch didn't match anything.
+                        * Move the `input` to the next character in the stream.
+                        */
+                       input = rex_grep_next_char(input, end);
 
                        if (nextshift < end && ((unsigned char)*nextshift) < 0x80) {
                                shifter <<= REX_HASH_BITS;