Subversion Repositories wimsdev

Rev

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<8 && *pp; pp=find_word_start(pe),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,t1);
162
      snprintf(buf,sizeof(buf),"%s/%s/score/%s",dirbase,dirname,fname);
129
      dir=opendir(buf); if(dir==NULL) return;
-
 
130
      while((ff=readdir(dir))!=NULL) {
163
      onefile(buf,t1);
131
          if(!isalnum(ff->d_name[0]) ||
-
 
132
             strcmp(ff->d_name,"supervisor")==0) continue;
-
 
133
          snprintf(buf2,sizeof(buf2),"%s/%s",buf,ff->d_name);
164
      snprintf(buf2,sizeof(buf),"%s/%s/noscore/%s",dirbase,dirname,fname);
134
          onefile(buf2);
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 output(void)
218
void  outsheetexo (int i, int flag)
172
{
219
{
173
    int i;
-
 
174
    for(i=0;i<MAX_SHEET*MAX_EXO;i++) {
-
 
175
      if(shdata[i].newcnt<=0) continue;
220
  if(shdata[i].newcnt<=0) return;
176
      stati(shdata+i);
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
    for(i=0;i<MAX_EXAM*MAX_EXO;i++) {
251
void outexamexo (int i)
-
 
252
{
190
      if(examdata[i].newcnt<=0) continue;
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
}