src/string.c

changeset 591
7df0bcaecffa
parent 590
02a56701a5cb
child 593
ea9b41b5ebbc
     1.1 --- a/src/string.c	Tue Oct 04 18:55:20 2022 +0200
     1.2 +++ b/src/string.c	Tue Oct 04 19:25:07 2022 +0200
     1.3 @@ -227,14 +227,7 @@
     1.4      return (cxmutstr) {(char *) result.ptr, result.length};
     1.5  }
     1.6  
     1.7 -#define ptable_r(dest, useheap, ptable, index) (dest = useheap ? \
     1.8 -    ((size_t*)ptable)[index] : (size_t) ((uint8_t*)ptable)[index])
     1.9 -
    1.10 -#define ptable_w(useheap, ptable, index, src) do {\
    1.11 -    if (!useheap) ((uint8_t*)ptable)[index] = (uint8_t) src;\
    1.12 -    else ((size_t*)ptable)[index] = src;\
    1.13 -    } while (0)
    1.14 -
    1.15 +#define STRSTR_SBO_BUFLEN 512
    1.16  
    1.17  cxstring cx_strstr(
    1.18          cxstring haystack,
    1.19 @@ -257,14 +250,14 @@
    1.20       * and we want to avoid that.
    1.21       */
    1.22  
    1.23 -    /* static prefix table */
    1.24 -    static uint8_t s_prefix_table[512];
    1.25 +    /* local prefix table */
    1.26 +    size_t s_prefix_table[STRSTR_SBO_BUFLEN];
    1.27  
    1.28 -    /* check pattern length and use appropriate prefix table */
    1.29 +    /* check needle length and use appropriate prefix table */
    1.30      /* if the pattern exceeds static prefix table, allocate on the heap */
    1.31 -    register int useheap = needle.length >= 512;
    1.32 -    register void *ptable = useheap ? calloc(needle.length + 1,
    1.33 -                                             sizeof(size_t)) : s_prefix_table;
    1.34 +    bool useheap = needle.length >= STRSTR_SBO_BUFLEN;
    1.35 +    register size_t *ptable = useheap ? calloc(needle.length + 1,
    1.36 +                                               sizeof(size_t)) : s_prefix_table;
    1.37  
    1.38      /* keep counter in registers */
    1.39      register size_t i, j;
    1.40 @@ -272,14 +265,14 @@
    1.41      /* fill prefix table */
    1.42      i = 0;
    1.43      j = 0;
    1.44 -    ptable_w(useheap, ptable, i, j);
    1.45 +    ptable[i] = j;
    1.46      while (i < needle.length) {
    1.47          while (j >= 1 && needle.ptr[j - 1] != needle.ptr[i]) {
    1.48 -            ptable_r(j, useheap, ptable, j - 1);
    1.49 +            j = ptable[j - 1];
    1.50          }
    1.51          i++;
    1.52          j++;
    1.53 -        ptable_w(useheap, ptable, i, j);
    1.54 +        ptable[i] = j;
    1.55      }
    1.56  
    1.57      /* search */
    1.58 @@ -288,7 +281,7 @@
    1.59      j = 1;
    1.60      while (i < haystack.length) {
    1.61          while (j >= 1 && haystack.ptr[i] != needle.ptr[j - 1]) {
    1.62 -            ptable_r(j, useheap, ptable, j - 1);
    1.63 +            j = ptable[j - 1];
    1.64          }
    1.65          i++;
    1.66          j++;

mercurial