This patch cleans up function applyToFeature(). Function applyToFeature() is nearly unreadable. There are some deep levels of indentation and cascades of loops makes code flow difficult to read. I split up this function into three smaller one. This reduces indentation levels and makes code flow clearer. Changes in v2: * Rename generate_features() to _appyToFeatures(). * Get rid of needless variable num. * Change prototype of function pointer FeatureFN. None of the functions returns with an error, so we needn't a return value. Changes in v3: * Drop change in rrdGetSensors() * Move signature change of FeatureFN to a separate patch (5/8). Note: The issue (in v1) with the overwritten return value will be fixed by the next patch. --- prog/sensord/rrd.c | 104 +++++++++++++++++++++++++++++++---------------------- 1 file changed, 62 insertions(+), 42 deletions(-) Index: sensors/prog/sensord/rrd.c =================================================================== --- sensors.orig/prog/sensord/rrd.c 2009-11-03 20:02:45.000000000 +0100 +++ sensors/prog/sensord/rrd.c 2009-11-03 20:03:14.000000000 +0100 @@ -137,52 +137,72 @@ } } -static int applyToFeatures(FeatureFN fn, void *data) +static int _applyToFeatures(FeatureFN fn, void *data, + const sensors_chip_name *chip, + const ChipDescriptor *desc) { - const sensors_chip_name *chip; - int i, j, ret = 0, num = 0; + int i, ret; + const FeatureDescriptor *features = desc->features; + const FeatureDescriptor *feature; + const char *rawLabel; + char *label; + + for (i = 0; i < MAX_RRD_SENSORS && features[i].format; ++i) { + feature = features + i; + rawLabel = feature->feature->name; + + label = sensors_get_label(chip, feature->feature); + if (!label) { + sensorLog(LOG_ERR, "Error getting sensor label: %s/%s", + chip->prefix, rawLabel); + return -1; + } - for (j = 0; (ret == 0) && (j < sensord_args.numChipNames); ++ j) { - i = 0; - while ((ret == 0) && ((chip = sensors_get_detected_chips(&sensord_args.chipNames[j], &i)) != NULL)) { - int index0, chipindex = -1; - - /* Trick: we compare addresses here. We know it works - * because both pointers were returned by - * sensors_get_detected_chips(), so they refer to - * libsensors internal structures, which do not move. - */ - for (index0 = 0; knownChips[index0].features; ++index0) - if (knownChips[index0].name == chip) { - chipindex = index0; - break; - } - if (chipindex >= 0) { - const ChipDescriptor *descriptor = &knownChips[chipindex]; - const FeatureDescriptor *features = descriptor->features; - - for (index0 = 0; (ret == 0) && (num < MAX_RRD_SENSORS) && features[index0].format; ++index0) { - const FeatureDescriptor *feature = features + index0; - const char *rawLabel = feature->feature->name; - char *label = NULL; - - if (!(label = sensors_get_label(chip, feature->feature))) { - sensorLog(LOG_ERR, "Error getting sensor label: %s/%s", chip->prefix, rawLabel); - ret = -1; - } else { - rrdCheckLabel(rawLabel, num); - ret = fn(data, - rrdLabels[num], - label, feature); - ++ num; - } - if (label) - free(label); - } - } + rrdCheckLabel(rawLabel, i); + ret = fn(data, rrdLabels[i], label, feature); + free(label); + } + return 0; +} + +static ChipDescriptor *lookup_known_chips(const sensors_chip_name *chip) +{ + int i; + + /* Trick: we compare addresses here. We know it works + * because both pointers were returned by + * sensors_get_detected_chips(), so they refer to + * libsensors internal structures, which do not move. + */ + for (i = 0; knownChips[i].features; i++) { + if (knownChips[i].name == chip) { + return &knownChips[i]; } } - return ret; + return NULL; +} + +static int applyToFeatures(FeatureFN fn, void *data) +{ + int i, i_detected, ret; + const sensors_chip_name *chip, *chip_arg; + ChipDescriptor *desc; + + for (i = 0; i < sensord_args.numChipNames; i++) { + chip_arg = &sensord_args.chipNames[i]; + i_detected = 0; + while ((chip = sensors_get_detected_chips(chip_arg, + &i_detected))) { + + desc = lookup_known_chips(chip); + if (!desc) + continue; + ret = _applyToFeatures(fn, data, chip, desc); + if (ret) + return ret; + } + } + return 0; } struct ds { _______________________________________________ lm-sensors mailing list lm-sensors@xxxxxxxxxxxxxx http://lists.lm-sensors.org/mailman/listinfo/lm-sensors