Annotation of capa/capa51/GUITools/quizzer.funct.c, revision 1.1

1.1     ! albertel    1: /*
        !             2:  * quizzer.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 <quizzer.h>
        !            10: #include <common.h>
        !            11: #include <ctype.h>
        !            12: #include <time.h>
        !            13: #include <signal.h>
        !            14: #include <sys/types.h>
        !            15: #include <sys/wait.h>
        !            16: #include <errno.h>
        !            17: 
        !            18: extern  int errno;
        !            19: extern  int Parsemode_f;
        !            20: static  int capaParsing;
        !            21: static  int gCreateDvi;
        !            22: void capaQuizzerStatus();
        !            23: 
        !            24: T_header gCapaHeader;
        !            25: static char* gPreviewText;
        !            26: int capaTclParse (ClientData clientdata, Tcl_Interp *interp, int argc, 
        !            27: 		  char *argv[])
        !            28: {
        !            29: 
        !            30:   extern  char      *EndText_p;
        !            31:   extern  char      *StartText_p;
        !            32:   T_student student;
        !            33:   Problem_t *headProblem,*currentProblem;
        !            34:   int numOfQuestions,numAnswers,problemNumber=0;
        !            35:   int result,i=1,j,length;
        !            36:   char *buf, *buf2, *temp, *previewText=NULL;
        !            37:   char lower[32],upper[32],ans[64], unit[64];
        !            38:   double  targetAns;
        !            39: #ifdef QUIZZER_UPDATE
        !            40:   char *update=";update";
        !            41: #else
        !            42:   char *update=" ";
        !            43: #endif
        !            44: 
        !            45:   capaParsing = 1;
        !            46:   switch(argv[0][0])
        !            47:     {
        !            48:     case 'e':Parsemode_f = ASCII_MODE;break;
        !            49:     case 't':Parsemode_f = TeX_MODE;break;
        !            50:     case 'w':Parsemode_f = HTML_MODE;break;
        !            51:     default:
        !            52:       Tcl_ResetResult(interp);
        !            53:       Tcl_AppendElement(interp,"Invalid call to capaTclParse\n");
        !            54:       capaParsing=0;
        !            55:       return TCL_ERROR;
        !            56:       break;
        !            57:     }
        !            58: 
        !            59:   if (argc==9) { gCreateDvi=atoi(argv[8]); } else { gCreateDvi=0; }
        !            60: 
        !            61:   if ( (previewText = Tcl_GetVar(interp,argv[7],
        !            62: 				 TCL_GLOBAL_ONLY|TCL_LEAVE_ERR_MSG)) == NULL)
        !            63:     {
        !            64:       fprintf(stderr,"Tcl_GetVar error\n");
        !            65:       fprintf(stderr,"%s\n",interp->result);
        !            66:       capaParsing=0;
        !            67:       return TCL_ERROR;
        !            68:     }
        !            69:   gPreviewText=previewText;
        !            70:   switch (argv[3][0])
        !            71:     {
        !            72:     case 'R':
        !            73:       result = capa_pick_student(atoi(argv[4]),&student);
        !            74:       if (result == -1)
        !            75: 	{
        !            76: 	  buf=capa_malloc(BUFFER_SIZE,1);
        !            77: 	  sprintf(buf,"displayError \"There are no students in section %d.\"",
        !            78: 		  atoi(argv[4]));
        !            79: 	  Tcl_Eval(interp,buf);
        !            80: 	  capa_mfree(buf);
        !            81: 	  Tcl_ResetResult(interp);
        !            82: 	  Tcl_AppendElement(interp,"-1");
        !            83: 	  capaParsing = 0;
        !            84: 	  return TCL_ERROR;
        !            85: 	}
        !            86:       result = capa_parse(atoi(argv[2]),&headProblem,student.s_sn,
        !            87: 			  &numOfQuestions,capaQuizzerStatus);
        !            88:       break;
        !            89:     case 'S':
        !            90:       result = capa_get_student(argv[5],&student);
        !            91:       if ((result == -1) || (result == 0))
        !            92: 	{
        !            93: 	  buf=capa_malloc(BUFFER_SIZE,1);
        !            94: 	  sprintf(buf,"displayError \"The student %s does not exist.\"",
        !            95: 		  argv[5]);
        !            96: 	  Tcl_Eval(interp,buf);
        !            97: 	  capa_mfree(buf);
        !            98: 	  Tcl_ResetResult(interp);
        !            99: 	  Tcl_AppendElement(interp,"-1");
        !           100: 	  capaParsing = 0;
        !           101: 	  return TCL_ERROR;
        !           102: 	}
        !           103:       result = capa_parse(atoi(argv[2]),&headProblem,argv[5],&numOfQuestions,
        !           104: 			  capaQuizzerStatus);
        !           105:       break;
        !           106:     default:
        !           107:       Tcl_ResetResult(interp);
        !           108:       Tcl_AppendElement(interp,"Invalid 2nd argument to capaTclParse\n");
        !           109:       capaParsing = 0;
        !           110:       return TCL_ERROR;
        !           111:       break;
        !           112:     }
        !           113: 
        !           114:   if (result==-1)
        !           115:     {
        !           116:       Tcl_ResetResult(interp);
        !           117:       Tcl_AppendElement(interp,"-1");
        !           118:       capaParsing = 0;
        !           119:       return TCL_OK;
        !           120:     }
        !           121: 
        !           122:   currentProblem=headProblem;
        !           123:   buf=capa_malloc(BUFFER_SIZE,1);
        !           124:   sprintf(buf,"%s del 0.0 end %s",previewText,update);
        !           125:   if (Tcl_Eval(interp,buf) != TCL_OK)
        !           126:     {
        !           127:       fprintf(stderr,"Tcl_Eval error 2a\n");
        !           128:       fprintf(stderr,"%s\n",interp->result);
        !           129:       capaParsing = 0;
        !           130:       return TCL_ERROR;
        !           131:     }
        !           132:   capa_mfree(buf);
        !           133: 
        !           134:   /* if in answer only mode or ascii mode put a useful header on top */
        !           135:   if(argv[1][0] == Q_ANSWER || Parsemode_f == ASCII_MODE )
        !           136:     { 
        !           137:       buf=capa_malloc(BUFFER_SIZE,1);
        !           138:       buf2=capa_malloc(BUFFER_SIZE,1);
        !           139:       switch(Parsemode_f)
        !           140: 	{
        !           141: 	case ASCII_MODE:
        !           142: 	  sprintf(buf,"Section %d                               Set %d\n Name: %s CAPAID: %d\n\n",
        !           143: 		  student.s_sec, atoi(argv[2]), student.s_nm,
        !           144: 		  capa_PIN(student.s_sn, atoi(argv[2]),0));
        !           145: 	  break;
        !           146: 	case TeX_MODE:
        !           147: 	  
        !           148: 	  sprintf(buf,"Section %d  {\\Large %s}\\hspace*{1in}{\\large %s}, CAPAID: %d, set%d\n\\begin{enumerate}", 
        !           149: 		  student.s_sec, student.s_nm, student.s_sn,
        !           150: 		  capa_PIN(student.s_sn, atoi(argv[2]),0), atoi(argv[2]));
        !           151: 	  break;
        !           152: 	case HTML_MODE:
        !           153: 	  sprintf(buf,"<H2>Section %d  %s,  %s, CAPAID:%d set %d</H2>\n<OL>\n", 
        !           154: 		  student.s_sec, student.s_nm, student.s_sn,
        !           155: 		  capa_PIN(student.s_sn, atoi(argv[2]),0), atoi(argv[2]));
        !           156: 	  break;
        !           157: 	}
        !           158:       j=capaPrepareBuffer(buf,buf2,0);
        !           159:       
        !           160:       sprintf(buf,"%s insert end \" %s \" header%s",previewText,buf2,update);
        !           161:       
        !           162:       if (Tcl_Eval(interp,buf) != TCL_OK)
        !           163: 	{
        !           164: 	  fprintf(stderr,"Tcl_Eval error 2\n");
        !           165: 	  fprintf(stderr,"%s\n",interp->result);
        !           166: 	  capaParsing = 0;
        !           167: 	  return TCL_ERROR;
        !           168: 	}
        !           169:       capa_mfree(buf);
        !           170:       capa_mfree(buf2);
        !           171:     }
        !           172: 
        !           173:   if ( gCapaHeader.weight != NULL ) { capa_mfree(gCapaHeader.weight); } 
        !           174:   if ( gCapaHeader.partial_credit != NULL ) { capa_mfree(gCapaHeader.partial_credit); } 
        !           175:   gCapaHeader.weight= capa_malloc(numOfQuestions+1,1);
        !           176:   gCapaHeader.partial_credit= capa_malloc(numOfQuestions+1,1);
        !           177: 
        !           178:   if( ( StartText_p != NULL) ) 
        !           179:     {
        !           180:       buf=capa_malloc(BUFFER_SIZE+(2*strlen(StartText_p)),1);
        !           181:       buf2=capa_malloc(BUFFER_SIZE+(2*strlen(StartText_p)),1);
        !           182:       temp=capa_malloc(BUFFER_SIZE+(2*strlen(StartText_p)),1);
        !           183:       sprintf(temp,"%s", StartText_p);
        !           184:       j=capaPrepareBuffer(temp,buf2,0);
        !           185:       
        !           186:       sprintf(buf,"%s insert end \"%s\" answer%s",previewText,buf2,update);
        !           187:       
        !           188:       if (Tcl_Eval(interp,buf) != TCL_OK)
        !           189:         {
        !           190: 	  fprintf(stderr,"Tcl_Eval error 8\n");
        !           191: 	  fprintf(stderr,"%s\n",interp->result);
        !           192: 	  capaParsing = 0;
        !           193: 	  return TCL_ERROR;
        !           194: 	}
        !           195:       capa_mfree(buf);
        !           196:       capa_mfree(buf2);
        !           197:       capa_mfree(temp);
        !           198:     }
        !           199:   
        !           200:   while (currentProblem!=NULL)
        !           201:     {
        !           202:       gCapaHeader.weight[problemNumber]=((char)(currentProblem->weight))+'0';
        !           203:       gCapaHeader.partial_credit[problemNumber]=
        !           204: 	((char)(currentProblem->partial_cdt))+'0';
        !           205:       switch (argv[1][0])
        !           206: 	{
        !           207: 	case Q_PROBLEM:
        !           208: 	  if (currentProblem->question) { 
        !           209: 	    length=strlen(currentProblem->question); 
        !           210: 	  } else { 
        !           211: 	    length=0;
        !           212: 	  }
        !           213: 	  buf=capa_malloc(BUFFER_SIZE+(2*length),1);
        !           214: 	  buf2=capa_malloc(BUFFER_SIZE+(2*length),1);
        !           215: 	  if(currentProblem->question) {
        !           216: 	    j=capaPrepareBuffer(currentProblem->question,buf2,0);
        !           217: 	    buf2[j-1]='\n';
        !           218: 	    buf2[j]='\0';
        !           219: 	  } else {
        !           220: 	    buf2[0]='\n';buf2[1]='\0';
        !           221: 	  }
        !           222: 	  
        !           223: 	  switch(Parsemode_f)
        !           224: 	    {
        !           225: 	    case ASCII_MODE:
        !           226: 	      sprintf(buf,"%s insert end \"%s \n-----------\n\n\" problem%s",
        !           227: 		      previewText,buf2,update);
        !           228: 	      break;
        !           229: 	    case TeX_MODE:
        !           230: 	      sprintf(buf,"%s insert end \"%s\" problem%s",previewText,buf2,update);
        !           231: 	      break;
        !           232: 	    case HTML_MODE:
        !           233: 	      sprintf(buf,"%s insert end \"%s\" problem%s",previewText,buf2,update);
        !           234: 	      break;
        !           235: 	    }	  
        !           236: 	  if (Tcl_Eval(interp,buf) != TCL_OK)
        !           237: 	    {
        !           238: 	      fprintf(stderr,"Tcl_Eval error 3\n");
        !           239: 	      fprintf(stderr,"%s\n",interp->result);
        !           240: 	      capaParsing = 0;
        !           241: 	      return TCL_ERROR;
        !           242: 	    }
        !           243: 	  capa_mfree(buf);
        !           244: 	  capa_mfree(buf2);
        !           245: 	  break;
        !           246: 	case Q_PROBLEM_AND_ANSWER:
        !           247: 	  if (currentProblem->question) { 
        !           248: 	    length=strlen(currentProblem->question); 
        !           249: 	  } else { 
        !           250: 	    length=0;
        !           251: 	  }
        !           252: 	  buf=capa_malloc(BUFFER_SIZE+(2*length),1);
        !           253: 	  buf2=capa_malloc(BUFFER_SIZE+(2*length),1);
        !           254: 	  temp=capa_malloc(BUFFER_SIZE+(2*length),1);
        !           255: 	  if (currentProblem->question) 
        !           256: 	    j=capaPrepareBuffer(currentProblem->question,buf2,0);
        !           257: 	  switch(Parsemode_f)
        !           258: 	    {
        !           259: 	    case ASCII_MODE:
        !           260: 	      sprintf(buf,"%s insert end \"%s \n-----------\n\n\" problem%s",
        !           261: 		      previewText,buf2,update);
        !           262: 	      break;
        !           263: 	    case TeX_MODE:
        !           264: 	      sprintf(buf,"%s insert end \"%s\" problem%s",previewText,buf2,update);
        !           265: 	      break;
        !           266: 	    case HTML_MODE:
        !           267: 	      sprintf(buf,"%s insert end \"%s\" problem%s",previewText,buf2,update);
        !           268: 	      break;
        !           269: 	    } 
        !           270: 	  if (Tcl_Eval(interp,buf) != TCL_OK)
        !           271: 	    {
        !           272: 	      fprintf(stderr,"Tcl_Eval error 4\n");
        !           273: 	      fprintf(stderr,"%s\n",interp->result);
        !           274: 	      capaParsing = 0;
        !           275: 	      return TCL_ERROR;
        !           276: 	    }	  
        !           277: 	  capa_mfree(buf);
        !           278: 	  capa_mfree(buf2);
        !           279: 	  capa_mfree(temp);
        !           280: 	  capaInsertAnswer(currentProblem,interp,previewText);
        !           281: 	  break;
        !           282: 	case Q_ANSWER:
        !           283: 	  print_begin_item(Parsemode_f,interp,previewText,problemNumber+1);
        !           284: 	  capaInsertAnswer(currentProblem,interp,previewText);
        !           285: 	  break;
        !           286: 	}
        !           287: 
        !           288:       currentProblem=currentProblem->next;
        !           289:       problemNumber++;
        !           290:     }
        !           291: 
        !           292:   if(argv[1][0] == Q_ANSWER && Parsemode_f == TeX_MODE )  { 
        !           293:     buf=capa_malloc(BUFFER_SIZE,1);
        !           294:     buf2=capa_malloc(BUFFER_SIZE,1);
        !           295:     sprintf(buf,"\n\\end{enumerate}\n");
        !           296:     j=capaPrepareBuffer(buf,buf2,0);
        !           297:     
        !           298:     sprintf(buf,"%s insert end \" %s \" header%s",previewText,buf2,update);
        !           299:     
        !           300:     if (Tcl_Eval(interp,buf) != TCL_OK)	{
        !           301:       fprintf(stderr,"Tcl_Eval error 2\n");
        !           302:       fprintf(stderr,"%s\n",interp->result);
        !           303:       capaParsing = 0;
        !           304:       return TCL_ERROR;
        !           305:     }
        !           306:     capa_mfree(buf);
        !           307:     capa_mfree(buf2);
        !           308:   }
        !           309: 
        !           310:   if( ( EndText_p != NULL) ) 
        !           311:     {
        !           312:       buf=capa_malloc(BUFFER_SIZE+(2*strlen(EndText_p)),1);
        !           313:       buf2=capa_malloc(BUFFER_SIZE+(2*strlen(EndText_p)),1);
        !           314:       temp=capa_malloc(BUFFER_SIZE+(2*strlen(EndText_p)),1);
        !           315:       sprintf(temp,"%s", EndText_p);
        !           316:       j=capaPrepareBuffer(temp,buf2,0);
        !           317:       
        !           318:       sprintf(buf,"%s insert end \"%s\" answer%s",previewText,buf2,update);
        !           319:       
        !           320:       if (Tcl_Eval(interp,buf) != TCL_OK)
        !           321:         {
        !           322: 	  fprintf(stderr,"Tcl_Eval error 7\n");
        !           323: 	  fprintf(stderr,"%s\n",interp->result);
        !           324: 	  capaParsing = 0;
        !           325: 	  return TCL_ERROR;
        !           326: 	}
        !           327:       capa_mfree(buf);
        !           328:       capa_mfree(buf2);
        !           329:       capa_mfree(temp);
        !           330:     }
        !           331:   free_problems(headProblem);
        !           332:   free_units();
        !           333:   gCapaHeader.weight[problemNumber]='\0';
        !           334:   gCapaHeader.partial_credit[problemNumber]='\0';
        !           335: 
        !           336:   if (result==0) 
        !           337:     {
        !           338:       Tcl_ResetResult(interp);
        !           339:       Tcl_AppendElement(interp,"0");
        !           340:     }
        !           341:   else
        !           342:     {
        !           343:       buf=capa_malloc(BUFFER_SIZE,1);
        !           344:       sprintf(buf,"%d",result);
        !           345:       Tcl_ResetResult(interp);
        !           346:       Tcl_AppendElement(interp,buf);
        !           347:       capa_mfree(buf);
        !           348:     }
        !           349:   capaParsing = 0;
        !           350:   return TCL_OK;
        !           351: }
        !           352: 
        !           353: int capaGetStudent(ClientData clientdata, Tcl_Interp *interp, int argc, 
        !           354: 		   char *argv[])
        !           355: {
        !           356:   T_student student;
        !           357:   int result;
        !           358:   char buf[BUFFER_SIZE];
        !           359: 
        !           360:   result = capa_get_student(argv[1],&student);
        !           361: 
        !           362:   Tcl_ResetResult(interp);
        !           363: 
        !           364:   switch (result)
        !           365:     {
        !           366:     case -1:
        !           367:       Tcl_AppendElement(interp,"File path incorrect");
        !           368:       break;
        !           369:     case 0:
        !           370:       Tcl_AppendElement(interp,"No such student");
        !           371:       break;
        !           372:     default:
        !           373:       Tcl_ResetResult(interp);
        !           374:       sprintf(buf,"%d",student.s_sec);
        !           375:       Tcl_AppendElement(interp,buf);
        !           376:       sprintf(buf,"%d",student.s_scores);
        !           377:       Tcl_AppendElement(interp,buf);
        !           378:       Tcl_AppendElement(interp,student.s_key);
        !           379:       Tcl_AppendElement(interp,student.s_sn);
        !           380:       Tcl_AppendElement(interp,student.s_nm);
        !           381:       break;
        !           382:     }
        !           383:   return TCL_OK;
        !           384: }
        !           385: 
        !           386: int capaRunLatex(ClientData clientdata, Tcl_Interp *interp, int argc, 
        !           387: 		 char *argv[])
        !           388: {
        !           389:   FILE* output;
        !           390:   char *textWindow,buf[BUFFER_SIZE],buf2[BUFFER_SIZE*2],
        !           391:     command[BUFFER_SIZE*3],*stopPrinting;
        !           392:   char *compString="Output written on quiztemp.dvi";
        !           393:   int createdDvi=0,stop=0,i,update=0;
        !           394: 
        !           395:   if ( (output = popen(argv[1],"r"))==NULL) {
        !           396:     fprintf(stderr,"popen failed");
        !           397:   }
        !           398: 
        !           399:   if ( (textWindow = Tcl_GetVar(interp,argv[2],
        !           400: 				TCL_GLOBAL_ONLY|TCL_LEAVE_ERR_MSG)) == NULL)  {
        !           401:     fprintf(stderr,"Tcl_GetVar error\n");
        !           402:     fprintf(stderr,"%s\n",interp->result);
        !           403:     return TCL_ERROR;
        !           404:   }  
        !           405: 
        !           406:   while(fgets(buf,BUFFER_SIZE-1,output)) {
        !           407:     if (strncmp(compString,buf,strlen(compString))==0)  createdDvi=1;
        !           408:     
        !           409:     capaPrepareBuffer(buf,buf2,0);
        !           410:     
        !           411:     sprintf(command,"%s insert end \"%s\" answer",textWindow, buf2);
        !           412:     
        !           413:     if (Tcl_Eval(interp,command) != TCL_OK) {
        !           414:       fprintf(stderr,"Tcl_Eval error\n");
        !           415:       fprintf(stderr,"%s\n",interp->result);
        !           416:       return TCL_ERROR;
        !           417:     }
        !           418:     
        !           419:     if (Tcl_Eval(interp,"update") != TCL_OK) {
        !           420:       fprintf(stderr,"Tcl_Eval error\n");
        !           421:       fprintf(stderr,"%s\n",interp->result);
        !           422:       return TCL_ERROR;
        !           423:     }
        !           424:      
        !           425:     if (update++ > 10) {
        !           426:       sprintf(command,"%s see end",textWindow, buf2);
        !           427:       
        !           428:       if (Tcl_Eval(interp,command) != TCL_OK) {
        !           429: 	fprintf(stderr,"Tcl_Eval error\n");
        !           430: 	fprintf(stderr,"%s\n",interp->result);
        !           431: 	return TCL_ERROR;
        !           432:       }
        !           433:       update=0;
        !           434:     }
        !           435:     if ( (stopPrinting = Tcl_GetVar(interp,"gStopPrinting",
        !           436: 				    TCL_GLOBAL_ONLY|TCL_LEAVE_ERR_MSG)) == NULL) {
        !           437:       fprintf(stderr,"Tcl_GetVar error\n");
        !           438:       fprintf(stderr,"%s\n",interp->result);
        !           439:       return TCL_ERROR;
        !           440:     }
        !           441:     stop=atoi(stopPrinting);
        !           442:     if (stop) {
        !           443:       for(i=1;i< 32768;i++) {
        !           444: 	waitpid(i,NULL,WNOHANG);
        !           445: 	if (errno!=ECHILD) { errno=0;break; }
        !           446: 	errno=0;
        !           447:       }
        !           448:       if ( i < 32768 ) { kill(i,SIGKILL); }
        !           449:       break;
        !           450:     }
        !           451:   }
        !           452:   
        !           453:   sprintf(command,"%s see end",textWindow, buf2);
        !           454:   
        !           455:   if (Tcl_Eval(interp,command) != TCL_OK) {
        !           456:     fprintf(stderr,"Tcl_Eval error\n");
        !           457:     fprintf(stderr,"%s\n",interp->result);
        !           458:     return TCL_ERROR;
        !           459:   }  
        !           460:   pclose(output);
        !           461:   
        !           462:   if (stop) {
        !           463:     Tcl_ResetResult(interp);
        !           464:     Tcl_AppendElement(interp,"2");
        !           465:     return TCL_OK;
        !           466:   } 
        !           467:   if (createdDvi) {
        !           468:     Tcl_ResetResult(interp);
        !           469:     Tcl_AppendElement(interp,"1");
        !           470:   } else {
        !           471:     Tcl_ResetResult(interp);
        !           472:     Tcl_AppendElement(interp,"0");
        !           473:   }
        !           474:   return TCL_OK;
        !           475: }
        !           476: 
        !           477: int capaGetParseErrors(ClientData clientdata, Tcl_Interp *interp, 
        !           478: 		       int argc, char *argv[])
        !           479: {
        !           480:   extern int ErrorMsg_count;
        !           481:   extern char *ErrorMsg_p;
        !           482: 
        !           483:   if (ErrorMsg_count > 0)
        !           484:     {
        !           485:       Tcl_ResetResult(interp);
        !           486:       Tcl_SetResult(interp,ErrorMsg_p,TCL_VOLATILE);
        !           487:     }
        !           488:   else
        !           489:     {
        !           490:       Tcl_ResetResult(interp);
        !           491:     }
        !           492:   return TCL_OK;  
        !           493: }
        !           494: 
        !           495: int capaGetHeaderInfo(ClientData clientdata, Tcl_Interp *interp, 
        !           496: 		      int argc, char *argv[])
        !           497: {
        !           498:   T_header header;
        !           499:   T_dates  *dates,*current;
        !           500:   char * setNumber,buf[BUFFER_SIZE],*buf2;
        !           501:   int set,result,i;
        !           502: 
        !           503:   setNumber=Tcl_GetVar(interp,"gLoadHeaderSet",TCL_GLOBAL_ONLY);
        !           504: 
        !           505:   if ( setNumber== NULL || setNumber[0] == '\0') {
        !           506:     Tcl_ResetResult(interp);
        !           507:     Tcl_AppendElement(interp,"called getHeaderInfo with no gLoadHeaderSet value");    
        !           508:     return TCL_ERROR;
        !           509:   }
        !           510: 
        !           511:   sscanf(setNumber,"%d",&set);
        !           512: 
        !           513:   result=capa_get_header(&header,set);
        !           514:   
        !           515:   if (result == -1 ) {
        !           516:     Tcl_ResetResult(interp);
        !           517:     Tcl_AppendElement(interp,"capa_get_header return a -1");    
        !           518:     return TCL_ERROR;
        !           519:   }
        !           520: 
        !           521:   Tcl_SetVar(interp,"gWeightsDiffer","0",TCL_GLOBAL_ONLY);
        !           522:   if (gCapaHeader.weight!=NULL && header.weight !=NULL) {
        !           523:     for(i=0;i<(strlen(header.weight)&&strlen(gCapaHeader.weight));i++) {
        !           524:       if (header.weight[i]!=gCapaHeader.weight[i]) {
        !           525: 	Tcl_SetVar(interp,"gWeightsDiffer","1",TCL_GLOBAL_ONLY);break;
        !           526:       }
        !           527:     }
        !           528:   }
        !           529:   capa_mfree(header.weight);
        !           530: 
        !           531:   if (gCapaHeader.partial_credit!=NULL && header.partial_credit !=NULL) {
        !           532:     Tcl_SetVar(interp,"gPartialDiffer","0",TCL_GLOBAL_ONLY);
        !           533:     for(i=0;i<(strlen(header.partial_credit)&&strlen(gCapaHeader.partial_credit));i++) {
        !           534:       if (header.partial_credit[i]!=gCapaHeader.partial_credit[i]) {
        !           535: 	Tcl_SetVar(interp,"gPartialDiffer","1",TCL_GLOBAL_ONLY);break;
        !           536:       }
        !           537:     }
        !           538:   }
        !           539:   capa_mfree(header.partial_credit);
        !           540: 
        !           541:   result=capa_get_all_dates(set,&dates);
        !           542:   if (result < 0 ) {
        !           543:     Tcl_ResetResult(interp);
        !           544:     Tcl_AppendElement(interp,"capa_get_header returned a negative number");    
        !           545:     return TCL_ERROR;
        !           546:   }
        !           547: 
        !           548:   Tcl_SetVar(interp,"gHeaderQCount",header.num_questions,TCL_GLOBAL_ONLY);  
        !           549: 
        !           550:   buf2=capa_malloc(result*QUARTER_K,1);
        !           551:   buf2[0]='\0';
        !           552:   current=dates;
        !           553:   while(current != NULL ) {
        !           554:     sprintf(buf,"{%d %d {%s} {%s} {%s} {%s} %d %d} ",current->section_start,
        !           555: 	    current->section_end, current->open_date, current->due_date,
        !           556: 	    current->answer_date, current->duration, current->inhibit_response,
        !           557: 	    current->view_problems_after_due);
        !           558:     strcat(buf2,buf);
        !           559:     current=current->s_next;
        !           560:   }
        !           561:   Tcl_SetVar(interp,"gControlDates",buf2,TCL_GLOBAL_ONLY);
        !           562:   free_dates(dates);
        !           563:   capa_mfree(buf2);
        !           564:   return TCL_OK;
        !           565: }
        !           566: 
        !           567: int capaCheckDateFormat(char *varName,Tcl_Interp *interp)
        !           568: {
        !           569:   char *tempPoint;
        !           570: 
        !           571:   tempPoint=Tcl_GetVar(interp,varName,TCL_GLOBAL_ONLY);
        !           572: 
        !           573:   if (strlen(tempPoint)!=8) goto wrong;
        !           574: 
        !           575:   switch(tempPoint[0])
        !           576:     {
        !           577:     case '0':
        !           578:       if (!isdigit(tempPoint[1])) goto wrong;
        !           579:       break;
        !           580:     case '1':
        !           581:       if (!(
        !           582: 	    (tempPoint[1]=='0') ||
        !           583: 	    (tempPoint[1]=='1') ||
        !           584: 	    (tempPoint[1]=='2')
        !           585: 	    )
        !           586: 	  ) goto wrong;
        !           587:       break;
        !           588:     case '2':
        !           589:       if (!(
        !           590:             (tempPoint[1]=='0') ||
        !           591: 	    (tempPoint[1]=='1') ||
        !           592: 	    (tempPoint[1]=='2') ||
        !           593: 	    (tempPoint[1]=='3') ||
        !           594: 	    (tempPoint[1]=='4')
        !           595: 	   )
        !           596:          ) goto wrong;
        !           597:        break;
        !           598:     default:
        !           599:       goto wrong;
        !           600:       break;
        !           601:     }
        !           602:   if (tempPoint[2] != '/') goto wrong;
        !           603:   switch(tempPoint[3])
        !           604:     {
        !           605:     case '0':
        !           606:     case '1':
        !           607:     case '2':
        !           608:        if (!isdigit(tempPoint[4])) goto wrong;
        !           609:       break;
        !           610:     case '3':
        !           611:       if (!(
        !           612: 	    (tempPoint[4]=='0') ||
        !           613: 	    (tempPoint[4]=='1') 
        !           614: 	    )
        !           615: 	  ) goto wrong;
        !           616:       break;
        !           617:     default:
        !           618:       goto wrong;
        !           619:       break;
        !           620:     }
        !           621:   if (tempPoint[5] != '/') goto wrong;
        !           622:   if (!isdigit(tempPoint[6])) goto wrong;
        !           623:   if (!isdigit(tempPoint[7])) goto wrong;
        !           624:   goto right;
        !           625: wrong:
        !           626:   return 0;
        !           627: right:
        !           628:   return 1;
        !           629: }
        !           630: 
        !           631: int capaCheckTimeFormat(char *varName,Tcl_Interp *interp)
        !           632: {
        !           633:   char *tempPoint;
        !           634: 
        !           635:   tempPoint=Tcl_GetVar(interp,varName,TCL_GLOBAL_ONLY);
        !           636: 
        !           637:   if (strlen(tempPoint)!=5) goto wrong;
        !           638: 
        !           639:   switch(tempPoint[0])
        !           640:     {
        !           641:     case '0':
        !           642:       if (!isdigit(tempPoint[1])) goto wrong;
        !           643:       break;
        !           644:     case '1':
        !           645:       if (!(isdigit(tempPoint[1])))
        !           646: 	  goto wrong;
        !           647:       break;
        !           648:     case '2':
        !           649:       switch(tempPoint[1])
        !           650: 	{
        !           651: 	case '0':
        !           652: 	case '1':
        !           653: 	case '2':
        !           654: 	case '3':
        !           655: 	case '4':
        !           656: 	  break;
        !           657: 	default:
        !           658: 	  goto wrong;
        !           659: 	  break;
        !           660: 	}
        !           661:       break;
        !           662:     default:
        !           663:       goto wrong;
        !           664:       break;
        !           665:     }
        !           666:   if (tempPoint[2] != ':') goto wrong;
        !           667:   switch (tempPoint[3])
        !           668:     {
        !           669:     case '0':
        !           670:     case '1':
        !           671:     case '2':
        !           672:     case '3':
        !           673:     case '4':
        !           674:     case '5':
        !           675:       break;
        !           676:     default:
        !           677:       goto wrong;
        !           678:       break;
        !           679:     }
        !           680:   if (!isdigit(tempPoint[4])) goto wrong;
        !           681:   goto right;
        !           682: 
        !           683: wrong:
        !           684:   return 0;
        !           685: right:
        !           686:   return 1;
        !           687: }
        !           688: 
        !           689: int capaCheckHeader(ClientData clientdata, Tcl_Interp *interp, 
        !           690: 		    int argc, char *argv[])
        !           691: {
        !           692:   if (!capaCheckDateFormat("gOpenDate",interp)) 
        !           693:     {
        !           694:       Tcl_ResetResult(interp);
        !           695:       Tcl_AppendElement(interp,"0");
        !           696:       return TCL_OK;
        !           697:     }
        !           698:   if (!capaCheckTimeFormat("gOpenTime",interp)) 
        !           699:     {
        !           700:       Tcl_ResetResult(interp);
        !           701:       Tcl_AppendElement(interp,"0");
        !           702:       return TCL_OK;
        !           703:     }
        !           704:   if (!capaCheckDateFormat("gDueDate",interp)) 
        !           705:     {
        !           706:       Tcl_ResetResult(interp);
        !           707:       Tcl_AppendElement(interp,"0");
        !           708:       return TCL_OK;
        !           709:     }
        !           710:   if (!capaCheckTimeFormat("gDueTime",interp)) 
        !           711:     {
        !           712:       Tcl_ResetResult(interp);
        !           713:       Tcl_AppendElement(interp,"0");
        !           714:       return TCL_OK;
        !           715:     }
        !           716:   if (!capaCheckDateFormat("gAnswerDate",interp)) 
        !           717:     {
        !           718:       Tcl_ResetResult(interp);
        !           719:       Tcl_AppendElement(interp,"0");
        !           720:       return TCL_OK;
        !           721:     }
        !           722:   if (!capaCheckTimeFormat("gAnswerTime",interp)) 
        !           723:     {
        !           724:       Tcl_ResetResult(interp);
        !           725:       Tcl_AppendElement(interp,"0");
        !           726:       return TCL_OK;
        !           727:     }
        !           728:   Tcl_ResetResult(interp);
        !           729:   Tcl_AppendElement(interp,"1");
        !           730:   return TCL_OK;
        !           731: }
        !           732: 
        !           733: int capaUpdateHeader(ClientData clientdata, Tcl_Interp *interp, 
        !           734: 		     int argc, char *argv[])
        !           735: {
        !           736:   char *setNumber,*date,*time,*questions;
        !           737:   int set,result,i;
        !           738:   T_dates *dates;
        !           739: 
        !           740:   setNumber=Tcl_GetVar(interp,"gSetNumberText",TCL_GLOBAL_ONLY);
        !           741: 
        !           742:   if ( setNumber[0] == '\0' )  return TCL_OK;
        !           743: 
        !           744:   sscanf(setNumber,"%d",&set);
        !           745:   questions=Tcl_GetVar(interp,"gNumberParsedText",TCL_GLOBAL_ONLY);
        !           746:   sprintf(gCapaHeader.num_questions,"%s",questions);
        !           747: 
        !           748:   /*weight and partialcredit info is from the parse*/
        !           749: 
        !           750:   result=capa_set_header(&gCapaHeader,set);
        !           751: 
        !           752:   if (result == -1) 
        !           753:     Tcl_Eval(interp,"displayError \"The records directory does not exist or is unwritable.\"");
        !           754:   else {
        !           755:     T_dates* current;
        !           756:     for(i=0;i<argc/8;i++) {
        !           757:       if ( i==0 ) {
        !           758: 	dates=current=(T_dates*)capa_malloc(sizeof(T_dates),1);
        !           759:       } else {
        !           760: 	current->s_next=(T_dates*)capa_malloc(sizeof(T_dates),1);
        !           761: 	current=current->s_next;
        !           762:       }
        !           763:       current->section_start=atoi(argv[(i*8)+1]);
        !           764:       current->section_end=atoi(argv[(i*8)+2]);
        !           765:       strncpy(current->open_date,argv[(i*8)+3],sizeof(current->open_date));
        !           766:       strncpy(current->due_date,argv[(i*8)+4],sizeof(current->due_date));
        !           767:       strncpy(current->answer_date,argv[(i*8)+5],sizeof(current->answer_date));
        !           768:       strncpy(current->duration,argv[(i*8)+6],sizeof(current->duration));
        !           769:       current->inhibit_response=atoi(argv[(i*8)+7]);
        !           770:       current->view_problems_after_due=atoi(argv[(i*8)+8]);
        !           771:     }
        !           772:     result=capa_set_all_dates(set,dates);
        !           773:     free_dates(dates);
        !           774:     if (result == -1) 
        !           775:       Tcl_Eval(interp,"displayError \"The records directory does not exist or is unwritable.\"");
        !           776:   }
        !           777:   return TCL_OK;
        !           778: }
        !           779: 
        !           780: int capaGetStudentNumbers(ClientData clientdata, Tcl_Interp *interp, 
        !           781: 			int argc, char *argv[])
        !           782: {
        !           783:   char buf[BUFFER_SIZE];
        !           784:   T_student *first_student,*a_student;
        !           785:   int result;
        !           786: 
        !           787:   result=capa_get_section(&first_student,0);
        !           788:   
        !           789:   if ( result == 0 ) { 
        !           790:     Tcl_Eval(interp,"displayError \"There are no students in this class, you can only do random runs\"");
        !           791:     Tcl_ResetResult(interp);
        !           792:     return TCL_OK; 
        !           793:   } 
        !           794:   if ( result == -1 ) {
        !           795:     Tcl_Eval(interp,"displayError \"There is no classl file, you can only do random runs.\"");
        !           796:     Tcl_ResetResult(interp);
        !           797:     return TCL_OK; 
        !           798:   }
        !           799:   
        !           800:   a_student=first_student;
        !           801:   Tcl_ResetResult(interp);
        !           802:   while( a_student ) {
        !           803:     Tcl_AppendElement(interp,a_student->s_sn);
        !           804:     Tcl_AppendElement(interp,a_student->s_nm);
        !           805:     sprintf(buf,"%d",a_student->s_sec);
        !           806:     Tcl_AppendElement(interp,buf);
        !           807:     a_student=a_student->s_next;
        !           808:   }
        !           809:   free_students(first_student);
        !           810:   return TCL_OK;
        !           811: }
        !           812: 
        !           813: void capaShowParseLocation(int sigNum) 
        !           814: {
        !           815:   extern int Current_line[MAX_OPENED_FILE];
        !           816:   extern int Input_idx;
        !           817:   extern char Opened_filename[MAX_OPENED_FILE][QUARTER_K];
        !           818:   extern Tcl_Interp *gInterp;
        !           819:   char buf[BUFFER_SIZE];
        !           820: 
        !           821:   sprintf(buf,"displayError \"In file %s on Line %d a coding error caused a fatal error in Quizzer.\"",Opened_filename[Input_idx],Current_line[Input_idx]-1);
        !           822:   printf(buf);
        !           823:   fflush(stdout);
        !           824:   Tcl_Eval(gInterp,buf);
        !           825:   exit(-1);
        !           826: }
        !           827: 
        !           828: void capaGenerateError()
        !           829: {
        !           830:   extern Tcl_Interp *gInterp;
        !           831:   char buf[BUFFER_SIZE];
        !           832: 
        !           833:   sprintf(buf, "displayError \"Your last action just caused Quizzer to die. Please let the developers know what action caused this. Thanks.\"");
        !           834:   printf(buf);
        !           835:   fflush(stdout);
        !           836:   Tcl_Eval(gInterp,buf);
        !           837:   exit(-1);
        !           838: }
        !           839: 
        !           840: /*
        !           841: extern int Input_idx;
        !           842: extern char Opened_filename[MAX_OPENED_FILE][QUARTER_K];
        !           843: extern char Current_line[MAX_OPENED_FILE];
        !           844: extern Tcl_Interp *gInterp;
        !           845: void dynamicStatus()
        !           846: {
        !           847:   char *buf,*buf2,small[BUFFER_SIZE];
        !           848:   int i,j,totlen=0,len,idx=0;
        !           849: 
        !           850:   for(i=0;i<=Input_idx;i++) totlen=+strlen(Opened_filename[i])+4;
        !           851:   buf=capa_malloc(sizeof(char),totlen);
        !           852:   for(i=0;i<=Input_idx;i++) {
        !           853:     len=strlen(Opened_filename[i]);
        !           854:     for(j=0;j<len;j++) buf[idx++] = Opened_filename[i][j];
        !           855:     buf[idx++] = ':';
        !           856:     sprintf(small,"%d",Current_line[i]);
        !           857:     len=strlen(small);
        !           858:     for(j=0;j<len;j++) buf[idx++] = small[j];
        !           859:     buf[idx++]=' ';
        !           860:     buf[idx]='\0';
        !           861:   }
        !           862:   buf[idx++]='\n';
        !           863:   buf[idx]='\0';
        !           864:   buf2=capa_malloc(sizeof(char),strlen(buf)*2);
        !           865:   j=capaPrepareBuffer(buf,buf2,0);
        !           866:   capa_mfree(buf);
        !           867:   buf=capa_malloc(sizeof(char),strlen(buf2)+BUFFER_SIZE);
        !           868:   sprintf(buf,"%s insert end %s",gPreviewText,buf2);
        !           869:   if (Tcl_Eval(gInterp,buf) != TCL_OK) {
        !           870:     fprintf(stderr,"Tcl_Eval error 2a\n");
        !           871:     fprintf(stderr,"%s\n",gInterp->result);
        !           872:   }
        !           873:   capa_mfree(buf);
        !           874:   capa_mfree(buf2);
        !           875: }
        !           876: */
        !           877: 
        !           878: void capaQuizzerStatus()
        !           879: {
        !           880:   static time_t lasttime;
        !           881:   time_t thistime=time(NULL);
        !           882:   if (thistime > lasttime) {
        !           883:     extern Tcl_Interp *gInterp;
        !           884:     char *buf=parser_status(),*buf2;
        !           885:     int j;
        !           886:     buf2=capa_malloc(sizeof(char),strlen(buf)*2);
        !           887:     j=capaPrepareBuffer(buf,buf2,0);
        !           888:     capa_mfree(buf);
        !           889:     buf=capa_malloc(sizeof(char),strlen(buf2)+BUFFER_SIZE);
        !           890:     if (gCreateDvi) {
        !           891:       sprintf(buf,"global gStopStatus;set gStopStatus \"%s\"",buf2);
        !           892:     } else {
        !           893:       sprintf(buf,"%s insert end \"%s\n\";%s see end",
        !           894: 	      gPreviewText,buf2,gPreviewText);
        !           895:     }
        !           896:     capa_mfree(buf2);
        !           897:     if (Tcl_Eval(gInterp,buf) != TCL_OK) {
        !           898:       fprintf(stderr,"Tcl_Eval error 2a\n");
        !           899:       fprintf(stderr,"%s\n",gInterp->result);
        !           900:     }
        !           901:     capa_mfree(buf);
        !           902:     while(Tcl_DoOneEvent(TCL_ALL_EVENTS|TCL_DONT_WAIT));
        !           903:     lasttime=time(NULL);
        !           904:   } else {
        !           905:     if (!gFasterParsing) while(Tcl_DoOneEvent(TCL_ALL_EVENTS|TCL_DONT_WAIT));
        !           906:   }
        !           907: }
        !           908: 
        !           909: void signalHandler(int sigNum)
        !           910: {
        !           911:   if (capaParsing) {
        !           912:     capaShowParseLocation(sigNum);
        !           913:   } else {
        !           914:     capaGenerateError();
        !           915:   }
        !           916: }
        !           917: 
        !           918: int capaStopParser(ClientData clientdata, Tcl_Interp *interp, int argc, char *argv[])
        !           919: {
        !           920:   extern int Stop_Parser;
        !           921:   Stop_Parser=1;
        !           922:   return TCL_OK;
        !           923: }
        !           924: 

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>