/*
* grader.funct.c
* Copyright Guy Albertelli II 1996-1999
* Portions Copyright Issac Tsai
*/
#include <stdio.h>
#include <tk.h>
#include <Capa/capaCommon.h>
#include <manager.h>
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();
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;
}
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>