* lib/unistr/u16-cmp.c (u16_cmp): Use if/else instead of 'continue;'.
* lib/unistr/u16-strcmp.c (u16_strcmp): Likewise.
* lib/unistr/u16-strncmp.c (u16_strncmp): Likewise.
* lib/unistr/u32-cmp.c (u32_cmp): Likewise.
* lib/unistr/u32-strcmp.c (u32_strcmp): Likewise.
* lib/unistr/u32-strncmp.c (u32_strncmp): Likewise.
+2025-11-23 Bruno Haible <bruno@clisp.org>
+
+ unistr: Replace some 'continue;' statements with if/else.
+ * lib/unistr/u16-cmp.c (u16_cmp): Use if/else instead of 'continue;'.
+ * lib/unistr/u16-strcmp.c (u16_strcmp): Likewise.
+ * lib/unistr/u16-strncmp.c (u16_strncmp): Likewise.
+ * lib/unistr/u32-cmp.c (u32_cmp): Likewise.
+ * lib/unistr/u32-strcmp.c (u32_strcmp): Likewise.
+ * lib/unistr/u32-strncmp.c (u32_strncmp): Likewise.
+
2025-11-23 Paul Eggert <eggert@cs.ucla.edu>
count-leading-zeros: fix 2025-11-18 regression
/* Note that the UTF-16 encoding does NOT preserve lexicographic order.
Namely, if uc1 is a 16-bit character and [uc2a,uc2b] is a surrogate pair,
we must enforce uc1 < [uc2a,uc2b], even if uc1 > uc2a. */
- for (; n > 0;)
+ for (; n > 0; n--)
{
uint16_t c1 = *s1++;
uint16_t c2 = *s2++;
- if (c1 == c2)
+ if (c1 != c2)
{
- n--;
- continue;
+ if (c1 < 0xd800 || c1 >= 0xe000)
+ {
+ if (!(c2 < 0xd800 || c2 >= 0xe000))
+ /* c2 is a surrogate, but c1 is not. */
+ return -1;
+ }
+ else
+ {
+ if (c2 < 0xd800 || c2 >= 0xe000)
+ /* c1 is a surrogate, but c2 is not. */
+ return 1;
+ }
+ return (int)c1 - (int)c2;
+ /* > 0 if c1 > c2, < 0 if c1 < c2. */
}
- if (c1 < 0xd800 || c1 >= 0xe000)
- {
- if (!(c2 < 0xd800 || c2 >= 0xe000))
- /* c2 is a surrogate, but c1 is not. */
- return -1;
- }
- else
- {
- if (c2 < 0xd800 || c2 >= 0xe000)
- /* c1 is a surrogate, but c2 is not. */
- return 1;
- }
- return (int)c1 - (int)c2;
- /* > 0 if c1 > c2, < 0 if c1 < c2. */
}
return 0;
}
{
uint16_t c1 = *s1++;
uint16_t c2 = *s2++;
- if (c1 != 0 && c1 == c2)
- continue;
- if (c1 < 0xd800 || c1 >= 0xe000)
+ if (c1 == 0 || c1 != c2)
{
- if (!(c2 < 0xd800 || c2 >= 0xe000))
- /* c2 is a surrogate, but c1 is not. */
- return -1;
+ if (c1 < 0xd800 || c1 >= 0xe000)
+ {
+ if (!(c2 < 0xd800 || c2 >= 0xe000))
+ /* c2 is a surrogate, but c1 is not. */
+ return -1;
+ }
+ else
+ {
+ if (c2 < 0xd800 || c2 >= 0xe000)
+ /* c1 is a surrogate, but c2 is not. */
+ return 1;
+ }
+ return (int)c1 - (int)c2;
+ /* > 0 if c1 > c2, < 0 if c1 < c2. */
}
- else
- {
- if (c2 < 0xd800 || c2 >= 0xe000)
- /* c1 is a surrogate, but c2 is not. */
- return 1;
- }
- return (int)c1 - (int)c2;
- /* > 0 if c1 > c2, < 0 if c1 < c2. */
}
}
/* Note that the UTF-16 encoding does NOT preserve lexicographic order.
Namely, if uc1 is a 16-bit character and [uc2a,uc2b] is a surrogate pair,
we must enforce uc1 < [uc2a,uc2b], even if uc1 > uc2a. */
- for (; n > 0;)
+ for (; n > 0; n--)
{
uint16_t c1 = *s1++;
uint16_t c2 = *s2++;
- if (c1 != 0 && c1 == c2)
+ if (c1 == 0 || c1 != c2)
{
- n--;
- continue;
+ if (c1 < 0xd800 || c1 >= 0xe000)
+ {
+ if (!(c2 < 0xd800 || c2 >= 0xe000))
+ /* c2 is a surrogate, but c1 is not. */
+ return -1;
+ }
+ else
+ {
+ if (c2 < 0xd800 || c2 >= 0xe000)
+ /* c1 is a surrogate, but c2 is not. */
+ return 1;
+ }
+ return (int)c1 - (int)c2;
+ /* > 0 if c1 > c2, < 0 if c1 < c2, = 0 if c1 and c2 are both 0. */
}
- if (c1 < 0xd800 || c1 >= 0xe000)
- {
- if (!(c2 < 0xd800 || c2 >= 0xe000))
- /* c2 is a surrogate, but c1 is not. */
- return -1;
- }
- else
- {
- if (c2 < 0xd800 || c2 >= 0xe000)
- /* c1 is a surrogate, but c2 is not. */
- return 1;
- }
- return (int)c1 - (int)c2;
- /* > 0 if c1 > c2, < 0 if c1 < c2, = 0 if c1 and c2 are both 0. */
}
return 0;
}
int
u32_cmp (const uint32_t *s1, const uint32_t *s2, size_t n)
{
- for (; n > 0;)
+ for (; n > 0; n--)
{
uint32_t uc1 = *s1++;
uint32_t uc2 = *s2++;
- if (uc1 == uc2)
+ if (uc1 != uc2)
{
- n--;
- continue;
+ /* Note that uc1 and uc2 each have at most 31 bits. */
+ return (int)uc1 - (int)uc2;
+ /* > 0 if uc1 > uc2, < 0 if uc1 < uc2. */
}
- /* Note that uc1 and uc2 each have at most 31 bits. */
- return (int)uc1 - (int)uc2;
- /* > 0 if uc1 > uc2, < 0 if uc1 < uc2. */
}
return 0;
}
{
uint32_t uc1 = *s1++;
uint32_t uc2 = *s2++;
- if (uc1 != 0 && uc1 == uc2)
- continue;
- /* Note that uc1 and uc2 each have at most 31 bits. */
- return (int)uc1 - (int)uc2;
- /* > 0 if uc1 > uc2, < 0 if uc1 < uc2. */
+ if (uc1 == 0 || uc1 != uc2)
+ {
+ /* Note that uc1 and uc2 each have at most 31 bits. */
+ return (int)uc1 - (int)uc2;
+ /* > 0 if uc1 > uc2, < 0 if uc1 < uc2. */
+ }
}
}
int
u32_strncmp (const uint32_t *s1, const uint32_t *s2, size_t n)
{
- for (; n > 0;)
+ for (; n > 0; n--)
{
uint32_t uc1 = *s1++;
uint32_t uc2 = *s2++;
- if (uc1 != 0 && uc1 == uc2)
+ if (uc1 == 0 || uc1 != uc2)
{
- n--;
- continue;
+ /* Note that uc1 and uc2 each have at most 31 bits. */
+ return (int)uc1 - (int)uc2;
+ /* > 0 if uc1 > uc2, < 0 if uc1 < uc2, = 0 if uc1 and uc2 are both 0. */
}
- /* Note that uc1 and uc2 each have at most 31 bits. */
- return (int)uc1 - (int)uc2;
- /* > 0 if uc1 > uc2, < 0 if uc1 < uc2, = 0 if uc1 and uc2 are both 0. */
}
return 0;
}