|
|
1.1 ! root 1: /* @(#)stat.c 1.2 90/01/03 NFS Rev 2 Testsuite */ ! 2: /* 1.3 Lachman ONC Test Suite source */ ! 3: ! 4: #include <stdio.h> ! 5: #include <math.h> ! 6: ! 7: /* ! 8: * crunch through time stat files. This program will handle two ! 9: * formats: BSD ! 10: * 1.7 real 0.0 user 0.4 sys ! 11: * and ATT ! 12: * real 1.4 ! 13: * user 0.0 ! 14: * sys 0.2 ! 15: * ! 16: * ATT format may break out minutes -- 2:03.2 ! 17: */ ! 18: #define MAXINDEX 100 ! 19: double real[MAXINDEX]; ! 20: double user[MAXINDEX]; ! 21: double sys[MAXINDEX]; ! 22: char *Prog, *File; ! 23: ! 24: main(argc, argv) ! 25: int argc; ! 26: char *argv[]; ! 27: { ! 28: FILE *fp; ! 29: int i, n; ! 30: char c, *fmt; ! 31: int attfmt = 0; /* set if using att time format */ ! 32: ! 33: Prog = argv[0]; ! 34: if (argc == 1) { ! 35: fprintf(stderr, "Usage: %s datafile\n", Prog); ! 36: exit(1); ! 37: } ! 38: File = argv[1]; ! 39: fp = fopen(File, "r"); ! 40: if (fp == NULL) { ! 41: fprintf(stderr, "%s: unable to open %s\n", ! 42: Prog, File); ! 43: exit(1); ! 44: } ! 45: if ((i = fgetc(fp)) == EOF) { ! 46: fprintf(stderr, "%s: %s is empty\n", ! 47: Prog, File); ! 48: exit(1); ! 49: } ! 50: c = i & 0x7f; ! 51: if (c == '\n' || c == '\r' || c == 'r') ! 52: attfmt = 1; ! 53: else ! 54: fmt = "%F %*s %F %*s %F %*s"; /* BSD fmt */ ! 55: if (ungetc(c, fp) == EOF) { ! 56: fprintf(stderr, "%s: can't push char back to %s\n", ! 57: Prog, File); ! 58: exit(1); ! 59: } ! 60: ! 61: if (attfmt) { ! 62: for (n = 0; getattfmt(fp, n, 1); n++) { ! 63: getattfmt(fp, n, 2); ! 64: getattfmt(fp, n, 3); ! 65: } ! 66: } else { ! 67: n = 0; ! 68: while(fscanf(fp, fmt, &real[n], &user[n], &sys[n]) == 3) ! 69: n++; ! 70: } ! 71: if (n == 0) { ! 72: fprintf(stderr, "%s: no data in %s\n", ! 73: Prog, File); ! 74: #ifdef SVR3 ! 75: exit(0); ! 76: #else ! 77: exit(1); ! 78: #endif ! 79: } ! 80: stat(real, n); ! 81: printf(" real"); ! 82: stat(user, n); ! 83: printf(" user"); ! 84: stat(sys, n); ! 85: printf(" sys\n"); ! 86: ! 87: exit(0); ! 88: } ! 89: ! 90: /* ! 91: * which: 1: real, 2:user, 3:sys ! 92: * ! 93: * returns 0 if no more data, else 1 ! 94: */ ! 95: getattfmt(fp, n, which) ! 96: FILE *fp; ! 97: int n, which; ! 98: { ! 99: char buf[BUFSIZ]; ! 100: char *p; ! 101: char *fmt; ! 102: double *dp; ! 103: int min, err = 0; ! 104: ! 105: if (n < 0 || n >= MAXINDEX) { ! 106: fprintf(stderr, "%s: illegal index=%d in getattfmt\n", ! 107: Prog, n); ! 108: exit(1); ! 109: } ! 110: switch(which) { ! 111: case 1: /* real */ ! 112: dp = &real[n]; ! 113: break; ! 114: case 2: /* user */ ! 115: dp = &user[n]; ! 116: break; ! 117: case 3: /* sys */ ! 118: dp = &sys[n]; ! 119: break; ! 120: default: ! 121: fprintf(stderr, "%s: illegal which=%d in getattfmt\n", ! 122: Prog, which); ! 123: exit(1); ! 124: } ! 125: ! 126: while (fgets(buf, BUFSIZ, fp)) { ! 127: /* null out newline */ ! 128: for (p = buf; *p && *p != '\n'; p++) ! 129: ; ! 130: if (*p == '\n') ! 131: *p = '\0'; ! 132: ! 133: /* look for blank line and skip it */ ! 134: for (p = buf; *p && (*p == ' ' || *p == '\t'); p++) ! 135: ; ! 136: if (*p == '\0') ! 137: continue; ! 138: ! 139: min = 0; ! 140: for (p = buf; *p && *p != ':'; p++) ! 141: ; ! 142: if (*p == ':') { ! 143: fmt = "%*s %d:%F"; ! 144: if (sscanf(buf, fmt, &min, dp) != 2) ! 145: err = 1; ! 146: } else { ! 147: fmt = "%*s %F"; ! 148: if (sscanf(buf, fmt, dp) != 1) ! 149: err = 1; ! 150: } ! 151: if (err) { ! 152: fprintf(stderr, "%s: bad data format in %s (%s)\n", ! 153: Prog, File, buf); ! 154: exit(1); ! 155: } ! 156: if (min > 0) ! 157: *dp += (double)(min * 60); ! 158: return 1; ! 159: } ! 160: /* EOF */ ! 161: if (which == 1) ! 162: return 0; ! 163: else { ! 164: fprintf(stderr, "%s: premature EOF in %s\n", ! 165: Prog, File); ! 166: exit(1); ! 167: } ! 168: } ! 169: ! 170: stat(array, n) ! 171: double array[]; ! 172: int n; ! 173: { ! 174: double avg, sd; ! 175: int i; ! 176: ! 177: avg = 0; ! 178: for (i = 0; i < n; i++) ! 179: avg += array[i]; ! 180: avg = avg / (float) n; ! 181: sd = 0; ! 182: for (i = 0; i < n; i++) ! 183: sd += (array[i] - avg)*(array[i] - avg); ! 184: if (n > 1) { ! 185: sd = sd / (float) (n - 1); ! 186: sd = sqrt(sd); ! 187: } else { ! 188: sd = 0.0; ! 189: } ! 190: printf("\t%.1f (%.1f)", avg, sd); ! 191: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.