Go to most recent revision | Details | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
10 | reyssat | 1 | /* Copyright (C) 1998-2003 XIAO, Gang of Universite de Nice - Sophia Antipolis |
2 | * |
||
3 | * This program is free software; you can redistribute it and/or modify |
||
4 | * it under the terms of the GNU General Public License as published by |
||
5 | * the Free Software Foundation; either version 2 of the License, or |
||
6 | * (at your option) any later version. |
||
7 | * |
||
8 | * This program is distributed in the hope that it will be useful, |
||
9 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
||
10 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||
11 | * GNU General Public License for more details. |
||
12 | * |
||
13 | * You should have received a copy of the GNU General Public License |
||
14 | * along with this program; if not, write to the Free Software |
||
15 | * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. |
||
16 | */ |
||
17 | |||
18 | char *setpre=""; |
||
19 | |||
20 | void sp_asis(char *p, int ptype) |
||
21 | { |
||
22 | fprintf(outf,"%stmp%d=!nosubst %s\n\n",setpre,prepcnt,p); |
||
23 | } |
||
24 | |||
25 | void sp_evalue(char *p, int ptype) |
||
26 | { |
||
27 | char *p1, *p2, *pe; |
||
7622 | bpr | 28 | |
10 | reyssat | 29 | p1=strparchr(p,','); |
30 | if(p1==NULL) { |
||
7677 | bpr | 31 | fprintf(outf,"%stmp%d=%s\n\n",setpre,prepcnt,p); |
32 | return; |
||
10 | reyssat | 33 | } |
34 | *p1++=0; fprintf(outf,"%sevaltmp=%s\n\n", setpre,p); |
||
35 | for(; p1!=NULL; p1=p2){ |
||
7677 | bpr | 36 | p1=find_word_start(p1); |
37 | p2=strparchr(p1,','); |
||
38 | if(p2!=NULL) *p2++=0; |
||
39 | pe=strchr(p1,'='); |
||
40 | if(pe==NULL) continue; |
||
41 | *pe++=0; *find_word_end(p1)=0; |
||
42 | if(*p1==0) continue; |
||
43 | fprintf(outf,"%sevaltmp=!mathsubst %s=(%s) in $evaltmp\n", |
||
44 | setpre,p1,pe); |
||
10 | reyssat | 45 | } |
46 | fprintf(outf,"%stmp%d=($evaltmp)\n",setpre,prepcnt); |
||
47 | } |
||
48 | |||
7677 | bpr | 49 | /* simple roots.*/ |
10 | reyssat | 50 | void sp_solve(char *p, int ptype) |
51 | { |
||
52 | fprintf(outf,"%stmp=!replace internal .. by , in %s \n\n\ |
||
53 | !distribute items $tmp into tmp1,tmp2,tmp3\n\ |
||
54 | %stmp2=!replace internal = by , in $tmp2\n\ |
||
55 | !distribute items $tmp2 into tmp4,tmp5\n\ |
||
56 | %stmp%d=!solve $tmp1 for $tmp4 = $tmp5 to $tmp3 \n", |
||
7677 | bpr | 57 | setpre,p,setpre,setpre,prepcnt); |
10 | reyssat | 58 | } |
59 | |||
7677 | bpr | 60 | /* use maxima to do formal derivation. */ |
10 | reyssat | 61 | void sp_diff(char *p, int ptype) |
62 | { |
||
63 | fprintf(outf,"%stmp=!translate ;\";': to $ $ in %s\n\n\ |
||
64 | %stmp=!lower $tmp\n\ |
||
65 | %stmp%d=!exec maxima diff($tmp);\n", |
||
7677 | bpr | 66 | setpre,p,setpre,setpre,prepcnt); |
10 | reyssat | 67 | } |
68 | |||
7677 | bpr | 69 | /* user pari to compute matrix determinant. */ |
10 | reyssat | 70 | void sp_det(char *p, int ptype) |
71 | { |
||
72 | fprintf(outf,"%stmp=!translate $ $ to ; in %s\n\n\ |
||
73 | %stmp%d=!exec pari matdet([$tmp])\n", |
||
7677 | bpr | 74 | setpre,p,setpre,prepcnt); |
10 | reyssat | 75 | } |
76 | |||
7677 | bpr | 77 | /* use maxima to do formal integration, |
78 | * but pari for numerical integration. */ |
||
10 | reyssat | 79 | void sp_int(char *p, int ptype) |
80 | { |
||
81 | char *s; |
||
7622 | bpr | 82 | |
10 | reyssat | 83 | if((s=strchr(p,'='))!=NULL) *s=','; |
84 | if((s=strstr(p,".."))!=NULL) {*s=','; *(s+1)=' ';} |
||
85 | fprintf(outf,"%stmp=!translate ;\";': to $ $ in %s \n\ |
||
86 | %stmp=!lower $tmp\n\ |
||
87 | !readproc slib/function/integrate $tmp\n\ |
||
88 | %stmp%d=$slib_out\n", |
||
7677 | bpr | 89 | setpre,p,setpre,setpre,prepcnt); |
10 | reyssat | 90 | } |
91 | |||
92 | void sp_htmlmath(char *p, int ptype) |
||
93 | { |
||
94 | fprintf(outf,"%stmp%d=!htmlmath %s\n\n",setpre,prepcnt,p); |
||
95 | } |
||
96 | |||
3346 | bpr | 97 | void sp_teximg(char *p, int ptype) |
98 | { |
||
99 | fprintf(outf,"!readproc %s/teximg.phtml %s \n\ |
||
100 | %stmp%d=$ins_url\n", primitive_dir, p, setpre,prepcnt); |
||
101 | } |
||
102 | |||
10 | reyssat | 103 | void sp_texmath(char *p, int ptype) |
104 | { |
||
105 | fprintf(outf,"%stmp%d=!texmath %s\n\n",setpre,prepcnt,p); |
||
106 | } |
||
107 | |||
108 | void sp_maxima(char *p, int ptype) |
||
109 | { |
||
110 | fprintf(outf,"%st_=!replace internal \\( by ( in %s\n\ |
||
111 | %stmp%d=!exec maxima $t_\n\n",setpre,p,setpre,prepcnt); |
||
112 | } |
||
113 | |||
114 | void sp_yacas(char *p, int ptype) |
||
115 | { |
||
116 | fprintf(outf,"%st_=!replace internal \\( by ( in %s\n\ |
||
117 | %stmp%d=!exec yacas $t_\n\n",setpre,p,setpre,prepcnt); |
||
118 | } |
||
119 | |||
120 | void sp_pari(char *p, int ptype) |
||
121 | { |
||
122 | fprintf(outf,"%st_=!replace internal \\( by ( in %s\n\ |
||
123 | %stmp%d=!exec pari $t_\n\n",setpre,p,setpre,prepcnt); |
||
124 | } |
||
125 | |||
126 | void sp_simplify(char *p, int ptype) |
||
127 | { |
||
128 | fprintf(outf,"%stmp=!translate \";': to $ $ in %s\n\n\ |
||
129 | %stmp=!lower $tmp\n\ |
||
130 | %stmp%d=!exec maxima fullratsimp($tmp);\n", |
||
7677 | bpr | 131 | setpre,p,setpre,setpre,prepcnt); |
10 | reyssat | 132 | } |
133 | |||
134 | void sp_slib(char *p, int ptype) |
||
135 | { |
||
136 | char *p2; |
||
137 | p=find_word_start(p); |
||
138 | for(p2=p;*p2!=0 && !isspace(*p2) && *p2!=',' && *p2!=';';p2++); |
||
139 | if(*p2!=0 && !isspace(*p2)) *p2=' '; |
||
140 | fprintf(outf,"!readproc slib/%s \n\ |
||
141 | %stmp%d=$slib_out\n",p,setpre,prepcnt); |
||
142 | } |
||
143 | |||
144 | void sp_draw(char *p, int ptype) |
||
145 | { |
||
146 | char *p2; |
||
147 | p2=strchr(p,' '); if(p2==NULL) p2=strchr(p,'\n'); |
||
148 | if(p2==NULL) return; *p2++=0; |
||
149 | fprintf(outf,"!readproc %s/draw.phtml %s \\\n%s \n\ |
||
150 | %stmp%d=$ins_url\n", primitive_dir, p, p2, setpre,prepcnt); |
||
151 | } |
||
152 | |||
7622 | bpr | 153 | void sp_canvasdraw(char *p, int ptype) |
154 | { |
||
155 | char *p2; |
||
156 | p2=strchr(p,' '); if(p2==NULL) p2=strchr(p,'\n'); |
||
157 | if(p2==NULL) return; *p2++=0; |
||
158 | fprintf(outf,"!readproc %s/canvasdraw.phtml %s \\\n%s \n\ |
||
159 | %stmp%d=$canvasdraw_out\n", primitive_dir, p, p2, setpre,prepcnt); |
||
160 | } |
||
161 | |||
10 | reyssat | 162 | void sp_shuffle(char *p, int ptype) |
163 | { |
||
164 | fprintf(outf,"%stmp%d=!shuffle %s\n\n",setpre,prepcnt,p); |
||
165 | } |
||
166 | |||
167 | void sp_positionof(char *p, int ptype) |
||
168 | { |
||
169 | char *p1; |
||
170 | p1=strparchr(p,','); if(p1==NULL) { |
||
7677 | bpr | 171 | fprintf(outf,"%stmp%d=%s\n\n",setpre,prepcnt,p); return; |
10 | reyssat | 172 | } |
173 | *p1++=0; |
||
174 | fprintf(outf,"%stmp%d=!positionof item %s in %s\n\n",setpre,prepcnt,p, p1); |
||
175 | } |
||
176 | |||
177 | void sp_random(char *p, int ptype) |
||
178 | { |
||
179 | char *pr, *p2, buf[MAX_LINELEN+1]; |
||
180 | snprintf(buf,sizeof(buf),"%s",p); |
||
181 | for(p2=buf; *p2 && p2-buf<MAX_LINELEN; p2++) { |
||
7677 | bpr | 182 | if(*p2=='(') { |
183 | p2=find_matching(p2+1,')'); continue; |
||
184 | } |
||
185 | if(*p2==',' || (*p2=='.' && *(p2+1)=='.')) break; |
||
10 | reyssat | 186 | } |
187 | if(*p2==',') pr="randitem"; |
||
188 | else { |
||
7677 | bpr | 189 | if(*p2=='.') { |
190 | *p2=','; *(p2+1)=' '; |
||
191 | } |
||
192 | if(ptype==pt_int) pr="randint"; else pr="random"; |
||
10 | reyssat | 193 | } |
194 | fprintf(outf,"%stmp%d=!%s %s\n\n",setpre,prepcnt,pr,buf); |
||
195 | } |
||
196 | |||
197 | void sp_pickone(char *p, int ptype) |
||
198 | { |
||
199 | sp_random(p,pt_int); |
||
200 | } |
||
201 | |||
202 | void sp_item(char *p, int ptype) |
||
203 | { |
||
204 | char *pp, *p2, buf[MAX_LINELEN+1]; |
||
205 | pp=strparchr(p,','); |
||
206 | if(pp==NULL) pp=""; else *pp++=0; |
||
207 | strncpy(buf,p,MAX_LINELEN);buf[MAX_LINELEN]=0; |
||
208 | strip_enclosing_par(buf); |
||
209 | if((p2=strstr(buf,".."))!=NULL) string_modify(buf,p2,p2+2," to "); |
||
210 | fprintf(outf,"%stmp%d=!item %s of %s\n\n",setpre,prepcnt,buf,pp); |
||
211 | } |
||
212 | |||
213 | void sp_items(char *p, int ptype) |
||
214 | { |
||
215 | fprintf(outf,"%stmp%d=!itemcnt %s\n\n",setpre,prepcnt,p); |
||
216 | } |
||
217 | |||
218 | void sp_randitem(char *p, int ptype) |
||
219 | { |
||
220 | fprintf(outf,"%stmp=!nonempty items %s\n\n\ |
||
221 | %stmp%d=!randitem $tmp\n",setpre,p,setpre,prepcnt); |
||
222 | } |
||
223 | |||
224 | void sp_column(char *p, int ptype) |
||
225 | { |
||
226 | char *pp, *p2, buf[MAX_LINELEN+1]; |
||
227 | pp=strparchr(p,','); |
||
228 | if(pp==NULL) pp=""; else *pp++=0; |
||
229 | strncpy(buf,p,MAX_LINELEN);buf[MAX_LINELEN]=0; |
||
230 | strip_enclosing_par(buf); |
||
231 | if((p2=strstr(buf,".."))!=NULL) string_modify(buf,p2,p2+2," to "); |
||
232 | fprintf(outf,"%stmp=!translate internal $ $ to ; in %s\n\n\ |
||
233 | %stmp=!column %s of $tmp\n\ |
||
234 | %stmp%d=!translate internal $\\\n$ to ; in $tmp\n", |
||
7677 | bpr | 235 | setpre,pp,setpre, buf, setpre, prepcnt); |
10 | reyssat | 236 | } |
237 | |||
238 | void sp_row(char *p, int ptype) |
||
239 | { |
||
240 | char *pp, *p2, buf[MAX_LINELEN+1]; |
||
241 | pp=strparchr(p,','); |
||
242 | if(pp==NULL) pp=""; else *pp++=0; |
||
243 | strncpy(buf,p,MAX_LINELEN);buf[MAX_LINELEN]=0; |
||
244 | strip_enclosing_par(buf); |
||
245 | fprintf(outf,"%stmp=!translate internal $ $ to ; in %s\n\n", |
||
7677 | bpr | 246 | setpre,pp); |
10 | reyssat | 247 | if(strstr(buf,"column")!=NULL) { |
7677 | bpr | 248 | fprintf(outf,"%stmp%d=!select $tmp where %s\n\n",setpre,prepcnt,buf); |
249 | return; |
||
10 | reyssat | 250 | } |
7622 | bpr | 251 | while((p2=strstr(buf,".."))!=NULL) |
10 | reyssat | 252 | string_modify(buf,p2,p2+2," to "); |
253 | fprintf(outf,"%stmp=!row %s of $tmp\n\ |
||
254 | %stmp%d=!translate internal $\\\n$ to ; in $tmp\n", |
||
7677 | bpr | 255 | setpre, buf, setpre, prepcnt); |
10 | reyssat | 256 | } |
257 | |||
258 | void sp_rows(char *p, int ptype) |
||
259 | { |
||
260 | fprintf(outf,"%stmp=!translate internal $ $ to ; in %s\n\n\ |
||
261 | %stmp%d=!rowcnt $tmp\n",setpre,p,setpre,prepcnt); |
||
262 | } |
||
263 | |||
264 | void sp_randrow(char *p, int ptype) |
||
265 | { |
||
266 | fprintf(outf,"%stmp=!translate internal $ $ to ; in %s\n\n\ |
||
267 | %stmp=!nonempty rows $tmp\n\ |
||
268 | %stmp=!randrow $tmp\n\ |
||
269 | %stmp%d=!translate internal $\\\n$ to ; in $tmp\n", |
||
7677 | bpr | 270 | setpre,p,setpre,setpre,setpre,prepcnt); |
10 | reyssat | 271 | } |
272 | |||
273 | void sp_mathexp_cut(char *p, int ptype) |
||
274 | { |
||
275 | char *p2; |
||
276 | p2=find_word_end(find_word_start(p)); if(isspace(*p2)) *p2++=0; |
||
277 | p2=find_word_start(p2); |
||
278 | fprintf(outf,"%stmp%d=!exec mathexp cut %s\\\n%s\n\n", |
||
7677 | bpr | 279 | setpre,prepcnt,p,p2); |
10 | reyssat | 280 | } |
281 | |||
282 | void sp_wims(char *p, int ptype) |
||
283 | { |
||
284 | p=find_word_start(p); |
||
285 | if(!isalpha(*p) || strncasecmp(p,"ins",3)==0) |
||
286 | fprintf(outf,"%stmp%d=%s\n\n",setpre,prepcnt,p); |
||
287 | else |
||
288 | fprintf(outf,"%stmp%d=!%s\n\n",setpre,prepcnt,p); |
||
289 | } |
||
290 | |||
291 | struct { |
||
292 | char *name; |
||
293 | void (*processor)(char *p, int ptype); |
||
294 | } specialfn[]={ |
||
7677 | bpr | 295 | {"asis", sp_asis}, |
296 | {"canvasdraw", sp_canvasdraw}, |
||
297 | {"column", sp_column}, |
||
298 | {"deriv", sp_diff}, |
||
299 | {"derivative", sp_diff}, |
||
300 | {"det", sp_det}, |
||
301 | {"determinant", sp_det}, |
||
302 | {"diff", sp_diff}, |
||
303 | {"draw", sp_draw}, |
||
304 | {"evaluate", sp_evalue}, |
||
305 | {"evalue", sp_evalue}, |
||
306 | {"htmlmath", sp_htmlmath}, |
||
307 | {"int", sp_int}, |
||
308 | {"integral", sp_int}, |
||
309 | {"integrate", sp_int}, |
||
310 | {"item", sp_item}, |
||
311 | {"items", sp_items}, |
||
312 | {"mathexp_cut", sp_mathexp_cut}, |
||
313 | {"maxima", sp_maxima}, |
||
314 | {"pari", sp_pari}, |
||
315 | {"pickone", sp_pickone}, |
||
316 | {"position", sp_positionof}, |
||
317 | {"positionof", sp_positionof}, |
||
318 | {"randint", sp_pickone}, |
||
319 | {"randitem", sp_randitem}, |
||
320 | {"random", sp_random}, |
||
321 | {"randomitem", sp_randitem}, |
||
322 | {"randomrow", sp_randrow}, |
||
323 | {"randrow", sp_randrow}, |
||
324 | {"row", sp_row}, |
||
325 | {"rows", sp_rows}, |
||
326 | {"shuffle", sp_shuffle}, |
||
327 | {"simplify", sp_simplify}, |
||
328 | {"slib", sp_slib}, |
||
329 | {"solve", sp_solve}, |
||
330 | {"teximg", sp_teximg}, |
||
331 | {"texmath", sp_texmath}, |
||
332 | {"wims", sp_wims}, |
||
333 | {"yacas", sp_yacas} |
||
10 | reyssat | 334 | }; |
335 | #define specialfn_no (sizeof(specialfn)/sizeof(specialfn[0])) |
||
336 | |||
7677 | bpr | 337 | /* This routine treats special functions */ |
10 | reyssat | 338 | void parmprep(char *p,int ptype) |
339 | { |
||
340 | char *pp, *p2, *pn, namebuf[32], buf[MAX_LINELEN+1]; |
||
341 | int i; |
||
342 | |||
343 | while((pp=strchr(p,'\n'))!=NULL) *pp=' '; |
||
344 | for(pp=p;*pp && pp-p<MAX_LINELEN;pp++) { |
||
7677 | bpr | 345 | /* function names */ |
346 | if(isalpha(*pp)) { |
||
347 | for(i=0;i<30 && (isalnum(pp[i]) || pp[i]=='_');i++) namebuf[i]=pp[i]; |
||
348 | namebuf[i]=0; p2=find_word_start(pp+i); |
||
349 | if((pp>p && isalnum(*(pp-1))) || *p2!='(') { |
||
350 | /* if(*p2=='\\' && *(p2+1)=='(') ovlstrcpy(p2,p2+1); */ |
||
351 | pp=p2-1; continue; |
||
352 | } |
||
353 | pn=pp; pp=p2+1; p2=find_matching(pp,')'); |
||
354 | if(p2==NULL) { |
||
355 | error("unmatched_parentheses"); |
||
356 | pp=p2; continue; |
||
357 | } |
||
358 | i=search_list(specialfn,specialfn_no,sizeof(specialfn[0]),namebuf); |
||
359 | if(i<0) { |
||
360 | pp--; continue; |
||
361 | } |
||
362 | *p2=0; |
||
363 | snprintf(buf,sizeof(buf),"%s",pp); |
||
364 | if(specialfn[i].processor!=sp_asis) parmprep(buf,ptype); |
||
365 | specialfn[i].processor(buf,ptype); |
||
366 | string_modify(p, pn, p2+1, "$(tmp%d)",prepcnt); prepcnt++; |
||
367 | pp=pn+6; |
||
368 | } |
||
10 | reyssat | 369 | } |
370 | } |
||
371 |