Annotation of capa/capa51/GUITools/scorertoset.c, revision 1.1
1.1 ! albertel 1: /*
! 2: * scorertoset.c
! 3: * Copyright Guy Albertelli II 1997
! 4: */
! 5: #include <stdio.h>
! 6: #include <ctype.h>
! 7: #include <tcl.h>
! 8: #include <tk.h>
! 9: #include "Capa/capaCommon.h"
! 10: #include "scorer.h"
! 11:
! 12: /**************************************************Set Database Entry */
! 13: int scorer_set_entry(ClientData notused, Tcl_Interp *interp, int argc, char** argv)
! 14: {
! 15: FILE *fp;
! 16: int fd;
! 17: int errcode=TCL_OK;
! 18: int done,len,new_len,item_cnt;
! 19: long next_r, orig_size, new_size, big_buf_size;
! 20: char filename[FILE_NAME_LENGTH];
! 21: char *a_line, tmpline[MAX_LINE_LENGTH], errorline[MAX_LINE_LENGTH],
! 22: tmp_sn[MAX_STUDENT_NUMBER+1], fmtbuf[SMALL_LINE_BUFFER];
! 23: char *big_buf;
! 24: char *student_number,*answers,*tries;
! 25: int set;
! 26: long offset;
! 27:
! 28: if (argc != 6) {
! 29: Tcl_SetResult(interp,"usage is: studentNumber set fileOffset answers tries",
! 30: TCL_VOLATILE);
! 31: return TCL_ERROR;
! 32: }
! 33: student_number=argv[1];
! 34: set=atoi(argv[2]);
! 35: offset=atoi(argv[3]);
! 36: answers=argv[4];
! 37: tries=argv[5];
! 38:
! 39: offset=(offset<0)?-offset:offset;
! 40:
! 41: sprintf(filename,"records/set%d.sb",set);
! 42: if ((fp=fopen(filename,"r+"))==NULL) {
! 43: sprintf(errorline,"Error: can't open %s\n",filename);
! 44: Tcl_SetResult(interp,errorline,TCL_VOLATILE);
! 45: return TCL_ERROR;
! 46: }
! 47: a_line=capa_malloc(strlen(tries)*5,1);
! 48: sprintf(a_line,"%s %s,%s\n",student_number,answers,tries);
! 49: new_len = strlen(a_line);
! 50: sprintf(fmtbuf, "%%%dc",MAX_STUDENT_NUMBER);
! 51: flockstream(fp);
! 52: fseek(fp,0L,SEEK_END);
! 53: orig_size = ftell(fp);
! 54: big_buf_size = orig_size + new_len;
! 55: big_buf = capa_malloc(big_buf_size,1);
! 56: fseek(fp,0L,SEEK_SET); /* rewind to beginning of file */
! 57: fgets(tmpline,TMP_LINE_LENGTH-1,fp); /* skip weight line, including \n */
! 58: fgets(tmpline,TMP_LINE_LENGTH-1,fp); /* hand grading */
! 59: done = 0;
! 60: while(!done) {
! 61: done = !fgets(tmpline,TMP_LINE_LENGTH-1,fp); len = strlen(tmpline);
! 62: if( !done ) {
! 63: sscanf(tmpline,fmtbuf,tmp_sn);
! 64: if( !strncasecmp(tmp_sn,student_number,MAX_STUDENT_NUMBER) ) { /* Found */
! 65: next_r = ftell(fp); offset = next_r - len; done = 1;
! 66: item_cnt=fread(big_buf,1,big_buf_size, fp); /* read remaining lines into buffer */
! 67: if(item_cnt >= 0 ) { /* no error reading remaining lines */
! 68: big_buf[item_cnt]=0; /* terminate the buffer, for sure */
! 69: fseek(fp,offset,SEEK_SET); /* reposition file pointer to the record */
! 70: if (!fwrite(a_line,new_len,1,fp) ) { /* write out the records */
! 71: sprintf(errorline,"Error writing data to file: %s\n",filename);
! 72: Tcl_SetResult(interp,errorline,TCL_VOLATILE);
! 73: errcode= TCL_ERROR;
! 74: }
! 75: if (item_cnt != 0) {
! 76: if (!fwrite(big_buf,item_cnt,1,fp) ){/*write out the remainings*/
! 77: sprintf(errorline,"Error writing data to file: %s\n",filename);
! 78: Tcl_SetResult(interp,errorline,TCL_VOLATILE);
! 79: errcode= TCL_ERROR;
! 80: }
! 81: }
! 82: new_size = ftell(fp);
! 83: if(new_size < orig_size ) {
! 84: fd = fileno(fp);
! 85: ftruncate(fd,new_size);
! 86: }
! 87: }
! 88: }
! 89: } else { /* end of file */
! 90: fseek(fp,0L,SEEK_END);
! 91: offset = ftell(fp); /* last byte, if last byte is cr, back up one */
! 92: fseek(fp,-1L,SEEK_END);
! 93: while(fgetc(fp) == '\n' ) { offset--; fseek(fp,offset,SEEK_SET); }
! 94: offset = offset +2; /* last char and cr */
! 95: done=1;
! 96: fseek(fp,offset,SEEK_SET);
! 97: if (!fwrite(a_line,new_len,1,fp) ) { /* write out the records */
! 98: sprintf(errorline,"Error writing data to file: %s\n",filename);
! 99: Tcl_SetResult(interp,errorline,TCL_VOLATILE);
! 100: errcode= TCL_ERROR;
! 101: }
! 102: }
! 103: }
! 104: fflush(fp);
! 105: funlockstream(fp); /* <======= unlock the file */
! 106: fclose(fp);
! 107: capa_mfree(big_buf); /* free up the buffer */
! 108: return (errcode);
! 109: }
! 110:
! 111: /**************************************************** Get db entry*/
! 112: /* RETURNS: byte offset to start of record, 0 if error,
! 113: -offset if not found & newly created
! 114:
! 115: */
! 116: int scorer_get_entry(ClientData notused, Tcl_Interp *interp, int argc, char** argv)
! 117: {
! 118: char filename[FILE_NAME_LENGTH];
! 119: FILE *fp;
! 120: int len, nq;
! 121: char *ans_p, *tries_p,oneline[MAX_LINE_LENGTH],fmtbuf[MAX_LINE_LENGTH],
! 122: buf[MAX_LINE_LENGTH];
! 123: long offset=0, next_r;
! 124: int ii, done, found=0,set;
! 125: char a_sn[MAX_STUDENT_NUMBER+1];
! 126: char *student_number;
! 127: T_entry *entry;
! 128:
! 129: if (argc!=3) {
! 130: Tcl_SetResult(interp,"usage is: studentNumber set",TCL_VOLATILE);
! 131: return TCL_ERROR;
! 132: }
! 133: set=atoi(argv[2]);
! 134: student_number=argv[1];
! 135: entry=(T_entry*)capa_malloc(1,sizeof(T_entry));
! 136:
! 137: sprintf(filename,"records/set%d.sb",set);
! 138: if ((fp=fopen(filename,"r"))==NULL) {
! 139: sprintf(buf,"Error: can't open %s\n",filename);
! 140: Tcl_SetResult(interp,buf,TCL_VOLATILE);
! 141: return TCL_ERROR;
! 142: }
! 143: sprintf(entry->student_number,"%s",student_number);
! 144: sprintf(fmtbuf, "%%%dc",MAX_STUDENT_NUMBER);
! 145: flockstream(fp);
! 146: fgets(oneline,MAX_LINE_LENGTH-1,fp);
! 147: len = strlen(oneline); sscanf(oneline,"%d",&nq);
! 148: ans_p = capa_malloc(nq+1,1); tries_p = capa_malloc(3*nq,1);
! 149: fgets(oneline,MAX_LINE_LENGTH-1,fp); /* skip weight line */
! 150: fgets(oneline,MAX_LINE_LENGTH-1,fp); /* hand grading */
! 151: done = 0;
! 152: while(!done) {
! 153: done = !fgets(oneline,MAX_LINE_LENGTH-1,fp); len = strlen(oneline);
! 154: if( !done ) {
! 155: sscanf(oneline,fmtbuf,a_sn);
! 156: if( !strncasecmp(a_sn,student_number,MAX_STUDENT_NUMBER) ) { /* Found */
! 157: next_r = ftell(fp); offset = next_r - len; done = 1; found = 1;
! 158: }
! 159: } else {
! 160: fseek(fp,0L,SEEK_END);
! 161: offset = ftell(fp); /* last byte, if last bye is cr, back up one */
! 162: fseek(fp,-1L,SEEK_END);
! 163: while(fgetc(fp) == '\n' ) { offset--; fseek(fp,offset,SEEK_SET); }
! 164: offset = offset +2; /* last char and cr */
! 165: found = 0; done=1;
! 166: }
! 167: }
! 168: funlockstream(fp); fclose(fp);
! 169: if(!found) {
! 170: for(ii=0;ii<nq;ii++) { /* Initialize answer string and tries string */
! 171: ans_p[ii] = '-'; tries_p[3*ii] = ' '; tries_p[3*ii + 1] = '0';
! 172: if(ii < nq-1) tries_p[3*ii + 2] = ',';
! 173: }
! 174: entry->answers = ans_p;
! 175: entry->tries = tries_p;
! 176: entry->e_probs = nq;
! 177: /*if (scorer_set_entry(entry,student_number,set,offset)==-1)
! 178: offset=0;*/
! 179: offset = -offset;
! 180: } else {
! 181: sprintf(fmtbuf, "%%%dc",nq);
! 182: sscanf(oneline + MAX_STUDENT_NUMBER+1,fmtbuf,ans_p);
! 183: sprintf(fmtbuf, "%%%dc",(3*nq-1));
! 184: sscanf(oneline + MAX_STUDENT_NUMBER+1+nq+1,fmtbuf,tries_p);
! 185: entry->answers = ans_p;
! 186: entry->tries = tries_p;
! 187: entry->e_probs = nq;
! 188: }
! 189: sprintf(buf,"%d;%d;%s;%s",offset,entry->e_probs,entry->answers,entry->tries);
! 190: Tcl_SetResult(interp,buf,TCL_VOLATILE);
! 191: return TCL_OK;
! 192: }
! 193:
! 194: void processFile(FILE *inputFile,Question questions[MAX_QUEST],int setId,
! 195: int gradingMethod,int numQuestions)
! 196: {
! 197: T_entry grade;
! 198: char studentNumber[MAX_STUDENT_NUMBER+1],name[MAX_NAME_CHAR+1];
! 199: int offset,score,section,buf,i,numRight,points=0,leafs,processed=0,unit;
! 200:
! 201: printf("Processing");
! 202: while(fscanf(inputFile,"%s",studentNumber)!=EOF)
! 203: {
! 204: processed++;
! 205: if (processed%100==1) { printf("%d",processed-1); }
! 206: printf(".");
! 207: fflush(stdout);
! 208: /* if ((offset = scorer_get_entry(&grade,studentNumber,setId))==0)
! 209: {
! 210: fprintf(stderr,"Please create the set%d.sb file\n",setId);
! 211: exit(-1);
! 212: }
! 213: */
! 214: fscanf(inputFile,"%30c",name);
! 215: fscanf(inputFile,"%s",grade.answers);
! 216: fscanf(inputFile,"%d",&score);
! 217: fscanf(inputFile,"%d",§ion);
! 218: if ( (grade.e_probs != strlen(grade.answers))
! 219: ||
! 220: (strlen(grade.answers) != numQuestions))
! 221: {
! 222: fprintf(stderr,"There is a disagreement in the number of problems");
! 223: fprintf(stderr,"\nNumQuestions:%d\n",numQuestions);
! 224: fprintf(stderr,"strlen(grade.answers):%d\n",strlen(grade.answers));
! 225: fprintf(stderr,"grade.answers:%s\n",grade.answers);
! 226: fprintf(stderr,"grade.e_probs:%d\n",grade.e_probs);
! 227: fprintf(stderr,"The set.sb file may have bad entries, please\n");
! 228: fprintf(stderr,"check the file and fix the error.\n");
! 229: exit(-1);
! 230: }
! 231: buf='\0';
! 232: while(buf!='\n')
! 233: {
! 234: buf=fgetc(inputFile);
! 235: }
! 236: #ifdef DEBUG
! 237: printf("%d %d\n",numQuestions,strlen(grade.answers));
! 238: #endif /*DEBUG*/
! 239: for(i=0;i<numQuestions;i++)
! 240: {
! 241: switch(questions[i].type)
! 242: {
! 243: case ONE_OUT_OF_8:
! 244: case SINGLE_DIGIT:
! 245: numRight= (int) (grade.answers[i]-'0');
! 246: score=numRight*questions[i].points;
! 247: grade.answers[i]='0'+(char)score;
! 248: break;
! 249: case STRING_MATCH:
! 250: /*for STRING_MATCH the score is stroed as the NumRight*/
! 251: numRight= (int) (grade.answers[i]-'0');
! 252: score=numRight;
! 253: grade.answers[i]='0'+(char)score;
! 254: break;
! 255: case GLE:
! 256: case TF:
! 257: case N_OUT_OF_M:
! 258: numRight=(int) (grade.answers[i]-'0');
! 259: leafs=questions[i].leafs;
! 260: points=questions[i].points;
! 261: unit=(int)ceil((double)points/(double)leafs);
! 262: if (unit==0) unit=points;
! 263: switch (gradingMethod)
! 264: {
! 265: case CAPA_METHOD:
! 266: score=points-(2*unit*(leafs-numRight));
! 267: break;
! 268: case LENIENT_METHOD:
! 269: score=points-(unit*(leafs-numRight));
! 270: break;
! 271: case STRICT:
! 272: if (numRight==leafs) score=points;
! 273: else score=0;
! 274: break;
! 275: default:
! 276: fprintf(stderr,"Unknown grading Method. %d\n",gradingMethod);
! 277: break;
! 278: }
! 279: if (score<0)
! 280: score=0;
! 281: grade.answers[i]='0'+(char)score;
! 282: break;
! 283: case ASSIGNED:
! 284: /*
! 285: *grade.answers already has the correct number of points.
! 286: *i.e whatever the scorer.output file had in it and was put in
! 287: *grade.
! 288: */
! 289: break;
! 290: default:
! 291: fprintf(stderr,"Unknown question type %c\n",questions[i].type);
! 292: break;
! 293: }
! 294: }
! 295: for(i=0;i<strlen(grade.answers);i++)
! 296: {
! 297: grade.tries[3*i]=' ';
! 298: grade.tries[3*i+1]='1';
! 299: grade.tries[3*i+2]=',';
! 300: }
! 301: grade.tries[3*i-1]='\0';
! 302: grade.answers[i]='\0';
! 303: #ifdef DEBUG
! 304: printf("%s\n",studentNumber);
! 305: #endif /*DEBUG*/
! 306: /*if (scorer_set_entry(&grade,studentNumber,setId,abs(offset))==-1)
! 307: {
! 308: fprintf(stderr,"Please create the set%d.sb file\n",setId);
! 309: exit(-1);
! 310: }
! 311: */
! 312: }
! 313: printf("\nProcessed %d results\n",processed);
! 314: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>