Rev 8135 | Rev 8195 | Go to most recent revision | Details | Compare with Previous | 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 | |||
8135 | bpr | 18 | #include "../Lib/libwims.h" |
19 | #include "oef2wims.h" |
||
7677 | bpr | 20 | /* these are patches for rawmath.c */ |
8096 | bpr | 21 | /* |
10 | reyssat | 22 | char *getvar(char *p) {return NULL;} |
23 | void setvar(char *p, char *v) {return;} |
||
8096 | bpr | 24 | */ |
10 | reyssat | 25 | char *exec_if(char *p) |
26 | { |
||
27 | char *p1, *p2, *p3, *p4, *p5, *p6, *pp; |
||
28 | char buf[MAX_LINELEN+1]; |
||
29 | p1=find_word_start(p); if(*p1!='{') return p; |
||
30 | p2=find_matching(p1+1,'}'); if(p2==NULL) return p; |
||
31 | p3=find_word_start(p2+1); if(*p3!='{') return p; |
||
32 | p4=find_matching(p3+1,'}'); if(p4==NULL) return p; |
||
33 | *p2=0; snprintf(buf,sizeof(buf),"%s",p1+1); |
||
34 | for(pp=strchr(buf,'\\'); pp!=NULL; pp=strchr(pp+1,'\\')) { |
||
7677 | bpr | 35 | if(isalnum(*(pp+1))) string_modify(buf,pp,pp+1,"$m_"); |
10 | reyssat | 36 | } |
37 | fprintf(outf," \n!if %s \n$()",buf); |
||
38 | p5=find_word_start(p4+1); |
||
39 | if(*p5=='{' && (p6=find_matching(p5+1,'}'))!=NULL) { |
||
7677 | bpr | 40 | *p4=elsechar; *p5=' '; *p6=endifchar; |
10 | reyssat | 41 | } |
42 | else *p4=endifchar; |
||
43 | return p3+1; |
||
44 | } |
||
45 | |||
46 | char *exec_for(char *p) |
||
47 | { |
||
48 | char *p1, *p2, *p3, *p4, *pp; |
||
49 | char buf[MAX_LINELEN+1]; |
||
50 | p1=find_word_start(p); if(*p1!='{') return p; |
||
51 | p2=find_matching(p1+1,'}'); if(p2==NULL) return p; |
||
52 | p3=find_word_start(p2+1); if(*p3!='{') return p; |
||
53 | p4=find_matching(p3+1,'}'); if(p4==NULL) return p; |
||
54 | *p2=0; snprintf(buf,sizeof(buf),"%s",p1+1); |
||
55 | for(pp=strchr(buf,'\\'); pp!=NULL; pp=strchr(pp+1,'\\')) { |
||
7677 | bpr | 56 | if(isalnum(*(pp+1))) string_modify(buf,pp,pp+1,"$m_"); |
10 | reyssat | 57 | } |
58 | fprintf(outf," \n!for m_%s \n$()",find_word_start(buf)); |
||
59 | *p4=nextchar; |
||
7622 | bpr | 60 | return p3+1; |
10 | reyssat | 61 | } |
5335 | bpr | 62 | /* process math formula inside \( ) or \( \) */ |
10 | reyssat | 63 | void process_formula(char *p) |
64 | { |
||
65 | char *p3, bf[MAX_LINELEN+1]; |
||
7622 | bpr | 66 | |
10 | reyssat | 67 | if(strlen(p)>=MAX_LINELEN) error("formula too long"); |
68 | while((p3=strstr(p,"<"))!=NULL) memmove(p3," < ",4); |
||
69 | while((p3=strstr(p,">"))!=NULL) memmove(p3," > ",4); |
||
70 | for(p3=strchr(p,'\n'); p3!=NULL; p3=strchr(p3,'\n')) *p3=' '; |
||
7622 | bpr | 71 | snprintf(bf,sizeof(bf),"%s",p); |
10 | reyssat | 72 | if(strchr(bf,'\\')==NULL && strchr(bf,'}')==NULL && strlen(bf)>2) { |
7677 | bpr | 73 | for(p3=strstr(bf,".."); p3!=NULL; p3=strstr(p3,"..")) { |
74 | if(*(p3+2)=='.' || *(p3+2)==',') { |
||
75 | do p3++; while(*p3=='.'); continue; |
||
76 | } |
||
77 | *p3=','; *(p3+1)=' '; |
||
78 | } |
||
10 | reyssat | 79 | } |
80 | fprintf(outf,"\n!insmath %s\n$()",bf); |
||
81 | } |
||
82 | |||
83 | void out_exec(char *s1, char *s2) |
||
84 | { |
||
85 | char *ps, *p, *pp, *pe, *pp2, *pe2, *pt, c; |
||
86 | char *p2, *p3; |
||
87 | if(s2) fprintf(outf,"\n!exit\n\n:%s\n$()",s2); |
||
88 | ps=s1; |
||
89 | for(p=ps;*p;p++) { |
||
7677 | bpr | 90 | if(*p==nextchar) { |
91 | *p=0; |
||
92 | fprintf(outf,"%s \n!next\n$()",ps); ps=p+1; continue; |
||
93 | } |
||
94 | if(*p==elsechar) { |
||
95 | *p=0; |
||
96 | fprintf(outf,"%s \n!else\n$()",ps); ps=p+1; continue; |
||
97 | } |
||
98 | if(*p==endifchar) { |
||
99 | *p=0; |
||
100 | fprintf(outf,"%s \n!endif\n$()",ps); ps=p+1; continue; |
||
101 | } |
||
102 | if(*p!='\\') continue; |
||
103 | c=*(p+1); |
||
104 | if(isalnum(c)) { |
||
105 | /* exit */ |
||
106 | if(strncmp(p+1,"exit",4)==0 && !isalnum(*(p+5))) { |
||
107 | *p=0; fprintf(outf,"%s\n!exit\n",ps); p+=5; ps=p; |
||
108 | continue; |
||
109 | } |
||
110 | /* for */ |
||
111 | if(strncmp(p+1,"for",3)==0 && *find_word_start(p+4)=='{') { |
||
112 | char *pt; |
||
113 | *p=0; fprintf(outf,"%s",ps); p++; ps=p; |
||
114 | pt=exec_for(p+3); if(pt>p+3) {p=pt-1;ps=pt;} |
||
115 | continue; |
||
116 | } |
||
117 | /* if */ |
||
118 | if(strncmp(p+1,"if",2)==0 && *find_word_start(p+3)=='{') { |
||
119 | char *pt; |
||
120 | *p=0; fprintf(outf,"%s",ps); p++; ps=p; |
||
121 | pt=exec_if(p+2); if(pt>p+2) {p=pt-1;ps=pt;} |
||
122 | continue; |
||
123 | } |
||
124 | /* canvasdraw */ |
||
125 | if(strncmp(p+1,"canvasdraw",10)==0 && *find_word_start(p+11)=='{') { |
||
126 | pe=pp2=pe2=""; |
||
127 | pp=find_word_start(p+11); |
||
128 | if(*pp) pe=find_matching(pp+1,'}'); |
||
129 | if(pe) pp2=find_word_start(pe+1); else continue; |
||
130 | if(pp2) pe2=find_matching(pp2+1,'}'); else continue; |
||
131 | if(pe2 && *pp2=='{' && *pe2=='}') { |
||
132 | pp++; pp2++; *p=*pe=*pe2=0; |
||
133 | while((pt=strstr(pp2,"$val1/"))!=NULL) |
||
134 | ovlstrcpy(pt,pt+strlen("$val1/")); |
||
135 | fprintf(outf,"%s \n\ |
||
7622 | bpr | 136 | !read oef/canvasdraw.phtml %s \\\n%s \n$()", ps,pp,pp2); |
7677 | bpr | 137 | ps=p=pe2; ps++; continue; |
138 | } |
||
139 | } |
||
7622 | bpr | 140 | |
7677 | bpr | 141 | /* draw */ |
142 | if(strncmp(p+1,"draw",4)==0 && *find_word_start(p+5)=='{') { |
||
143 | pe=pp2=pe2=""; |
||
144 | pp=find_word_start(p+5); |
||
145 | if(*pp) pe=find_matching(pp+1,'}'); |
||
146 | if(pe) pp2=find_word_start(pe+1); else continue; |
||
147 | if(pp2) pe2=find_matching(pp2+1,'}'); else continue; |
||
148 | if(pe2 && *pp2=='{' && *pe2=='}') { |
||
149 | pp++; pp2++; *p=*pe=*pe2=0; |
||
150 | while((pt=strstr(pp2,"$val1/"))!=NULL) |
||
151 | ovlstrcpy(pt,pt+strlen("$val1/")); |
||
152 | fprintf(outf,"%s \n\ |
||
10 | reyssat | 153 | !read oef/draw.phtml %s \\\n%s \n$()", ps,pp,pp2); |
7677 | bpr | 154 | ps=p=pe2; ps++; continue; |
155 | } |
||
156 | } |
||
157 | /* img */ |
||
158 | if(strncmp(p+1,"img",strlen("img"))==0 && *find_word_start(p+strlen("img")+1)=='{') { |
||
159 | pe=pp2=NULL; |
||
160 | pp=find_word_start(p+strlen("img")+1); |
||
161 | if(*pp=='{') pe=find_matching(pp+1,'}'); |
||
162 | if(pe) pp2=find_word_start(pe+1); else continue; |
||
163 | pe2=pe; |
||
164 | if(*pp2=='{') { |
||
165 | pe2=find_matching(++pp2,'}'); |
||
166 | if(pe2) *pe2=0; |
||
167 | } |
||
168 | else pp2=""; |
||
169 | if(*pp=='{' && *pe=='}') { |
||
170 | pp++; *p=*pe=0; |
||
171 | fprintf(outf,"%s \n\ |
||
10 | reyssat | 172 | !read oef/img.phtml %s %s \n$()", ps,pp,pp2); |
7677 | bpr | 173 | ps=p=pe2; ps++; continue; |
174 | } |
||
175 | } |
||
176 | /* audio */ |
||
177 | if(strncmp(p+1,"audio",strlen("audio"))==0 && *find_word_start(p+strlen("audio")+1)=='{') { |
||
178 | pe=pp2=NULL; |
||
179 | pp=find_word_start(p+strlen("audio")+1); |
||
180 | if(*pp=='{') pe=find_matching(pp+1,'}'); |
||
181 | if(pe) pp2=find_word_start(pe+1); else continue; |
||
182 | pe2=pe; |
||
183 | if(*pp2=='{') { |
||
184 | pe2=find_matching(++pp2,'}'); |
||
185 | if(pe2) *pe2=0; |
||
186 | } |
||
187 | else pp2=""; |
||
188 | if(*pp=='{' && *pe=='}') { |
||
189 | pp++; *p=*pe=0; |
||
190 | fprintf(outf,"%s \n\ |
||
7132 | bpr | 191 | !read oef/audio.phtml %s %s \n$()", ps,pp,pp2); |
7677 | bpr | 192 | ps=p=pe2; ps++; continue; |
193 | } |
||
194 | } |
||
195 | if(strncmp(p+1,"embed",5)==0 && *find_word_start(p+6)=='{') { |
||
196 | pe=pp2=pe2=""; |
||
197 | pp=find_word_start(p+6); |
||
198 | if(*pp) pe=find_matching(pp+1,'}'); |
||
199 | if(pe && *pp=='{' && *pe=='}') { |
||
200 | pp++; *p=*pe=0; |
||
201 | fprintf(outf,"%s \n\ |
||
10 | reyssat | 202 | !read oef/embed.phtml %s \n$()", ps,pp); |
7677 | bpr | 203 | ps=p=pe; ps++; embedcnt++; continue; |
204 | } |
||
205 | } |
||
206 | if(strncmp(p+1,"special",7)==0 && *find_word_start(p+8)=='{') { |
||
207 | pe=pp2=pe2=""; |
||
208 | pp=find_word_start(p+8); |
||
209 | if(*pp) pe=find_matching(pp+1,'}'); |
||
210 | if(pe && *pp=='{' && *pe=='}') { |
||
211 | pp++; *p=*pe=0; |
||
212 | fprintf(outf,"%s \n\ |
||
10 | reyssat | 213 | !read oef/special.phtml %s \n$()", ps,pp); |
7677 | bpr | 214 | ps=p=pe; ps++; embedcnt++; continue; |
215 | } |
||
216 | } |
||
217 | *p++=0; fprintf(outf,"%s$m_",ps); ps=p; continue; |
||
218 | } |
||
219 | if(c=='\\') { |
||
220 | ovlstrcpy(p,p+1); continue; |
||
221 | } |
||
222 | if(c=='(') { |
||
223 | p2=find_matching(p+2,')'); p3=strstr(p,"\\)"); |
||
224 | if((p2==NULL && p3!=NULL) || |
||
225 | (p2!=NULL && p3!=NULL && p3<p2)) p2=p3+1; |
||
226 | if(p2==NULL) continue; |
||
227 | *p++=0; fprintf(outf,"%s",ps); |
||
228 | *p2=0; if(*(p2-1)=='\\') *(p2-1)=0; |
||
229 | process_formula(p+1); |
||
230 | formulaend: p=p2; ps=p+1; |
||
231 | continue; |
||
232 | } |
||
233 | if(c=='{') { |
||
234 | p2=find_matching(p+2,'}'); p3=strstr(p,"\\}"); |
||
235 | if((p2==NULL && p3!=NULL) || |
||
236 | (p2!=NULL && p3!=NULL && p3<p2)) p2=p3+1; |
||
237 | if(p2==NULL) continue; |
||
238 | *p++=0; fprintf(outf,"%s",ps); |
||
239 | *p2=0; process_formula(p+1); |
||
240 | goto formulaend; |
||
241 | } |
||
10 | reyssat | 242 | } |
243 | fprintf(outf,"%s\n$()",ps); |
||
244 | } |
||
245 |