/* define neccsary constants/contructs for CGI scripts
   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.
*/

/* ==================================================================== */


#ifndef   CAPA_CGI_H
#define   CAPA_CGI_H

#ifdef CAPA_ARG
#undef CAPA_ARG
#define CAPA_ARG(x)  x
#endif

/*
 #ifdef __STDC__
 #define CAPA_ARG(x)  x
 #else
 #define CAPA_ARG(x)  ()
 #endif
*/

#if   defined(_MAIN_PROGRAM_) || defined(LONCAPA)

#define  GLOBAL_VAR(xx)   xx
#else 
#define  GLOBAL_VAR(xx)   extern  xx
#endif


#define   MAX_ENTRIES                 10000    /* maximal number of entries in a web page form */
#define   DEFAULT_STATUS_LINE_LENGTH  50
#define   MAX_PROBLEM_CNT             1024
#define   MAX_ANSWER_CHAR             32
#define   MAX_CLASS_CHAR              16       /* officially, it is 8, since the account name won't allow */
                                      /* more than 8 characters. */

                                     /* ----------------------------- various mode used in print_quizz() */
#define   TRY_SET_MODE        1
#define   CHECK_ANSWER_MODE   2
#define   VIEW_PREVIOUS_MODE  3


#define   TEXT_BUF_SIZE      1
/*(128*1024)*/
#define   STATUS_BUF_SIZE    1
/*(32*1024)*/

typedef struct _form_entry {
    char *name;
    char *val;
} FormEntry_t;

typedef struct _student_answer {
    int                       a_idx;
    char                     *a_str;
    struct _student_answer   *a_next;
} StudentAnswer_t;

#define     M_CHECKIN         1
#define     M_TRYSET          2
#define     M_CHECKANS        3
#define     M_VIEWPREV        4
#define     M_VIEWSUMM        5
#define     M_EXAMSUMM        6
#define     M_QUIZSUMM        7
#define     M_TERMSCORE       8
#define     LF                10
#define     CR                13


/* --------- default parameter values when something mis-specified in capa.config -------- */

#define     DEFAULT_HW_W          0.3
#define     DEFAULT_QZ_W          0.07
#define     DEFAULT_EX_W          0.3
#define     DEFAULT_FE_W          0.35
#define     DEFAULT_PC_W          0.3
#define     DEFAULT_HW_COUNT      12
#define     DEFAULT_QZ_COUNT      24
#define     DEFAULT_FE_NUMBER     4
#define     DEFAULT_WIDTH        600 /* for score extrapolation applet*/
#define     DEFAULT_HEIGHT       750 /* for score extrapolation applet*/
/* ============ function prototype in capaCgiUtils.c ===================== */

void        getword            CAPA_ARG((char *word, char *line, char stop));
char       *makeword           CAPA_ARG((char *line, char stop));
char       *fmakeword          CAPA_ARG((FILE *f, char stop, int *cl));
char        x2c                CAPA_ARG((char *what));
void        unescape_url       CAPA_ARG((char *url));
void        plustospace        CAPA_ARG((char *str));
int         rind               CAPA_ARG((char *s, char c));
int         getline            CAPA_ARG((char *s, int n, FILE *f));
void        send_fd            CAPA_ARG((FILE *f, FILE *fd));
int         ind                CAPA_ARG((char *s, char c));
void        escape_shell_cmd   CAPA_ARG((char *cmd));

