+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'.
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.
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)
{
#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);
}
#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))