Subversion Repositories wimsdev

Rev

Rev 3608 | Go to most recent revision | 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.         /* Interface maxima to wims */
  19.  
  20. /*************** Customization: change values hereafter ****************/
  21.  
  22.         /* limit of input/output file sizes */
  23. #define fsizelim 131072
  24.         /* This string tells maxima to exit. */
  25. #define quitstring "\nquit();\n"
  26.         /* The way to print a string in the program. */
  27. #define stringprinter "\"%s\";\n"
  28.         /* This is maxima home page. To be kept up to date. */
  29. #define homepage "http://maxima.sourceforge.net/"
  30.  
  31. char *nameofcmd="maxima";
  32. int precision=20;
  33. char header[]="\n\
  34. display2d:false;\n\
  35. letrat:true;\n\
  36. keepfloat:true;\n\
  37. rombergmin:5;\n\
  38. rombergtol:1.E-6;\n\
  39. rombergit:13;\n\
  40. simpsum:true;\n\
  41. triginverses:true; logabs:true;\n\
  42. e:%e;pi:%PI;Pi:%PI;PI:%PI;I:%I;i:%I;\n\
  43. ln:log;sh:sinh;ch:cosh;th:tanh;\n\
  44. arctan:atan;arcsin:asin;arccos:acos;\n\
  45. tg:tan;arctg:atan;\n\
  46. argsh:asinh;argch:acosh;argth:atanh;\n\
  47. Argsh:asinh;Argch:acosh;Argth:atanh;\n\
  48. cotan:cot;ctg:cot;\n\
  49. log10(x):=block([],return(log(x)/log(10.0)));\n\
  50. log2(x):=block([],return(log(x)/log(2.0)));\n\
  51. lg(x):=log10(x);\n\
  52. sgn:sign;\n\
  53. nolabels:true; kill(labels);\n\
  54. ";
  55.  
  56. struct {
  57.     char *wname;    char *defaultval;   char *setname;
  58. } setups[]={
  59.         {"w_maxima_precision",  "20",   "fpprec"}
  60. };
  61.  
  62.         /* names which are not allowed */
  63. char *illegal[]={
  64.       "system","describe","example",
  65.       "save","fassave","stringout","batcon",
  66.       "batcount","cursordisp",
  67.       "direc","readonly","with_stdout","pscom",
  68.       "demo","ttyintfun","bug"
  69.      
  70. };
  71.  
  72.         /* name parts which are not allowed */
  73. char *illpart[]={
  74.     "file", "debug", "plot", "load", "store", "batch"
  75. };
  76.  
  77. /***************** Nothing should need change hereafter *****************/
  78.  
  79. #define linebyline "\n(%i"
  80. #define progname "maxima"
  81. #include "common.h"
  82. #include "common.c"
  83.  
  84.         /* check for security violations in command string */
  85. void check_parm(char *pm)
  86. {
  87.     char *s, *pp;
  88.     int l;
  89.           /* Underscore replacement */
  90.     for(pp=strchr(pm,'_'); pp!=NULL; pp=strchr(pp+1,'_')) *pp='K';
  91.         /* '?' escapes to Lisp commands. */
  92.     if(strchr(pm,'?')!=NULL) {
  93.           fprintf(stderr,"Illegal under WIMS.\n"); exit(1);
  94.     }
  95.     for(s=pm;*s;s++) *s=tolower(*s);
  96.     strip_trailing_spaces(pm); l=strlen(pm);
  97.     if(l>0 && pm[l-1]!=';') strcat(pm,";");
  98.     find_illegal(pm);
  99. }
  100.  
  101. char *find_prompt(char *p, char t)
  102. {
  103.     char *pp=p-1, *pt;
  104.     char c;
  105.     int add;
  106.     redo:
  107.     if(*p==0 || (pp>=p && *pp==0)) return NULL;
  108.     add=3;
  109.     do {
  110.         pp=strstr(pp+1,"\n(");
  111.         if(!pp) break;
  112.         c=pp[2]; add=3;
  113.         if(c=='\%') {   /* backward compatibility */
  114.             add++; c=pp[3];
  115.             if(c=='i') c='C';
  116.             if(c=='o') c='D';
  117.         }
  118.     }
  119.     while(c!=t);
  120.     pt=pp;
  121.     if(pp!=NULL) {
  122.         pp+=add; while(isdigit(*pp)) pp++;
  123.         if(*pp!=')') goto redo;
  124.         pp++;
  125.     }
  126.     if(pt!=NULL && t=='D') pt=pp;
  127.     return pt;
  128. }
  129.  
  130.         /* process and print maxima output */
  131. void output(char *p)
  132. {
  133.     int i,n;
  134.     char *pp, *pe, *pt;
  135.  
  136.     pp=find_prompt(p,'C');
  137.     while(pp!=NULL) {
  138.         pe=find_prompt(pp+1,'C'); pp=find_prompt(pp,'D');
  139.         if(pp==NULL) return;
  140.         if(pe!=NULL && pp>=pe) goto emptyline;
  141.         if(pe==NULL) pe=pp+strlen(pp); else *pe++=0;
  142.         if(pp>=pe) {
  143.             emptyline:
  144.             puts(""); pp=pe; continue;
  145.         }
  146.         n=strlen(pp); if(n==0) goto emptyline;
  147.                 /* make every output one-line */
  148.         for(i=0;i<n;i++) {
  149.             if(*(pp+i)=='\n' || *(pp+i)=='\%') *(pp+i)=' ';
  150.             else *(pp+i)=tolower(*(pp+i));
  151.         }
  152.           /* strip leading and trailing spaces */
  153.         while(isspace(*pp) && pp<pe) pp++;
  154.         pt=pp+strlen(pp)-1;
  155.         while(isspace(*pt) && pt>pp) *pt--=0;
  156.         if(*pp=='[' && *pt==']' && find_matching(pp+1,']')==pt) {
  157.             *(pt--)=0; pp++;
  158.         }
  159.         for(pt=strchr(pp,'b');pt!=NULL; pt=strchr(pt+1,'b')) {
  160.             if(pt>pp && isdigit(*(pt-1)) &&
  161.                (*(pt+1)=='-' || isdigit(*(pt+1)))) {
  162.                 if(*(pt+1)=='0' && !isdigit(*(pt+2))) strcpy(pt,pt+2);
  163.                 else *pt='E';
  164.             }
  165.         }
  166.         puts(pp); pp=pe;
  167.     }
  168. }
  169.  
  170. void about(void)
  171. {
  172.     char *p, *p2, *pp;
  173.     int i;
  174.  
  175. /*    printf("<A HREF=\"%s\">Maxima</A>",homepage); return; */
  176.     prepabout("build_info();\n" quitstring,outputfname,NULL);
  177.     if(readabout()>0) {
  178.         for(p=aboutbuf; *p; p=find_word_start(find_word_end(p))) {
  179.             if(strncasecmp(p,"Maxima",strlen("Maxima"))==0) {
  180.                 p2=find_word_start(find_word_end(p));
  181.                 if(strncmp(p2,"restarted",9)!=0) break;
  182.             }
  183.         }
  184.         for(p2=p;*p2 && *p2!='\n' && !isdigit(*p2);p2++);
  185.         if(isdigit(*p2)) pp=find_word_end(p2);
  186.         else for(i=0, pp=p;i<2;i++) pp=find_word_end(find_word_start(pp));
  187.         *pp=0;
  188.         if(*p!=0) printf("<A HREF=\"%s\">%s</A>",homepage,p);
  189.     }
  190. }
  191.  
  192. char *dynsetup(char *ptr, char *end)
  193. {
  194.     int i;
  195.     char *p, *pp;
  196.     for(i=0;i<SETUP_NO;i++) {
  197.         p=getenv(setups[i].wname);
  198.         if(p!=NULL) for(pp=p;*pp;pp++) if(!isspace(*pp) && !isalnum(*pp)) p="";
  199.         if(p==NULL || *p==0) p=setups[i].defaultval;
  200.         snprintf(ptr,end-ptr,"%s:%s;\n",setups[i].setname,p);
  201.         ptr+=strlen(ptr);
  202.         if(strstr(setups[i].wname,"maxima_precision")!=NULL)
  203.           precision=atoi(p);
  204.         if(precision<0) precision=-precision;
  205.     }
  206.     return ptr;
  207. }
  208.  
  209. int main(int argc,char *argv[])
  210. {
  211.     prepare1();
  212.     run();
  213.     return 0;    
  214. }
  215.  
  216.