Subversion Repositories wimsdev

Rev

Rev 7674 | Rev 8120 | 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 octave to wims */
  19.  
  20. /* 'Permission denied' error generated by Octave: it is trying to
  21.  * write to .octave.history even with the -H switch. */
  22.  
  23. /*************** Customization: change values hereafter ****************/
  24.  
  25. /* limit of input/output file sizes */
  26. #define fsizelim 131072
  27. /* This string tells octave to exit. */
  28. #define quitstring "\nquit\n"
  29. /* The way to print a string in the program. */
  30. #define stringprinter "\"%s\"\n"
  31. /* This is octave home page. To be kept up to date. */
  32. #define homepage "http://www.gnu.org/software/octave/"
  33. /* String to search for answers */
  34. char ans_str[]="ans =";
  35.  
  36. char *nameofcmd="octave -Hf --no-line-editing";
  37. int precision=9;
  38. char header[]="split_long_rows(0)\n\
  39. page_screen_output(0)\n\
  40. function y=sh(x) y=sinh(x); endfunction\n\
  41. function y=ch(x) y=cosh(x); endfunction\n\
  42. function y=th(x) y=tanh(x); endfunction\n\
  43. function y=ln(x) y=log(x); endfunction\n\
  44. function y=lg(x) y=log10(x); endfunction\n\
  45. function y=sgn(x) y=sign(x); endfunction\n\
  46. function y=tg(x) y=tan(x); endfunction\n\
  47. function y=cotan(x) y=cot(x); endfunction\n\
  48. function y=ctg(x) y=cot(x); endfunction\n\
  49. function y=arcsin(x) y=asin(x); endfunction\n\
  50. function y=arccos(x) y=acos(x); endfunction\n\
  51. function y=arctan(x) y=atan(x); endfunction\n\
  52. function y=arctg(x) y=atan(x); endfunction\n\
  53. function y=argsh(x) y=asinh(x); endfunction\n\
  54. function y=argch(x) y=acosh(x); endfunction\n\
  55. function y=argth(x) y=atanh(x); endfunction\n\
  56. function y=Argsh(x) y=asinh(x); endfunction\n\
  57. function y=Argch(x) y=acosh(x); endfunction\n\
  58. function y=Argth(x) y=atanh(x); endfunction\n\
  59. function y=rint(x) y=round(x); endfunction\n\
  60. PI=pi\n\
  61. Pi=pi\n\
  62. ";
  63.  
  64. struct {
  65.     char *wname; char *defaultval; char *setname;
  66. } setups[]={
  67.       {"w_octave_precision", "9", "output_precision"}
  68. };
  69.  
  70. /* names which are not allowed */
  71. char *illegal[]={
  72.       "system","fopen","fclose","readdir","popen","mkdir","rmdir",
  73.       "dir","ls","cd","chdir","more","save","load","diary",
  74.       "fork","putenv","graw","eval",
  75.       "scanf","exec","unlink","umask","lstat","stat","rename",
  76.       "glob","tilde_expand","pclose","popen2","waitpid",
  77. };
  78.  
  79. /* name parts which are not allowed */
  80. char *illpart[]={
  81.     "file", "debug", "plot"
  82. };
  83.  
  84. /***************** Nothing should need change hereafter *****************/
  85.  
  86. #define progname "octave"
  87. #include "common.h"
  88. #include "common.c"
  89.  
  90. /* check for security violations in command string */
  91. void check_parm(char *p)
  92. {
  93.     char *pp, *s;
  94.  
  95.  /* Underscore replacement */
  96.     for(pp=strchr(p,'_'); pp!=NULL; pp=strchr(pp+1,'_')) {
  97.       if(pp==p || !isalnum(*(pp-1))) *pp='K';
  98.     }
  99.     for(s=p;*s;s++) *s=tolower(*s);
  100.     find_illegal(p);
  101. }
  102.  
  103. /* process and print octave output */
  104. void output(char *p)
  105. {
  106.     int i,n;
  107.     char *pp, *pe, *pt;
  108.  
  109.     pp=strchr(p,'\n');
  110.     for(pp++; *pp; pp=pe) {
  111.       pe=strchr(pp,'\n'); if(pe) *pe++=0; else pe=pp+strlen(pp);
  112.       if(memcmp(pp,ans_str,strlen(ans_str))==0) pp+=strlen(ans_str);
  113.       n=strlen(pp); if(n==0) {
  114.           puts(""); continue;
  115.       }
  116. /* make every output one-line */
  117.       for(i=0;i<n;i++) {
  118.           if(*(pp+i)=='\n' || *(pp+i)=='\%') *(pp+i)=' ';
  119.       }
  120. /* strip leading and trailing spaces */
  121.       while(isspace(*pp) && pp<pe) pp++;
  122.       pt=pp+strlen(pp)-1;
  123.       while(isspace(*pt) && pt>pp) *pt--=0;
  124.       strip_zeros(pp);
  125.       puts(pp);
  126.     }
  127. }
  128.  
  129. void about(void)
  130. {
  131.     char *p;
  132.  
  133.     prepabout(quitstring,outputfname,NULL);
  134.     if(readabout()>0) {
  135.       p=strchr(aboutbuf,'\n'); if(p!=NULL) *p=0;
  136.       p=strchr(aboutbuf,'('); if(p!=NULL) *p=0;
  137.       strip_trailing_spaces2(aboutbuf);
  138.       printf("<a href=\"%s\">%s</a>",homepage,aboutbuf);
  139.     }
  140. }
  141.  
  142. char *dynsetup(char *ptr, char *end)
  143. {
  144.     int i;
  145.     char *p, *pp;
  146.     for(i=0;i<SETUP_NO;i++) {
  147.       p=getenv(setups[i].wname);
  148.       if(p!=NULL) for(pp=p;*pp;pp++) if(!isspace(*pp) && !isalnum(*pp)) p="";
  149.       if(p==NULL || *p==0) p=setups[i].defaultval;
  150.       snprintf(ptr,end-ptr,"%s(%s)\n",setups[i].setname,p);
  151.       ptr+=strlen(ptr);
  152.       if(strstr(setups[i].wname,"octave_precision")!=NULL)
  153.         precision=atoi(p);
  154.       if(precision<0) precision=-precision;
  155.     }
  156.     return ptr;
  157. }
  158.  
  159. int main(int argc,char *argv[])
  160. {
  161.     prepare1();
  162.     run();
  163.     return 0;
  164. }
  165.  
  166.