Annotation of capa/capa51/GUITools/common.funct.c, revision 1.5
1.4 albertel 1: /* general functionality for all parts of GUI CAPA
2: Copyright (C) 1992-2000 Michigan State University
3:
4: The CAPA system is free software; you can redistribute it and/or
5: modify it under the terms of the GNU Library General Public License as
6: published by the Free Software Foundation; either version 2 of the
7: License, or (at your option) any later version.
8:
9: The CAPA system is distributed in the hope that it will be useful,
10: but WITHOUT ANY WARRANTY; without even the implied warranty of
11: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12: Library General Public License for more details.
13:
14: You should have received a copy of the GNU Library General Public
15: License along with the CAPA system; see the file COPYING. If not,
16: write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
17: Boston, MA 02111-1307, USA.
18:
19: As a special exception, you have permission to link this program
20: with the TtH/TtM library and distribute executables, as long as you
21: follow the requirements of the GNU GPL in regard to all of the
22: software in the executable aside from TtH/TtM.
23: */
24:
1.1 albertel 25: /*
26: * common.funct.c
1.4 albertel 27: * Created Guy Albertelli II 1998
1.1 albertel 28: */
29: #include <stdio.h>
30: #include <tk.h>
31: #include <Capa/capaCommon.h>
32: #include <common.h>
33: #include <ctype.h>
34: #include <time.h>
35: #include <sys/types.h>
36: #include <sys/wait.h>
37:
38: /* Used by the parse front end to escape any special characters in TCL */
39: /* arguments are source buffer, destination buffer, and where to start */
40: /* in the destination buffer */
41: int capaPrepareBuffer(char *buf,char *buf2,int j)
42: {
43: int i;
44: for(i=0;i<strlen(buf);i++,j++)
45: {
46: switch(buf[i])
47: {
48: case '$':case '[': case ']': case '{': case '}': case '\\': case '"':
49: buf2[j]='\\';
50: j++;
51: buf2[j]=buf[i];
52: break;
53: default:
54: buf2[j]=buf[i];
55: break;
56: }
57: }
58: buf2[j]='\0';
59: return j;
60: }
61:
62: int bufInsert(Tcl_Interp*interp,char*window,char*string)
63: {
64: char *buf;
65: char *buf2;
66: #ifdef _UPDATE
67: char *update=";update";
68: #else
69: char *update=" ";
70: #endif
71:
72: buf=capa_malloc(BUFFER_SIZE+strlen(string)*2,1);
73: buf2=capa_malloc(BUFFER_SIZE+strlen(string)*3,1);
74: capaPrepareBuffer(string,buf,0);
75: sprintf(buf2,"%s insert end \"%s\" answer%s",window,buf,update);
76: if (Tcl_Eval(interp,buf2) != TCL_OK) { fprintf(stderr,"problem with bufInsert\n"); }
77: capa_mfree(buf);
78: capa_mfree(buf2);
79: }
80:
81: void print_begin_item(int mode,Tcl_Interp *interp,char *window,int q_idx)
82: {
83: char buf[BUFFER_SIZE];
84: switch(mode) {
85: case TeX_MODE: bufInsert(interp,window, "\\item "); break;
86: case ASCII_MODE:
87: sprintf(buf, "%d) ", q_idx);
88: bufInsert(interp,window,buf); break;
89: case HTML_MODE: bufInsert(interp,window, "<LI> "); break;
90: }
91: }
92:
93: void capaInsertAnswer(Problem_t *p,Tcl_Interp *interp, char *window) {
94: extern int Parsemode_f;
95: char* answer;
96:
97: answer=answers_string(Parsemode_f,p);
98: bufInsert(interp,window,answer);
99: capa_mfree(answer);
100: }
101:
102: /* updates the gDate var with the current date and reregisters itself
103: * to run in .8 seconds
104: */
105:
106: int capaDateUpdate(ClientData clientdata, Tcl_Interp *interp, int argc,
107: char *argv[])
108: {
109: time_t rightNow=time(NULL);
110:
111: if (Tcl_SetVar(interp,"gDate",asctime(localtime(&rightNow)),
112: TCL_GLOBAL_ONLY) == NULL)
113: {
114: fprintf(stderr,"Tcl_Eval error\n");
115: fprintf(stderr,"%s\n",interp->result);
116: return TCL_ERROR;
117: }
118:
119: if (Tcl_Eval(interp,"after 800 { dateUpdate } ") != TCL_OK)
120: {
121: fprintf(stderr,"Tcl_Eval error\n");
122: fprintf(stderr,"%s\n",interp->result);
123: return TCL_ERROR;
124: }
125: return TCL_OK;
126: }
127:
128: int capaGetExistingSections(ClientData clientdata, Tcl_Interp *interp,
129: int argc, char *argv[])
130: {
131: int i=0,result,sectionArray[MAX_SECTION_COUNT];
132: char buf[BUFFER_SIZE];
133:
134: Tcl_ResetResult(interp);
135: result=capa_get_section_count(sectionArray);
136: if (result==-1)
137: {
138: Tcl_AppendElement(interp,"Unable to find a classl file.\n");
139: return TCL_ERROR;
140: }
141: for(i=1;i<=sectionArray[0];i++)
142: {
143: if ( sectionArray[i] !=0 )
144: {
145: sprintf(buf,"%d %d",i, sectionArray[i]);
146: Tcl_AppendElement(interp,buf);
147: }
148: }
149: return TCL_OK;
150: }
151:
1.2 albertel 152: /* finds how many set.db files there are */
153: int howManySetDBFile()
154: {
155: char filename[BUFFER_SIZE], *pathName;
156: int ii;
157:
158: pathName=getcwd(NULL,BUFFER_SIZE);
159: ii=1;
160: sprintf(filename,"%s/records/set%d.db",pathName,ii);
161: while(!access(filename, F_OK)) {
162: ii++;
163: sprintf(filename,"%s/records/set%d.db",pathName,ii);
164: }
165: free(pathName);
166: return (ii-1);
167: }
168:
1.3 albertel 169: /* argv[1] is student number argv[2] is setnumber */
170: int capaGetSpecifiCapaId(ClientData clientdata, Tcl_Interp *interp, int argc,
171: char *argv[])
172: {
173: char buf[MAX_BUFFER_SIZE];
174: if (argc==3) {
175: sprintf(buf,"%d",capa_PIN(argv[1],atoi(argv[2]),0));
176: Tcl_AppendElement(interp,buf);
177: } else {
178: sprintf(buf,"Usage: %s StudentNumber SetNumber",argv[0]);
179: Tcl_AppendElement(interp,buf);
180: }
181: return TCL_OK;
182: }
183:
184: /* argv[1] is student number argv[2] is section number argv[3] is setnumber */
185: int capaIsSetOpen(ClientData clientdata, Tcl_Interp *interp, int argc,
186: char *argv[])
187: {
188: char buf[MAX_BUFFER_SIZE];
189: if (argc==4) {
190: sprintf(buf,"%d",capa_check_date(CHECK_OPEN_DATE,argv[1],atoi(argv[2]),atoi(argv[3])));
191: Tcl_AppendElement(interp,buf);
192: } else {
193: sprintf(buf,"Usage: %s StudentNumber SectionNumber SetNumber",argv[0]);
194: Tcl_AppendElement(interp,buf);
195: }
196: return TCL_OK;
197: }
1.2 albertel 198:
1.1 albertel 199: void message()
200: {
1.3 albertel 201: signed char *message=
1.1 albertel 202: "***** ***** ************ ***** *****\n"
203: "****** ****** ****************** ***** *****\n"
204: " ****** ****** **** **** **** **** \n"
205: " ******* ******* **** **** **** **** \n"
206: " ******** ******** **** **** **** **** \n"
207: " **** **** **** **** **** **** **** \n"
208: " **** **** **** **** **** **** **** \n"
209: " **** **** **** **** **** **** **** \n"
210: " **** ******** **** **** **** **** \n"
211: " **** ****** **** *************** **** **** \n"
212: " **** **** **** *************** **** **** \n"
213: " **** ** **** **** **** **** \n"
214: " **** **** **** **** **** \n"
215: " **** **** **** **** **** \n"
216: " **** **** **** **** **** \n"
217: " **** **** **** **** **** **** \n"
218: " **** **** **** **** **** **** \n"
219: " **** **** **** **** **** **** \n"
220: "***** ***** ****************** ***************** \n"
221: "***** ***** ************ *********** \n"
1.5 ! albertel 222: "CAPA comes with ABSOLUTELY NO WARRANTY \n"
! 223: "This is free software, and you are welcome \n"
! 224: "to redistribute it under certain conditions; check the COPYING file. \n";
1.1 albertel 225: fprintf(stderr,message);
226: exit(0);
227: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>