Subversion Repositories wimsdev

Rev

Rev 3902 | Rev 7674 | 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
        }
4716 bpr 155
        if(memcmp(pp,"Vecsmall(",9)==0 && *pt==')' && find_matching(pp+9,')')==pt) {
156
            *(pt--)=0; pp+=9;
157
        }
10 reyssat 158
        if(*pp=='[' && *pt==']' && find_matching(pp+1,']')==pt) {
159
            *(pt--)=0; pp++;
160
        }
161
        strip_zeros(pp);
162
        puts(pp); pp=pe;
163
    }
164
}
165
 
166
void about(void)
167
{
168
    char *p;
169
 
170
    prepabout("\\v\nquit\n",outputfname,NULL);
171
    if(readabout()>0) {
172
        p=strchr(aboutbuf,'\n'); if(p!=NULL) *p=0;
173
        strip_trailing_spaces(aboutbuf);
3902 bpr 174
        printf("<a href=\"%s\">%s</a>",homepage,aboutbuf);
10 reyssat 175
    }
176
}
177
 
178
char *dynsetup(char *ptr, char *end)
179
{
180
    int i;
181
    char *p, *pp;
182
 
3879 bpr 183
    snprintf(ptr,end-ptr,"\nsetrand(%u);\n",seed&(0x7FFFFFFF));
10 reyssat 184
    ptr+=strlen(ptr);
185
    for(i=0;i<SETUP_NO;i++) {
186
        p=getenv(setups[i].wname);
187
        if(p!=NULL) for(pp=p;*pp;pp++) if(!isspace(*pp) && !isalnum(*pp)) p="";
188
        if(p==NULL || *p==0) p=setups[i].defaultval;
189
        snprintf(ptr,end-ptr,"%s%s\n",setups[i].gpset,p);
190
        ptr+=strlen(ptr);
191
        if(strstr(setups[i].wname,"pari_precision")!=NULL)
192
          precision=atoi(p);
193
        if(precision<0) precision=-precision;
194
    }
195
    if(pariray) snprintf(ptr,end-ptr,"\\e0\n");
196
    else snprintf(ptr,end-ptr,"\\e1\n");
197
    ptr+=strlen(ptr);
198
    return ptr;
199
}
200
 
201
int main(int argc,char *argv[])
202
{
203
    char *p;
204
 
205
    p=getenv("pari_ray");
206
    if(p!=NULL && *p!=0) {pariray=1; fsizelim=4*1024*1024;}
207
    setenv(gprcenv,gprc,1);
208
    prepare1();
209
    setenv("GPTMPDIR",tmp_dir,1);
210
    run();
211
    return 0;    
212
}
213