version 1.1, 1999/09/28 21:26:21
|
version 1.10, 2000/10/10 20:03:23
|
Line 1
|
Line 1
|
/* 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 */ |
/* version 4.6 */ |
|
|
/* Jan 28 1997 I.T. */ |
/* Jan 28 1997 I.T. */ |
Line 741 char *log_string;
|
Line 764 char *log_string;
|
tmtime=localtime(&t); |
tmtime=localtime(&t); |
strftime(timeStr,FILE_NAME_LENGTH,"%d/%m %X",tmtime); |
strftime(timeStr,FILE_NAME_LENGTH,"%d/%m %X",tmtime); |
/*ct[ strlen(ct)-1 ]=0;*/ /* Trash newline */ |
/*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); |
fprintf(fp,"%s\t%s\t%s\n",student_number,timeStr,log_string); fflush(fp); |
fclose(fp); |
fclose(fp); |
return (0); |
return (0); |
Line 777 int type;
|
Line 800 int type;
|
set_score, /* Score on a set */ |
set_score, /* Score on a set */ |
term_score=0, /* Total points received */ |
term_score=0, /* Total points received */ |
term_total=0, /* Total points possible */ |
term_total=0, /* Total points possible */ |
result; |
result, |
|
tot_num_sets=0; |
T_entry entry; /* Database entry for a set */ |
T_entry entry; /* Database entry for a set */ |
char buf[MAX_BUFFER_SIZE], buf2[MAX_BUFFER_SIZE]; |
char buf[MAX_BUFFER_SIZE], buf2[MAX_BUFFER_SIZE]; |
T_header header; /* Problem set header */ |
T_header header; /* Problem set header */ |
Line 796 int type;
|
Line 820 int type;
|
probs_in_set[0]= 0; |
probs_in_set[0]= 0; |
for (set_idx=1; set_idx<=set; set_idx++) { |
for (set_idx=1; set_idx<=set; set_idx++) { |
if (capa_get_header(&header,set_idx)) return; |
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); |
capa_get_entry(&entry,student_number,set_idx); |
sscanf(header.num_questions,"%d", &(probs_in_set[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); |
start_at[set_idx] = start_at[set_idx-1]+2*(1+probs_in_set[set_idx-1]/50); |
Line 840 int type;
|
Line 867 int type;
|
|
|
/* SHOW TOTALS */ |
/* SHOW TOTALS */ |
/* if capalogin_show_summary_score is set to none don't show it */ |
/* 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, |
if (term_total > 0 ) { |
100*term_score/term_total); |
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); |
result=read_capa_config("capalogin_show_summary_score",buf2); |
if (result != 0 && result != -1) { |
if (result != 0 && result != -1) { |
if (strcasecmp(buf2,"none")==0) { |
if (strcasecmp(buf2,"none")==0) { |
Line 860 int type;
|
Line 891 int type;
|
/* don't show summary for set if inhibit response is set*/ |
/* don't show summary for set if inhibit response is set*/ |
inhibit_response=capa_check_option(OPTION_INHIBIT_RESPONSE,set_idx,*section); |
inhibit_response=capa_check_option(OPTION_INHIBIT_RESPONSE,set_idx,*section); |
if (inhibit_response > 0) continue; |
if (inhibit_response > 0) continue; |
|
if ( capa_check_date(CHECK_OPEN_DATE,student_number,*section,set_idx) < 0 ) |
|
continue; |
set_score=0; |
set_score=0; |
set_start_line=line; |
set_start_line=line; |
/* Stop if not enough lines to summarize set */ |
/* Stop if not enough lines to summarize set */ |
Line 1124 print_unit_components(FILE *fp,Unit_t *t
|
Line 1156 print_unit_components(FILE *fp,Unit_t *t
|
} |
} |
|
|
|
|
#define ANSWER_STRING_LENG 64 |
/*#define ANSWER_STRING_LENG 64*/ |
#define UNIT_STRING_LENG 64 |
#define UNIT_STRING_LENG 64 |
#define FORMAT_STRING_LENG 32 |
#define FORMAT_STRING_LENG 32 |
|
|
Line 1133 int give_response(Problem_t *p,char **a
|
Line 1165 int give_response(Problem_t *p,char **a
|
{ |
{ |
int can_answer; |
int can_answer; |
char tmp_str[MAX_BUFFER_SIZE], *c_answer_str; |
char tmp_str[MAX_BUFFER_SIZE], *c_answer_str; |
|
char *error=NULL; |
|
|
|
switch( capa_check_answers(p,a,cnt,&error) ) { |
switch( capa_check_answers(p,a,cnt) ) { |
|
|
|
case EXACT_ANS: move(A_ROW,S_COL); clrtoeol(); |
case EXACT_ANS: move(A_ROW,S_COL); clrtoeol(); |
mvaddstr(A_ROW,S_COL,"*Yes Computer gets:"); |
mvaddstr(A_ROW,S_COL,"*Yes Computer gets:"); |
Line 1163 int give_response(Problem_t *p,char **a
|
Line 1195 int give_response(Problem_t *p,char **a
|
*log_char='Y'; can_answer=NAY; |
*log_char='Y'; can_answer=NAY; |
if(*tried < TRY_BOUND) (*tried)++; |
if(*tried < TRY_BOUND) (*tried)++; |
break; |
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(); |
case SIG_FAIL: move(S_ROW,S_COL); clrtoeol(); |
mvaddstr(S_ROW,S_COL,"*Adjust Sig. Figs. "); |
mvaddstr(S_ROW,S_COL,"*Adjust Sig. Figs. "); |
*log_char='S'; can_answer=YAK; |
*log_char='S'; can_answer=YAK; |
|
capa_mfree(error); |
break; |
break; |
case UNIT_FAIL: move(S_ROW,S_COL); clrtoeol(); |
case UNIT_FAIL: move(S_ROW,S_COL); clrtoeol(); |
mvaddstr(S_ROW,S_COL,"*Units incorrect "); |
mvaddstr(S_ROW,S_COL,"*Units incorrect "); |
*log_char='U'; can_answer=YAK; |
*log_char='U'; can_answer=YAK; |
|
capa_mfree(error); |
break; |
break; |
case UNIT_NOTNEEDED: move(S_ROW,S_COL); clrtoeol(); |
case UNIT_NOTNEEDED: move(S_ROW,S_COL); clrtoeol(); |
mvaddstr(S_ROW,S_COL,"*Only a number required"); |
mvaddstr(S_ROW,S_COL,"*Only a number required"); |
*log_char='U'; can_answer=YAK; |
*log_char='U'; can_answer=YAK; |
|
capa_mfree(error); |
break; |
break; |
case NO_UNIT: move(S_ROW,S_COL); clrtoeol(); |
case NO_UNIT: move(S_ROW,S_COL); clrtoeol(); |
mvaddstr(S_ROW,S_COL,"*Units required "); |
mvaddstr(S_ROW,S_COL,"*Units required "); |
Line 1218 int give_inhibited_response(Problem_t *
|
Line 1257 int give_inhibited_response(Problem_t *
|
{ |
{ |
int can_answer; |
int can_answer; |
char tmp_str[MAX_BUFFER_SIZE]; |
char tmp_str[MAX_BUFFER_SIZE]; |
|
char *error=NULL; |
|
|
|
switch( capa_check_answers(p,a,cnt,&error) ) { |
switch( capa_check_answers(p,a,cnt) ) { |
|
|
|
|
|
case EXACT_ANS: *log_char='Y'; break; |
case EXACT_ANS: *log_char='Y'; break; |
case APPROX_ANS: *log_char='Y'; break; |
case APPROX_ANS: *log_char='Y'; break; |
case SIG_FAIL: *log_char='S'; break; |
case SIG_FAIL: *log_char='S'; capa_mfree(error); break; |
case UNIT_FAIL: *log_char='U'; break; |
case UNIT_FAIL: *log_char='U'; capa_mfree(error); break; |
case UNIT_NOTNEEDED: *log_char='U'; break; |
case UNIT_NOTNEEDED: *log_char='U'; capa_mfree(error); break; |
case NO_UNIT: *log_char='u'; break; |
case NO_UNIT: *log_char='u'; break; |
case BAD_FORMULA:*log_char='F'; break; |
case BAD_FORMULA:*log_char='F'; break; |
case INCORRECT: *log_char='N'; break; |
case INCORRECT: *log_char='N'; break; |
|
case WANTED_NUMERIC: *log_char='s'; break; |
case ANS_CNT_NOT_MATCH: *log_char='C'; break; |
case ANS_CNT_NOT_MATCH: *log_char='C'; break; |
} |
} |
|
|
Line 1549 int *section;
|
Line 1589 int *section;
|
int prob; |
int prob; |
{ |
{ |
int i,length; |
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 **sbuf_pp,answer[(EDIT_HEIGHT*(EDIT_WIDTH+1))+1]; |
char submissions_str[(EDIT_HEIGHT*(EDIT_WIDTH+1))+MAX_BUFFER_SIZE]; |
char submissions_str[(EDIT_HEIGHT*(EDIT_WIDTH+1))+MAX_BUFFER_SIZE]; |
time_t curtime; |
time_t curtime; |
Line 1575 int prob;
|
Line 1615 int prob;
|
capa_mfree((char *)sbuf_pp[i]); |
capa_mfree((char *)sbuf_pp[i]); |
} |
} |
capa_set_subjective(set,prob,student_number,answer); |
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); |
log_submissions(student_number,set,submissions_str); |
capa_mfree((char *)sbuf_pp); |
capa_mfree((char *)sbuf_pp); |
return 1; |
return 1; |
Line 1615 int *section;
|
Line 1658 int *section;
|
T_entry entry; |
T_entry entry; |
char answer[256], *a_str, **ans_strs; |
char answer[256], *a_str, **ans_strs; |
int num, offset, num_questions, start_from, leng; |
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 *tried,answered; |
int scr_idx=1, display=1, second_scr, canAnswer; |
int scr_idx=1, display=1, second_scr, canAnswer; |
int usr_command, whereto, allow_hint=0, ex=0; |
int usr_command, whereto, allow_hint=0, ex=0; |
Line 1820 int *section;
|
Line 1863 int *section;
|
if ( is_all_ws(ans_strs[0]) ) break; |
if ( is_all_ws(ans_strs[0]) ) break; |
trim_response_ws(ans_strs[0]); |
trim_response_ws(ans_strs[0]); |
} |
} |
|
tmp=strsave(a_str); |
sprintf(submissions_str,"%d\t%s\t",num+1,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); |
log_submissions(student_number,set,submissions_str); |
|
|
{ |
{ |
Line 1856 int *section;
|
Line 1901 int *section;
|
mvaddstr(X_ROW,H_COL,":H = Show Hint"); |
mvaddstr(X_ROW,H_COL,":H = Show Hint"); |
} |
} |
switch(log_char) { |
switch(log_char) { |
case 'U': case 'u': case 'S': |
case 'U': case 'u': case 'S': case 'F': |
entry.answers[num]='N'; break; |
entry.answers[num]='N'; break; |
case 'Y': allow_hint=1; mvaddstr(X_ROW,H_COL,":H = Show Hint"); /* fall through here */ |
case 'Y': allow_hint=1; mvaddstr(X_ROW,H_COL,":H = Show Hint"); /* fall through here */ |
default: entry.answers[num]=log_char; break; |
default: entry.answers[num]=log_char; break; |
Line 1870 int *section;
|
Line 1915 int *section;
|
/* ------------------------------ check due date */ |
/* ------------------------------ check due date */ |
time(&curtime); |
time(&curtime); |
/* ===> if (compare_datetime(curtime,header.due_date) > 0) { */ |
/* ===> if (compare_datetime(curtime,header.due_date) > 0) { */ |
|
#ifndef NO_DATE_CHECK |
if( capa_check_date(CHECK_DUE_DATE,student_number,*section,set) > 0 ) { |
if( capa_check_date(CHECK_DUE_DATE,student_number,*section,set) > 0 ) { |
capa_get_date(CHECK_DUE_DATE,student_number,*section,set,date_str); |
capa_get_date(CHECK_DUE_DATE,student_number,*section,set,date_str); |
sprintf(answer,"Sorry, the due date was: %s",date_str); |
sprintf(answer,"Sorry, the due date was: %s",date_str); |
move(20,1); clrtobot(); addstr(answer); mypause(23,1); |
move(20,1); clrtobot(); addstr(answer); mypause(23,1); |
} else { |
} else |
|
#endif |
|
{ |
capa_set_entry(&entry,student_number,set,offset); |
capa_set_entry(&entry,student_number,set,offset); |
} |
} |
} break; |
} break; |
Line 2389 void print_version()
|
Line 2437 void print_version()
|
{ |
{ |
printf("capalogin\n"); |
printf("capalogin\n"); |
printf(" CAPA version %s, %s\n",CAPA_VER,COMPILE_DATE); |
printf(" CAPA version %s, %s\n",CAPA_VER,COMPILE_DATE); |
|
printf(" CAPA is released under the GNU GPL v2 see COPYING for details.\n"); |
} |
} |
|
|
/* ------------------------------------------------------------------------- */ |
/* ------------------------------------------------------------------------- */ |