- /* seek the folded equivalent */
- t = cm[c & CM_MASK];
- l = 0;
- r = cmn[c & CM_MASK] - 1;
- while(l <= r && c != t[m = (l + r) / 2].ch)
- if(c < t[m].ch)
- r = m - 1;
- else
- l = m + 1;
- if(l <= r)
- dynstr_append_string(&d, t[m].tr);
- else
- dynstr_append_bytes(&d, start, s - start);
+ /* Normalize */
+ if(c < UNICODE_NCHARS) {
+ /* If this a known character, convert it to lower case */
+ const struct unidata *const ud = &unidata[c / 256][c % 256];
+ c += ud->lower_offset;
+ }
+ /* Convert UCS-4 back to UTF-8 */
+ one_ucs42utf8(c, &d);