/* This function is equivalent to strpbrk() for multibyte strings, * except in that it scans the string in reverse, starting at * rev_start. */ char *mbrevstrpbrk(const char *s, const char *accept, const char *rev_start) { assert(s != NULL && accept != NULL && rev_start != NULL); #ifdef ENABLE_UTF8 if (use_utf8) { bool begin_line = FALSE; while (!begin_line) { const char *q = (*rev_start == '\0') ? NULL : mbstrchr(accept, rev_start); if (q != NULL) return (char *)rev_start; if (rev_start == s) begin_line = TRUE; else rev_start = s + move_mbleft(s, rev_start - s); } return NULL; } else #endif return revstrpbrk(s, accept, rev_start); }
/* This function is equivalent to strpbrk() for multibyte strings, * except in that it scans the string in reverse, starting at rev_start. */ char *mbrevstrpbrk(const char *s, const char *accept, const char *rev_start) { assert(s != NULL && accept != NULL && rev_start != NULL); #ifdef ENABLE_UTF8 if (use_utf8) { if (*rev_start == '\0') { if (rev_start == s) return NULL; rev_start = s + move_mbleft(s, rev_start - s); } while (TRUE) { if (mbstrchr(accept, rev_start) != NULL) return (char *)rev_start; /* If we've reached the head of the string, we found nothing. */ if (rev_start == s) return NULL; rev_start = s + move_mbleft(s, rev_start - s); } } else #endif return revstrpbrk(s, accept, rev_start); }