--- capa/capa51/pProj/capalogin.c 1999/09/28 21:26:21 1.1 +++ capa/capa51/pProj/capalogin.c 2000/10/10 20:03:23 1.10 @@ -1,4 +1,27 @@ -/* Copyright 1992-1997 Michigan State University, Board of Trustee */ +/* main code that implements the capa login shell + Copyright (C) 1992-2000 Michigan State University + + The CAPA system is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The CAPA system is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public + License along with the CAPA system; see the file COPYING. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. + + As a special exception, you have permission to link this program + with the TtH/TtM library and distribute executables, as long as you + follow the requirements of the GNU GPL in regard to all of the + software in the executable aside from TtH/TtM. +*/ + /* version 4.6 */ /* Jan 28 1997 I.T. */ @@ -741,7 +764,7 @@ char *log_string; tmtime=localtime(&t); strftime(timeStr,FILE_NAME_LENGTH,"%d/%m %X",tmtime); /*ct[ strlen(ct)-1 ]=0;*/ /* Trash newline */ - protect_log_string(log_string); + /*protect_log_string(log_string);*/ fprintf(fp,"%s\t%s\t%s\n",student_number,timeStr,log_string); fflush(fp); fclose(fp); return (0); @@ -777,7 +800,8 @@ int type; set_score, /* Score on a set */ term_score=0, /* Total points received */ term_total=0, /* Total points possible */ - result; + result, + tot_num_sets=0; T_entry entry; /* Database entry for a set */ char buf[MAX_BUFFER_SIZE], buf2[MAX_BUFFER_SIZE]; T_header header; /* Problem set header */ @@ -796,6 +820,9 @@ int type; probs_in_set[0]= 0; for (set_idx=1; set_idx<=set; set_idx++) { if (capa_get_header(&header,set_idx)) return; + if ( capa_check_date(CHECK_OPEN_DATE,student_number,*section,set_idx) < 0 ) + continue; + tot_num_sets++; capa_get_entry(&entry,student_number,set_idx); sscanf(header.num_questions,"%d", &(probs_in_set[set_idx]) ); start_at[set_idx] = start_at[set_idx-1]+2*(1+probs_in_set[set_idx-1]/50); @@ -840,8 +867,12 @@ int type; /* SHOW TOTALS */ /* if capalogin_show_summary_score is set to none don't show it */ - sprintf(buf,"%d sets, total=%3d/%3d (%d%%)", set, term_score, term_total, - 100*term_score/term_total); + if (term_total > 0 ) { + sprintf(buf,"%d sets, total=%3d/%3d (%d%%)", tot_num_sets, term_score, term_total, + 100*term_score/term_total); + } else { + sprintf(buf,"%d sets, total=%3d/%3d", tot_num_sets, term_score, term_total); + } result=read_capa_config("capalogin_show_summary_score",buf2); if (result != 0 && result != -1) { if (strcasecmp(buf2,"none")==0) { @@ -860,7 +891,8 @@ int type; /* don't show summary for set if inhibit response is set*/ inhibit_response=capa_check_option(OPTION_INHIBIT_RESPONSE,set_idx,*section); if (inhibit_response > 0) continue; - + if ( capa_check_date(CHECK_OPEN_DATE,student_number,*section,set_idx) < 0 ) + continue; set_score=0; set_start_line=line; /* Stop if not enough lines to summarize set */ @@ -1124,7 +1156,7 @@ print_unit_components(FILE *fp,Unit_t *t } -#define ANSWER_STRING_LENG 64 +/*#define ANSWER_STRING_LENG 64*/ #define UNIT_STRING_LENG 64 #define FORMAT_STRING_LENG 32 @@ -1133,9 +1165,9 @@ int give_response(Problem_t *p,char **a { int can_answer; char tmp_str[MAX_BUFFER_SIZE], *c_answer_str; + char *error=NULL; - - switch( capa_check_answers(p,a,cnt) ) { + switch( capa_check_answers(p,a,cnt,&error) ) { case EXACT_ANS: move(A_ROW,S_COL); clrtoeol(); mvaddstr(A_ROW,S_COL,"*Yes Computer gets:"); @@ -1163,17 +1195,24 @@ int give_response(Problem_t *p,char **a *log_char='Y'; can_answer=NAY; if(*tried < TRY_BOUND) (*tried)++; break; + case WANTED_NUMERIC: move(S_ROW,S_COL); clrtoeol(); + mvaddstr(S_ROW,S_COL,"*Enter a Number Ans"); + *log_char='S'; can_answer=YAK; + break; case SIG_FAIL: move(S_ROW,S_COL); clrtoeol(); mvaddstr(S_ROW,S_COL,"*Adjust Sig. Figs. "); *log_char='S'; can_answer=YAK; + capa_mfree(error); break; case UNIT_FAIL: move(S_ROW,S_COL); clrtoeol(); mvaddstr(S_ROW,S_COL,"*Units incorrect "); *log_char='U'; can_answer=YAK; + capa_mfree(error); break; case UNIT_NOTNEEDED: move(S_ROW,S_COL); clrtoeol(); mvaddstr(S_ROW,S_COL,"*Only a number required"); *log_char='U'; can_answer=YAK; + capa_mfree(error); break; case NO_UNIT: move(S_ROW,S_COL); clrtoeol(); mvaddstr(S_ROW,S_COL,"*Units required "); @@ -1218,19 +1257,20 @@ int give_inhibited_response(Problem_t * { int can_answer; char tmp_str[MAX_BUFFER_SIZE]; + char *error=NULL; - - switch( capa_check_answers(p,a,cnt) ) { + switch( capa_check_answers(p,a,cnt,&error) ) { case EXACT_ANS: *log_char='Y'; break; case APPROX_ANS: *log_char='Y'; break; - case SIG_FAIL: *log_char='S'; break; - case UNIT_FAIL: *log_char='U'; break; - case UNIT_NOTNEEDED: *log_char='U'; break; + case SIG_FAIL: *log_char='S'; capa_mfree(error); break; + case UNIT_FAIL: *log_char='U'; capa_mfree(error); break; + case UNIT_NOTNEEDED: *log_char='U'; capa_mfree(error); break; case NO_UNIT: *log_char='u'; break; case BAD_FORMULA:*log_char='F'; break; case INCORRECT: *log_char='N'; break; + case WANTED_NUMERIC: *log_char='s'; break; case ANS_CNT_NOT_MATCH: *log_char='C'; break; } @@ -1549,7 +1589,7 @@ int *section; int prob; { int i,length; - char date_str[DATE_LENGTH]; + char date_str[DATE_LENGTH],*tmp; char **sbuf_pp,answer[(EDIT_HEIGHT*(EDIT_WIDTH+1))+1]; char submissions_str[(EDIT_HEIGHT*(EDIT_WIDTH+1))+MAX_BUFFER_SIZE]; time_t curtime; @@ -1575,7 +1615,10 @@ int prob; capa_mfree((char *)sbuf_pp[i]); } capa_set_subjective(set,prob,student_number,answer); - sprintf(submissions_str,"%d\t%s\t",prob,answer); + tmp=strsave(answer); + protect_log_string(tmp); + sprintf(submissions_str,"%d\t%s\t",prob,tmp); + capa_mfree(tmp); log_submissions(student_number,set,submissions_str); capa_mfree((char *)sbuf_pp); return 1; @@ -1615,7 +1658,7 @@ int *section; T_entry entry; char answer[256], *a_str, **ans_strs; int num, offset, num_questions, start_from, leng; - char *log_string,submissions_str[MAX_BUFFER_SIZE]; + char *log_string,submissions_str[MAX_BUFFER_SIZE],*tmp; int *tried,answered; int scr_idx=1, display=1, second_scr, canAnswer; int usr_command, whereto, allow_hint=0, ex=0; @@ -1820,8 +1863,10 @@ int *section; if ( is_all_ws(ans_strs[0]) ) break; trim_response_ws(ans_strs[0]); } - - sprintf(submissions_str,"%d\t%s\t",num+1,a_str); + tmp=strsave(a_str); + protect_log_string(tmp); + sprintf(submissions_str,"%d\t%s\t",num+1,tmp); + capa_mfree(tmp); log_submissions(student_number,set,submissions_str); { @@ -1856,7 +1901,7 @@ int *section; mvaddstr(X_ROW,H_COL,":H = Show Hint"); } switch(log_char) { - case 'U': case 'u': case 'S': + case 'U': case 'u': case 'S': case 'F': entry.answers[num]='N'; break; case 'Y': allow_hint=1; mvaddstr(X_ROW,H_COL,":H = Show Hint"); /* fall through here */ default: entry.answers[num]=log_char; break; @@ -1870,11 +1915,14 @@ int *section; /* ------------------------------ check due date */ time(&curtime); /* ===> if (compare_datetime(curtime,header.due_date) > 0) { */ +#ifndef NO_DATE_CHECK if( capa_check_date(CHECK_DUE_DATE,student_number,*section,set) > 0 ) { capa_get_date(CHECK_DUE_DATE,student_number,*section,set,date_str); sprintf(answer,"Sorry, the due date was: %s",date_str); move(20,1); clrtobot(); addstr(answer); mypause(23,1); - } else { + } else +#endif + { capa_set_entry(&entry,student_number,set,offset); } } break; @@ -2389,6 +2437,7 @@ void print_version() { printf("capalogin\n"); printf(" CAPA version %s, %s\n",CAPA_VER,COMPILE_DATE); + printf(" CAPA is released under the GNU GPL v2 see COPYING for details.\n"); } /* ------------------------------------------------------------------------- */