api: Optimise datum_api_fill_vars by populating replacements in-place

This commit is contained in:
Luke Dashjr 2024-12-12 20:06:08 +00:00
parent f41b2b4ada
commit 15ab54dba3
No known key found for this signature in database
GPG Key ID: A291A2C45D0C504A

View File

@ -244,8 +244,6 @@ void datum_api_fill_vars(const char *input, char *output, size_t max_output_size
size_t output_len = 0;
size_t var_name_len = 0;
char var_name[256];
char replacement[256];
size_t replacement_len;
size_t remaining;
size_t to_copy;
const char *var_start;
@ -281,14 +279,12 @@ void datum_api_fill_vars(const char *input, char *output, size_t max_output_size
if (var_name[8] == 'J' && !vardata->sjob) {
// Leave blank for now
} else {
char * const replacement = &output[output_len];
size_t replacement_max_len = max_output_size - output_len;
if (replacement_max_len > 256) replacement_max_len = 256;
replacement[0] = 0;
func(replacement, sizeof(replacement), vardata);
replacement_len = strlen(replacement);
if (replacement_len) {
to_copy = (replacement_len < max_output_size - output_len - 1) ? replacement_len : max_output_size - output_len - 1;
strncpy(&output[output_len], replacement, to_copy);
output_len += to_copy;
}
func(replacement, replacement_max_len, vardata);
output_len += strlen(replacement);
}
output[output_len] = 0;
} else {