|
|
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.