Annotation of capa/capa51/pProj/qzparse.c, revision 1.1.1.1

1.1       albertel    1: /* ======================================================================== */
                      2: /*       Feb. 10 1997   Isaac Tsai                                          */
                      3: /* ======================================================================== */
                      4: 
                      5: #ifdef NeXT
                      6: #include <stdlib.h>
                      7: #include <sys/types.h>
                      8: #include <sys/stat.h>  
                      9: #include <bsd/curses.h>
                     10: #else
                     11: #include <curses.h>
                     12: #include <malloc.h>
                     13: double atof();
                     14: #endif
                     15: 
                     16: #include <stdio.h>
                     17: #include <ctype.h>
                     18: #include <sys/types.h>
                     19: #include <sys/stat.h>  
                     20: #include <signal.h>
                     21: #include <time.h>
                     22: #include <math.h>
                     23: #include <string.h>
                     24: 
                     25: 
                     26: #define   YES    1
                     27: 
                     28: #include "capaParser.h"
                     29: #include "capaCommon.h"
                     30: #include "ranlib.h"
                     31: 
                     32: char    *progname;
                     33: 
                     34: void free_header(T_header* header) 
                     35: {
                     36:   capa_mfree(header->weight);
                     37:   capa_mfree(header->partial_credit);
                     38: }
                     39: 
                     40: void setdb_error(int set)
                     41: {
                     42:   fprintf(stderr,"Set #%d has not had it's DB Header set. Please run Quizzer and set the DB Header.\n",set);
                     43:   exit(-1);
                     44: }
                     45: 
                     46: void
                     47: print_header(int mode,FILE *o_fp,int sec,int set,char *stu_nam,char *stu_num)
                     48: {
                     49:   extern  char      *StartText_p;
                     50:   int capaid = capa_PIN(stu_num,set,0);
                     51: 
                     52:   switch(mode) {
                     53:     case TeX_MODE:
                     54:           fprintf(o_fp, "Section %d  {\\Large %s}\\hspace*{1in}",sec,stu_nam);
                     55:           fprintf(o_fp, "{\\large %s}, CAPAID: %d, set %d",stu_num, capaid, set);
                     56:           fprintf(o_fp, "\n\\begin{enumerate}\n");
                     57:           break;
                     58:     case ASCII_MODE:
                     59:           fprintf(o_fp, "Section %d   %s    ", sec,stu_nam); 
                     60: 	  fprintf(o_fp, "%s, CAPAID: %d set %d\n\n",stu_num, capaid, set);
                     61: 	  break;
                     62:     case HTML_MODE: 
                     63:           fprintf(o_fp, "<H2>Section %d  %s,  ", sec,stu_nam); 
                     64: 	  fprintf(o_fp, "%s, CAPAID:%d set %d</H2>\n", stu_num,capaid,set);
                     65: 	  fprintf(o_fp, "<OL>\n");
                     66: 	  break;
                     67:   }
                     68:   if( StartText_p != NULL ) {
                     69:      fprintf(o_fp, "%s", StartText_p);
                     70:   }
                     71: 
                     72: }
                     73: 
                     74: void
                     75: print_begin_item(int mode,FILE *o_fp,int q_idx)
                     76: {
                     77: 
                     78:   switch(mode) {
                     79:     case TeX_MODE:
                     80:           fprintf(o_fp, "\\item ");
                     81:           break;
                     82:     case ASCII_MODE:
                     83:           fprintf(o_fp, "%d) ", q_idx); 
                     84: 	  break;
                     85:     case HTML_MODE: 
                     86:           fprintf(o_fp, "<LI> "); 
                     87: 	  break;
                     88:   }
                     89: }
                     90: 
                     91: 
                     92: void
                     93: unit_toHTML(char *u_str, char *r)
                     94: {
                     95:   int   i;
                     96:   char  *ch;
                     97:   
                     98:   
                     99:    while(isspace(*ch)) ch++;
                    100:    while( isalnum(*ch) ) {
                    101:      r[i++] = *ch; ch++;
                    102:    }
                    103:    if( *ch == '^' ) {
                    104:      r[i++] = '<'; r[i++]='s';r[i++]='u';r[i++]='p';r[i++]='>';
                    105:      ch++; while(isspace(*ch)) ch++;
                    106:      while( isalnum(*ch) ) {
                    107:        r[i++] = *ch; ch++;
                    108:      }
                    109:      r[i++] = '<'; r[i++]='/'; r[i++]='s';r[i++]='u';r[i++]='p';r[i++]='>';
                    110:    } else {
                    111:      r[i++] = *ch; ch++;
                    112:    }
                    113:   
                    114:   
                    115: }
                    116: 
                    117: void
                    118: print_footer(int mode,FILE *o_fp)
                    119: {
                    120: extern  char      *EndText_p;
                    121: 
                    122:   switch(mode) {
                    123:     case TeX_MODE:
                    124:           fprintf(o_fp, "\n\\end{enumerate}\n");        
                    125:           break;
                    126:     case ASCII_MODE:
                    127: 	  fprintf(o_fp, "\n");
                    128: 	  break;
                    129:     case HTML_MODE: 
                    130: 	  fprintf(o_fp, "</OL>\n");
                    131: 	  break;
                    132:   }
                    133:   if( EndText_p != NULL ) {
                    134:      fprintf(o_fp, "%s", EndText_p);
                    135:   }
                    136: }
                    137: 
                    138: /* ============================================================== */
                    139: /*  qz --> tex    -Tq */
                    140: /*  qz --> html   -Ha */
                    141: /*  qz --> ascii  -Ab */
                    142: /*     question only   q */
                    143: /*     answer   only   a */
                    144: /*     both            b */
                    145: /*        for entire class            -C       */
                    146: /*        for a range of sections     -Sec 2:6 */
                    147: /*        for a section               -Sec 2   */
                    148: /*        for a student               -Stu 12345678 */
                    149: /*           output a set             -Set 2     */
                    150: /*           output a range of sets   -Set 1:6   */
                    151: /*        output blocksize            -b 30     */
                    152: /* ============================================================== */
                    153: 
                    154: void usage()
                    155: {
                    156:  printf("USAGE: %s [ -[T|H|A][a|b] ] [-Sec [n|n:m] | -Stu sn [-o filename] ]\n",progname);
                    157:  printf("          [ -Set [n|n:m] ] [-c path_to_class] [-d outputdirectory]\n");
                    158:  printf(" Example 1: %s -Tb -sec 2:3 -set 2:5\n", progname);
                    159:  printf("            will generate tex files with both questions and answers\n");
                    160:  printf("            for sections 2 to 3, sets 2 to 5\n");
                    161:  printf(" Example 2: %s -Ha -stu A12345678 -set 3\n", progname);
                    162:  printf("            will generate html files with answer only \n");
                    163:  printf("            for student A12345678 set 3\n");
                    164:  printf("          -T     = tex   mode\n");
                    165:  printf("          -H     = html  mode\n");
                    166:  printf("          -A     = ascii mode\n");
                    167:  printf("                 = default question only\n");
                    168:  printf("            a    = answer   only\n");
                    169:  printf("            b    = both question and answer\n");
                    170:  printf("          -nopagebreak = don't put a \\clearpage between assignments\n");
                    171:  printf("          -Sec 3 = for section 3\n");
                    172:  printf("          -Sec 3:7    = from section 3 to section 7\n");
                    173:  printf("          -Stu A12345678 = for a specified student\n");
                    174:  printf("          -Set 1 = output set 1\n");
                    175:  printf("          -Set 3:4 = output from set 3 to set 4\n");
                    176:  printf("          -c class_path\n");
                    177:  printf("          -o output_filename_with_absolute_path (only for a student)\n");
                    178:  printf("          -d directory_to_create_files_in (default is class_path/TeX)\n");
                    179:  printf("-------This is version %s @ %s\n",CAPA_VER,COMPILE_DATE);
                    180:  printf("------------------------------------------------------\n");
                    181: }
                    182: 
                    183: #define  Q_ONLY        1
                    184: #define  A_ONLY        2
                    185: #define  QA_BOTH       3
                    186: #define  F_CLASS       1
                    187: #define  F_SECTIONS    2
                    188: #define  F_STUDENT     3
                    189: 
                    190: 
                    191: 
                    192: /* filter out the number to be [1:999] */
                    193: int  scan_num(char *num_str,int *first, int *second) {
                    194:   char  tmp_str[SMALL_LINE_BUFFER], *ch;
                    195:   int   ii=0, a_num, b_num, result=0;
                    196:   
                    197:   ch = num_str;
                    198:   tmp_str[ii] = 0;
                    199:   while( isspace(*ch) ) ch++;
                    200:   while(isdigit(*ch)) { tmp_str[ii++] = *ch; ch++; }
                    201:   tmp_str[ii] = 0;
                    202:   sscanf(tmp_str,"%d",&a_num);
                    203:   if( a_num < 0 || a_num > 999 ) a_num = 1;
                    204:   *first = a_num;
                    205:   result = 1;
                    206:   while( isspace(*ch) ) ch++;
                    207:   if( *ch == ':' ) {
                    208:     ch++;
                    209:     while( isspace(*ch) ) ch++;
                    210:     ii=0; tmp_str[ii] = 0;
                    211:     while( isdigit(*ch) ) { tmp_str[ii++] = *ch; ch++; }
                    212:     tmp_str[ii] = 0;
                    213:     sscanf(tmp_str,"%d",&b_num);
                    214:     if( b_num < 0 || b_num > 999 ) b_num = 1;
                    215:     if( a_num > b_num )           b_num = a_num;
                    216:     *second = b_num;
                    217:     result = 2;
                    218:   }
                    219:   return (result);
                    220: }
                    221: 
                    222: int main (int argc, char  **argv) 
                    223: {
                    224:   extern  int        Parsemode_f;
                    225:   extern  char      *EndText_p;
                    226:   extern  char      *StartText_p;
                    227:   extern  char      *ErrorMsg_p;
                    228:   extern  int        ErrorMsg_count;
                    229:     
                    230:   Problem_t  *first_prob,*p;
                    231:   T_student  *students_p,*s_p, a_student;
                    232:   int         num_students, q_cnt, result, inputNotOK = 1, 
                    233:               ii, sectionIdx, setIdx = 1, q_idx, outputFlag = 0;
                    234:   char        filename[FILE_NAME_LENGTH], path[FILE_NAME_LENGTH];
                    235:   FILE       *dfp;
                    236:   int         tmp_num, first_stu, file_specified, directory_specified;
                    237:   int         ForWhat  = F_SECTIONS, pagebreak=1,
                    238:               StartSec = 1, EndSec = 1, StartSet = 1, EndSet = 1;
                    239:   char        StuNum[MAX_STUDENT_NUMBER+1];
                    240:   char        out_filename[FILE_NAME_LENGTH],out_directory[FILE_NAME_LENGTH];
                    241:   char        cmd[SMALL_LINE_BUFFER], *ans_str;
                    242:   
                    243: /*  qz --> tex    -T */
                    244: /*  qz --> html   -Ha */
                    245: /*  qz --> ascii  -Ab */
                    246: /*     answer   only   a */
                    247: /*     both            b */
                    248: /*        for entire class            -C       */
                    249: /*        for a range of sections     -Sec 2:6 */
                    250: /*        for a section               -Sec 2   */
                    251: /*        for a student               -Stu 12345678 */
                    252: /*           output a set             -Set 2     */
                    253: /*           output a range of sets   -Set 1:6   */
                    254: 
                    255: /*  default */
                    256:   Parsemode_f = TeX_MODE; ForWhat = F_SECTIONS; outputFlag=Q_ONLY;
                    257:   file_specified=0;
                    258:   out_filename[0]='\0';
                    259:   directory_specified=0;
                    260:   out_directory[0]='\0';
                    261:   for( progname = *argv++; --argc; argv++) {
                    262:     if ( argv[0][0] == '-' ) {
                    263:        switch(argv[0][1]) {
                    264:         case 'T':  Parsemode_f = TeX_MODE;
                    265:                    outputFlag=(argv[0][2] == 'a' ? A_ONLY :(argv[0][2] == 'b' ? QA_BOTH : Q_ONLY));
                    266:                    break;
                    267:         case 'H':  Parsemode_f = HTML_MODE;
                    268:                    outputFlag=(argv[0][2] == 'a' ? A_ONLY :(argv[0][2] == 'b' ? QA_BOTH : Q_ONLY));
                    269:                    break;
                    270:         case 'A':  Parsemode_f = ASCII_MODE;
                    271:                    outputFlag=(argv[0][2] == 'a' ? A_ONLY :(argv[0][2] == 'b' ? QA_BOTH : Q_ONLY));
                    272:                    break;
                    273:         case 'S':  
                    274:         case 's':  if( strncasecmp(argv[0],"-sec",4) == 0 ) {
                    275:                      tmp_num = scan_num(argv[1],&StartSec,&EndSec);
                    276:                      if( tmp_num ==  1 ) { EndSec = StartSec;  }
                    277:                      ForWhat = F_SECTIONS;
                    278:                    } else if( strncasecmp(argv[0],"-stu",4) == 0 ) {
                    279:                      for(ii=0;ii<MAX_STUDENT_NUMBER;ii++) {
                    280:                        StuNum[ii] = argv[1][ii];
                    281:                      }
                    282:                      StuNum[ii]=0;
                    283:                      ForWhat = F_STUDENT;
                    284:                    } else if( strncasecmp(argv[0],"-set",4) == 0 ) {
                    285:                      tmp_num = scan_num(argv[1],&StartSet,&EndSet);
                    286:                      if( tmp_num ==  1 ) { EndSet = StartSet;  }
                    287:                    } else {
                    288:                      usage();
                    289:                    }
                    290:                    break;
                    291:         case 'c': strcpy(path, argv[1]);
                    292:                   if(capa_access(path, F_OK) == -1) {
                    293:                     inputNotOK = 1;
                    294:                   } else {
                    295:                     inputNotOK = 0;
                    296:                   }
                    297:                   break;
                    298:         case 'o':
                    299: 	  if (argc == 1 || argv[1][0] == '-') {
                    300: 	      usage(); return 0;
                    301: 	  } else {
                    302: 	    strcpy(out_filename, argv[1]);  file_specified=1; break;
                    303: 	  }
                    304:         case 'd':
                    305: 	  if (argc == 1 || argv[1][0] == '-') {
                    306: 	      usage(); return 0; break;
                    307: 	  } else {
                    308: 	    strcpy(out_directory, argv[1]);  directory_specified=1; break;
                    309: 	  } 
                    310:         case 'n':
                    311:           pagebreak=0;break;
                    312:         case 'u': case 'h': default: usage(); return(0); break;
                    313:        }
                    314:      }
                    315:    }
                    316:    printf(" %s running in %s mode, %s for %s, ", progname,
                    317:      (Parsemode_f == TeX_MODE ? "TeX" : (Parsemode_f == ASCII_MODE ? "ASCII" : "HTML")),
                    318:      (outputFlag==A_ONLY ? "answer only" : (outputFlag==QA_BOTH? "question and answer" : "question only")),
                    319:      (ForWhat == F_STUDENT ? "a student" : "section" ) );
                    320:    if( ForWhat == F_STUDENT ) {
                    321:      printf(" for student %s,",StuNum);
                    322:    } else {
                    323:      if(StartSec==EndSec) { 
                    324:        printf(" for section %d,", StartSec); 
                    325:      } 
                    326:      else { 
                    327:        printf(" from section %d to %d,",StartSec, EndSec);
                    328:      }
                    329:    }
                    330:    if(StartSet==EndSet) { printf(" set %d\n",StartSet); } else { printf(" from  set %d to %d\n", StartSet, EndSet); }
                    331:    
                    332:    while ( inputNotOK ) {
                    333:      puts("Enter the ABSOLUTE path of class");
                    334:      scanf("%s", path);
                    335:      if( capa_access(path, F_OK) == -1 ) {
                    336:      } else {
                    337:         sprintf(filename,"%s/classl",path);
                    338:         if( capa_access(filename, F_OK) == -1 ) {
                    339:           puts("There isn't a classl file in this CLASS directory\nPlease Specify another class");
                    340:         } else {
                    341:           inputNotOK = 0;
                    342:         }
                    343:      }
                    344:    }
                    345: 
                    346:    if( (ForWhat == F_STUDENT) && strlen(StuNum) == 0 ) {
                    347:      inputNotOK = 1;
                    348:      while ( inputNotOK ) {
                    349:        puts("Enter student number"); scanf("%s", StuNum);
                    350:        if( strlen(StuNum) == MAX_STUDENT_NUMBER ) { inputNotOK = 0; }
                    351:      }
                    352:    }
                    353:    if ( file_specified == 0) {
                    354:      if ( directory_specified == 0) {
                    355:        switch( Parsemode_f ) {
                    356:        case TeX_MODE:   sprintf(filename,"%s/TeX",path);   break;
                    357:        case ASCII_MODE: sprintf(filename,"%s/ASCII",path); break;
                    358:        case HTML_MODE:  sprintf(filename,"%s/HTML",path);  break;
                    359:        default:         sprintf(filename,"%s/TeX",path); Parsemode_f = TeX_MODE; break;
                    360:        }
                    361:      } else {
                    362:        sprintf(filename,"%s",out_directory);
                    363:      }
                    364:      if( capa_access(filename, F_OK) == -1 ) { 
                    365:        if ( mkdir(filename, S_IREAD | S_IWRITE | S_IEXEC ) == -1 ) {
                    366: 	 printf("Unable to write to %s\n",filename);
                    367: 	 printf("Please check this directory and run %s again.\n",progname);
                    368: 	 return(-1);
                    369:        }
                    370:      }
                    371: 
                    372:    } else {
                    373:      if ( directory_specified == 0) {
                    374:      } else {
                    375:        sprintf(filename,"%s",out_directory);
                    376:      }
                    377:    }
                    378:    chdir(path);
                    379: 
                    380:    if ( ForWhat == F_SECTIONS ) {
                    381:      T_dates* dates;
                    382:      T_header header;
                    383:      for(ii=StartSet;ii<=EndSet;ii++) {
                    384:        if (capa_get_header(&header,ii)<0) {
                    385: 	 setdb_error(ii);
                    386:        }
                    387:        free_header(&header);
                    388:        if (capa_get_all_dates(ii,&dates)<0) {
                    389: 	 setdb_error(ii);
                    390:        } 
                    391:        free_dates(dates);
                    392:      }
                    393:    }
                    394: 
                    395:    if( ForWhat == F_STUDENT ) {
                    396:      result = capa_get_student(StuNum, &a_student);
                    397:      if ( result == 0 ) {
                    398:        fprintf(stderr,"Unable to find student %s in %s/classl",StuNum,path);
                    399:        exit(-1);
                    400:      } else {
                    401:        if (result == -1 ) {
                    402: 	 fprintf(stderr,"Unable to read %s/classl",path);
                    403: 	 exit(-1);
                    404:        }
                    405:      }
                    406:      if ( file_specified == 0) {
                    407:        if ( directory_specified == 0) {
                    408: 	 switch( Parsemode_f ) {
                    409:          case TeX_MODE: sprintf(filename,"TeX/%s.tex",StuNum);  break;
                    410:          case ASCII_MODE: sprintf(filename,"ASCII/%s.ascii",StuNum); break;
                    411:          case HTML_MODE:  sprintf(filename,"HTML/%s.html",StuNum);   break;
                    412: 	 }
                    413:        } else {
                    414: 	 switch( Parsemode_f ) {
                    415:          case TeX_MODE: sprintf(filename,"%s/%s.tex",out_directory,StuNum); break;
                    416:          case ASCII_MODE: sprintf(filename,"%s/%s.ascii",out_directory,StuNum); break;
                    417:          case HTML_MODE:  sprintf(filename,"%s/%s.html",out_directory,StuNum); break;
                    418: 	 }
                    419:        }
                    420:      } else {
                    421:        if (directory_specified == 0 ) {
                    422: 	 sprintf(filename,"%s",out_filename);
                    423:        } else {
                    424: 	 sprintf(filename,"%s/%s",out_directory,out_filename);
                    425:        }
                    426:      }
                    427:      switch ( Parsemode_f ) {
                    428:      case TeX_MODE: sprintf(cmd, "cp TeXheader %s\n",filename); system(cmd); break;
                    429:      default: sprintf(cmd,"rm %s\n",filename);system(cmd); break;
                    430:      }
                    431:      if((dfp=fopen(filename,"a"))==NULL)  { 
                    432:        fprintf(stdout,"File error! Cannot open [%s].\n",filename);  
                    433:        return -1; 
                    434:      }
                    435:      for(setIdx=StartSet; setIdx <= EndSet; setIdx++) {
                    436:        result = capa_parse(setIdx, &first_prob, StuNum, &q_cnt, NULL);
                    437:        if ( result != 0 ) { p = first_prob;
                    438: 	  switch(outputFlag) {
                    439: 	    case  Q_ONLY: 
                    440: 	                 if( StartText_p != NULL) {
                    441:                             fprintf(dfp, "%s", StartText_p); fflush(dfp);
                    442:                           }
                    443: 	                  for( q_idx = 0; q_idx < q_cnt; printf("."),fflush(stdout), q_idx++ ) {
                    444: 	                    fprintf(dfp, "%s", p->question); p = p->next;
                    445:                           } 
                    446:                           if( EndText_p != NULL) {
                    447:                             fprintf(dfp, "%s", EndText_p); fflush(dfp);
                    448:                           }
                    449:                           break;
                    450: 	    case  A_ONLY:
                    451: 	                print_header(Parsemode_f, dfp,a_student.s_sec,setIdx,a_student.s_nm, StuNum);
                    452: 		        for( q_idx = 0; q_idx < q_cnt; printf("."),fflush(stdout), q_idx++ ) {
                    453: 	                   print_begin_item(Parsemode_f,dfp,q_idx+1);
                    454: 	                   ans_str = answers_string(Parsemode_f,p);
                    455: 	                   fprintf(dfp, "%s",ans_str); fflush(dfp);
                    456: 	                   capa_mfree((char *)ans_str);
                    457:                            p = p->next;
                    458:                         }
                    459:                         print_footer(Parsemode_f, dfp);
                    460: 		        break;
                    461: 	    case  QA_BOTH:
                    462:                     if( StartText_p != NULL ) {
                    463:                       fprintf(dfp, "%s", StartText_p);
                    464:                     }
                    465: 		    for( q_idx = 0; q_idx < q_cnt; printf("."),fflush(stdout), q_idx++ ) {
                    466: 		       fprintf(dfp, "%s", p->question);  fflush(dfp);
                    467: 		       ans_str = answers_string(Parsemode_f,p);
                    468: 	               fprintf(dfp, "%s",ans_str); fflush(dfp);
                    469: 	               capa_mfree((char *)ans_str);
                    470:                        p = p->next;
                    471:                     }  
                    472:                     if( EndText_p != NULL ) {
                    473:                       fprintf(dfp, "%s", EndText_p);
                    474:                     }
                    475:                     break;
                    476:            }
                    477:               
                    478:         }
                    479:         free_problems(first_prob);
                    480:         if( setIdx < EndSet ) { 
                    481:           if( Parsemode_f == TeX_MODE && pagebreak ) { 
                    482: 	    fprintf(dfp, "\\clearpage\n\\setcounter{page}{1}\n"); 
                    483: 	  } else {
                    484: 	    printf("\n"); 
                    485: 	  }
                    486: 	}
                    487: 	if( ErrorMsg_count > 0 ) {
                    488:            printf("%s",ErrorMsg_p);
                    489:         }
                    490:      }
                    491:      fflush(dfp); fclose(dfp);
                    492: 
                    493:      switch( Parsemode_f ) {
                    494:        case TeX_MODE: sprintf(cmd, "cat TeXfooter >> %s\n", filename); system(cmd); break;
                    495:      }
                    496:      printf("\n  DONE Student %s\n",StuNum);
                    497: } else {  /*   For section(s) */
                    498:     for(sectionIdx = StartSec; sectionIdx <= EndSec; sectionIdx++ ) { 
                    499:       num_students = capa_sorted_section(&students_p, sectionIdx);
                    500:       printf("Section %2d: %d students\n",sectionIdx,num_students);
                    501:       if( num_students > 0 ) {
                    502:         for(setIdx=StartSet; setIdx <= EndSet; setIdx++) {
                    503:           
                    504: 	  if (directory_specified == 0 ) {
                    505: 	    switch( Parsemode_f ) {
                    506: 	      case TeX_MODE: sprintf(cmd, "cp TeXheader TeX/section%d-set%d.tex\n", sectionIdx,setIdx); 
                    507: 	        system(cmd);
                    508: 	        sprintf(filename,"TeX/section%d-set%d.tex",sectionIdx,setIdx);  break;
                    509: 	      case ASCII_MODE: sprintf(filename,"ASCII/section%d-set%d.ascii",sectionIdx,setIdx); break;
                    510: 	      case HTML_MODE:  sprintf(filename,"HTML/section%d-set%d.text",sectionIdx,setIdx); break;
                    511: 	    }
                    512: 	  } else {
                    513: 	    switch( Parsemode_f ) {
                    514:                case TeX_MODE: sprintf(cmd, "cp TeXheader %s/section%d-set%d.tex\n", out_directory,
                    515: 				      sectionIdx,setIdx); 
                    516:                               system(cmd);
                    517:                               sprintf(filename,"%s/section%d-set%d.tex",out_directory,
                    518: 				      sectionIdx,setIdx);  break;
                    519:                case ASCII_MODE: sprintf(filename,"%s/section%d-set%d.ascii",out_directory,
                    520: 					sectionIdx,setIdx); break;
                    521:                case HTML_MODE:  sprintf(filename,"%s/section%d-set%d.text",out_directory,
                    522: 					sectionIdx,setIdx); break;
                    523: 	    }
                    524: 	  }
                    525:           if((dfp=fopen(filename,"a"))==NULL)  { printf("File error\n");  return -1; }
                    526:           for(s_p = students_p,first_stu=1; s_p ; s_p = s_p->s_next ) {
                    527:             s_p->s_sn[MAX_STUDENT_NUMBER]=0;
                    528:             printf("    Student: %s%s   set %d",s_p->s_nm,s_p->s_sn,setIdx);
                    529:             result = capa_parse(setIdx, &first_prob, s_p->s_sn, &q_cnt, NULL);
                    530:             if ( result != 0 ) {
                    531:                 p = first_prob;
                    532: 	        switch(outputFlag) {
                    533: 	          case  Q_ONLY:
                    534:                       if( StartText_p != NULL ) {
                    535:                             fprintf(dfp, "%s", StartText_p); fflush(dfp);
                    536:                       } 
                    537:                       for( q_idx = 0; q_idx < q_cnt; printf("."),fflush(stdout), q_idx++ ) {
                    538: 	                 fprintf(dfp, "%s", p->question); fflush(dfp); p = p->next;
                    539:                       }
                    540:                       if( EndText_p != NULL ) {
                    541:                             fprintf(dfp, "%s", EndText_p); fflush(dfp);
                    542:                       } 
                    543:                       break;
                    544: 		  case  A_ONLY:
                    545: 		      print_header(Parsemode_f,dfp,s_p->s_sec,setIdx,s_p->s_nm,s_p->s_sn);
                    546: 		      for( q_idx = 0; q_idx < q_cnt; printf("."),fflush(stdout), q_idx++ ) {
                    547: 	                 print_begin_item(Parsemode_f,dfp,q_idx+1);
                    548: 	                 ans_str = answers_string(Parsemode_f,p);
                    549: 	                 fprintf(dfp, "%s",ans_str); fflush(dfp);
                    550: 	                 capa_mfree((char *)ans_str);
                    551:                          p = p->next;
                    552:                       }
                    553:                       print_footer(Parsemode_f,dfp);
                    554: 		      break;
                    555: 		  case  QA_BOTH:
                    556:                       if( StartText_p != NULL ) {
                    557:                             fprintf(dfp, "%s", StartText_p); fflush(dfp);
                    558:                       } 
                    559: 		      for( q_idx = 0; q_idx < q_cnt; printf("."),fflush(stdout), q_idx++ ) {
                    560: 	                 fprintf(dfp, "%s", p->question);  fflush(dfp);
                    561: 	                 ans_str = answers_string(Parsemode_f,p);
                    562: 	                 fprintf(dfp, "%s",ans_str); fflush(dfp);
                    563: 	                 capa_mfree((char *)ans_str);
                    564:                          p = p->next;
                    565:                       }
                    566:                       if( ( EndText_p != NULL) ) {
                    567:                          fprintf(dfp, "%s", EndText_p);
                    568:                       }
                    569:                       break;
                    570:                 }
                    571:                 if( s_p->s_next != NULL ) {    
                    572:                   if(Parsemode_f == TeX_MODE && pagebreak) {
                    573:                         fprintf(dfp, "\\clearpage\n\\setcounter{page}{1}\n"); fflush(dfp); 
                    574:                   }
                    575:                   printf("\n"); 
                    576:                 }
                    577:                 free_problems(first_prob);
                    578:               }
                    579:             }
                    580:             fflush(dfp); fclose(dfp);
                    581:             if(Parsemode_f == TeX_MODE) {
                    582: 	      if (directory_specified==0) {
                    583: 		sprintf(cmd, "cat TeXfooter >> TeX/section%d-set%d.tex\n", sectionIdx,setIdx); system(cmd);
                    584: 	      } else {
                    585: 		sprintf(cmd, "cat TeXfooter >> %s/section%d-set%d.tex\n", out_directory,
                    586: 			sectionIdx,setIdx); system(cmd);
                    587: 	      }
                    588: 	    }
                    589: 	    printf("\n  DONE set%2d\n",setIdx);
                    590: 	}
                    591: 	
                    592:       }
                    593:       printf("\n  DONE section%2d\n",sectionIdx);
                    594:     }
                    595:     free_students(students_p);
                    596:    }
                    597:    printf("ALL DONE\n");
                    598:    return (0);
                    599: }
                    600: 
                    601: 

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