Cleanup parse loop

This commit is contained in:
Kovid Goyal 2024-09-13 09:07:06 +05:30
parent 84f371805a
commit 1f003e392b
No known key found for this signature in database
GPG Key ID: 06BC317B515ACE7C
2 changed files with 6 additions and 13 deletions

View File

@ -114,17 +114,15 @@ bad_entity:
static size_t static size_t
process_entity(const char *input, size_t input_sz, char *output, size_t *output_pos) { process_entity(const char *input, size_t input_sz, char *output, size_t *output_pos) {
size_t input_pos = 0; size_t input_pos = 1; // ignore leading &
while (input_pos < input_sz) { while (input_pos < input_sz) {
char ch = input[input_pos++]; char ch = input[input_pos++];
if (('a' <= ch && ch <= 'z') || ('A' <= ch && ch <= 'Z') || ('0' <= ch && ch <= '9') || (ch == '#' && input_pos == 1)); if (('a' <= ch && ch <= 'z') || ('A' <= ch && ch <= 'Z') || ('0' <= ch && ch <= '9') || (ch == '#' && input_pos == 1));
else if (ch == ';') *output_pos += add_entity(input, input_pos-1, output + *output_pos); else if (ch == ';') { *output_pos += add_entity(input, input_pos-1, output + *output_pos); return input_pos; }
else { else break;
output[(*output_pos)++] = '&'; }
memcpy(output + *output_pos, input, input_pos); memcpy(output + *output_pos, input, input_pos);
*output_pos += input_pos; *output_pos += input_pos;
}
}
return input_pos; return input_pos;
} }
@ -134,12 +132,6 @@ replace(const char *input, size_t input_sz, char *output, int keep_xml_entities)
while (input_pos < input_sz) { while (input_pos < input_sz) {
const char *p = (const char*)memchr(input + input_pos, '&', input_sz - input_pos); const char *p = (const char*)memchr(input + input_pos, '&', input_sz - input_pos);
if (p) { if (p) {
if (p > input + input_pos) {
size_t sz = p - (input + input_pos);
memcpy(output + output_pos, input + input_pos, sz);
output_pos += sz;
input_pos += sz;
}
input_pos += process_entity(p, input_sz - (p - input), output, &output_pos); input_pos += process_entity(p, input_sz - (p - input), output, &output_pos);
} else { } else {
memcpy(output + output_pos, input + input_pos, input_sz - input_pos); memcpy(output + output_pos, input + input_pos, input_sz - input_pos);

View File

@ -2142,6 +2142,7 @@ def find_tests():
from calibre_extensions.fast_html_entities import replace_entities from calibre_extensions.fast_html_entities import replace_entities
def t(inp, exp): def t(inp, exp):
self.assertEqual(exp, replace_entities(inp), f'Failed for input: {inp!r}') self.assertEqual(exp, replace_entities(inp), f'Failed for input: {inp!r}')
t('&amp', '&amp')
t('', '') t('', '')
t('a', 'a') t('a', 'a')