/* @(#)stat.c 1.1 97/01/03 Connectathon Testsuite */ /* 1.3 Lachman ONC Test Suite source */ #include #include /* * crunch through time stat files. This program will handle two * formats: BSD * 1.7 real 0.0 user 0.4 sys * and ATT * real 1.4 * user 0.0 * sys 0.2 * * ATT format may break out minutes -- 2:03.2 */ #define MAXINDEX 100 double real[MAXINDEX]; double user[MAXINDEX]; double sys[MAXINDEX]; char *Prog, *File; int getattfmt(); void prtstat(); main(argc, argv) int argc; char *argv[]; { FILE *fp; int i, n; char c, *fmt, buf[BUFSIZ]; int attfmt = 0; /* set if using att time format */ Prog = argv[0]; if (argc == 1) { fprintf(stderr, "Usage: %s datafile\n", Prog); exit(1); } File = argv[1]; fp = fopen(File, "r"); if (fp == NULL) { fprintf(stderr, "%s: unable to open %s\n", Prog, File); exit(1); } getnewch: if ((i = fgetc(fp)) == EOF) { fprintf(stderr, "%s: %s is empty\n", Prog, File); exit(1); } c = i & 0x7f; if (c == '\n' || c == '\r' || c == 'r') attfmt = 1; else if (isdigit(c)) fmt = "%lf %*s %lf %*s %lf %*s"; /* BSD fmt */ else { /* skip the line */ fgets(buf, BUFSIZ, fp); goto getnewch; } if (ungetc(c, fp) == EOF) { fprintf(stderr, "%s: can't push char back to %s\n", Prog, File); exit(1); } if (attfmt) { for (n = 0; getattfmt(fp, n, 1); n++) { (void) getattfmt(fp, n, 2); (void) getattfmt(fp, n, 3); } } else { n = 0; while (fscanf(fp, fmt, &real[n], &user[n], &sys[n]) == 3) n++; } if (n == 0) { fprintf(stderr, "%s: no data in %s\n", Prog, File); #ifdef SVR3 exit(0); #else exit(1); #endif } prtstat(real, n); printf(" real"); prtstat(user, n); printf(" user"); prtstat(sys, n); printf(" sys\n"); exit(0); } /* * which: 1: real, 2:user, 3:sys * * returns 0 if no more data, else 1 */ int getattfmt(fp, n, which) FILE *fp; int n, which; { char buf[BUFSIZ]; char *p; char *fmt; double *dp; int min, err = 0; if (n < 0 || n >= MAXINDEX) { fprintf(stderr, "%s: illegal index=%d in getattfmt\n", Prog, n); exit(1); } switch (which) { case 1: /* real */ dp = &real[n]; break; case 2: /* user */ dp = &user[n]; break; case 3: /* sys */ dp = &sys[n]; break; default: fprintf(stderr, "%s: illegal which=%d in getattfmt\n", Prog, which); exit(1); } while (fgets(buf, BUFSIZ, fp)) { /* null out newline */ for (p = buf; *p != '\0' && *p != '\n'; p++) ; if (*p == '\n') *p = '\0'; /* look for blank line and skip it */ for (p = buf; *p != '\0' && (*p == ' ' || *p == '\t'); p++) ; if (*p == '\0') continue; min = 0; for (p = buf; *p != '\0' && *p != ':'; p++) ; if (*p == ':') { fmt = "%*s %d:%lf"; if (sscanf(buf, fmt, &min, dp) != 2) err = 1; } else { fmt = "%*s %lf"; if (sscanf(buf, fmt, dp) != 1) err = 1; } if (err) { fprintf(stderr, "%s: bad data format in %s (%s)\n", Prog, File, buf); exit(1); } if (min > 0) *dp += (double)(min * 60); return (1); } /* EOF */ if (which == 1) return (0); fprintf(stderr, "%s: premature EOF in %s\n", Prog, File); exit(1); } void prtstat(array, n) double array[]; int n; { double avg, sd; int i; avg = 0; for (i = 0; i < n; i++) avg += array[i]; avg = avg / (float) n; sd = 0; for (i = 0; i < n; i++) sd += (array[i] - avg)*(array[i] - avg); if (n > 1) { sd = sd / (float) (n - 1); sd = sqrt(sd); } else sd = 0.0; printf("\t%.1f (%.1f)", avg, sd); }