|
|
1.1 ! root 1: /* read stats file generated by atc */ ! 2: ! 3: #define STATSFILE "/usr/games/lib/atc/stats" ! 4: ! 5: #include <stdio.h> ! 6: ! 7: #define AMAX 20 /* no more than 20 airspaces yet */ ! 8: #define UMAX 100 /* number of likely users */ ! 9: ! 10: struct ! 11: { char month[5]; /* Apr 15 17:04 */ ! 12: char date[5]; ! 13: int dhour; ! 14: int dmin; ! 15: char user[9]; ! 16: int crashes; ! 17: int system; ! 18: int towtruck; ! 19: int boundary; ! 20: int goaround; ! 21: int remain; ! 22: int seed; ! 23: int rtime; ! 24: int gas; ! 25: int cmds; ! 26: char airspace[50]; ! 27: } r; ! 28: ! 29: struct /* record with each airspace */ ! 30: { char recordholder[9]; ! 31: int time; ! 32: char smo[5]; ! 33: char sdate[5]; ! 34: int shour; ! 35: int smin; ! 36: char airspname[50]; ! 37: } s[AMAX]; ! 38: ! 39: int nairspace = 0; ! 40: ! 41: int users = 0; ! 42: ! 43: struct /* user */ ! 44: { char uname[9]; ! 45: int minutes; /* total time played */ ! 46: int start; ! 47: int ucrashes; ! 48: int usystem; ! 49: int utowtruck; ! 50: int uboundary; ! 51: int ugoaround; ! 52: int through; ! 53: int urtime; ! 54: int ugas; ! 55: int ucmds; ! 56: } u[UMAX]; ! 57: ! 58: #define BUFSIZE 80 ! 59: #define SKIP while (*c != ' ') c++; ! 60: ! 61: main(argc,argv) ! 62: int argc; ! 63: char **argv; ! 64: { FILE *sfile; ! 65: char buf[BUFSIZE],*c; ! 66: int dump,i,j,done,ok; ! 67: ! 68: ! 69: if ((sfile = fopen(STATSFILE,"r")) == NULL) ! 70: { fprintf(stderr,"No stats file.\n"); ! 71: exit(1); ! 72: } ! 73: if (argc == 2) /* don't want the beginning */ ! 74: if (-1 == fseek(sfile,-atoi(argv[1]),2))/* seek forward from end */ ! 75: printf("Couldn't seek.\n"); ! 76: while (fgets(buf,BUFSIZE,sfile) != NULL) ! 77: { if ((j = sscanf(buf,"%s%s%d:%d:%s %d%d%d%d%d%d%d%d.%d%d %s\n", ! 78: r.month,r.date,&r.dhour,&r.dmin, ! 79: r.user,&r.crashes,&r.system,&r.towtruck, ! 80: &r.boundary,&r.goaround,&r.gas,&r.cmds, ! 81: &r.remain, ! 82: &r.seed,&r.rtime, ! 83: r.airspace)) == 0) continue; ! 84: for (c = r.user; *c; c++) if (*c == ':') *c = 0; ! 85: if (strcmp("CR",r.month) == 0) continue; ! 86: for (i=0; i<users; i++) ! 87: if (strcmp(u[i].uname,r.user) == 0) break; ! 88: if (i == users) strcpy(u[users++].uname,r.user); ! 89: if (j < 13) ! 90: { u[i].start = 60*r.dhour+r.dmin; ! 91: continue; ! 92: } ! 93: ! 94: if (u[i].start == 0) continue; ! 95: done = 60*r.dhour+r.dmin; ! 96: u[i].minutes += done - u[i].start; ! 97: u[i].ucrashes += r.crashes; ! 98: u[i].usystem += r.system; ! 99: u[i].utowtruck += r.towtruck; ! 100: u[i].uboundary += r.boundary; ! 101: u[i].ugoaround += r.goaround; ! 102: u[i].urtime += r.rtime; ! 103: u[i].ugas += r.gas; ! 104: u[i].ucmds += r.cmds; ! 105: ok = 26-r.remain-r.crashes-r.towtruck-r.boundary-2*r.system; ! 106: if (ok > 0) u[i].through += ok; ! 107: if (done - u[i].start < 0) u[i].minutes += 24*60; ! 108: ! 109: if (r.remain+r.crashes+r.system+r.towtruck+r.boundary ! 110: != 0) continue; /* need only perfect games */ ! 111: ! 112: for (i=0; i<nairspace; i++) ! 113: if (strcmp(r.airspace,s[i].airspname) == 0) break; ! 114: ! 115: if (i != nairspace && s[i].time <= r.rtime) continue; ! 116: strcpy(s[i].airspname,r.airspace); ! 117: strcpy(s[i].recordholder,r.user); ! 118: s[i].time = r.rtime; ! 119: strcpy(s[i].smo,r.month); ! 120: s[i].shour = r.dhour; ! 121: s[i].smin = r.dmin; ! 122: strcpy(s[i].sdate,r.date); ! 123: if (i == nairspace) nairspace++; ! 124: } ! 125: printf(" RECORDHOLDERS\n\n"); ! 126: for (i=0; i<nairspace; i++) ! 127: printf("%s %s %2d:%02d %s: %s in %d minutes\n", ! 128: s[i].smo,s[i].sdate,s[i].shour,s[i].smin, ! 129: s[i].recordholder,s[i].airspname,s[i].time); ! 130: ! 131: printf("\nINDIVIDUAL STATS: per declared hour\n\n"); ! 132: printf(" Time SYS GAS CMD CR TT BD GA OK\n"); ! 133: for (i=0; i<users; i++) ! 134: { if (u[i].minutes <= 0) continue; ! 135: printf("%8s:%4d:%02d %3d%5d%4d%4d%3d%3d%3d%6d\n",u[i].uname, ! 136: u[i].urtime/60, u[i].urtime%60, ! 137: 60 * u[i].usystem/u[i].urtime, ! 138: 60 * u[i].ugas/u[i].urtime, ! 139: 60 * u[i].ucmds/u[i].urtime, ! 140: 60 * u[i].ucrashes/u[i].urtime, ! 141: 60 * u[i].utowtruck/u[i].urtime, ! 142: 60 * u[i].uboundary/u[i].urtime, ! 143: 60 * u[i].ugoaround/u[i].urtime, ! 144: 60 * u[i].through/u[i].urtime); ! 145: } ! 146: printf("\nINDIVIDUAL STATS: per real hour\n\n"); ! 147: printf(" Time SYS GAS CMD CR TT BD GA OK\n"); ! 148: for (i=0; i<users; i++) ! 149: { if (u[i].minutes <= 0) continue; ! 150: printf("%8s:%4d:%02d %3d%5d%4d%4d%3d%3d%3d%6d\n",u[i].uname, ! 151: u[i].minutes/60, u[i].minutes%60, ! 152: 60 * u[i].usystem/u[i].minutes, ! 153: 60 * u[i].ugas/u[i].minutes, ! 154: 60 * u[i].ucmds/u[i].minutes, ! 155: 60 * u[i].ucrashes/u[i].minutes, ! 156: 60 * u[i].utowtruck/u[i].minutes, ! 157: 60 * u[i].uboundary/u[i].minutes, ! 158: 60 * u[i].ugoaround/u[i].minutes, ! 159: 60 * u[i].through/u[i].minutes); ! 160: } ! 161: } ! 162: ! 163:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.