Subversion Repositories wimsdev

Rev

Rev 10 | Rev 3902 | 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\
42
alias(ln,log)\n\
43
alias(pi,Pi)\n\
44
alias(euler,Euler)\n\
45
alias(PI,Pi)\n\
46
i=I\n\
47
e=exp(1)\n\
48
E=exp(1)\n\
3879 bpr 49
sec(x)=1/cos(x);\n\
50
csc(x)=1/sin(x);\n\
51
lg(x)=log(x)/log(10);\n\
52
log2(x)=log(x)/log(10);\n\
10 reyssat 53
alias(log10,lg)\n\
54
alias(sgn,sign)\n\
55
alias(ch,cosh)\n\
56
alias(sh,sinh)\n\
57
alias(th,tanh)\n\
58
alias(arccos,acos)\n\
59
alias(arcsin,asin)\n\
60
alias(tg,tan)\n\
61
alias(arctan,atan)\n\
62
alias(arctg,atan)\n\
63
alias(Argch,acosh)\n\
64
alias(Argsh,asinh)\n\
65
alias(Argth,atanh)\n\
66
alias(argch,acosh)\n\
67
alias(argsh,asinh)\n\
68
alias(argth,atanh)\n\
69
alias(cot,cotan)\n\
70
alias(ctg,cotan)\n\
71
alias(rint,round)\n\
72
alias(RANDOM,random)\n\
73
alias(SOLVE,solve)\n\
74
alias(parirandom,random)\n\
75
alias(parisolve,solve)\n\
76
";
77
 
78
struct {
79
    char *wname;    char *defaultval;    char *gpset;
80
} setups[]={
81
      {"w_pari_precision",      "20",   "\\p "},
82
      {"w_pari_serieslength",   "8",    "\\ps "}
83
};
84
 
85
        /* names which are not allowed */
86
char *illegal[]={
87
        "alias","allocatemem","default","extern",
3879 bpr 88
      "getrand", "setrand", "getstack","input","psdraw",
89
      "read","readvec","system","install", "externstr",
90
      "Strexpand"
10 reyssat 91
};
92
 
93
        /* name parts which are not allowed */
94
char *illpart[]={
95
    "plot", "write", "help"
96
};
97
 
98
/***************** Nothing should need change hereafter *****************/
99
 
100
#define progname "pari"
101
#include "common.h"
102
#include "common.c"
103
 
104
int pariray=0;
105
 
106
        /* check for security violations in command string */
107
void check_parm(char *pm)
108
{
109
    char *p;
110
    for(p=pm;*p!=0;p++) {
111
          /* Underscore replacement */
112
        if(*p=='_') {*p='K'; continue;}
113
          /* no escape commands. */
114
        if(*p!='\n') continue;
115
        while(*p!=0 && isspace(*p)) p++;
116
        if(*p=='\\' && *(p+1)!='\\' && *(p+1)!='v' && *(p+1)!='p') *p='.';
117
        if(*p=='\\') p++;
118
    }
119
    find_illegal(pm);
120
}
121
 
122
        /* process and print gp output */
123
void output(char *p)
124
{
125
    int i,n;
126
    char *pp, *pe, *pt;
127
 
128
    if(pariray) {puts(p); return;}
129
    pp=strstr(p,gpprompt); if(pp==NULL) return;
130
    pe=strstr(pp,goodbyestring);
131
    if(pe>=pp) *pe=0;
132
    while(pp!=NULL) {
133
        pp++;
134
        pe=strstr(pp,gpprompt);
135
        if(pe>=pp) *pe=0;
136
        pp=strchr(pp,'\n');
137
        if(pp==NULL) {
138
            emptyline:
139
            puts(""); pp=pe; continue;
140
        }
141
        pp++; n=strlen(pp);
142
        if(n==0) goto emptyline;
143
                /* make every output one-line */
144
        for(i=0;i<n;i++) {
145
            if(*(pp+i)=='\n') {
146
                if(*(pp+i+1)!='%') *(pp+i)=' ';
147
                else {*(pp+i)=0; break;}
148
            }
149
        }
150
          /* strip leading and trailing spaces */
151
        while(isspace(*pp) && pp<pe) pp++;
152
        pt=pp+strlen(pp)-1;
153
        while(isspace(*pt) && pt>pp) *pt--=0;
154
          /* remove parentheses of matrix output */
155
        if(memcmp(pp,"Mat(",4)==0 && *pt==')' && find_matching(pp+4,')')==pt) {
156
            *(pt--)=0; pp+=4;
157
        }
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);
174
        printf("<A HREF=\"%s\">%s</A>",homepage,aboutbuf);
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