]> Savannah Git Hosting - gnulib.git/commitdiff
mbuiter: Optimize.
authorBruno Haible <bruno@clisp.org>
Mon, 17 Jul 2023 18:50:30 +0000 (20:50 +0200)
committerBruno Haible <bruno@clisp.org>
Mon, 17 Jul 2023 18:50:30 +0000 (20:50 +0200)
* lib/mbuiter.h (struct mbuiter_multi): Add cur_max field.
(mbui_init): Initialize it.
(mbuiter_multi_next): Use it instead of MB_CUR_MAX.
(mbuiter_multi_copy): Update.

ChangeLog
lib/mbuiter.h

index 1eea948669cb77bfa9e8769428cbc6d6babfc0ad..88de38a2ae980fc93c214c5d4898ff383d0e670e 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+2023-07-17  Bruno Haible  <bruno@clisp.org>
+
+       mbuiter: Optimize.
+       * lib/mbuiter.h (struct mbuiter_multi): Add cur_max field.
+       (mbui_init): Initialize it.
+       (mbuiter_multi_next): Use it instead of MB_CUR_MAX.
+       (mbuiter_multi_copy): Update.
+
 2023-07-17  Bruno Haible  <bruno@clisp.org>
 
        mbchar: Reduce size of 'struct mbchar'.
index 6a060329411cefc966b7044f767271ddc224b2cc..9e2e90a23593e463a207b5fbc5190d53f049fe61 100644 (file)
@@ -121,6 +121,7 @@ struct mbuiter_multi
                            before and after every mbuiter_multi_next invocation.
                          */
   bool next_done;       /* true if mbui_avail has already filled the following */
+  unsigned int cur_max; /* A cache of MB_CUR_MAX.  */
   struct mbchar cur;    /* the current character:
         const char *cur.ptr          pointer to current character
         The following are only valid after mbui_avail.
@@ -160,7 +161,7 @@ mbuiter_multi_next (struct mbuiter_multi *iter)
     with_shift:
       #endif
       iter->cur.bytes = mbrtoc32 (&iter->cur.wc, iter->cur.ptr,
-                                  strnlen1 (iter->cur.ptr, MB_CUR_MAX),
+                                  strnlen1 (iter->cur.ptr, iter->cur_max),
                                   &iter->state);
       if (iter->cur.bytes == (size_t) -1)
         {
@@ -225,6 +226,7 @@ mbuiter_multi_copy (struct mbuiter_multi *new_iter, const struct mbuiter_multi *
   #endif
     mbszero (&new_iter->state);
   new_iter->next_done = old_iter->next_done;
+  new_iter->cur_max = old_iter->cur_max;
   mb_copy (&new_iter->cur, &old_iter->cur);
 }
 
@@ -234,13 +236,15 @@ typedef struct mbuiter_multi mbui_iterator_t;
 #define mbui_init(iter, startptr) \
   ((iter).cur.ptr = (startptr), \
    (iter).in_shift = false, mbszero (&(iter).state), \
-   (iter).next_done = false)
+   (iter).next_done = false, \
+   (iter).cur_max = MB_CUR_MAX)
 #else
 /* Optimized: no in_shift.  */
 #define mbui_init(iter, startptr) \
   ((iter).cur.ptr = (startptr), \
    mbszero (&(iter).state), \
-   (iter).next_done = false)
+   (iter).next_done = false, \
+   (iter).cur_max = MB_CUR_MAX)
 #endif
 #define mbui_avail(iter) \
   (mbuiter_multi_next (&(iter)), !mb_isnul ((iter).cur))