Annotation of capa/capa51/GUITools/grader.funct.c, revision 1.1
1.1 ! albertel 1: /*
! 2: * grader.funct.c
! 3: * Copyright Guy Albertelli II 1996
! 4: * Portions Copyright Issac Tsai
! 5: */
! 6: #include <stdio.h>
! 7: #include <tk.h>
! 8: #include <Capa/capaCommon.h>
! 9: #include <grader.h>
! 10: #include <common.h>
! 11: #include <ctype.h>
! 12: #include <time.h>
! 13:
! 14: /*
! 15: * used to remeber the weights and partial credit from a parse for when
! 16: * setting a DBHeader
! 17: */
! 18:
! 19: /* Reads a header form the file and sets up the time and date variables
! 20: */
! 21: int capaGetHeader(ClientData clientdata, Tcl_Interp *interp, int argc, char *argv[])
! 22: {
! 23: T_header header;
! 24: char * setNumber,buf[BUFFER_SIZE],*sectionNumber,dateStr[BUFFER_SIZE];
! 25: int set,section,result;
! 26:
! 27:
! 28: setNumber=Tcl_GetVar(interp,"gSetLoad",TCL_GLOBAL_ONLY);
! 29: sectionNumber=Tcl_GetVar(interp,"gSectionLoad",TCL_GLOBAL_ONLY);
! 30:
! 31: if ( setNumber[0] == '\0' ) return TCL_OK;
! 32: if ( sectionNumber[0] == '\0' ) return TCL_OK;
! 33:
! 34: set=atoi(setNumber);
! 35: section=atoi(sectionNumber);
! 36:
! 37: result=capa_get_header(&header,set);
! 38:
! 39: if ( result == -1 )
! 40: {
! 41: Tcl_ResetResult(interp);
! 42: Tcl_AppendElement(interp,"0");
! 43: return TCL_OK;
! 44: }
! 45:
! 46: result=capa_get_date(CHECK_OPEN_DATE,NULL,section,set,dateStr);
! 47: if (result<0) {
! 48: Tcl_ResetResult(interp);
! 49: Tcl_AppendElement(interp,"-1");
! 50: return TCL_OK;
! 51: }
! 52: sscanf(dateStr,"%10c",buf);
! 53: buf[10]='\0';
! 54: Tcl_SetVar(interp,"gOpenDate",buf,TCL_GLOBAL_ONLY);
! 55: sscanf((dateStr)+11,"%5c",buf);
! 56: buf[5]='\0';
! 57: Tcl_SetVar(interp,"gOpenTime",buf,TCL_GLOBAL_ONLY);
! 58:
! 59: result=capa_get_date(CHECK_DUE_DATE,NULL,section,set,dateStr);
! 60: if (result<0) {
! 61: Tcl_ResetResult(interp);
! 62: Tcl_AppendElement(interp,"-1");
! 63: return TCL_OK;
! 64: }
! 65: sscanf(dateStr,"%10c",buf);
! 66: buf[10]='\0';
! 67: Tcl_SetVar(interp,"gDueDate",buf,TCL_GLOBAL_ONLY);
! 68: sscanf((dateStr)+11,"%5c",buf);
! 69: buf[5]='\0';
! 70: Tcl_SetVar(interp,"gDueTime",buf,TCL_GLOBAL_ONLY);
! 71:
! 72: result=capa_get_date(CHECK_ANS_DATE,NULL,section,set,dateStr);
! 73: if (result<0) {
! 74: Tcl_ResetResult(interp);
! 75: Tcl_AppendElement(interp,"-1");
! 76: return TCL_OK;
! 77: }
! 78: sscanf(dateStr,"%10c",buf);
! 79: buf[10]='\0';
! 80: Tcl_SetVar(interp,"gAnswerDate",buf,TCL_GLOBAL_ONLY);
! 81: sscanf((dateStr)+11,"%5c",buf);
! 82: buf[5]='\0';
! 83: Tcl_SetVar(interp,"gAnswerTime",buf,TCL_GLOBAL_ONLY);
! 84:
! 85: Tcl_ResetResult(interp);
! 86: Tcl_AppendElement(interp,"1");
! 87: capa_mfree(header.weight);
! 88: capa_mfree(header.partial_credit);
! 89: return TCL_OK;
! 90: }
! 91:
! 92: /* get the information for all of the students in the current section
! 93: * and puts them into the listbox.
! 94: * Arguments: the name of the variable the widget name of the listbox
! 95: * is in.
! 96: */
! 97: int capaGetStudents(ClientData clientdata, Tcl_Interp *interp, int argc, char *argv[])
! 98: {
! 99: T_student *headStudent,*currentStudent;
! 100: int result,section,set,setScore,maxScore,num=0;
! 101: char buf[BUFFER_SIZE],buf2[BUFFER_SIZE],*answers,*listWidget;
! 102:
! 103: section=atoi(Tcl_GetVar(interp,"gSectionLoad",TCL_GLOBAL_ONLY));
! 104: set=atoi(Tcl_GetVar(interp,"gSetLoad",TCL_GLOBAL_ONLY));
! 105:
! 106: if ( (listWidget = Tcl_GetVar(interp,argv[1],
! 107: TCL_GLOBAL_ONLY|TCL_LEAVE_ERR_MSG)) == NULL)
! 108: {
! 109: fprintf(stderr,"Tcl_GetVar error\n");
! 110: fprintf(stderr,"%s\n",interp->result);
! 111: return TCL_ERROR;
! 112: }
! 113:
! 114: result=capa_sorted_section(&headStudent,section);
! 115:
! 116: if (result == -1 || result == 0)
! 117: {
! 118: Tcl_Eval(interp,"displayError \"Invalid section\"");
! 119: Tcl_ResetResult(interp);
! 120: return TCL_OK;
! 121: }
! 122:
! 123: currentStudent=headStudent;
! 124:
! 125: while(currentStudent!=NULL)
! 126: {
! 127: num++;
! 128: setScore = capa_get_score(currentStudent->s_sn,set,&maxScore,&answers);
! 129: if ( setScore == -1 ) setScore=0;
! 130: sprintf(buf,"%s %s %2d/%2d %2d ",currentStudent->s_nm,
! 131: currentStudent->s_sn,setScore,maxScore,
! 132: capa_PIN(currentStudent->s_sn,set,0));
! 133:
! 134: capaPrepareBuffer(buf,buf2,0);
! 135: sprintf(buf,"%s insert end \"%s\" ",listWidget,buf2);
! 136:
! 137: if (Tcl_Eval(interp,buf) != TCL_OK)
! 138: {
! 139: fprintf(stderr,"Tcl_Eval error\n");
! 140: fprintf(stderr,"%s\n",interp->result);
! 141: free_students(headStudent);
! 142: return TCL_ERROR;
! 143: }
! 144:
! 145: if (!(num%10)) {
! 146: if (Tcl_Eval(interp,"update") != TCL_OK)
! 147: {
! 148: fprintf(stderr,"Tcl_Eval error\n");
! 149: fprintf(stderr,"%s\n",interp->result);
! 150: free_students(headStudent);
! 151: return TCL_ERROR;
! 152: }
! 153: }
! 154: currentStudent=currentStudent->s_next;
! 155: capa_mfree(answers);
! 156: }
! 157:
! 158: free_students(headStudent);
! 159: if (!(num%5)) {
! 160: if (Tcl_Eval(interp,"update") != TCL_OK)
! 161: {
! 162: fprintf(stderr,"Tcl_Eval error\n");
! 163: fprintf(stderr,"%s\n",interp->result);
! 164: return TCL_ERROR;
! 165: }
! 166: }
! 167: return TCL_OK;
! 168: }
! 169:
! 170: /* searches for the section a student is in by either name or number
! 171: * Arguments: one of (name or number) and then the name or number to
! 172: * search for.
! 173: */
! 174: int capaFindSection(ClientData clientdata, Tcl_Interp *interp, int argc, char *argv[])
! 175: {
! 176: int errorNm;
! 177: char searchStr[MAX_NAME_CHAR+1],buf[MAX_NAME_CHAR+1];
! 178: T_student student;
! 179:
! 180: switch(argv[1][1])
! 181: {
! 182: case 'a':
! 183: strncpy(searchStr,argv[2],MAX_NAME_CHAR+1);
! 184: if ( (errorNm = capa_student_byname(searchStr,&student ))==0 )
! 185: {
! 186: sprintf(buf,"%d",0);
! 187: }
! 188: else
! 189: {
! 190: sprintf(buf,"%d",student.s_sec);
! 191: }
! 192: break;
! 193: case 'u':
! 194: strncpy(searchStr,argv[2],MAX_NAME_CHAR+1);
! 195: if ( (errorNm = capa_get_student(searchStr,&student ))==0 )
! 196: {
! 197: sprintf(buf,"%d",0);
! 198: }
! 199: else
! 200: {
! 201: sprintf(buf,"%d",student.s_sec);
! 202: }
! 203: break;
! 204: default:
! 205: break;
! 206: }
! 207: Tcl_ResetResult(interp);
! 208: Tcl_AppendElement(interp,buf);
! 209: return TCL_OK;
! 210: }
! 211:
! 212: /* finds how many set.db files there are */
! 213: int howManySetDBFile()
! 214: {
! 215: char filename[FNAMELENGTH], *pathName;
! 216: int ii;
! 217:
! 218:
! 219: pathName=getcwd(NULL,FNAMELENGTH);
! 220: ii=1;
! 221: sprintf(filename,"%s/records/set%d.db",pathName,ii);
! 222: while(!access(filename, F_OK))
! 223: {
! 224: ii++;
! 225: sprintf(filename,"%s/records/set%d.db",pathName,ii);
! 226: }
! 227: free(pathName);
! 228: return (ii-1);
! 229: }
! 230:
! 231: /* makes a student report
! 232: * Arguments: the student number
! 233: */
! 234: int capaGetReportInfo(ClientData clientdata, Tcl_Interp *interp, int argc, char *argv[])
! 235: {
! 236: char studentNumber[MAX_STUDENT_NUMBER+1],
! 237: lineOne[BUFFER_SIZE],*wgt,*partialCredit;
! 238: T_header header;
! 239: T_entry entry;
! 240: int ii, setIdx, setScores, setValids,
! 241: totalSet, totalProbs, neverLogin;
! 242: int termScores, termValids;
! 243:
! 244: strncpy(studentNumber,argv[1], MAX_STUDENT_NUMBER+1);
! 245: totalSet = howManySetDBFile();
! 246:
! 247: Tcl_ResetResult(interp);
! 248:
! 249: for(termScores=0,termValids=0,setIdx=1;setIdx <= totalSet ;setIdx++)
! 250: {
! 251: capa_get_entry(&entry, studentNumber, setIdx);
! 252: totalProbs = entry.e_probs;
! 253: if( capa_get_header( &header, setIdx ) == -1 )
! 254: {
! 255: Tcl_ResetResult(interp);
! 256: Tcl_AppendElement(interp,"File Error");
! 257: return TCL_OK;
! 258: }
! 259: wgt=header.weight;
! 260: partialCredit=header.partial_credit;
! 261:
! 262: for(setScores=0, setValids=0,neverLogin=1,ii=0;ii<totalProbs;ii++)
! 263: {
! 264: switch(entry.answers[ii])
! 265: {
! 266: case 'Y': case 'y':
! 267: neverLogin = 0;
! 268: setScores += (wgt[ii] - '0');
! 269: setValids += (wgt[ii] - '0');
! 270: break;
! 271: case '-': case 'N': case 'n':
! 272: setValids += (wgt[ii] - '0');
! 273: break;
! 274: case 'E': case 'e':
! 275: break;
! 276: default :
! 277: if( entry.answers[ii] >= '0' && entry.answers[ii] <= '9' )
! 278: {
! 279: setScores += (entry.answers[ii] - '0');
! 280: setValids += (wgt[ii] - '0');
! 281: neverLogin = 0;
! 282: }
! 283: break;
! 284: }
! 285: }
! 286: entry.answers[totalProbs]='\0'; /* get rid of last unknown chars */
! 287: entry.tries[3*totalProbs]='\0';
! 288: termScores += setScores;
! 289: termValids += setValids;
! 290:
! 291: if(neverLogin)
! 292: {
! 293: sprintf(lineOne,"%3d -/%3d %s\n",setIdx,setValids,entry.answers);
! 294: }
! 295: else
! 296: {
! 297: sprintf(lineOne,"%3d %3d/%3d %s\n",setIdx,setScores,setValids,entry.answers);
! 298: }
! 299: Tcl_AppendResult(interp,lineOne,NULL);
! 300: sprintf(lineOne," %s\n",entry.tries);
! 301: Tcl_AppendResult(interp,lineOne,NULL);
! 302: capa_mfree(entry.answers);
! 303: capa_mfree(entry.tries);
! 304: }
! 305: sprintf(lineOne,"========================\n Total = %3d/%3d",termScores,termValids);
! 306: Tcl_AppendResult(interp,lineOne,NULL);
! 307: capa_mfree(header.weight);
! 308: capa_mfree(header.partial_credit);
! 309: return TCL_OK;
! 310: }
! 311:
! 312: int compare_string( a, b)
! 313: char *a, *b;
! 314: {
! 315: return( strcasecmp(a, b) );
! 316: }
! 317:
! 318: /* Builds a set summary
! 319: * Argument: the filename to write to
! 320: */
! 321: int capaGetSetSummary(ClientData clientdata, Tcl_Interp *interp, int argc, char *argv[])
! 322: {
! 323: T_student *stuPtr, *currentStudentPtr;
! 324: T_header a_header;
! 325: int section, set;
! 326: int studentCount,currentStudent, setScores, validScores;
! 327: char fmt1[64], fmt2[64],buf[BUFFER_SIZE],*str1="Student Name",*str2=" ";
! 328: char *answersPtr;
! 329: FILE *outputFile;
! 330:
! 331: section=atoi(Tcl_GetVar(interp,"gSectionLoad",TCL_GLOBAL_ONLY));
! 332: set=atoi(Tcl_GetVar(interp,"gSetLoad",TCL_GLOBAL_ONLY));
! 333: Tcl_ResetResult(interp);
! 334:
! 335: studentCount = capa_sorted_section(&stuPtr, section);
! 336: if( studentCount > 0 )
! 337: {
! 338: if( capa_get_header( &a_header, set) == -1 )
! 339: {
! 340: Tcl_Eval(interp,"displayerror \"Cannot open set.db file\"");
! 341: Tcl_ResetResult(interp);
! 342: free_students(stuPtr);
! 343: return TCL_OK;
! 344: }
! 345: capa_mfree(a_header.weight);
! 346: capa_mfree(a_header.partial_credit);
! 347: sprintf(fmt1,"%%-%ds\t%%%ss\t Score\n", MAX_NAME_CHAR,a_header.num_questions);
! 348:
! 349: outputFile=fopen(argv[1],"w");
! 350: fprintf(outputFile, "Section %-3d, Set %-3d Score Report\n",section, set);
! 351:
! 352: fprintf(outputFile, fmt1,str1,str2);
! 353:
! 354: sprintf(fmt1,"%%-%ds\t%%s\t -/%%3d\n", MAX_NAME_CHAR);
! 355: sprintf(fmt2,"%%-%ds\t%%s\t%%3d/%%3d\n", MAX_NAME_CHAR);
! 356:
! 357: for(currentStudentPtr=stuPtr,currentStudent=0;currentStudentPtr;
! 358: currentStudentPtr=currentStudentPtr->s_next,currentStudent++)
! 359: {
! 360: sprintf(buf,"updateStatusBar %f",(float)currentStudent/(float)studentCount);
! 361: Tcl_Eval(interp,buf);
! 362: if( (setScores = capa_get_score(currentStudentPtr->s_sn,
! 363: set,&validScores,&answersPtr) ) == -2 )
! 364: {
! 365: Tcl_Eval(interp,"displayerror \"Cannot open set.db file\"");
! 366: Tcl_ResetResult(interp);
! 367: free_students(stuPtr);
! 368: capa_mfree(answersPtr);
! 369: fclose(outputFile);
! 370: return TCL_OK;
! 371: }
! 372: if( setScores < 0 )
! 373: {
! 374: fprintf(outputFile,fmt1,currentStudentPtr->s_nm,answersPtr,validScores );
! 375: }
! 376: else
! 377: {
! 378: fprintf(outputFile,fmt2,currentStudentPtr->s_nm,answersPtr,setScores,validScores );
! 379: }
! 380: capa_mfree(answersPtr);
! 381: }
! 382: free_students(stuPtr);
! 383: fclose(outputFile);
! 384: }
! 385: return TCL_OK;
! 386: }
! 387:
! 388: /* builds a term summary
! 389: * Arguments: filename
! 390: */
! 391: int capaGetTermSummary(ClientData clientdata, Tcl_Interp *interp, int argc, char *argv[])
! 392: {
! 393: T_student *studentPtr, *currentStudentPtr;
! 394: int section, totalSet;
! 395: int setIndex, setScores, termScores, validScores, termValids;
! 396: int studentCount,currentStudent=1;
! 397: char fmt[64];
! 398: char *answersPtr,buf[BUFFER_SIZE];
! 399: FILE *outputFile;
! 400:
! 401: outputFile=fopen(argv[1],"w");
! 402: section=atoi(Tcl_GetVar(interp,"gSectionLoad",TCL_GLOBAL_ONLY));
! 403: totalSet = howManySetDBFile();
! 404: Tcl_ResetResult(interp);
! 405:
! 406: studentCount = capa_sorted_section(&studentPtr, section);
! 407: if( studentCount > 0 )
! 408: {
! 409: for(currentStudentPtr=studentPtr,currentStudent=1;currentStudentPtr;
! 410: currentStudentPtr=currentStudentPtr->s_next,currentStudent++)
! 411: {
! 412: sprintf(buf,"updateStatusBar %f",(float)currentStudent/(float)studentCount);
! 413: Tcl_Eval(interp,buf);
! 414: sprintf(fmt,"%%-%ds\n", MAX_NAME_CHAR);
! 415: fprintf(outputFile,fmt,currentStudentPtr->s_nm);
! 416:
! 417: for( termScores = 0, termValids = 0, setIndex = 1; setIndex <= totalSet; setIndex++)
! 418: {
! 419: if( (setScores = capa_get_score(currentStudentPtr->s_sn,
! 420: setIndex,&validScores,&answersPtr) ) == -2 )
! 421: {
! 422: sprintf(buf,"displayerror \"Cannot open set%d.db file\"",setIndex);
! 423: Tcl_Eval(interp,buf);
! 424: Tcl_ResetResult(interp);
! 425: capa_mfree(answersPtr);
! 426: free_students(studentPtr);
! 427: fclose(outputFile);
! 428: return TCL_OK;
! 429: }
! 430: if( setScores < 0 )
! 431: {
! 432: fprintf(outputFile,"Set %-3d\t%s\t -/%3d\n", setIndex,answersPtr, validScores);
! 433: }
! 434: else
! 435: {
! 436: fprintf(outputFile, "Set %-3d\t%s\t%3d/%3d\n",
! 437: setIndex,answersPtr,setScores,validScores );
! 438: termScores += setScores;
! 439: }
! 440: capa_mfree(answersPtr);
! 441: termValids += validScores;
! 442: }
! 443: fprintf(outputFile,"\t\t\tTerm Score = %3d/%3d\n", termScores,termValids);
! 444: fprintf(outputFile, "-----------------------------------------------------------------------\n");
! 445: }
! 446: free_students(studentPtr);
! 447: }
! 448: fclose(outputFile);
! 449: return TCL_OK;
! 450: }
! 451:
! 452: extern int Parsemode_f;
! 453:
! 454: /* runs capaParse and puts the results into a text widget
! 455: * Arguments: the name it is registered under (enscriptParse, texParse,
! 456: * webParse, bubblerParse); what results of the parse to show
! 457: * 0 (Problem Only), 1 (Question and Answer), 2 (Answer Only);
! 458: * the set number; either (Random or Specific) student; section;
! 459: * student Number; student Name ; the name of the variable to
! 460: * find the widget name of the text widget to put the text into
! 461: */
! 462: int capaTclParse (ClientData clientdata, Tcl_Interp *interp, int argc, char *argv[])
! 463: {
! 464: extern char *EndText_p;
! 465: T_student student;
! 466: Problem_t *headProblem,*currentProblem;
! 467: int numOfQuestions,numAnswers,problemNumber=0;
! 468: int result,i=1,j,length;
! 469: char *buf, *buf2, *temp, *previewText=NULL;
! 470: char lower[32],upper[32],ans[32], unit[32];
! 471: double targetAns;
! 472: int c_set;
! 473: #ifdef GRADER_UPDATE
! 474: char *update=";update";
! 475: #else
! 476: char *update=" ";
! 477: #endif
! 478:
! 479: switch(argv[0][0])
! 480: {
! 481: case 'e':Parsemode_f = ASCII_MODE;break;
! 482: case 't':Parsemode_f = TeX_MODE;break;
! 483: case 'w':Parsemode_f = HTML_MODE;break;
! 484: case 'b':Parsemode_f = BUBBLE_MODE;break;
! 485: default:
! 486: Tcl_ResetResult(interp);
! 487: Tcl_AppendElement(interp,"Invalid call to capaTclParse\n");
! 488: return TCL_ERROR;
! 489: break;
! 490: }
! 491:
! 492: if ( (previewText = Tcl_GetVar(interp,argv[7],
! 493: TCL_GLOBAL_ONLY|TCL_LEAVE_ERR_MSG)) == NULL)
! 494: {
! 495: fprintf(stderr,"Tcl_GetVar error\n");
! 496: fprintf(stderr,"%s\n",interp->result);
! 497: return TCL_ERROR;
! 498: }
! 499: c_set = atoi(argv[2]);
! 500: switch (argv[3][0])
! 501: {
! 502: case 'R':
! 503: result = capa_pick_student(atoi(argv[4]),&student);
! 504: if (result == -1)
! 505: {
! 506: buf=capa_malloc(BUFFER_SIZE,1);
! 507: sprintf(buf,"displayError \"There are no students in section %d.\"",
! 508: atoi(argv[4]));
! 509: Tcl_Eval(interp,buf);
! 510: capa_mfree(buf);
! 511: Tcl_ResetResult(interp);
! 512: Tcl_AppendElement(interp,"-1");
! 513: return TCL_OK;
! 514: }
! 515:
! 516: result = capa_parse(atoi(argv[2]),&headProblem,student.s_sn,&numOfQuestions,NULL);
! 517: break;
! 518: case 'S':
! 519: result = capa_get_student(argv[5],&student);
! 520: if ((result == -1) || (result == 0))
! 521: {
! 522: buf=capa_malloc(BUFFER_SIZE,1);
! 523: sprintf(buf,"displayError \"The student %s does not exist.\"",
! 524: argv[5]);
! 525: Tcl_Eval(interp,buf);
! 526: capa_mfree(buf);
! 527: Tcl_ResetResult(interp);
! 528: Tcl_AppendElement(interp,"-1");
! 529: return TCL_OK;
! 530: }
! 531: result = capa_parse(atoi(argv[2]),&headProblem,argv[5],&numOfQuestions,NULL);
! 532: break;
! 533: default:
! 534: Tcl_ResetResult(interp);
! 535: Tcl_AppendElement(interp,"Invalid 2nd argument to capaTclParse\n");
! 536: return TCL_ERROR;
! 537: break;
! 538: }
! 539:
! 540: if (result==-1)
! 541: {
! 542: Tcl_ResetResult(interp);
! 543: Tcl_AppendElement(interp,"-1");
! 544: return TCL_OK;
! 545: }
! 546:
! 547: currentProblem=headProblem;
! 548:
! 549: if(argv[1][0] == Q_ANSWER)
! 550: {
! 551: /*
! 552: switch(Parsemode_f)
! 553: {
! 554: case ASCII_MODE:
! 555: sprintf(buf,"Section %d Set %d\n Name: %s PIN: %d\n\n",
! 556: student.s_sec, atoi(argv[2]), student.s_nm,
! 557: capa_PIN(student.s_sn, atoi(argv[2]),0));
! 558: break;
! 559: case TeX_MODE:
! 560: sprintf(buf,"{\\bf Section %d\\qquad Set %d}\\\\\\medskip \n{\\bf Name: \
! 561: %s\\qquad PIN: %d}\\\\ \\bigskip\n\n", student.s_sec, atoi(argv[2]), student.s_nm,
! 562: capa_PIN(student.s_sn, atoi(argv[2]),0));
! 563: break;
! 564: case HTML_MODE:
! 565: sprintf(buf,"Section %d Set %d\n Name: %s PIN: %d\n\n",
! 566: student.s_sec, atoi(argv[2]), student.s_nm,
! 567: capa_PIN(student.s_sn, atoi(argv[2]),0));
! 568: break;
! 569: case BUBBLE_MODE:
! 570: break;
! 571: }
! 572: j=capaPrepareBuffer(buf,buf2,0);
! 573:
! 574: sprintf(buf,"%s insert end \" %s \" header",previewText,buf2);
! 575:
! 576: if (Tcl_Eval(interp,buf) != TCL_OK)
! 577: {
! 578: fprintf(stderr,"Tcl_Eval error\n");
! 579: fprintf(stderr,"%s\n",interp->result);
! 580: return TCL_ERROR;
! 581: }
! 582: */
! 583: }
! 584:
! 585: while (currentProblem!=NULL)
! 586: {
! 587: switch (argv[1][0])
! 588: {
! 589: case Q_PROBLEM:
! 590: if (currentProblem->question) {
! 591: length=strlen(currentProblem->question);
! 592: } else {
! 593: length=0;
! 594: }
! 595: buf=capa_malloc(BUFFER_SIZE+(2*length),1);
! 596: buf2=capa_malloc(BUFFER_SIZE+(2*length),1);
! 597: if(currentProblem->question) {
! 598: j=capaPrepareBuffer(currentProblem->question,buf2,0);
! 599: buf2[j-1]='\n';
! 600: buf2[j]='\0';
! 601: } else {
! 602: buf2[0]='\n';buf2[1]='\0';
! 603: }
! 604: if(currentProblem->question) {
! 605: j=capaPrepareBuffer(currentProblem->question,buf2,0);
! 606: buf2[j-1]='\n';
! 607: buf2[j]='\0';
! 608: } else {
! 609: buf2[0]='\n';buf2[1]='\0';
! 610: }
! 611:
! 612: switch(Parsemode_f)
! 613: {
! 614: case ASCII_MODE:
! 615: sprintf(buf,"%s insert end \"%s \n-----------\n\n\" problem",
! 616: previewText,buf2);
! 617: break;
! 618: case TeX_MODE:
! 619: sprintf(buf,"%s insert end \"%s\" problem",previewText,buf2);
! 620: break;
! 621: case HTML_MODE:
! 622: sprintf(buf,"%s insert end \"%s\" problem",previewText,buf2);
! 623: break;
! 624: case BUBBLE_MODE:
! 625: break;
! 626: }
! 627: if (Tcl_Eval(interp,buf) != TCL_OK)
! 628: {
! 629: fprintf(stderr,"Tcl_Eval error\n");
! 630: fprintf(stderr,"%s\n",interp->result);
! 631: return TCL_ERROR;
! 632: }
! 633: capa_mfree(buf);
! 634: capa_mfree(buf2);
! 635: break;
! 636: case Q_PROBLEM_AND_ANSWER:
! 637: if (currentProblem->question) {
! 638: length=strlen(currentProblem->question);
! 639: } else {
! 640: length=0;
! 641: }
! 642: buf=capa_malloc(BUFFER_SIZE+(2*length),1);
! 643: buf2=capa_malloc(BUFFER_SIZE+(2*length),1);
! 644: temp=capa_malloc(BUFFER_SIZE+(2*length),1);
! 645: j=capaPrepareBuffer(currentProblem->question,buf2,0);
! 646:
! 647: switch(Parsemode_f)
! 648: {
! 649: case ASCII_MODE:
! 650: sprintf(buf,"%s insert end \"%s \n-----------\n\n\" problem",
! 651: previewText,buf2);
! 652: break;
! 653: case TeX_MODE:
! 654: sprintf(buf,"%s insert end \"%s\" problem",previewText,buf2);
! 655: break;
! 656: case HTML_MODE:
! 657: sprintf(buf,"%s insert end \"%s\" problem",previewText,buf2);
! 658: break;
! 659: case BUBBLE_MODE:
! 660: break;
! 661: }
! 662: if (Tcl_Eval(interp,buf) != TCL_OK)
! 663: {
! 664: fprintf(stderr,"Tcl_Eval error\n");
! 665: fprintf(stderr,"%s\n",interp->result);
! 666: return TCL_ERROR;
! 667: }
! 668:
! 669: capa_mfree(buf);
! 670: capa_mfree(buf2);
! 671: capa_mfree(temp);
! 672: capaInsertAnswer(currentProblem,interp,previewText);
! 673: break;
! 674: case Q_ANSWER:
! 675: print_begin_item(Parsemode_f,interp,previewText,problemNumber+1);
! 676: capaInsertAnswer(currentProblem,interp,previewText);
! 677: break;
! 678: }
! 679:
! 680: currentProblem=currentProblem->next;
! 681: problemNumber++;
! 682: }
! 683: if( ( EndText_p != NULL) )
! 684: {
! 685: buf=capa_malloc(BUFFER_SIZE+(2*strlen(EndText_p)),1);
! 686: buf2=capa_malloc(BUFFER_SIZE+(2*strlen(EndText_p)),1);
! 687: temp=capa_malloc(BUFFER_SIZE+(2*strlen(EndText_p)),1);
! 688: sprintf(temp,"%s", EndText_p);
! 689: j=capaPrepareBuffer(temp,buf2,0);
! 690:
! 691: sprintf(buf,"%s insert end \"%s\" answer%s",previewText,buf2,update);
! 692:
! 693: if (Tcl_Eval(interp,buf) != TCL_OK)
! 694: {
! 695: fprintf(stderr,"Tcl_Eval error 7\n");
! 696: fprintf(stderr,"%s\n",interp->result);
! 697: return TCL_ERROR;
! 698: }
! 699: capa_mfree(buf);
! 700: capa_mfree(buf2);
! 701: capa_mfree(temp);
! 702: }
! 703: free_problems(headProblem);
! 704:
! 705: if (result==0)
! 706: {
! 707: Tcl_ResetResult(interp);
! 708: Tcl_AppendElement(interp,"0");
! 709: }
! 710: else
! 711: {
! 712: buf=capa_malloc(BUFFER_SIZE,1);
! 713: sprintf(buf,"%d",result);
! 714: Tcl_ResetResult(interp);
! 715: Tcl_AppendElement(interp,buf);
! 716: capa_mfree(buf);
! 717: }
! 718:
! 719: return TCL_OK;
! 720: }
! 721:
! 722: /* setup gQuestionType for all of the questions
! 723: * Arguments: number of Questions
! 724: */
! 725: int capaGetQuestionTypes(ClientData clientdata, Tcl_Interp *interp, int argc, char *argv[])
! 726: {
! 727: int numQuestions,result,i;
! 728: T_header header;
! 729: char buf[BUFFER_SIZE], buf2[BUFFER_SIZE],*weight;
! 730:
! 731: if (argc != 2)
! 732: {
! 733: Tcl_ResetResult(interp);
! 734: Tcl_AppendResult(interp,"Wrong number of arguments to getQuestionTypes",
! 735: NULL);
! 736: return TCL_ERROR;
! 737: }
! 738:
! 739: numQuestions=atoi(argv[1]);
! 740:
! 741: result = capa_get_header(&header,atoi(Tcl_GetVar(interp,"gSetLoad",
! 742: TCL_GLOBAL_ONLY)));
! 743: weight=header.weight;
! 744:
! 745: if (result == -1)
! 746: {
! 747: Tcl_ResetResult(interp);
! 748: Tcl_AppendResult(interp,"capa_get_header returned error.",NULL);
! 749: return TCL_ERROR;
! 750: }
! 751:
! 752: for(i=1;i<=numQuestions;i++)
! 753: {
! 754: sprintf(buf,"%d",i);
! 755: switch(header.partial_credit[i-1])
! 756: {
! 757: case '0':
! 758: Tcl_SetVar2(interp,"gQuestionType",buf,"autoGrade",TCL_GLOBAL_ONLY);
! 759: break;
! 760: case '1':
! 761: Tcl_SetVar2(interp,"gQuestionType",buf,"handGrade",TCL_GLOBAL_ONLY);
! 762: sprintf(buf,"max%d",i);
! 763: sprintf(buf2,"%c",weight[i-1]);
! 764: Tcl_SetVar2(interp,"gAnswer",buf,buf2,TCL_GLOBAL_ONLY);
! 765: break;
! 766: default:
! 767: Tcl_ResetResult(interp);
! 768: Tcl_AppendResult(interp,"Header for the set.db file is incorrect.",
! 769: NULL);
! 770: return TCL_ERROR;
! 771: break;
! 772: }
! 773: }
! 774: capa_mfree(header.weight);
! 775: capa_mfree(header.partial_credit);
! 776: Tcl_ResetResult(interp);
! 777: return TCL_OK;
! 778: }
! 779:
! 780: /* setup gAnswer for all of the questions
! 781: * Arguments: number of Questions
! 782: */
! 783: T_entry graderEntry;
! 784: int capaSetupGAnswer (ClientData clientdata, Tcl_Interp *interp, int argc, char *argv[])
! 785: {
! 786: int numQuestions,i,result;
! 787: char buf[BUFFER_SIZE],buf2[BUFFER_SIZE],*questionType;
! 788:
! 789: if (argc != 2)
! 790: {
! 791: Tcl_ResetResult(interp);
! 792: Tcl_AppendResult(interp,"Incorrect number of arguments to setup gAnswer",
! 793: NULL);
! 794: return TCL_ERROR;
! 795: }
! 796:
! 797: numQuestions=atoi(argv[1]);
! 798:
! 799: result = capa_get_entry(&graderEntry,Tcl_GetVar2(interp,"gGrading","number",
! 800: TCL_GLOBAL_ONLY),
! 801: atoi(Tcl_GetVar(interp,"gSetLoad",TCL_GLOBAL_ONLY)));
! 802:
! 803: if (result == 0)
! 804: {
! 805: Tcl_ResetResult(interp);
! 806: Tcl_AppendResult(interp,"capa_get_entry returned error.",NULL);
! 807: return TCL_ERROR;
! 808: }
! 809: for(i=1;i<=numQuestions;i++)
! 810: {
! 811: sprintf(buf,"%d.tries",i);
! 812: buf2[0]=graderEntry.tries[(i-1)*3];buf2[1]=graderEntry.tries[(i-1)*3+1];
! 813: buf2[2]='\0';
! 814: Tcl_SetVar2(interp,"gAnswer",buf,buf2,TCL_GLOBAL_ONLY);
! 815: sprintf(buf,"%d",i);
! 816: switch(graderEntry.answers[i-1])
! 817: {
! 818: case '-':
! 819: Tcl_SetVar2(interp,"gAnswer",buf,"-",TCL_GLOBAL_ONLY);
! 820: break;
! 821: case 'y':
! 822: case 'n':
! 823: case 'E':
! 824: sprintf(buf2,"%c",graderEntry.answers[i-1]);
! 825: Tcl_SetVar2(interp,"gAnswer",buf,buf2,TCL_GLOBAL_ONLY);
! 826: break;
! 827: case 'Y':
! 828: sprintf(buf2,"%c",graderEntry.answers[i-1]);
! 829: Tcl_SetVar2(interp,"gAnswer",buf,buf2,TCL_GLOBAL_ONLY);
! 830: questionType=Tcl_GetVar2(interp,"gQuestionType",buf,
! 831: TCL_GLOBAL_ONLY);
! 832: switch(questionType[0])
! 833: {
! 834: case 'a':
! 835: sprintf(buf,"$gGradeCanvas.dash%d configure -state disabled",i);
! 836: if (Tcl_Eval(interp,buf)!=TCL_OK)
! 837: return TCL_ERROR;
! 838: sprintf(buf,"$gGradeCanvas.y%d configure -state disabled",i);
! 839: if (Tcl_Eval(interp,buf)!=TCL_OK)
! 840: return TCL_ERROR;
! 841: sprintf(buf,"$gGradeCanvas.n%d configure -state disabled",i);
! 842: if (Tcl_Eval(interp,buf)!=TCL_OK)
! 843: return TCL_ERROR;
! 844: sprintf(buf,"$gGradeCanvas.e%d configure -state disabled",i);
! 845: if (Tcl_Eval(interp,buf)!=TCL_OK)
! 846: return TCL_ERROR;
! 847: break;
! 848: case 'h':
! 849: sprintf(buf,"$gGradeCanvas.hand%d configure -state disabled",i);
! 850: if (Tcl_Eval(interp,buf)!=TCL_OK)
! 851: return TCL_ERROR;
! 852: break;
! 853: default:
! 854: Tcl_ResetResult(interp);
! 855: Tcl_AppendElement(interp,"questionType contains invlaid data in capaSetupGAnswer.");
! 856: return TCL_ERROR;
! 857: break;
! 858: }
! 859: break;
! 860: default:
! 861: sprintf(buf2,"%c",graderEntry.answers[i-1]);
! 862: Tcl_SetVar2(interp,"gAnswer",buf,buf2,TCL_GLOBAL_ONLY);
! 863: break;
! 864: }
! 865: }
! 866:
! 867: Tcl_ResetResult(interp);
! 868: return TCL_OK;
! 869: }
! 870:
! 871: /* save gAnswer to the set.db file
! 872: * Arguments: number of Questions
! 873: */
! 874: int capaSaveGAnswer (ClientData clientdata, Tcl_Interp *interp, int argc, char *argv[])
! 875: {
! 876: T_entry entry;
! 877: int numQuestions,i,result;
! 878: char buf[BUFFER_SIZE],*gAnswer;
! 879:
! 880: if (argc != 2)
! 881: {
! 882: Tcl_ResetResult(interp);
! 883: Tcl_AppendResult(interp,"Incorrect number of arguments to save gAnswer",NULL);
! 884: return TCL_ERROR;
! 885: }
! 886:
! 887: numQuestions=atoi(argv[1]);
! 888:
! 889: entry.answers=capa_malloc(numQuestions+1,1);
! 890: entry.tries=capa_malloc(3*numQuestions+1,1);
! 891:
! 892: for(i=0;i<numQuestions;i++) {
! 893: sprintf(buf,"%d",i+1);
! 894: gAnswer=Tcl_GetVar2(interp,"gAnswer",buf,TCL_GLOBAL_ONLY);
! 895: if ( gAnswer[0] != graderEntry.answers[i] ) {
! 896: entry.answers[i]=gAnswer[0];
! 897: } else {
! 898: entry.answers[i]='?';
! 899: }
! 900: sprintf(buf,"%d.tries",i+1);
! 901: gAnswer=Tcl_GetVar2(interp,"gAnswer",buf,TCL_GLOBAL_ONLY);
! 902: if (atoi(gAnswer) != atoi(&(graderEntry.tries[i*3]))) {
! 903: sprintf(&(entry.tries[i*3]),"%2d",atoi(gAnswer));
! 904: if (i<numQuestions-1) entry.tries[i*3+2]=',';
! 905: } else {
! 906: entry.tries[i*3]='-';entry.tries[i*3+1]='1';
! 907: if (i<numQuestions-1) entry.tries[i*3+2]=',';
! 908: }
! 909: }
! 910: entry.answers[numQuestions]='\0';
! 911: entry.tries[numQuestions*3]='\0';
! 912: sprintf(entry.student_number,Tcl_GetVar2(interp,"gGrading","number",TCL_GLOBAL_ONLY));
! 913: entry.e_probs=numQuestions;
! 914: result = capa_change_entry(&entry,Tcl_GetVar2(interp,"gGrading","number",
! 915: TCL_GLOBAL_ONLY),
! 916: atoi(Tcl_GetVar(interp,"gSetLoad",TCL_GLOBAL_ONLY)));
! 917:
! 918: if (result == -1) {
! 919: Tcl_ResetResult(interp);
! 920: Tcl_AppendResult(interp,"capa_change_entry returned an error.",NULL);
! 921: return TCL_ERROR;
! 922: }
! 923:
! 924: Tcl_ResetResult(interp);
! 925: return TCL_OK;
! 926: }
! 927:
! 928: /* a wrapper for capa_excuse
! 929: * Arguments: set; problem; section
! 930: */
! 931: int capaExcuse (ClientData clientdata, Tcl_Interp *interp, int argc, char *argv[])
! 932: {
! 933: int result;
! 934:
! 935: result = capa_excuse(atoi(argv[1]),atoi(argv[2]),atoi(argv[3]));
! 936:
! 937: if (result == -1)
! 938: {
! 939: Tcl_ResetResult(interp);
! 940: Tcl_AppendResult(interp,"capa_excuse returned error.",NULL);
! 941: return TCL_ERROR;
! 942: }
! 943:
! 944: return TCL_OK;
! 945: }
! 946:
! 947: /* creates a summary report
! 948: * Arguments: the filename
! 949: */
! 950: int capaCreateSummary (ClientData clientdata, Tcl_Interp *interp, int argc, char *argv[])
! 951: {
! 952: int section = atoi(Tcl_GetVar2(interp,"gSummary","section",TCL_GLOBAL_ONLY)),
! 953: set = atoi(Tcl_GetVar2(interp,"gSummary","set",TCL_GLOBAL_ONLY));
! 954: int studentCount,currentStudent;
! 955: int setScores, termScores, validScores, termValids;
! 956: int setIndex, maxSet=0;
! 957: int whatSection;
! 958: char fmt[64];
! 959: char grades[4], sectionChar[4], *answersPtr, buf[BUFFER_SIZE], *who,*which,*sortOne,*sortTwo;
! 960: T_student *studentPtr, *currentStudentPtr;
! 961: FILE *outputFile;
! 962:
! 963: who=Tcl_GetVar2(interp,"gSummary","who",TCL_GLOBAL_ONLY);
! 964: which=Tcl_GetVar2(interp,"gSummary","which",TCL_GLOBAL_ONLY);
! 965: sortOne=Tcl_GetVar2(interp,"gSummary","first",TCL_GLOBAL_ONLY);
! 966: sortTwo=Tcl_GetVar2(interp,"gSummary","second",TCL_GLOBAL_ONLY);
! 967: maxSet=howManySetDBFile();
! 968: if ( ( ( strcmp(which,"upto") == 0 )
! 969: &&
! 970: ( ( set <= 0 )
! 971: ||
! 972: ( set >= NUM_SET_LIMIT ) ) )
! 973: ||
! 974: ( set > maxSet ) )
! 975: {
! 976: sprintf(buf,"displayError \"The set number (%d) doesn't exist.\"",set);
! 977: Tcl_Eval(interp,buf);
! 978: Tcl_ResetResult(interp);
! 979: Tcl_AppendResult(interp,"Error",NULL);
! 980: return TCL_ERROR;
! 981: }
! 982: outputFile=fopen(argv[1],"w");
! 983: if ( strcmp(who,"all") == 0 )
! 984: whatSection = GET_ALL_SECTIONS;
! 985: else
! 986: whatSection = section;
! 987: studentCount = capa_get_section(&studentPtr, whatSection);
! 988:
! 989: if (Tcl_Eval(interp,"updateStatusMessage \"Creating primary sort key\"") != TCL_OK)
! 990: {
! 991: free_students(studentPtr);
! 992: fclose(outputFile);
! 993: return TCL_ERROR;
! 994: }
! 995:
! 996: if( studentCount > 0 )
! 997: {
! 998: switch (sortOne[1])
! 999: {
! 1000: case 'a': /*BY_NAME*/
! 1001: for(currentStudentPtr=studentPtr,currentStudent=1;currentStudentPtr;
! 1002: currentStudentPtr=currentStudentPtr->s_next,currentStudent++)
! 1003: {
! 1004: sprintf(buf,"updateStatusBar %f",(float)currentStudent/(float)studentCount);
! 1005: Tcl_Eval(interp,buf);
! 1006: sprintf(currentStudentPtr->s_key,"%s",currentStudentPtr->s_nm);
! 1007: }
! 1008: break;
! 1009: case 'u': /*BY_NUMBER*/
! 1010: for(currentStudentPtr=studentPtr,currentStudent=1;currentStudentPtr;
! 1011: currentStudentPtr=currentStudentPtr->s_next,currentStudent++)
! 1012: {
! 1013: sprintf(buf,"updateStatusBar %f",(float)currentStudent/(float)studentCount);
! 1014: Tcl_Eval(interp,buf);
! 1015: sprintf(currentStudentPtr->s_key,"%s",currentStudentPtr->s_sn);
! 1016: }
! 1017: break;
! 1018: case 'e': /*BY_SECTION*/
! 1019: for(currentStudentPtr=studentPtr,currentStudent=1;currentStudentPtr;
! 1020: currentStudentPtr=currentStudentPtr->s_next,currentStudent++)
! 1021: {
! 1022: sprintf(buf,"updateStatusBar %f",(float)currentStudent/(float)studentCount);
! 1023: Tcl_Eval(interp,buf);
! 1024: sprintf(currentStudentPtr->s_key,"%03d",currentStudentPtr->s_sec);
! 1025: }
! 1026: break;
! 1027: case 'r': /*BY_GRADE*/
! 1028: if(strcmp(which,"specific") == 0 )
! 1029: {
! 1030: for(currentStudentPtr=studentPtr,currentStudent=1;currentStudentPtr;
! 1031: currentStudentPtr=currentStudentPtr->s_next,currentStudent++)
! 1032: {
! 1033: sprintf(buf,"updateStatusBar %f",(float)currentStudent/(float)studentCount);
! 1034: Tcl_Eval(interp,buf);
! 1035: if( (setScores = capa_get_score(currentStudentPtr->s_sn,set,
! 1036: &validScores,&answersPtr)) == -2 )
! 1037: break;
! 1038: if( setScores < 0 )
! 1039: sprintf(currentStudentPtr->s_key,"-");
! 1040: else
! 1041: sprintf(currentStudentPtr->s_key,"%03d",setScores);
! 1042: capa_mfree(answersPtr);
! 1043: }
! 1044: }
! 1045: else
! 1046: {
! 1047: for(currentStudentPtr=studentPtr,currentStudent=1;currentStudentPtr;
! 1048: currentStudentPtr=currentStudentPtr->s_next,currentStudent++)
! 1049: {
! 1050: sprintf(buf,"updateStatusBar %f",(float)currentStudent/(float)studentCount);
! 1051: Tcl_Eval(interp,buf);
! 1052: for( termScores = 0, termValids = 0, setIndex = 1;
! 1053: setIndex <= set; setIndex++)
! 1054: {
! 1055: if( (setScores = capa_get_score(currentStudentPtr->s_sn,setIndex,
! 1056: &validScores,&answersPtr)) >= 0 )
! 1057: termScores += setScores;
! 1058: capa_mfree(answersPtr);
! 1059: termValids += validScores;
! 1060: }
! 1061: sprintf(currentStudentPtr->s_key,"%03d",termScores);
! 1062: }
! 1063: }
! 1064: break;
! 1065: }
! 1066: if (Tcl_Eval(interp,"updateStatusMessage \"Creating secondary sort key\"") != TCL_OK)
! 1067: {
! 1068: free_students(studentPtr);
! 1069: fclose(outputFile);
! 1070: return TCL_ERROR;
! 1071: }
! 1072: switch (sortTwo[1])
! 1073: {
! 1074: case 'a':/*BY_NAME*/
! 1075: for(currentStudentPtr=studentPtr,currentStudent=1;currentStudentPtr;
! 1076: currentStudentPtr=currentStudentPtr->s_next,currentStudent++)
! 1077: {
! 1078: sprintf(buf,"updateStatusBar %f",(float)currentStudent/(float)studentCount);
! 1079: Tcl_Eval(interp,buf);
! 1080: strcat(currentStudentPtr->s_key,currentStudentPtr->s_nm);
! 1081: }
! 1082: break;
! 1083: case 'u':/*BY_NUMBER*/
! 1084: for(currentStudentPtr=studentPtr,currentStudent=1;currentStudentPtr;
! 1085: currentStudentPtr=currentStudentPtr->s_next,currentStudent++)
! 1086: {
! 1087: sprintf(buf,"updateStatusBar %f",(float)currentStudent/(float)studentCount);
! 1088: Tcl_Eval(interp,buf);
! 1089: strcat(currentStudentPtr->s_key,currentStudentPtr->s_sn);
! 1090: }
! 1091: break;
! 1092: case 'e':/*BY_SECTION*/
! 1093: for(currentStudentPtr=studentPtr,currentStudent=1;currentStudentPtr;
! 1094: currentStudentPtr=currentStudentPtr->s_next,currentStudent++)
! 1095: {
! 1096: sprintf(buf,"updateStatusBar %f",(float)currentStudent/(float)studentCount);
! 1097: Tcl_Eval(interp,buf);
! 1098: sprintf(sectionChar,"%03d",currentStudentPtr->s_sec);
! 1099: strcat(currentStudentPtr->s_key,sectionChar);
! 1100: }
! 1101: break;
! 1102: case 'r':/*BY_GRADE*/
! 1103: if(strcmp(which,"specific") == 0 )
! 1104: {
! 1105: for(currentStudentPtr=studentPtr,currentStudent=1;currentStudentPtr;
! 1106: currentStudentPtr=currentStudentPtr->s_next,currentStudent++)
! 1107: {
! 1108: sprintf(buf,"updateStatusBar %f",(float)currentStudent/(float)studentCount);
! 1109: Tcl_Eval(interp,buf);
! 1110: if( (setScores = capa_get_score(currentStudentPtr->s_sn,set,&validScores,
! 1111: &answersPtr) ) == -2 )
! 1112: break;
! 1113: if( setScores < 0 )
! 1114: strcat(currentStudentPtr->s_key,"-");
! 1115: else
! 1116: {
! 1117: sprintf(grades,"%03d",setScores);
! 1118: strcat(currentStudentPtr->s_key,grades);
! 1119: }
! 1120: capa_mfree(answersPtr);
! 1121: }
! 1122: }
! 1123: else
! 1124: {
! 1125: for(currentStudentPtr=studentPtr,currentStudent=1;currentStudentPtr;
! 1126: currentStudentPtr=currentStudentPtr->s_next,currentStudent++)
! 1127: {
! 1128: sprintf(buf,"updateStatusBar %f",(float)currentStudent/(float)studentCount);
! 1129: Tcl_Eval(interp,buf);
! 1130: for( termScores = 0, termValids = 0, setIndex = 1;
! 1131: setIndex <= set; setIndex++)
! 1132: {
! 1133: if( (setScores = capa_get_score(currentStudentPtr->s_sn,setIndex,
! 1134: &validScores,&answersPtr) ) >= 0 )
! 1135: termScores += setScores;
! 1136: capa_mfree(answersPtr);
! 1137: termValids += validScores;
! 1138: }
! 1139: sprintf(grades,"%03d",termScores);
! 1140: strcat(currentStudentPtr->s_key,grades);
! 1141: }
! 1142: }
! 1143: break;
! 1144: }
! 1145: if (Tcl_Eval(interp,"updateStatusMessage \"Sorting\"") != TCL_OK)
! 1146: {
! 1147: free_students(studentPtr);
! 1148: fclose(outputFile);
! 1149: return TCL_ERROR;
! 1150: }
! 1151: msort_main(&studentPtr);
! 1152: Tcl_ResetResult(interp);
! 1153:
! 1154: sprintf(fmt,"%%-%ds\t%%-%ds %%2d\t", MAX_NAME_CHAR,MAX_STUDENT_NUMBER);
! 1155: if (Tcl_Eval(interp,"updateStatusMessage \"Creating Report\"") != TCL_OK)
! 1156: {
! 1157: free_students(studentPtr);
! 1158: fclose(outputFile);
! 1159: return TCL_ERROR;
! 1160: }
! 1161: for(currentStudentPtr=studentPtr,currentStudent=1;currentStudentPtr;
! 1162: currentStudentPtr=currentStudentPtr->s_next,currentStudent++)
! 1163: {
! 1164: sprintf(buf,"updateStatusBar %f",(float)currentStudent/(float)studentCount);
! 1165: Tcl_Eval(interp,buf);
! 1166: fprintf(outputFile,fmt,currentStudentPtr->s_nm,currentStudentPtr->s_sn,
! 1167: currentStudentPtr->s_sec);
! 1168: if( strcmp(which,"specific") == 0)
! 1169: {
! 1170: setScores = 0; validScores = 0;
! 1171: if( (setScores =
! 1172: capa_get_score(currentStudentPtr->s_sn,set,&validScores,&answersPtr) ) == -2 )
! 1173: break;
! 1174: if( setScores < 0 )
! 1175: {
! 1176: fprintf(outputFile, " -\t%3d\n", validScores);
! 1177: }
! 1178: else
! 1179: {
! 1180: fprintf(outputFile, "%3d\t%3d\n",setScores, validScores);
! 1181: }
! 1182: capa_mfree(answersPtr);
! 1183: }
! 1184: else
! 1185: {
! 1186: for( setScores=0, validScores=0, termScores = 0, termValids = 0, setIndex = 1;
! 1187: setIndex <= set; setIndex++)
! 1188: {
! 1189: if( (setScores = capa_get_score(currentStudentPtr->s_sn,setIndex,
! 1190: &validScores,&answersPtr) ) >= 0 )
! 1191: termScores += setScores;
! 1192: capa_mfree(answersPtr);
! 1193: termValids += validScores;
! 1194: if( setScores >= 0 )
! 1195: {
! 1196: fprintf(outputFile, "%3d ",setScores);
! 1197: }
! 1198: else
! 1199: {
! 1200: fprintf(outputFile, " - ");
! 1201: }
! 1202: }
! 1203: fprintf(outputFile, "\t %3d\t%3d\n",termScores,termValids);
! 1204: }
! 1205: }
! 1206: free_students(studentPtr);
! 1207: }
! 1208: fclose(outputFile);
! 1209: return TCL_OK;
! 1210: }
! 1211:
! 1212: /* set the gAnswer score to what ever the user entered
! 1213: * Arguments: problemNumber
! 1214: */
! 1215: int capaSetHandGrade (ClientData clientdata, Tcl_Interp *interp, int argc, char *argv[])
! 1216: {
! 1217: int problemNumber=atoi(argv[1]),handGrade,maxGrade;
! 1218: char *handGradeChar,buf[BUFFER_SIZE];
! 1219:
! 1220: handGradeChar=Tcl_GetVar(interp,"gNewHandGrade",TCL_GLOBAL_ONLY);
! 1221: sprintf(buf,"max%d",problemNumber);
! 1222: maxGrade=atoi(Tcl_GetVar2(interp,"gAnswer",buf,TCL_GLOBAL_ONLY));
! 1223:
! 1224: if (isdigit(handGradeChar[0])) {
! 1225: handGrade=atoi(handGradeChar);
! 1226: if (handGrade > maxGrade) {
! 1227: sprintf(buf,"displayError \"Invalid response, you must enter a number between 0 and %d, or an E to excuse the problem.\"",maxGrade);
! 1228: if (Tcl_Eval(interp,buf)!=TCL_OK) {
! 1229: return TCL_ERROR;
! 1230: }
! 1231: } else {
! 1232: sprintf(buf,"%d",handGrade);
! 1233: Tcl_SetVar2(interp,"gAnswer",argv[1],buf,TCL_GLOBAL_ONLY);
! 1234: }
! 1235: } else {
! 1236: if (handGradeChar[0]=='E') {
! 1237: Tcl_SetVar2(interp,"gAnswer",argv[1],"E",TCL_GLOBAL_ONLY);
! 1238: } else {
! 1239: sprintf(buf,"displayError \"Invalid response, you must enter a number between 0 and %d, or an E to excuse the problem.\"",maxGrade);
! 1240: if (Tcl_Eval(interp,buf)!=TCL_OK) return TCL_ERROR;
! 1241:
! 1242: }
! 1243: }
! 1244: Tcl_ResetResult(interp);
! 1245: return TCL_OK;
! 1246: }
! 1247:
! 1248: /* save gAnswer to the set.db file
! 1249: * Arguments: setNum, questNum, stuId, score
! 1250: */
! 1251: int capaSetScore (ClientData clientdata, Tcl_Interp *interp, int argc, char *argv[])
! 1252: {
! 1253: T_entry entry;
! 1254: int score,i,result,question,numQuest,set;
! 1255: char buf[BUFFER_SIZE],*gAnswer,*stuId;
! 1256: T_header header;
! 1257:
! 1258: if (argc != 5)
! 1259: {
! 1260: Tcl_ResetResult(interp);
! 1261: Tcl_AppendResult(interp,"Incorrect number of arguments to save gAnswer",NULL);
! 1262: return TCL_ERROR;
! 1263: }
! 1264:
! 1265: set=atoi(argv[1]);
! 1266: question=atoi(argv[2]);
! 1267: stuId=argv[3];
! 1268: score=atoi(argv[4]);
! 1269:
! 1270: result=capa_get_header(&header,set);
! 1271:
! 1272: numQuest=atoi(header.num_questions);
! 1273: result = capa_get_entry(&entry,stuId,set);
! 1274:
! 1275: entry.answers=capa_malloc(numQuest+1,1);
! 1276: entry.tries=capa_malloc(3*numQuest+1,1);
! 1277:
! 1278: for(i=0;i<numQuest;i++) {
! 1279: if ( i==(question-1) ) {
! 1280: entry.answers[i]=score+'0';
! 1281: } else {
! 1282: entry.answers[i]='-';
! 1283: }
! 1284: entry.tries[i*3]='-';entry.tries[i*3+1]='1';
! 1285: if (i<numQuest-1) entry.tries[i*3+2]=',';
! 1286: }
! 1287:
! 1288: entry.answers[numQuest]='\0';
! 1289: entry.tries[(numQuest)*3]='\0';
! 1290: sprintf(entry.student_number,stuId);
! 1291: entry.e_probs=numQuest;
! 1292: result = capa_change_entry(&entry,stuId,set);
! 1293:
! 1294: if (result == -1) {
! 1295: Tcl_ResetResult(interp);
! 1296: Tcl_AppendResult(interp,"capa_change_entry returned an error.",NULL);
! 1297: return TCL_ERROR;
! 1298: }
! 1299:
! 1300: Tcl_ResetResult(interp);
! 1301: return TCL_OK;
! 1302: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>