Subversion Repositories wimsdev

Rev

Rev 16838 | Blame | Compare with Previous | Last modification | View Log | RSS feed

  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. #include "../Lib/libwims.h"
  19. #include "oef2wims.h"
  20. /* these are patches for rawmath.c */
  21. /*
  22. char *getvar(char *p) {return NULL;}
  23. void setvar(char *p, char *v) {return;}
  24. */
  25. char *_exec_if(char *p, int type)
  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,'\\')) {
  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;
  47. }
  48. char *exec_if(char *p) {return _exec_if(p,0);}
  49. char *exec_ifval(char *p) {return _exec_if(p,1);}
  50.  
  51. char *exec_for(char *p)
  52. {
  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;
  66. }
  67. /* process math formula inside \( ) or \( \) */
  68. void process_formula(char *p)
  69. {
  70.   char *p3, bf[MAX_LINELEN+1];
  71.  
  72.   if(strlen(p)>=MAX_LINELEN) oef_error("formula too long");
  73.   while((p3=strstr(p,"&lt;"))!=NULL) memmove(p3," <  ",4);
  74.   while((p3=strstr(p,"&gt;"))!=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)=' ';
  83.     }
  84.   }
  85.   fprintf(outf,"\n!insmath %s\n$()",bf);
  86. }
  87.  
  88. /* deux accolades obligatoires */
  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;
  96.     if(pp2 && *pp2=='{') pe2=find_matching(pp2+1,'}'); else return 1;
  97.     if(pe2) {
  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.       }
  103.     fprintf(outf,"%s \n\
  104. !read oef/%s.phtml %s \\\n%s \n$()", *ps,name,pp,pp2);
  105.     *ps=*p=pe2; (*ps)++; return 1;
  106.     }
  107.   }
  108.   return 0;
  109. }
  110.  
  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="";
  125.     pp++; **p=*pe=0;
  126.     fprintf(outf,"%s \n\
  127. !read oef/%s.phtml %s %s \n$()", *ps,name,pp,pp2);
  128.     *ps=*p=pe2; (*ps)++; return 1;
  129.   }
  130.   return 0;
  131. }
  132.  
  133. /* une seule accolade */
  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,'}');
  139.     if(pe) {
  140.       pp++; **p=*pe=0;
  141.       fprintf(outf,"%s \n\
  142. !read oef/%s.phtml %s \n$()", *ps,name,pp);
  143.       *ps=*p=pe; (*ps)++; embedcnt++; return 1;
  144.     }
  145.   }
  146.   return 0;
  147. }
  148.  
  149. void out_exec(char *s1, char *s2)
  150. {
  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;
  174.       }
  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;
  181.       }
  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;
  188.       }
  189. /* ifval */
  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;
  195.       }
  196. /* not seen as a variable */
  197.       if (_matchit2(&p, &ps, "img")) continue;
  198.       if (_matchit2(&p, &ps, "audio")) continue;
  199.       if (_matchit2(&p, &ps, "slib")) continue;
  200.       if (_matchit1(&p, &ps, "embed")) continue;
  201.       if (_matchit1(&p, &ps, "special")) continue;
  202.       if (_matchit3(&p, &ps, "draw",1)) continue;
  203.       if (_matchit3(&p, &ps, "drawtikz",1)) continue;
  204.       if (_matchit3(&p, &ps, "canvasdraw",0)) continue;
  205.       *p++=0; fprintf(outf,"%s$m_",ps); ps=p; continue;
  206.     }
  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);
  232. }
  233.