diff options
Diffstat (limited to 'qa/src/compare.c')
-rw-r--r-- | qa/src/compare.c | 114 |
1 files changed, 114 insertions, 0 deletions
diff --git a/qa/src/compare.c b/qa/src/compare.c new file mode 100644 index 0000000..b283995 --- /dev/null +++ b/qa/src/compare.c @@ -0,0 +1,114 @@ +/* + * Copyright (c) 1997-2002 Silicon Graphics, Inc. All Rights Reserved. + */ + +#include <math.h> +#include <pcp/pmapi.h> +#include <pcp/impl.h> + +int +main(int argc, char *argv[]) +{ + double d[3]; + long l[3]; + char *endp; + int haveDouble = 0; + int i, j; + int smallVal = 2; + int smallDVal = 2.0; + double tolerance = 0.1; + int c; + int err = 0; + int nArgs; + + __pmSetProgname(argv[0]); + + while ((c = getopt(argc, argv, "s:t:")) != EOF) + switch (c) { + case 's': /* small value */ + smallVal = (int)strtol(optarg, &endp, 0); + if (*endp == '.') { + smallDVal = strtod(optarg, &endp); + haveDouble = 1; + } + if (*endp != '\0') { + fprintf(stderr, "small value \"%s\" was not numeric\n", optarg); + err++; + } + break; + + case 't': /* tolerance (fraction of max) */ + tolerance = strtod(optarg, &endp); + if (*endp != '\0') { + fprintf(stderr, "tolerance \"%s\" was not numeric\n", optarg); + err++; + } + break; + + case '?': + err++; + } + + nArgs = argc - optind; + if (err || nArgs < 2 || nArgs > 3) { + fprintf(stderr, + "Usage: %s [-t tolerance] [-s small] number number [number]\n", + pmProgname); + exit(1); + } + + for (i = 0; i < nArgs; i++) { + if (!haveDouble) { + l[i] = strtol(argv[optind + i], &endp, 0); + if (*endp == '.') { + for (j = 0; j < i; j++) + d[j] = (double)l[j]; + d[i] = strtod(argv[i], &endp); + haveDouble = 1; + } + } + else + d[i] = strtod(argv[optind + i], &endp); + if (*endp != '\0') { + fprintf(stderr, "%s: non-numeric argument \"%s\"\n", pmProgname, argv[optind + i]); + exit(1); + } + } + + if (nArgs == 2) + /* check for 2 values within within 10% or one small and the delta small */ + if (haveDouble) { + double + delta = fabs(d[1] - d[0]), + max = d[0] > d[1] ? d[0] : d[1]; + if (delta / max <= tolerance) + exit(0); + else + if ((d[0] <= smallDVal || d[1] <= smallDVal) && delta <= smallDVal) + exit(0); + exit(1); + } + else { + long + delta = l[1] > l[0] ? l[1] - l[0] : l[0] - l[1], + max = l[0] > l[1] ? l[0] : l[1]; + if ((float)delta / (float)max <= tolerance) + exit(0); + else + if ((l[0] <= smallVal || l[1] <= smallVal) && delta <= smallVal) + exit(0); + exit(1); + } + else + if (haveDouble) + if (d[0] <= d[1] && d[1] <= d[2]) + exit(0); + else + exit(1); + else + if (l[0] <= l[1] && l[1] <= l[2]) + exit(0); + else + exit(1); + +} |