Rev 7571 | Rev 7620 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 7571 | Rev 7609 | ||
---|---|---|---|
Line 40... | Line 40... | ||
40 | exodata shdata[MAX_SHEET*MAX_EXO],examdata[MAX_EXAM*MAX_EXO]; |
40 | exodata shdata[MAX_SHEET*MAX_EXO],examdata[MAX_EXAM*MAX_EXO]; |
41 | 41 | ||
42 | /* cid: combined index of difficulty */ |
42 | /* cid: combined index of difficulty */ |
43 | double scsum, scavg, scdeviat, scmin, scmax, cid; |
43 | double scsum, scavg, scdeviat, scmin, scmax, cid; |
44 | double dursum, duravg, durdeviat, durmin, durmax; |
44 | double dursum, duravg, durdeviat, durmin, durmax; |
45 | - | ||
- | 45 | double best[10]; |
|
46 | int filecnt=0, fcind; |
46 | int filecnt=0, fcind; |
47 | char *dirbase, *sdata; |
47 | char *dirbase, *sdata, user[256]; |
48 | 48 | ||
49 | int str2time(char *p) |
49 | int str2time(char *p) |
50 | { |
50 | { |
51 | int sec,min,hr; |
51 | int sec,min,hr; |
52 | sec=atoi(p+15); p[14]=0; |
52 | sec=atoi(p+15); p[14]=0; |
Line 54... | Line 54... | ||
54 | hr=atoi(p+9); |
54 | hr=atoi(p+9); |
55 | if(sec<0 || min<0 || hr<0 || sec>59 || min>59 || hr>23) return -1; |
55 | if(sec<0 || min<0 || hr<0 || sec>59 || min>59 || hr>23) return -1; |
56 | return hr*3600+min*60+sec; |
56 | return hr*3600+min*60+sec; |
57 | } |
57 | } |
58 | 58 | ||
59 | void oneline(char *p) |
59 | void oneline(char *p, char *typ) |
60 | { |
60 | { |
61 | int i, sh, ex, t; |
61 | int i, sh, ex, t; |
62 | char *data[64]; |
62 | char *data[64]; |
63 | exodata *tab; |
63 | exodata *tab; |
64 | char *pp, *pe; |
64 | char *pp, *pe; |
65 | - | ||
66 | for(i=0, pp=find_word_start(p); i< |
65 | for(i=0, pp=find_word_start(p); i<9 && *pp; pp=find_word_start(pe),i++) { |
67 | pe=find_word_end(pp); if(*pe) *pe++=0; |
66 | pe=find_word_end(pp); if(*pe) *pe++=0; |
68 | data[i]=pp; |
67 | data[i]=pp; |
69 | } |
68 | } |
70 | if(i<6) return; |
69 | if(i<6) return; |
71 | sh=atoi(data[2]); ex=atoi(data[3]); |
70 | sh=atoi(data[2]); ex=atoi(data[3]); |
Line 77... | Line 76... | ||
77 | tab=shdata; if(sh>MAX_SHEET) return; |
76 | tab=shdata; if(sh>MAX_SHEET) return; |
78 | } |
77 | } |
79 | tab+=(sh-1)*MAX_EXO+(ex-1); |
78 | tab+=(sh-1)*MAX_EXO+(ex-1); |
80 | t=str2time(data[0]); if(t==-1) return; |
79 | t=str2time(data[0]); if(t==-1) return; |
81 | if(strstr(data[4],"new")!=NULL) { |
80 | if(strstr(data[4],"new")!=NULL) { |
- | 81 | if(strcmp(typ,"score")==0){ |
|
- | 82 | if ((i > 7 && strcmp(data[7],"noscore")==0) |
|
- | 83 | || (i > 8 && strcmp(data[8],"noscore")==0)) { return; } |
|
- | 84 | } |
|
- | 85 | if(strcmp(typ,"noscore")==0){ |
|
- | 86 | if (i < 7 || ( i>7 && strcmp(data[7],typ)!=0) |
|
- | 87 | || (i > 8 && strcmp(data[8], typ)!=0)) { return; } |
|
- | 88 | } |
|
82 | snprintf(tab->lastnew,12,"%s",data[1]); |
89 | snprintf(tab->lastnew,12,"%s",data[1]); |
83 | tab->newcnt++; tab->lasttime=t; |
90 | tab->newcnt++; tab->lasttime=t; |
84 | fcind++; |
91 | fcind++; |
85 | return; |
92 | return; |
86 | } |
93 | } |
Line 96... | Line 103... | ||
96 | else tab->firstscore=sccnt; |
103 | else tab->firstscore=sccnt; |
97 | tab->lastscore=sccnt; sccnt++; tab->scorecnt++; |
104 | tab->lastscore=sccnt; sccnt++; tab->scorecnt++; |
98 | } |
105 | } |
99 | } |
106 | } |
100 | 107 | ||
101 | void onefile(char *fname) |
108 | void onefile(char *fname, char *typ) |
102 | { |
109 | { |
103 | FILE *f; |
110 | FILE *f; |
104 | char *buf, *pp, *pe; |
111 | char *buf, *pp, *pe; |
105 | long int l; |
112 | long int l; |
106 | f=fopen(fname,"r"); if(f==NULL) return; |
113 | f=fopen(fname,"r"); if(f==NULL) return; |
Line 108... | Line 115... | ||
108 | if(l<=0) {fclose(f); return;} |
115 | if(l<=0) {fclose(f); return;} |
109 | buf=xmalloc(l+16); (void)fread(buf,1,l,f); fclose(f); buf[l]=0; |
116 | buf=xmalloc(l+16); (void)fread(buf,1,l,f); fclose(f); buf[l]=0; |
110 | fcind=0; |
117 | fcind=0; |
111 | for(pp=buf; pp; pp=pe) { |
118 | for(pp=buf; pp; pp=pe) { |
112 | pe=strchr(pp,'\n'); if(pe!=NULL) *pe++=0; |
119 | pe=strchr(pp,'\n'); if(pe!=NULL) *pe++=0; |
113 | oneline(pp); |
120 | oneline(pp,typ); |
114 | } |
121 | } |
115 | free(buf); |
122 | free(buf); |
116 | if(fcind>0) filecnt++; |
123 | if(fcind>0) filecnt++; |
- | 124 | } |
|
- | 125 | ||
- | 126 | void onedir_ (char buf[MAX_LINELEN+1], char *typ) |
|
- | 127 | { |
|
- | 128 | char buf2[MAX_LINELEN+1]; |
|
- | 129 | DIR *dir; |
|
- | 130 | struct dirent *ff; |
|
- | 131 | dir=opendir(buf); if(dir==NULL) return; |
|
- | 132 | while((ff=readdir(dir))!=NULL) { |
|
- | 133 | if(!isalnum(ff->d_name[0]) || |
|
- | 134 | strcmp(ff->d_name,"supervisor")==0) continue; |
|
- | 135 | snprintf(buf2,sizeof(buf2),"%s/%s",buf,ff->d_name); |
|
- | 136 | onefile(buf2,typ); |
|
- | 137 | } |
|
- | 138 | closedir(dir); |
|
117 | } |
139 | } |
118 | 140 | ||
119 | void onedir(char *dirname) |
141 | void onedir(char *dirname) |
- | 142 | { |
|
- | 143 | char buf[MAX_LINELEN+1]; |
|
- | 144 | char *t1, *t2, types[256]; |
|
- | 145 | snprintf(types,sizeof(types),"%s",sdata); |
|
- | 146 | for(t1=find_word_start(types); *t1; t1=find_word_start(t2)) { |
|
- | 147 | t2=find_word_end(t1); if(*t2) *t2++=0; |
|
- | 148 | snprintf(buf,sizeof(buf),"%s/%s/score",dirbase,dirname); |
|
- | 149 | onedir_(buf,t1); |
|
- | 150 | snprintf(buf,sizeof(buf),"%s/%s/noscore",dirbase,dirname); |
|
- | 151 | onedir_(buf,t1); |
|
- | 152 | } |
|
- | 153 | } |
|
- | 154 | ||
- | 155 | void oneuser(char *dirname, char fname[64]) |
|
120 | { |
156 | { |
121 | char buf[MAX_LINELEN+1], buf2[MAX_LINELEN+1]; |
157 | char buf[MAX_LINELEN+1], buf2[MAX_LINELEN+1]; |
122 | DIR *dir; |
- | |
123 | struct dirent *ff; |
- | |
124 | char *t1, *t2, types[256]; |
158 | char *t1, *t2, types[256]; |
125 | snprintf(types,sizeof(types),"%s",sdata); |
159 | snprintf(types,sizeof(types),"%s",sdata); |
126 | for(t1=find_word_start(types); *t1; t1=find_word_start(t2)) { |
160 | for(t1=find_word_start(types); *t1; t1=find_word_start(t2)) { |
127 | t2=find_word_end(t1); if(*t2) *t2++=0; |
161 | t2=find_word_end(t1); if(*t2) *t2++=0; |
128 | snprintf(buf,sizeof(buf),"%s/%s/%s",dirbase,dirname, |
162 | snprintf(buf,sizeof(buf),"%s/%s/score/%s",dirbase,dirname,fname); |
129 | dir=opendir(buf); if(dir==NULL) return; |
- | |
130 |
|
163 | onefile(buf,t1); |
131 | if(!isalnum(ff->d_name[0]) || |
- | |
132 | strcmp(ff->d_name,"supervisor")==0) continue; |
- | |
133 |
|
164 | snprintf(buf2,sizeof(buf),"%s/%s/noscore/%s",dirbase,dirname,fname); |
134 |
|
165 | onefile(buf2,t1); |
135 | } |
- | |
136 | closedir(dir); |
- | |
137 | } |
166 | } |
- | 167 | } |
|
- | 168 | ||
- | 169 | void multiuser(char *dirname, char *user) |
|
- | 170 | { |
|
- | 171 | char buf[MAX_LINELEN+1]; |
|
- | 172 | char *u1, *u2; |
|
- | 173 | snprintf(buf,sizeof(buf),"%s",user); |
|
- | 174 | for(u1=find_word_start(buf); *u1; u1=find_word_start(u2)) { |
|
- | 175 | u2=find_word_end(u1); if(*u2) *u2++=0; |
|
- | 176 | oneuser(dirname, u1); |
|
- | 177 | } |
|
138 | } |
178 | } |
139 | 179 | ||
140 | void stati(exodata *dat) |
180 | void stati(exodata *dat) |
141 | { |
181 | { |
142 | int i,j; |
182 | int i,j; |
143 | double s,d; |
183 | double s,d; |
144 | 184 | ||
145 | scsum=scavg=scdeviat=dursum=duravg=durdeviat=cid=0; |
185 | scsum=scavg=scdeviat=dursum=duravg=durdeviat=cid=0; |
146 | scmin=10; scmax=0; durmin=24*3600; durmax=0; |
186 | scmin=10; scmax=0; durmin=24*3600; durmax=0; |
- | 187 | {int k; for(k=0; k<10; k++) best[k]=0 ;} |
|
147 | for(i=0,j=dat->firstscore; i<dat->scorecnt; i++) { |
188 | for(i=0,j=dat->firstscore; i<dat->scorecnt; i++) { |
148 | s=(double) scores[j].score/100; d=(double) scores[j].dure/60; |
189 | s=(double) scores[j].score/100; d=(double) scores[j].dure/60; |
149 | scsum+=s; dursum+=d; |
190 | scsum+=s; dursum+=d; |
150 | if(scmin>s) scmin=s; if(scmax<s) scmax=s; |
191 | if(scmin>s) scmin=s; if(scmax<s) scmax=s; |
151 | if(durmin>d) durmin=d; if(durmax<d) durmax=d; |
192 | if(durmin>d) durmin=d; if(durmax<d) durmax=d; |
- | 193 | { |
|
- | 194 | int k, l = 0; |
|
- | 195 | for (k = 0; k < 10; k++) if (best[k] < best[l]) l = k; |
|
- | 196 | if (best[l] < s) best[l] = s; |
|
- | 197 | } |
|
152 | j=scores[j].next; |
198 | j=scores[j].next; |
153 | } |
199 | } |
154 | if(i<=0) {scmin=durmin=0; return;} |
200 | if(i<=0) {scmin=durmin=0; return;} |
155 | scavg=scsum/i; duravg=dursum/i; |
201 | scavg=scsum/i; duravg=dursum/i; |
156 | if(scsum>1) cid=min(4*sqrt(dursum*dat->newcnt)/scsum,99); |
202 | if(scsum>1) cid=min(4*sqrt(dursum*dat->newcnt)/scsum,99); |
157 | else cid=0; |
203 | else cid=0; |
158 | if(i>=2) { |
204 | if(i>=2) { |
Line 166... | Line 212... | ||
166 | } |
212 | } |
167 | 213 | ||
168 | /* Output line format: |
214 | /* Output line format: |
169 | * type sh exo newcnt scorecnt scsum dursum scavg duravg scmin durmin scmax durmax scdeviat durdeviat cid |
215 | * type sh exo newcnt scorecnt scsum dursum scavg duravg scmin durmin scmax durmax scdeviat durdeviat cid |
170 | */ |
216 | */ |
- | 217 | ||
171 | void |
218 | void outsheetexo (int i, int flag) |
172 | { |
219 | { |
173 | int i; |
- | |
174 | for(i=0;i<MAX_SHEET*MAX_EXO;i++) { |
- | |
175 |
|
220 | if(shdata[i].newcnt<=0) return; |
176 |
|
221 | stati(shdata+i); |
- | 222 | switch(flag) { |
|
177 | printf(":S %2d %2d %4d %4d \ |
223 | case 0: printf(":S %2d %2d %4d %4d \ |
178 | %4.0f %4.0f %5.2f %5.2f \ |
224 | %4.0f %4.0f %5.2f %5.2f \ |
179 | %5.2f %4.1f %5.2f %5.1f \ |
225 | %5.2f %4.1f %5.2f %5.1f \ |
180 | %5.2f %5.2f %4.1f\n", |
226 | %5.2f %5.2f %4.1f\n", |
- | 227 | i/MAX_EXO+1,i%MAX_EXO+1, |
|
- | 228 | shdata[i].newcnt, shdata[i].scorecnt, |
|
- | 229 | scsum, dursum, |
|
- | 230 | scavg, duravg, |
|
- | 231 | scmin,durmin,scmax,durmax, |
|
- | 232 | scdeviat, durdeviat, |
|
- | 233 | cid); break; |
|
- | 234 | case 1: printf("%d_%d=%d,%d,\ |
|
- | 235 | %.0f,%.0f,%.2f,%.2f,\ |
|
- | 236 | %.2f,%.1f,%.2f,%.1f,\ |
|
- | 237 | %.2f,%.2f,%.1f;", |
|
181 | i/MAX_EXO+1,i%MAX_EXO+1, |
238 | i/MAX_EXO+1,i%MAX_EXO+1, |
182 | shdata[i].newcnt, shdata[i].scorecnt, |
239 | shdata[i].newcnt, shdata[i].scorecnt, |
183 | scsum, dursum, |
240 | scsum, dursum, |
184 | scavg, duravg, |
241 | scavg, duravg, |
185 | scmin,durmin,scmax,durmax, |
242 | scmin,durmin,scmax,durmax, |
186 | scdeviat, durdeviat, |
243 | scdeviat, durdeviat, |
187 | cid); |
244 | cid); |
- | 245 | int k; for (k=0; k<10; k++) printf("%.2f,", best[k]); |
|
- | 246 | printf("\n"); |
|
- | 247 | break; |
|
188 |
|
248 | } |
- | 249 | } |
|
- | 250 | ||
189 |
|
251 | void outexamexo (int i) |
- | 252 | { |
|
190 |
|
253 | if(examdata[i].newcnt<=0) return; |
191 | stati(examdata+i); |
254 | stati(examdata+i); |
192 | printf(":E %2d %2d %4d %4d \ |
255 | printf(":E %2d %2d %4d %4d \ |
193 | %4.0f %4.0f %5.2f %5.2f \ |
256 | %4.0f %4.0f %5.2f %5.2f \ |
194 | %5.2f %4.1f %5.2f %5.1f \ |
257 | %5.2f %4.1f %5.2f %5.1f \ |
195 | %5.2f %5.2f %4.1f\n", |
258 | %5.2f %5.2f %4.1f\n", |
Line 198... | Line 261... | ||
198 | scsum, dursum, |
261 | scsum, dursum, |
199 | scavg, duravg, |
262 | scavg, duravg, |
200 | scmin,durmin,scmax,durmax, |
263 | scmin,durmin,scmax,durmax, |
201 | scdeviat, durdeviat, |
264 | scdeviat, durdeviat, |
202 | cid); |
265 | cid); |
- | 266 | } |
|
- | 267 | ||
- | 268 | void output(void) |
|
- | 269 | { |
|
203 |
|
270 | int i; |
- | 271 | for(i=0;i<MAX_SHEET*MAX_EXO;i++) { outsheetexo(i, 0);} |
|
- | 272 | for(i=0;i<MAX_EXAM*MAX_EXO;i++) { outexamexo(i);} |
|
204 | } |
273 | } |
205 | 274 | ||
206 | int main() |
275 | int main() |
207 | { |
276 | { |
208 | char cla[MAX_LINELEN+1]; |
277 | char cla[MAX_LINELEN+1], user[256]; |
209 | char *c1, *c2; |
278 | char *c1, *c2; |
210 | char *cdata; |
279 | char *cdata, *udata, *sh; |
211 | 280 | ||
212 | memset(shdata,0,sizeof(shdata)); memset(examdata,0,sizeof(examdata)); |
281 | memset(shdata,0,sizeof(shdata)); memset(examdata,0,sizeof(examdata)); |
213 | dirbase=getenv("exostat_dirbase"); |
282 | dirbase=getenv("exostat_dirbase"); |
214 | if(dirbase==NULL || *dirbase==0) dirbase="../log/classes"; |
283 | if(dirbase==NULL || *dirbase==0) dirbase="../log/classes"; |
215 | sdata=getenv("exostat_types"); |
284 | sdata=getenv("exostat_types"); |
216 | if(sdata==NULL || *sdata==0) sdata="score noscore"; |
285 | if(sdata==NULL || *sdata==0) sdata="score noscore"; |
217 | cdata=getenv("exostat_classes"); |
286 | cdata=getenv("exostat_classes"); |
218 | if(cdata==NULL || *cdata==0) cdata=getenv("w_wims_class"); |
287 | if(cdata==NULL || *cdata==0) cdata=getenv("w_wims_class"); |
219 | if(cdata==NULL || *cdata==0) return -1; |
288 | if(cdata==NULL || *cdata==0) return -1; |
220 | snprintf(cla,sizeof(cla),"%s",cdata); |
289 | snprintf(cla,sizeof(cla),"%s",cdata); |
- | 290 | udata=getenv("exostat_user"); |
|
- | 291 | if(udata==NULL || *udata==0) { |
|
221 | for(c1=cla; *c1; c1++) if(!isalnum(*c1) && *c1!='/') *c1=' '; |
292 | for(c1=cla; *c1; c1++) if(!isalnum(*c1) && *c1!='/') *c1=' '; |
222 | for(c1=find_word_start(cla); *c1; c1=find_word_start(c2)) { |
293 | for(c1=find_word_start(cla); *c1; c1=find_word_start(c2)) { |
223 | c2=find_word_end(c1); if(*c2) *c2++=0; |
294 | c2=find_word_end(c1); if(*c2) *c2++=0; |
224 | onedir(c1); |
295 | onedir(c1); |
- | 296 | } |
|
- | 297 | output(); |
|
- | 298 | } else { |
|
- | 299 | snprintf(user,sizeof(user),"%s",udata); |
|
- | 300 | multiuser(cla, user); |
|
- | 301 | sh=getenv("exostat_sheet"); |
|
- | 302 | if( sh==NULL || *sh==0 ) { output(); } |
|
- | 303 | else { |
|
- | 304 | int s=atoi(sh); |
|
- | 305 | s=(s-1)*MAX_EXO; |
|
- | 306 | int i; |
|
- | 307 | for(i=s;i < s + MAX_EXO;i++) { |
|
- | 308 | outsheetexo(i, 1); |
|
- | 309 | } |
|
- | 310 | }; |
|
225 | } |
311 | } |
226 | output(); |
- | |
227 | return 0; |
312 | return 0; |
228 | } |
313 | } |