Rev 16838 | 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 | */ |
8367 | bpr | 25 | char *_exec_if(char *p, int type) |
10 | reyssat | 26 | { |
12247 | bpr | 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,'\\')) { |
||
35 | if(isalnum(*(pp+1))) string_modify(buf,pp,pp+1,"$m_"); |
||
36 | } |
||
37 | switch(type) { |
||
38 | case 0: fprintf(outf,"\n!if %s \n$()",buf); break; |
||
39 | case 1: fprintf(outf,"\n!ifval %s \n$()",buf); |
||
40 | } |
||
41 | p5=find_word_start(p4+1); |
||
42 | if(*p5=='{' && (p6=find_matching(p5+1,'}'))!=NULL) { |
||
43 | *p4=elsechar; *p5=' '; *p6=endifchar; |
||
44 | } |
||
45 | else *p4=endifchar; |
||
46 | return p3+1; |
||
10 | reyssat | 47 | } |
8367 | bpr | 48 | char *exec_if(char *p) {return _exec_if(p,0);} |
49 | char *exec_ifval(char *p) {return _exec_if(p,1);} |
||
10 | reyssat | 50 | |
51 | char *exec_for(char *p) |
||
52 | { |
||
12247 | bpr | 53 | char *p1, *p2, *p3, *p4, *pp; |
54 | char buf[MAX_LINELEN+1]; |
||
55 | p1=find_word_start(p); if(*p1!='{') return p; |
||
56 | p2=find_matching(p1+1,'}'); if(p2==NULL) return p; |
||
57 | p3=find_word_start(p2+1); if(*p3!='{') return p; |
||
58 | p4=find_matching(p3+1,'}'); if(p4==NULL) return p; |
||
59 | *p2=0; snprintf(buf,sizeof(buf),"%s",p1+1); |
||
60 | for(pp=strchr(buf,'\\'); pp!=NULL; pp=strchr(pp+1,'\\')) { |
||
61 | if(isalnum(*(pp+1))) string_modify(buf,pp,pp+1,"$m_"); |
||
62 | } |
||
63 | fprintf(outf," \n!for m_%s \n$()",find_word_start(buf)); |
||
64 | *p4=nextchar; |
||
65 | return p3+1; |
||
10 | reyssat | 66 | } |
5335 | bpr | 67 | /* process math formula inside \( ) or \( \) */ |
10 | reyssat | 68 | void process_formula(char *p) |
69 | { |
||
12247 | bpr | 70 | char *p3, bf[MAX_LINELEN+1]; |
7622 | bpr | 71 | |
12247 | bpr | 72 | if(strlen(p)>=MAX_LINELEN) oef_error("formula too long"); |
73 | while((p3=strstr(p,"<"))!=NULL) memmove(p3," < ",4); |
||
74 | while((p3=strstr(p,">"))!=NULL) memmove(p3," > ",4); |
||
75 | for(p3=strchr(p,'\n'); p3!=NULL; p3=strchr(p3,'\n')) *p3=' '; |
||
76 | snprintf(bf,sizeof(bf),"%s",p); |
||
77 | if(strchr(bf,'\\')==NULL && strchr(bf,'}')==NULL && strlen(bf)>2) { |
||
78 | for(p3=strstr(bf,".."); p3!=NULL; p3=strstr(p3,"..")) { |
||
79 | if(*(p3+2)=='.' || *(p3+2)==',') { |
||
80 | do p3++; while(*p3=='.'); continue; |
||
81 | } |
||
82 | *p3=','; *(p3+1)=' '; |
||
10 | reyssat | 83 | } |
12247 | bpr | 84 | } |
85 | fprintf(outf,"\n!insmath %s\n$()",bf); |
||
10 | reyssat | 86 | } |
87 | |||
8947 | bpr | 88 | /* deux accolades obligatoires */ |
8882 | bpr | 89 | int _matchit3(char **p, char **ps, char *name, int type) |
90 | { |
||
91 | char *pp = find_word_start(*p+strlen(name)+1); |
||
92 | if(strncmp(*p+1,name,strlen(name))==0 && *pp=='{') { |
||
93 | char *pp2, *pe2, *pt; |
||
94 | char *pe=find_matching(pp+1,'}'); |
||
95 | if(pe) pp2=find_word_start(pe+1); else return 1; |
||
8947 | bpr | 96 | if(pp2 && *pp2=='{') pe2=find_matching(pp2+1,'}'); else return 1; |
97 | if(pe2) { |
||
8882 | bpr | 98 | pp++; pp2++; **p=*pe=*pe2=0; |
99 | switch(type) { |
||
100 | /* $val1 is $imagedir supprime s'il se trouve dans le code de draw */ |
||
101 | case 0: while((pt=strstr(pp2,"$val1/"))!=NULL) ovlstrcpy(pt,pt+strlen("$val1/")); break; |
||
102 | } |
||
12247 | bpr | 103 | fprintf(outf,"%s \n\ |
8882 | bpr | 104 | !read oef/%s.phtml %s \\\n%s \n$()", *ps,name,pp,pp2); |
12247 | bpr | 105 | *ps=*p=pe2; (*ps)++; return 1; |
106 | } |
||
8882 | bpr | 107 | } |
108 | return 0; |
||
109 | } |
||
8850 | bpr | 110 | |
8882 | bpr | 111 | /* deux accolades la deuxième non obligatoire */ |
112 | int _matchit2(char **p, char **ps, char *name) |
||
113 | { |
||
114 | char *pp = find_word_start(*p+strlen(name)+1); |
||
115 | if(strncmp(*p+1,name,strlen(name))==0 && *pp=='{') { |
||
116 | char *pp2, *pe2; |
||
117 | char *pe=find_matching(pp+1,'}'); |
||
118 | if(pe) pp2=find_word_start(pe+1); else return 1; |
||
119 | pe2=pe; |
||
120 | if(*pp2=='{') { |
||
121 | pe2=find_matching(++pp2,'}'); |
||
122 | if(pe2) *pe2=0; |
||
123 | } |
||
124 | else pp2=""; |
||
8947 | bpr | 125 | pp++; **p=*pe=0; |
126 | fprintf(outf,"%s \n\ |
||
8882 | bpr | 127 | !read oef/%s.phtml %s %s \n$()", *ps,name,pp,pp2); |
8947 | bpr | 128 | *ps=*p=pe2; (*ps)++; return 1; |
8882 | bpr | 129 | } |
130 | return 0; |
||
131 | } |
||
8947 | bpr | 132 | |
133 | /* une seule accolade */ |
||
8882 | bpr | 134 | int _matchit1(char **p, char **ps, char *name) |
135 | { |
||
136 | char *pp = find_word_start(*p+strlen(name)+1); |
||
137 | if(strncmp(*p+1,name,strlen(name))==0 && *pp=='{') { |
||
138 | char *pe=find_matching(pp+1,'}'); |
||
8947 | bpr | 139 | if(pe) { |
140 | pp++; **p=*pe=0; |
||
141 | fprintf(outf,"%s \n\ |
||
8882 | bpr | 142 | !read oef/%s.phtml %s \n$()", *ps,name,pp); |
8947 | bpr | 143 | *ps=*p=pe; (*ps)++; embedcnt++; return 1; |
144 | } |
||
8882 | bpr | 145 | } |
146 | return 0; |
||
147 | } |
||
148 | |||
10 | reyssat | 149 | void out_exec(char *s1, char *s2) |
150 | { |
||
12247 | bpr | 151 | char *ps, *p, c, *p2, *p3; |
152 | if(s2) fprintf(outf,"\n!exit\n\n:%s\n$()",s2); |
||
153 | ps=s1; |
||
154 | for(p=ps;*p;p++) { |
||
155 | if(*p==nextchar) { |
||
156 | *p=0; |
||
157 | fprintf(outf,"%s \n!next\n$()",ps); ps=p+1; continue; |
||
158 | } |
||
159 | if(*p==elsechar) { |
||
160 | *p=0; |
||
161 | fprintf(outf,"%s \n!else\n$()",ps); ps=p+1; continue; |
||
162 | } |
||
163 | if(*p==endifchar) { |
||
164 | *p=0; |
||
165 | fprintf(outf,"%s \n!endif\n$()",ps); ps=p+1; continue; |
||
166 | } |
||
167 | if(*p!='\\') continue; |
||
168 | c=*(p+1); |
||
169 | if(isalnum(c)) { |
||
170 | /* exit */ |
||
171 | if(strncmp(p+1,"exit",strlen("exit"))==0 && !isalnum(*(p+strlen("exit")+1))) { |
||
172 | *p=0; fprintf(outf,"%s\n!exit\n",ps); p+=strlen("exit")+1; ps=p; |
||
173 | continue; |
||
7677 | bpr | 174 | } |
12247 | bpr | 175 | /* for */ |
176 | if(strncmp(p+1,"for",strlen("for"))==0 && *find_word_start(p+strlen("for")+1)=='{') { |
||
177 | char *pt; |
||
178 | *p=0; fprintf(outf,"%s",ps); p++; ps=p; |
||
179 | pt=exec_for(p+strlen("for")); if(pt>p+strlen("for")) {p=pt-1;ps=pt;} |
||
180 | continue; |
||
7677 | bpr | 181 | } |
12247 | bpr | 182 | /* if */ |
183 | if(strncmp(p+1,"if",strlen("if"))==0 && *find_word_start(p+strlen("if")+1)=='{') { |
||
184 | char *pt; |
||
185 | *p=0; fprintf(outf,"%s",ps); p++; ps=p; |
||
186 | pt=exec_if(p+2); if(pt>p+strlen("if")) {p=pt-1;ps=pt;} |
||
187 | continue; |
||
7677 | bpr | 188 | } |
8367 | bpr | 189 | /* ifval */ |
12247 | bpr | 190 | if(strncmp(p+1,"ifval",strlen("ifval"))==0 && *find_word_start(p+strlen("ifval")+1)=='{') { |
191 | char *pt; |
||
192 | *p=0; fprintf(outf,"%s",ps); p++; ps=p; |
||
193 | pt=exec_if(p+strlen("ifval")); if(pt>p+strlen("ifval")) {p=pt-1;ps=pt;} |
||
194 | continue; |
||
7677 | bpr | 195 | } |
16838 | bpr | 196 | /* not seen as a variable */ |
12247 | bpr | 197 | if (_matchit2(&p, &ps, "img")) continue; |
198 | if (_matchit2(&p, &ps, "audio")) continue; |
||
16838 | bpr | 199 | if (_matchit2(&p, &ps, "slib")) continue; |
12247 | bpr | 200 | if (_matchit1(&p, &ps, "embed")) continue; |
201 | if (_matchit1(&p, &ps, "special")) continue; |
||
202 | if (_matchit3(&p, &ps, "draw",1)) continue; |
||
17918 | bpr | 203 | if (_matchit3(&p, &ps, "drawtikz",1)) continue; |
12247 | bpr | 204 | if (_matchit3(&p, &ps, "canvasdraw",0)) continue; |
205 | *p++=0; fprintf(outf,"%s$m_",ps); ps=p; continue; |
||
10 | reyssat | 206 | } |
12247 | bpr | 207 | if(c=='\\') { |
208 | ovlstrcpy(p,p+1); continue; |
||
209 | } |
||
210 | if(c=='(') { |
||
211 | p2=find_matching(p+2,')'); p3=strstr(p,"\\)"); |
||
212 | if((p2==NULL && p3!=NULL) || |
||
213 | (p2!=NULL && p3!=NULL && p3<p2)) p2=p3+1; |
||
214 | if(p2==NULL) continue; |
||
215 | *p++=0; fprintf(outf,"%s",ps); |
||
216 | *p2=0; if(*(p2-1)=='\\') *(p2-1)=0; |
||
217 | process_formula(p+1); |
||
218 | formulaend: p=p2; ps=p+1; |
||
219 | continue; |
||
220 | } |
||
221 | if(c=='{') { |
||
222 | p2=find_matching(p+2,'}'); p3=strstr(p,"\\}"); |
||
223 | if((p2==NULL && p3!=NULL) || |
||
224 | (p2!=NULL && p3!=NULL && p3<p2)) p2=p3+1; |
||
225 | if(p2==NULL) continue; |
||
226 | *p++=0; fprintf(outf,"%s",ps); |
||
227 | *p2=0; process_formula(p+1); |
||
228 | goto formulaend; |
||
229 | } |
||
230 | } |
||
231 | fprintf(outf,"%s\n$()",ps); |
||
10 | reyssat | 232 | } |