/*
* common.funct.c
* Copyright Guy Albertelli II 1998
* Portions Copyright Issac Tsai
*/
#include <stdio.h>
#include <tk.h>
#include <Capa/capaCommon.h>
#include <common.h>
#include <ctype.h>
#include <time.h>
#include <sys/types.h>
#include <sys/wait.h>
/* Used by the parse front end to escape any special characters in TCL */
/* arguments are source buffer, destination buffer, and where to start */
/* in the destination buffer */
int capaPrepareBuffer(char *buf,char *buf2,int j)
{
int i;
for(i=0;i<strlen(buf);i++,j++)
{
switch(buf[i])
{
case '$':case '[': case ']': case '{': case '}': case '\\': case '"':
buf2[j]='\\';
j++;
buf2[j]=buf[i];
break;
default:
buf2[j]=buf[i];
break;
}
}
buf2[j]='\0';
return j;
}
int bufInsert(Tcl_Interp*interp,char*window,char*string)
{
char *buf;
char *buf2;
#ifdef _UPDATE
char *update=";update";
#else
char *update=" ";
#endif
buf=capa_malloc(BUFFER_SIZE+strlen(string)*2,1);
buf2=capa_malloc(BUFFER_SIZE+strlen(string)*3,1);
capaPrepareBuffer(string,buf,0);
sprintf(buf2,"%s insert end \"%s\" answer%s",window,buf,update);
if (Tcl_Eval(interp,buf2) != TCL_OK) { fprintf(stderr,"problem with bufInsert\n"); }
capa_mfree(buf);
capa_mfree(buf2);
}
void print_begin_item(int mode,Tcl_Interp *interp,char *window,int q_idx)
{
char buf[BUFFER_SIZE];
switch(mode) {
case TeX_MODE: bufInsert(interp,window, "\\item "); break;
case ASCII_MODE:
sprintf(buf, "%d) ", q_idx);
bufInsert(interp,window,buf); break;
case HTML_MODE: bufInsert(interp,window, "<LI> "); break;
}
}
void capaInsertAnswer(Problem_t *p,Tcl_Interp *interp, char *window) {
extern int Parsemode_f;
char* answer;
answer=answers_string(Parsemode_f,p);
bufInsert(interp,window,answer);
capa_mfree(answer);
}
/* updates the gDate var with the current date and reregisters itself
* to run in .8 seconds
*/
int capaDateUpdate(ClientData clientdata, Tcl_Interp *interp, int argc,
char *argv[])
{
time_t rightNow=time(NULL);
if (Tcl_SetVar(interp,"gDate",asctime(localtime(&rightNow)),
TCL_GLOBAL_ONLY) == NULL)
{
fprintf(stderr,"Tcl_Eval error\n");
fprintf(stderr,"%s\n",interp->result);
return TCL_ERROR;
}
if (Tcl_Eval(interp,"after 800 { dateUpdate } ") != TCL_OK)
{
fprintf(stderr,"Tcl_Eval error\n");
fprintf(stderr,"%s\n",interp->result);
return TCL_ERROR;
}
return TCL_OK;
}
int capaGetExistingSections(ClientData clientdata, Tcl_Interp *interp,
int argc, char *argv[])
{
int i=0,result,sectionArray[MAX_SECTION_COUNT];
char buf[BUFFER_SIZE];
Tcl_ResetResult(interp);
result=capa_get_section_count(sectionArray);
if (result==-1)
{
Tcl_AppendElement(interp,"Unable to find a classl file.\n");
return TCL_ERROR;
}
for(i=1;i<=sectionArray[0];i++)
{
if ( sectionArray[i] !=0 )
{
sprintf(buf,"%d %d",i, sectionArray[i]);
Tcl_AppendElement(interp,buf);
}
}
return TCL_OK;
}
/* finds how many set.db files there are */
int howManySetDBFile()
{
char filename[BUFFER_SIZE], *pathName;
int ii;
pathName=getcwd(NULL,BUFFER_SIZE);
ii=1;
sprintf(filename,"%s/records/set%d.db",pathName,ii);
while(!access(filename, F_OK)) {
ii++;
sprintf(filename,"%s/records/set%d.db",pathName,ii);
}
free(pathName);
return (ii-1);
}
void message()
{
unsigned char *message=
"***** ***** ************ ***** *****\n"
"****** ****** ****************** ***** *****\n"
" ****** ****** **** **** **** **** \n"
" ******* ******* **** **** **** **** \n"
" ******** ******** **** **** **** **** \n"
" **** **** **** **** **** **** **** \n"
" **** **** **** **** **** **** **** \n"
" **** **** **** **** **** **** **** \n"
" **** ******** **** **** **** **** \n"
" **** ****** **** *************** **** **** \n"
" **** **** **** *************** **** **** \n"
" **** ** **** **** **** **** \n"
" **** **** **** **** **** \n"
" **** **** **** **** **** \n"
" **** **** **** **** **** \n"
" **** **** **** **** **** **** \n"
" **** **** **** **** **** **** \n"
" **** **** **** **** **** **** \n"
"***** ***** ****************** ***************** \n"
"***** ***** ************ *********** \n"
"Copyright MSU Board of Trustees 1992-1999 \n"
"No Unauthorized Commercial Use or redistribution allowed. \n";
fprintf(stderr,message);
exit(0);
}
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>