forked from Ocean/datum_gateway
api: Optimise datum_api_fill_vars by avoiding copy of var_name
This commit is contained in:
parent
37411b402c
commit
47098ab6bd
@ -230,9 +230,9 @@ DATUM_API_VarEntry var_entries[] = {
|
|||||||
{NULL, NULL} // Mark the end of the array
|
{NULL, NULL} // Mark the end of the array
|
||||||
};
|
};
|
||||||
|
|
||||||
DATUM_API_VarFunc datum_api_find_var_func(const char *var_name) {
|
DATUM_API_VarFunc datum_api_find_var_func(const char * const var_start, const size_t var_name_len) {
|
||||||
for (int i = 0; var_entries[i].var_name != NULL; i++) {
|
for (int i = 0; var_entries[i].var_name != NULL; i++) {
|
||||||
if (strcmp(var_entries[i].var_name, var_name) == 0) {
|
if (strncmp(var_entries[i].var_name, var_start, var_name_len) == 0 && !var_entries[i].var_name[var_name_len]) {
|
||||||
return var_entries[i].func;
|
return var_entries[i].func;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -243,7 +243,6 @@ void datum_api_fill_vars(const char *input, char *output, size_t max_output_size
|
|||||||
const char* p = input;
|
const char* p = input;
|
||||||
size_t output_len = 0;
|
size_t output_len = 0;
|
||||||
size_t var_name_len = 0;
|
size_t var_name_len = 0;
|
||||||
char var_name[256];
|
|
||||||
const char *var_start;
|
const char *var_start;
|
||||||
const char *var_end;
|
const char *var_end;
|
||||||
|
|
||||||
@ -258,17 +257,10 @@ void datum_api_fill_vars(const char *input, char *output, size_t max_output_size
|
|||||||
}
|
}
|
||||||
var_name_len = var_end - var_start;
|
var_name_len = var_end - var_start;
|
||||||
|
|
||||||
if (var_name_len >= sizeof(var_name)-1) {
|
DATUM_API_VarFunc func = datum_api_find_var_func(var_start, var_name_len);
|
||||||
DLOG_ERROR("%s: Excessively long variable name '%.*s'", __func__, (int)var_name_len, var_start);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
strncpy(var_name, var_start, var_name_len);
|
|
||||||
var_name[var_name_len] = 0;
|
|
||||||
|
|
||||||
DATUM_API_VarFunc func = datum_api_find_var_func(var_name);
|
|
||||||
if (func) {
|
if (func) {
|
||||||
// Skip running STRATUM_JOB functions if there's no sjob
|
// Skip running STRATUM_JOB functions if there's no sjob
|
||||||
if (var_name[8] == 'J' && !vardata->sjob) {
|
if (var_start[8] == 'J' && !vardata->sjob) {
|
||||||
// Leave blank for now
|
// Leave blank for now
|
||||||
} else {
|
} else {
|
||||||
char * const replacement = &output[output_len];
|
char * const replacement = &output[output_len];
|
||||||
@ -280,7 +272,7 @@ void datum_api_fill_vars(const char *input, char *output, size_t max_output_size
|
|||||||
}
|
}
|
||||||
output[output_len] = 0;
|
output[output_len] = 0;
|
||||||
} else {
|
} else {
|
||||||
DLOG_ERROR("%s: Unknown variable '%s'", __func__, var_name);
|
DLOG_ERROR("%s: Unknown variable '%.*s'", __func__, (int)var_name_len, var_start);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
p = var_end + 1; // Move past '}'
|
p = var_end + 1; // Move past '}'
|
||||||
|
Loading…
Reference in New Issue
Block a user