diff --git a/lib/access.c b/lib/access.c index 50f7f230..a784579b 100644 --- a/lib/access.c +++ b/lib/access.c @@ -92,15 +92,11 @@ sensors_for_all_config_chips(const sensors_chip_name *name, const sensors_chip_feature *sensors_lookup_feature_nr(const sensors_chip_name *chip, int feature) { - int i, j; - const sensors_chip_feature *features; + int i; for (i = 0; i < sensors_proc_chips_count; i++) if (sensors_match_chip(&sensors_proc_chips[i].chip, chip)) { - features = sensors_proc_chips[i].feature; - for (j = 0; features[j].data.name; j++) - if (features[j].data.number == feature) - return features + j; + return sensors_proc_chips[i].feature + feature; } return NULL; } diff --git a/lib/sysfs.c b/lib/sysfs.c index 3fdd9e53..5438de7d 100644 --- a/lib/sysfs.c +++ b/lib/sysfs.c @@ -178,6 +178,21 @@ static int sensors_read_dynamic_chip(sensors_chip_features *chip, } } + /* Renumber the features linearly, so that feature number N is at + position N in the array. This allows for O(1) look-ups. */ + for (i = 0; i < fnum; i++) { + int j, old; + + old = dyn_features[i].data.number; + dyn_features[i].data.number = i; + for (j = i + 1; + j < fnum && dyn_features[j].data.mapping != SENSORS_NO_MAPPING; + j++) { + if (dyn_features[j].data.mapping == old) + dyn_features[j].data.mapping = i; + } + } + chip->feature = dyn_features; exit_free: