2023-09-27 19:24:48 +03:00
|
|
|
#include "prism/util/pm_memchr.h"
|
2023-06-30 21:30:24 +03:00
|
|
|
|
2023-09-27 19:24:48 +03:00
|
|
|
#define PRISM_MEMCHR_TRAILING_BYTE_MINIMUM 0x40
|
2023-06-30 21:30:24 +03:00
|
|
|
|
2023-10-31 06:28:54 +03:00
|
|
|
/**
|
|
|
|
* We need to roll our own memchr to handle cases where the encoding changes and
|
|
|
|
* we need to search for a character in a buffer that could be the trailing byte
|
|
|
|
* of a multibyte character.
|
|
|
|
*/
|
2023-06-30 21:30:24 +03:00
|
|
|
void *
|
2023-12-01 04:59:00 +03:00
|
|
|
pm_memchr(const void *memory, int character, size_t number, bool encoding_changed, const pm_encoding_t *encoding) {
|
2023-09-27 19:24:48 +03:00
|
|
|
if (encoding_changed && encoding->multibyte && character >= PRISM_MEMCHR_TRAILING_BYTE_MINIMUM) {
|
2023-08-29 17:48:20 +03:00
|
|
|
const uint8_t *source = (const uint8_t *) memory;
|
2023-06-30 21:30:24 +03:00
|
|
|
size_t index = 0;
|
|
|
|
|
|
|
|
while (index < number) {
|
|
|
|
if (source[index] == character) {
|
|
|
|
return (void *) (source + index);
|
|
|
|
}
|
|
|
|
|
2023-08-15 20:00:54 +03:00
|
|
|
size_t width = encoding->char_width(source + index, (ptrdiff_t) (number - index));
|
2023-06-30 21:30:24 +03:00
|
|
|
if (width == 0) {
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
index += width;
|
|
|
|
}
|
|
|
|
|
|
|
|
return NULL;
|
|
|
|
} else {
|
|
|
|
return memchr(memory, character, number);
|
|
|
|
}
|
|
|
|
}
|
2023-09-27 19:24:48 +03:00
|
|
|
|
|
|
|
#undef PRISM_MEMCHR_TRAILING_BYTE_MINIMUM
|