Subversion Repositories wimsdev

Rev

Rev 7674 | Rev 8120 | 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
 
7674 bpr 18
/* Interface gp to wims */
10 reyssat 19
 
20
/* This program is now limited to pari version 2.??. */
21
 
22
/*************** Customization: change values hereafter ****************/
23
 
7674 bpr 24
/* gp prompt string */
10 reyssat 25
#define gpprompt "\n? "
7674 bpr 26
/* This is the good bye string of gp, signaling end of output. */
10 reyssat 27
#define goodbyestring "Good bye!"
7674 bpr 28
/* This is PARI home page. To be kept up to date. */
10 reyssat 29
#define homepage "http://pari.math.u-bordeaux.fr/"
7674 bpr 30
/* String to tell the program to quit. */
10 reyssat 31
#define quitstring "\nquit\n"
7674 bpr 32
/* The way to print a string in the program. */
10 reyssat 33
#define stringprinter "print(\"%s\")\n"
7674 bpr 34
/* limit of input/output file sizes */
10 reyssat 35
int fsizelim=131072;
7674 bpr 36
int precision=28; /* default */
10 reyssat 37
 
38
char *nameofcmd="gp";
39
char *gprcenv="GPRC";
40
char *gprc="../.gprc";
41
char header[]="default(output,0)\n\
3902 bpr 42
default(secure,1)\n\
10 reyssat 43
alias(ln,log)\n\
44
alias(pi,Pi)\n\
45
alias(euler,Euler)\n\
46
alias(PI,Pi)\n\
47
i=I\n\
48
e=exp(1)\n\
49
E=exp(1)\n\
3879 bpr 50
sec(x)=1/cos(x);\n\
51
csc(x)=1/sin(x);\n\
52
lg(x)=log(x)/log(10);\n\
53
log2(x)=log(x)/log(10);\n\
10 reyssat 54
alias(log10,lg)\n\
55
alias(sgn,sign)\n\
56
alias(ch,cosh)\n\
57
alias(sh,sinh)\n\
58
alias(th,tanh)\n\
59
alias(arccos,acos)\n\
60
alias(arcsin,asin)\n\
61
alias(tg,tan)\n\
62
alias(arctan,atan)\n\
63
alias(arctg,atan)\n\
64
alias(Argch,acosh)\n\
65
alias(Argsh,asinh)\n\
66
alias(Argth,atanh)\n\
67
alias(argch,acosh)\n\
68
alias(argsh,asinh)\n\
69
alias(argth,atanh)\n\
70
alias(cot,cotan)\n\
71
alias(ctg,cotan)\n\
72
alias(rint,round)\n\
73
alias(RANDOM,random)\n\
74
alias(SOLVE,solve)\n\
75
alias(parirandom,random)\n\
76
alias(parisolve,solve)\n\
77
";
78
 
79
struct {
80
    char *wname;    char *defaultval;    char *gpset;
81
} setups[]={
7674 bpr 82
      {"w_pari_precision", "20", "\\p "},
83
      {"w_pari_serieslength", "8", "\\ps "}
10 reyssat 84
};
85
 
7674 bpr 86
/* names which are not allowed */
10 reyssat 87
char *illegal[]={
88
};
89
 
7674 bpr 90
/* name parts which are not allowed */
10 reyssat 91
char *illpart[]={
92
    "plot", "write", "help"
93
};
94
 
95
/***************** Nothing should need change hereafter *****************/
96
 
97
#define progname "pari"
98
#include "common.h"
99
#include "common.c"
100
 
101
int pariray=0;
102
 
7674 bpr 103
/* check for security violations in command string */
10 reyssat 104
void check_parm(char *pm)
105
{
106
    char *p;
107
    for(p=pm;*p!=0;p++) {
7674 bpr 108
/* Underscore replacement */
109
      if(*p=='_') {*p='K'; continue;}
110
/* no escape commands. */
111
      if(*p!='\n') continue;
112
      while(*p!=0 && isspace(*p)) p++;
113
      if(*p=='\\' && *(p+1)!='\\' && *(p+1)!='v' && *(p+1)!='p') *p='.';
114
      if(*p=='\\') p++;
10 reyssat 115
    }
116
    find_illegal(pm);
117
}
118
 
