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>