/* * grader.funct.c * Copyright Guy Albertelli II 1996-1999 * Portions Copyright Issac Tsai */ #include #include #include #include int capaCTcreateSummary (ClientData clientdata, Tcl_Interp *interp, int argc, char *argv[]) { int section, set; int studentCount,currentStudent; int setScores, termScores, validScores, termValids; int setIndex, maxSet=0; int whatSection; char fmt[64]; char grades[4], sectionChar[4], *answersPtr, buf[BUFFER_SIZE], *who,*which,*sortOne,*sortTwo; T_student *studentPtr, *currentStudentPtr; FILE *outputFile; sprintf(buf,"summary.section.%s",argv[2]); section = atoi(Tcl_GetVar2(interp,"gCT",buf,TCL_GLOBAL_ONLY)); sprintf(buf,"summary.set.%s",argv[2]); set = atoi(Tcl_GetVar2(interp,"gCT",buf,TCL_GLOBAL_ONLY)); sprintf(buf,"summary.who.%s",argv[2]); who=Tcl_GetVar2(interp,"gCT",buf,TCL_GLOBAL_ONLY); sprintf(buf,"summary.which.%s",argv[2]); which=Tcl_GetVar2(interp,"gCT",buf,TCL_GLOBAL_ONLY); sprintf(buf,"summary.first.%s",argv[2]); sortOne=Tcl_GetVar2(interp,"gCT",buf,TCL_GLOBAL_ONLY); sprintf(buf,"summary.second.%s",argv[2]); sortTwo=Tcl_GetVar2(interp,"gCT",buf,TCL_GLOBAL_ONLY); maxSet=howManySetDBFile(argv[3]); if (((strcmp(which,"upto") == 0) && ((set <= 0) || (set >= NUM_SET_LIMIT))) || (set > maxSet)) { sprintf(buf,"displayError \"The set number (%d) doesn't exist.\"",set); Tcl_Eval(interp,buf); Tcl_ResetResult(interp); Tcl_AppendResult(interp,"Error",NULL); return TCL_ERROR; } outputFile=fopen(argv[1],"w"); if ( strcmp(who,"all") == 0 ) { whatSection = GET_ALL_SECTIONS; } else { whatSection = section; } studentCount = capa_get_section(&studentPtr, whatSection); sprintf(buf,"updateStatusMessage \"Creating primary sort key\" %s",argv[2]); if (Tcl_Eval(interp,buf) != TCL_OK) { free_students(studentPtr); fclose(outputFile); return TCL_ERROR; } if( studentCount > 0 ) { switch (sortOne[1]) { case 'a': /*BY_NAME*/ for(currentStudentPtr=studentPtr,currentStudent=1;currentStudentPtr; currentStudentPtr=currentStudentPtr->s_next,currentStudent++) { sprintf(buf,"updateStatusBar %f %s",(float)currentStudent/(float)studentCount, argv[2]); Tcl_Eval(interp,buf); sprintf(currentStudentPtr->s_key,"%s",currentStudentPtr->s_nm); } break; case 'u': /*BY_NUMBER*/ for(currentStudentPtr=studentPtr,currentStudent=1;currentStudentPtr; currentStudentPtr=currentStudentPtr->s_next,currentStudent++) { sprintf(buf,"updateStatusBar %f %s",(float)currentStudent/(float)studentCount, argv[2]); Tcl_Eval(interp,buf); sprintf(currentStudentPtr->s_key,"%s",currentStudentPtr->s_sn); } break; case 'e': /*BY_SECTION*/ for(currentStudentPtr=studentPtr,currentStudent=1;currentStudentPtr; currentStudentPtr=currentStudentPtr->s_next,currentStudent++) { sprintf(buf,"updateStatusBar %f %s",(float)currentStudent/(float)studentCount, argv[2]); Tcl_Eval(interp,buf); sprintf(currentStudentPtr->s_key,"%03d",currentStudentPtr->s_sec); } break; case 'r': /*BY_GRADE*/ if(strcmp(which,"specific") == 0 ) { for(currentStudentPtr=studentPtr,currentStudent=1;currentStudentPtr; currentStudentPtr=currentStudentPtr->s_next,currentStudent++) { sprintf(buf,"updateStatusBar %f %s",(float)currentStudent/(float)studentCount, argv[2]); Tcl_Eval(interp,buf); if( (setScores = capa_get_score(currentStudentPtr->s_sn,set, &validScores,&answersPtr)) == -2 ) break; if( setScores < 0 ) { sprintf(currentStudentPtr->s_key,"-"); } else { sprintf(currentStudentPtr->s_key,"%03d",setScores); } capa_mfree(answersPtr); } } else { for(currentStudentPtr=studentPtr,currentStudent=1;currentStudentPtr; currentStudentPtr=currentStudentPtr->s_next,currentStudent++) { sprintf(buf,"updateStatusBar %f %s",(float)currentStudent/(float)studentCount, argv[2]); Tcl_Eval(interp,buf); for(termScores=0, termValids=0, setIndex=1; setIndex <= set; setIndex++) { if( (setScores = capa_get_score(currentStudentPtr->s_sn,setIndex, &validScores,&answersPtr)) >= 0 ) { termScores += setScores; } capa_mfree(answersPtr); termValids += validScores; } sprintf(currentStudentPtr->s_key,"%03d",termScores); } } break; } sprintf(buf,"updateStatusMessage \"Creating secondary sort key\" %s",argv[2]); if (Tcl_Eval(interp,buf) != TCL_OK) { free_students(studentPtr); fclose(outputFile); return TCL_ERROR; } switch (sortTwo[1]) { case 'a':/*BY_NAME*/ for(currentStudentPtr=studentPtr,currentStudent=1;currentStudentPtr; currentStudentPtr=currentStudentPtr->s_next,currentStudent++) { sprintf(buf,"updateStatusBar %f %s",(float)currentStudent/(float)studentCount, argv[2]); Tcl_Eval(interp,buf); strcat(currentStudentPtr->s_key,currentStudentPtr->s_nm); } break; case 'u':/*BY_NUMBER*/ for(currentStudentPtr=studentPtr,currentStudent=1;currentStudentPtr; currentStudentPtr=currentStudentPtr->s_next,currentStudent++) { sprintf(buf,"updateStatusBar %f %s",(float)currentStudent/(float)studentCount, argv[2]); Tcl_Eval(interp,buf); strcat(currentStudentPtr->s_key,currentStudentPtr->s_sn); } break; case 'e':/*BY_SECTION*/ for(currentStudentPtr=studentPtr,currentStudent=1;currentStudentPtr; currentStudentPtr=currentStudentPtr->s_next,currentStudent++) { sprintf(buf,"updateStatusBar %f %s",(float)currentStudent/(float)studentCount, argv[2]); Tcl_Eval(interp,buf); sprintf(sectionChar,"%03d",currentStudentPtr->s_sec); strcat(currentStudentPtr->s_key,sectionChar); } break; case 'r':/*BY_GRADE*/ if(strcmp(which,"specific") == 0 ) { for(currentStudentPtr=studentPtr,currentStudent=1;currentStudentPtr; currentStudentPtr=currentStudentPtr->s_next,currentStudent++) { sprintf(buf,"updateStatusBar %f %s",(float)currentStudent/(float)studentCount, argv[2]); Tcl_Eval(interp,buf); if( (setScores = capa_get_score(currentStudentPtr->s_sn,set,&validScores, &answersPtr) ) == -2 ) { break; } if( setScores < 0 ) { strcat(currentStudentPtr->s_key,"-"); } else { sprintf(grades,"%03d",setScores); strcat(currentStudentPtr->s_key,grades); } capa_mfree(answersPtr); } } else { for(currentStudentPtr=studentPtr,currentStudent=1;currentStudentPtr; currentStudentPtr=currentStudentPtr->s_next,currentStudent++) { sprintf(buf,"updateStatusBar %f %s",(float)currentStudent/(float)studentCount, argv[2]); Tcl_Eval(interp,buf); for (termScores=0, termValids=0, setIndex=1;setIndex<=set;setIndex++) { if( (setScores = capa_get_score(currentStudentPtr->s_sn,setIndex, &validScores,&answersPtr) ) >= 0 ) { termScores += setScores; } capa_mfree(answersPtr); termValids += validScores; } sprintf(grades,"%03d",termScores); strcat(currentStudentPtr->s_key,grades); } } break; } sprintf(buf,"updateStatusMessage \"Sorting\" %s",argv[2]); if (Tcl_Eval(interp,buf) != TCL_OK) { free_students(studentPtr); fclose(outputFile); return TCL_ERROR; } msort_main(&studentPtr); Tcl_ResetResult(interp); sprintf(fmt,"%%-%ds\t%%-%ds %%2d\t", MAX_NAME_CHAR,MAX_STUDENT_NUMBER); sprintf(buf,"updateStatusMessage \"Creating Report\" %s",argv[2]); if (Tcl_Eval(interp,buf) != TCL_OK) { free_students(studentPtr); fclose(outputFile); return TCL_ERROR; } for(currentStudentPtr=studentPtr,currentStudent=1;currentStudentPtr; currentStudentPtr=currentStudentPtr->s_next,currentStudent++) { sprintf(buf,"updateStatusBar %f %s",(float)currentStudent/(float)studentCount, argv[2]); Tcl_Eval(interp,buf); fprintf(outputFile,fmt,currentStudentPtr->s_nm,currentStudentPtr->s_sn, currentStudentPtr->s_sec); if( strcmp(which,"specific") == 0) { setScores = 0; validScores = 0; if( (setScores = capa_get_score(currentStudentPtr->s_sn,set,&validScores,&answersPtr) ) == -2 ) { break; } if( setScores < 0 ) { fprintf(outputFile, " -\t%3d\n", validScores); } else { fprintf(outputFile, "%3d\t%3d\n",setScores, validScores); } capa_mfree(answersPtr); } else { for( setScores=0, validScores=0, termScores = 0, termValids = 0, setIndex = 1; setIndex <= set; setIndex++) { if( (setScores = capa_get_score(currentStudentPtr->s_sn,setIndex, &validScores,&answersPtr) ) >= 0 ) { termScores += setScores; } capa_mfree(answersPtr); termValids += validScores; if( setScores >= 0 ) { fprintf(outputFile, "%3d ",setScores); } else { fprintf(outputFile, " - "); } } fprintf(outputFile, "\t %3d\t%3d\n",termScores,termValids); } } free_students(studentPtr); } fclose(outputFile); return TCL_OK; }