int         web_log            CAPA_ARG((char *log_str));
/*
void        file_log           CAPA_ARG((char *filename, char *log_str));
*/
int         w_log_timing       CAPA_ARG((char *student_number,int set,int section,char *log_string));
int         w_log_attempt      CAPA_ARG((char *student_number,int set,char *log_string));
int         w_log_submissions  CAPA_ARG((char *student_number,int set,char *log_string));
int         w_get_input        CAPA_ARG(());
void        print_mainmenu     CAPA_ARG((char *class,char *sn, int pin));
void        print_page_header  CAPA_ARG((int mode,int num_quest));
void        print_quizz        CAPA_ARG((char *class_dir, char *c_owner,char *class,char *sn,int pin,int set,int mode));
void        print_response     CAPA_ARG((char pcr,char u_db,int q_idx,Problem_t *p));
void        print_inhibited_response CAPA_ARG((char pcr,char u_db,int q_idx,Problem_t *p));
void        check_user_ans     CAPA_ARG((int q_idx,Problem_t *p));
void        check_inhibited_user_ans     CAPA_ARG((int q_idx,Problem_t *p));
void        get_response       CAPA_ARG((char pcr,char u_db,int q_idx,Problem_t *p));
void        log_user_ans       CAPA_ARG((int q_idx,Problem_t *p));
int         check_class_get_maxset CAPA_ARG((char  *dir_path));
int         check_exam_quiz_path CAPA_ARG(());
void        print_summary  CAPA_ARG((char *class_dir,char *class, char *student_number,int pin,int set)); 
void        print_termscore_page  CAPA_ARG((char *class_dir,char *class, char *student_number,int pin,int set,FILE *out)); 
void        get_tscore_width_height CAPA_ARG((int *width,int *height));
int         get_termscore_params CAPA_ARG((float *hw,float *qw,float *ew,float *fw,float *pw,int *hc,int *qc,int *fs));
int         web_getclassdir  CAPA_ARG((char **cpath_p, char **cown_p, char *class));
char       *c_getpath        CAPA_ARG((FILE *f));
void        append_qtext     CAPA_ARG((char *new_str));
void        append_stext     CAPA_ARG((char *new_str));
void        process_mode     CAPA_ARG((int  mode));
void        process_summary  CAPA_ARG((int mode));
void        web_printheader  CAPA_ARG((FILE*));
void        web_printfooter  CAPA_ARG((FILE*));
void        preserve_last_answer CAPA_ARG((int q_idx,int print));
/* ======================================================================= */
GLOBAL_VAR(char           *g_question_txt);
GLOBAL_VAR(int             g_qchar_cnt);
GLOBAL_VAR(int             g_qsize);
GLOBAL_VAR(char           *g_status_txt);
GLOBAL_VAR(int             g_schar_cnt);
GLOBAL_VAR(int             g_ssize);
GLOBAL_VAR(int             g_run_mode);
GLOBAL_VAR(int             g_start_question);
#define ALL_QUESTIONS -1
GLOBAL_VAR(int             g_num_questions_per_page);
GLOBAL_VAR(int             g_inhibit_response);
GLOBAL_VAR(char            g_prog_name[FILE_NAME_LENGTH]);
GLOBAL_VAR(char            g_class_fullpath[FILE_NAME_LENGTH]);
GLOBAL_VAR(FormEntry_t     g_entries[MAX_ENTRIES] );
GLOBAL_VAR(char            g_student_number[MAX_STUDENT_NUMBER+4]);
GLOBAL_VAR(char            g_student_name[MAX_NAME_CHAR+1]);
GLOBAL_VAR(T_student       g_student_data);
GLOBAL_VAR(char            g_class_name[MAX_CLASS_CHAR]);
GLOBAL_VAR(char            g_class_fullpath[FILE_NAME_LENGTH]);
GLOBAL_VAR(char           *g_cpath);
GLOBAL_VAR(char           *g_cowner);
GLOBAL_VAR(int             g_entered_pin);
GLOBAL_VAR(int             g_login_set);
GLOBAL_VAR(int             g_set);
GLOBAL_VAR(int             g_vset);
GLOBAL_VAR(StudentAnswer_t *g_stu_ans_pp[MAX_PROBLEM_CNT]);
GLOBAL_VAR(StudentAnswer_t *g_last_ans_pp[MAX_PROBLEM_CNT]);
/*GLOBAL_VAR(char           *g_student_answer[MAX_PROBLEM_CNT]);
  GLOBAL_VAR(char           *g_last_answer[MAX_PROBLEM_CNT]);*/
GLOBAL_VAR(char            g_new_answerdb[MAX_PROBLEM_CNT]);
GLOBAL_VAR(char            g_log_string[MAX_PROBLEM_CNT]);
GLOBAL_VAR(int             g_modified[MAX_PROBLEM_CNT]);
GLOBAL_VAR(int             g_passdue);
GLOBAL_VAR(int             g_tried[MAX_PROBLEM_CNT]);
GLOBAL_VAR(int             g_smode);
GLOBAL_VAR(int             g_skind);
GLOBAL_VAR(char            g_cwd[FILE_NAME_LENGTH]);
#ifdef __alpha 
GLOBAL_VAR(struct timespec g_ats);
GLOBAL_VAR(struct timespec g_bts);
#endif
GLOBAL_VAR(FILE           *g_cgi);
GLOBAL_VAR(int             g_exam_set);
GLOBAL_VAR(int             g_quiz_set);
GLOBAL_VAR(char            g_exam_path[FILE_NAME_LENGTH]);
GLOBAL_VAR(char            g_quiz_path[FILE_NAME_LENGTH]);
GLOBAL_VAR(char           *g_cgibin_path);
/* ======================================================================= */


#endif   /* CAPA_CGI_H */

