Optimize res_find().
When the device name is provided, we can simply run strncmp() for each line to quickly skip unrelated ones, that is much faster than sscanf() and only then strcmp(). MFC after: 2 weeks
This commit is contained in:
parent
d8789cd0ae
commit
696fca3fd4
@ -127,7 +127,7 @@ res_find(char **hintp_cookie, int *line, int *startln,
|
||||
const char **ret_name, int *ret_namelen, int *ret_unit,
|
||||
const char **ret_resname, int *ret_resnamelen, const char **ret_value)
|
||||
{
|
||||
int fbacklvl = FBACK_MDENV, i = 0, n = 0;
|
||||
int fbacklvl = FBACK_MDENV, i = 0, n = 0, namelen;
|
||||
char r_name[32];
|
||||
int r_unit;
|
||||
char r_resname[32];
|
||||
@ -229,12 +229,16 @@ res_find(char **hintp_cookie, int *line, int *startln,
|
||||
i = 0;
|
||||
}
|
||||
|
||||
if (name)
|
||||
namelen = strlen(name);
|
||||
cp = hintp;
|
||||
while (cp) {
|
||||
(*line)++;
|
||||
if (strncmp(cp, "hint.", 5) != 0)
|
||||
goto nexthint;
|
||||
n = sscanf(cp, "hint.%32[^.].%d.%32[^=]=%127s", r_name, &r_unit,
|
||||
if (name && strncmp(cp + 5, name, namelen) != 0)
|
||||
goto nexthint;
|
||||
n = sscanf(cp + 5, "%32[^.].%d.%32[^=]=%127s", r_name, &r_unit,
|
||||
r_resname, r_value);
|
||||
if (n != 4) {
|
||||
printf("CONFIG: invalid hint '%s'\n", cp);
|
||||
|
Loading…
Reference in New Issue
Block a user