Subversion Repositories wimsdev

Rev

Rev 3879 | Rev 4716 | 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
 
18
        /* Interface gp to wims */
19
 
20
/* This program is now limited to pari version 2.??. */
21
 
22
/*************** Customization: change values hereafter ****************/
23
 
24
        /* gp prompt string */
25
#define gpprompt "\n? "
26
        /* This is the good bye string of gp, signaling end of output. */
27
#define goodbyestring "Good bye!"
28
        /* This is PARI home page. To be kept up to date. */
29
#define homepage "http://pari.math.u-bordeaux.fr/"
30
        /* String to tell the program to quit. */
31
#define quitstring "\nquit\n"
32
        /* The way to print a string in the program. */
33
#define stringprinter "print(\"%s\")\n"
34
        /* limit of input/output file sizes */
35
int fsizelim=131072;
36
int precision=28;       /* default */
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[]={
82
      {"w_pari_precision",      "20",   "\\p "},
83
      {"w_pari_serieslength",   "8",    "\\ps "}
84
};
85
 
86
        /* names which are not allowed */
87
char *illegal[]={
88
};
89
 
90
        /* name parts which are not allowed */
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
 
103
        /* check for security violations in command string */
104
void check_parm(char *pm)
105
{
106
    char *p;
107
    for(p=pm;*p!=0;p++) {
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++;
115
    }
116
    find_illegal(pm);
117
}
118
 
119
        /* process and print gp output */
120
void output(char *p)
121
{
122
    int i,n;
123
    char *pp, *pe, *pt;
124
 
125
    if(pariray) {puts(p); return;}
126
    pp=strstr(p,gpprompt); if(pp==NULL) return;
127
    pe=strstr(pp,goodbyestring);
128
    if(pe>=pp) *pe=0;
129
    while(pp!=NULL) {
130
        pp++;
131
        pe=strstr(pp,gpprompt);
132
        if(pe>=pp) *pe=0;
133
        pp=strchr(pp,'\n');
134
        if(pp==NULL) {
135
            emptyline:
136
            puts(""); pp=pe; continue;
137
        }
138
        pp++; n=strlen(pp);
139
        if(n==0) goto emptyline;
140
                /* make every output one-line */
141
        for(i=0;i<n;i++) {
142
            if(*(pp+i)=='\n') {
143
                if(*(pp+i+1)!='%') *(pp+i)=' ';
144
                else {*(pp+i)=0; break;}
145
            }
146
        }
147
          /* strip leading and trailing spaces */
148
        while(isspace(*pp) && pp<pe) pp++;
149
        pt=pp+strlen(pp)-1;
150
        while(isspace(*pt) && pt>pp) *pt--=0;
151
          /* remove parentheses of matrix output */
152
        if(memcmp(pp,"Mat(",4)==0 && *pt==')' && find_matching(pp+4,')')==pt) {
153
            *(pt--)=0; pp+=4;
154
        }
155
        if(*pp=='[' && *pt==']' && find_matching(pp+1,']')==pt) {
156
            *(pt--)=0; pp++;
157
        }
158
        strip_zeros(pp);
159
        puts(pp); pp=pe;
160
    }
161
}
162
 
163
void about(void)
164
{
165
    char *p;
166
 
167
    prepabout("\\v\nquit\n",outputfname,NULL);
168
    if(readabout()>0) {
169
        p=strchr(aboutbuf,'\n'); if(p!=NULL) *p=0;
170
        strip_trailing_spaces(aboutbuf);
3902 bpr 171
        printf("<a href=\"%s\">%s</a>",homepage,aboutbuf);
10 reyssat 172
    }
173
}
174
 
175
char *dynsetup(char *ptr, char *end)
176
{
177
    int i;
178
    char *p, *pp;
179
 
3879 bpr 180
    snprintf(ptr,end-ptr,"\nsetrand(%u);\n",seed&(0x7FFFFFFF));
10 reyssat 181
    ptr+=strlen(ptr);
182
    for(i=0;i<SETUP_NO;i++) {
183
        p=getenv(setups[i].wname);
184
        if(p!=NULL) for(pp=p;*pp;pp++) if(!isspace(*pp) && !isalnum(*pp)) p="";
185
        if(p==NULL || *p==0) p=setups[i].defaultval;
186
        snprintf(ptr,end-ptr,"%s%s\n",setups[i].gpset,p);
187
        ptr+=strlen(ptr);
188
        if(strstr(setups[i].wname,"pari_precision")!=NULL)
189
          precision=atoi(p);
190
        if(precision<0) precision=-precision;
191
    }
192
    if(pariray) snprintf(ptr,end-ptr,"\\e0\n");
193
    else snprintf(ptr,end-ptr,"\\e1\n");
194
    ptr+=strlen(ptr);
195
    return ptr;
196
}
197
 
198
int main(int argc,char *argv[])
199
{
200
    char *p;
201
 
202
    p=getenv("pari_ray");
203
    if(p!=NULL && *p!=0) {pariray=1; fsizelim=4*1024*1024;}
204
    setenv(gprcenv,gprc,1);
205
    prepare1();
206
    setenv("GPTMPDIR",tmp_dir,1);
207
    run();
208
    return 0;    
209
}
210