7674 bpr 119
/* process and print gp output */
10 reyssat 120
void output(char *p)
121
{
122
    int i,n;
123
    char *pp, *pe, *pt;
124
    if(pariray) {puts(p); return;}
125
    pp=strstr(p,gpprompt); if(pp==NULL) return;
126
    pe=strstr(pp,goodbyestring);
127
    if(pe>=pp) *pe=0;
128
    while(pp!=NULL) {
7674 bpr 129
      pp++;
130
      pe=strstr(pp,gpprompt);
131
      if(pe>=pp) *pe=0;
132
      pp=strchr(pp,'\n');
133
      if(pp==NULL) {
134
          emptyline:
135
          puts(""); pp=pe; continue;
136
      }
137
      pp++; n=strlen(pp);
138
      if(n==0) goto emptyline;
139
/* make every output one-line */
140
      for(i=0;i<n;i++) {
141
          if(*(pp+i)=='\n') {
142
            if(*(pp+i+1)!='%') *(pp+i)=' ';
143
            else {*(pp+i)=0; break;}
144
          }
145
      }
146
/* strip leading and trailing spaces */
147
      while(isspace(*pp) && pp<pe) pp++;
148
      pt=pp+strlen(pp)-1;
149
      while(isspace(*pt) && pt>pp) *pt--=0;
150
/* remove parentheses of matrix output */
8100 bpr 151
      if(memcmp(pp,"Mat(",4)==0 && *pt==')' && find_matching2(pp+4,')')==pt) {
7674 bpr 152
          *(pt--)=0; pp+=4;
153
      }
8100 bpr 154
      if(memcmp(pp,"Vecsmall(",9)==0 && *pt==')' && find_matching2(pp+9,')')==pt) {
7674 bpr 155
          *(pt--)=0; pp+=9;
156
      }
8100 bpr 157
      if(*pp=='[' && *pt==']' && find_matching2(pp+1,']')==pt) {
7674 bpr 158
          *(pt--)=0; pp++;
159
      }
160
      strip_zeros(pp);
161
      puts(pp); pp=pe;
10 reyssat 162
    }
163
}
164
 
165
void about(void)
166
{
167
    char *p;
168
 
169
    prepabout("\\v\nquit\n",outputfname,NULL);
170
    if(readabout()>0) {
7674 bpr 171
      p=strchr(aboutbuf,'\n'); if(p!=NULL) *p=0;
8100 bpr 172
      strip_trailing_spaces2(aboutbuf);
7674 bpr 173
      printf("<a href=\"%s\">%s</a>",homepage,aboutbuf);
10 reyssat 174
    }
175
}
176
 
177
char *dynsetup(char *ptr, char *end)
178
{
179
    int i;
180
    char *p, *pp;
181
 
3879 bpr 182
    snprintf(ptr,end-ptr,"\nsetrand(%u);\n",seed&(0x7FFFFFFF));
10 reyssat 183
    ptr+=strlen(ptr);
184
    for(i=0;i<SETUP_NO;i++) {
7674 bpr 185
      p=getenv(setups[i].wname);
186
      if(p!=NULL) for(pp=p;*pp;pp++) if(!isspace(*pp) && !isalnum(*pp)) p="";
187
      if(p==NULL || *p==0) p=setups[i].defaultval;
188
      snprintf(ptr,end-ptr,"%s%s\n",setups[i].gpset,p);
189
      ptr+=strlen(ptr);
190
      if(strstr(setups[i].wname,"pari_precision")!=NULL)
191
        precision=atoi(p);
192
      if(precision<0) precision=-precision;
10 reyssat 193
    }
194
    if(pariray) snprintf(ptr,end-ptr,"\\e0\n");
195
    else snprintf(ptr,end-ptr,"\\e1\n");
196
    ptr+=strlen(ptr);
197
    return ptr;
198
}
199
 
200
int main(int argc,char *argv[])
201
{
202
    char *p;
203
 
204
    p=getenv("pari_ray");
205
    if(p!=NULL && *p!=0) {pariray=1; fsizelim=4*1024*1024;}
206
    setenv(gprcenv,gprc,1);
207
    prepare1();
208
    setenv("GPTMPDIR",tmp_dir,1);
209
    run();
7674 bpr 210
    return 0;
10 reyssat 211
}
212