Rev 8871 | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 8871 | Rev 12247 | ||
---|---|---|---|
Line 21... | Line 21... | ||
21 | int dollar_subst=1; |
21 | int dollar_subst=1; |
22 | 22 | ||
23 | /* variable substitution. buffer p must have MAX_LINELEN */ |
23 | /* variable substitution. buffer p must have MAX_LINELEN */ |
24 | void substdoc(char *p) |
24 | void substdoc(char *p) |
25 | { |
25 | { |
26 |
|
26 | char *pp, *pe; |
27 | 27 | ||
28 |
|
28 | for(pp=p;pp-p<MAX_LINELEN && *pp; pp++) { |
29 |
|
29 | if(*pp==' ') *pp=' '; |
30 |
|
30 | if(*pp=='\n') *pp=' '; |
31 |
|
31 | if(*pp=='$' && dollar_subst) { |
32 |
|
32 | string_modify(p,pp,pp+1,"$"); |
33 |
|
33 | pp++; continue; |
34 |
|
34 | } |
35 |
|
35 | if(*pp=='!' && isalnum(*(pp+1)) && dollar_subst) { |
36 |
|
36 | string_modify(p,pp,pp+1,"!"); |
37 |
|
37 | pp++; continue; |
38 |
|
38 | } |
39 |
|
39 | if(*pp!='\\') continue; |
40 |
|
40 | if(*(pp+1)=='\\') { |
41 |
|
41 | pp++; continue; |
42 |
|
42 | } |
43 |
|
43 | if(!isalpha(*(pp+1))) continue; |
44 |
|
44 | for(pe=pp+1;isalnum(*pe) || *pe=='_'; pe++); |
45 |
|
45 | if(pe-pp<MAX_NAMELEN && *pe=='[') { |
46 |
|
46 | char *pt; |
47 |
|
47 | pt=find_matching(pe+1,']'); if(pt!=NULL && pt-pe<MAX_LINELEN) { |
48 |
|
48 | string_modify(p,pt+1,pt+1,")"); |
49 |
|
49 | string_modify(p,pp,pp+1,"$(m_"); |
50 |
|
50 | } |
51 |
|
51 | else goto nobrack; |
52 |
|
52 | } |
53 |
|
53 | else { |
54 |
|
54 | nobrack: string_modify(p,pp,pp+1,"$m_"); |
55 |
|
55 | } |
- | 56 | } |
|
- | 57 | } |
|
- | 58 | ||
- | 59 | void putval(char *p, char *name, int ptype) |
|
- | 60 | { |
|
- | 61 | switch(ptype) { |
|
- | 62 | case pt_int: { |
|
- | 63 | fprintf(outf,"%sm_%s=$[rint(%s)]\n",setpre,name,p); |
|
- | 64 | break; |
|
56 | } |
65 | } |
57 | } |
- | |
58 | - | ||
59 | void putval(char *p, char *name, int ptype) |
- | |
60 | { |
- | |
61 | switch(ptype) { |
- | |
62 | case pt_int: { |
- | |
63 | fprintf(outf,"%sm_%s=$[rint(%s)]\n",setpre,name,p); |
- | |
64 | break; |
- | |
65 | } |
- | |
66 |
|
66 | case pt_real: { |
67 |
|
67 | fprintf(outf,"%sm_%s=$[%s]\n",setpre,name,p); |
68 |
|
68 | break; |
69 |
|
69 | } |
70 |
|
70 | case pt_func: { |
71 |
|
71 | fprintf(outf,"%sm_%s=!rawmath %s \n",setpre,name,p); |
72 |
|
72 | break; |
73 |
|
73 | } |
74 |
|
74 | case pt_complex: { |
75 |
|
75 | fprintf(outf,"%st_=!rawmath %s \n%st_=!exec pari print($t_)\n\ |
76 | %sm_%s=!mathsubst I=i in $t_\n", |
76 | %sm_%s=!mathsubst I=i in $t_\n", |
77 | setpre,p,setpre,setpre,name); |
77 | setpre,p,setpre,setpre,name); |
78 |
|
78 | break; |
79 |
|
79 | } |
80 |
|
80 | case pt_matrix: { |
81 |
|
81 | fprintf(outf,"%stmp=!trim %s \n\ |
82 | %sm_%s=!translate internal $ $ to ; in $tmp\n",setpre,p,setpre,name); |
82 | %sm_%s=!translate internal $ $ to ; in $tmp\n",setpre,p,setpre,name); |
83 |
|
83 | break; |
84 |
|
84 | } |
85 |
|
85 | case pt_rat: { |
86 |
|
86 | fprintf(outf,"%st_=!rawmath %s \n%sm_%s=!exec pari print($t_)\n", |
87 | setpre,p,setpre,name); |
87 | setpre,p,setpre,name); |
88 |
|
88 | break; |
89 |
|
89 | } |
90 |
|
90 | default: { |
91 |
|
91 | fprintf(outf,"%sm_%s=%s\n\n",setpre,name,p); |
92 |
|
92 | break; |
93 | } |
- | |
94 | } |
93 | } |
- | 94 | } |
|
95 | } |
95 | } |
96 | 96 | ||
97 | void parm(char *p[MAX_PARM], int ptype) |
97 | void parm(char *p[MAX_PARM], int ptype) |
98 | { |
98 | { |
99 |
|
99 | char *pp, *p2; |
100 |
|
100 | char vbuf[MAX_LINELEN+1]; |
101 | 101 | ||
102 |
|
102 | setpre="!set "; |
103 |
|
103 | p[0]=find_word_start(p[0]); |
104 |
|
104 | if(*p[0]=='\\') p[0]++; |
105 | /* bad name */ |
105 | /* bad name */ |
106 |
|
106 | if(!isalpha(*p[0])) return; |
107 |
|
107 | strip_trailing_spaces(p[0]); |
108 |
|
108 | for(pp=p[0];*pp;pp++) if(!isalnum(*pp) && *pp!='_') { |
109 | /* bad name and security risk */ |
109 | /* bad name and security risk */ |
110 |
|
110 | if(!isspace(*pp)) return; |
111 |
|
111 | ovlstrcpy(pp,pp+1); pp--; |
112 |
|
112 | } |
113 |
|
113 | p[1]=find_word_start(p[1]); |
114 |
|
114 | snprintf(vbuf,sizeof(vbuf),"%s",p[1]); substdoc(vbuf); |
115 |
|
115 | fprintf(outf,"\n"); |
116 |
|
116 | if((pp=strparchr(vbuf,'?'))!=NULL && pp[1]!='?' && check_compare(vbuf)) { |
117 |
|
117 | char buf[MAX_LINELEN+1]; |
118 |
|
118 | p2=strparchr(pp,':'); *pp++=0; if(p2!=NULL) *p2++=0; |
119 |
|
119 | snprintf(buf,sizeof(buf),"%s",vbuf); |
120 |
|
120 | prepcnt=0; fprintf(outf,"!ifval %s \n",vbuf); |
- | 121 | snprintf(buf,sizeof(buf),"%s",pp); |
|
- | 122 | parmprep(buf, ptype); putval(buf,p[0],ptype); |
|
- | 123 | if(p2!=NULL) { |
|
121 | snprintf(buf,sizeof(buf),"%s", |
124 | snprintf(buf,sizeof(buf),"%s",p2); |
- | 125 | fprintf(outf,"!else\n"); |
|
122 | parmprep(buf, ptype); putval(buf,p[0],ptype); |
126 | parmprep(buf, ptype); putval(buf,p[0],ptype); |
123 | if(p2!=NULL) { |
- | |
124 | snprintf(buf,sizeof(buf),"%s",p2); |
- | |
125 | fprintf(outf,"!else\n"); |
- | |
126 | parmprep(buf, ptype); putval(buf,p[0],ptype); |
- | |
127 | } |
- | |
128 | fprintf(outf,"!endif\n");return; |
- | |
129 | } |
127 | } |
- | 128 | fprintf(outf,"!endif\n");return; |
|
- | 129 | } |
|
130 |
|
130 | prepcnt=0; parmprep(vbuf, ptype); |
131 |
|
131 | putval(vbuf,p[0],ptype); |
132 | } |
132 | } |
133 | 133 | ||
134 | void p_int(char *p[MAX_PARM]) {parm(p,pt_int);} |
134 | void p_int(char *p[MAX_PARM]) {parm(p,pt_int);} |
135 | void p_rational(char *p[MAX_PARM]) {parm(p,pt_rat);} |
135 | void p_rational(char *p[MAX_PARM]) {parm(p,pt_rat);} |
136 | void p_real(char *p[MAX_PARM]) {parm(p,pt_real);} |
136 | void p_real(char *p[MAX_PARM]) {parm(p,pt_real);} |
Line 139... | Line 139... | ||
139 | void p_text(char *p[MAX_PARM]) {parm(p,pt_text);} |
139 | void p_text(char *p[MAX_PARM]) {parm(p,pt_text);} |
140 | void p_matrix(char *p[MAX_PARM]) {parm(p,pt_matrix);} |
140 | void p_matrix(char *p[MAX_PARM]) {parm(p,pt_matrix);} |
141 | 141 | ||
142 | void p_parm(char *p[MAX_PARM]) |
142 | void p_parm(char *p[MAX_PARM]) |
143 | { |
143 | { |
144 |
|
144 | parm(p,pt_real); |
145 | } |
145 | } |
146 | 146 | ||
147 | struct { |
147 | struct { |
148 | char *name; |
148 | char *name; |
149 | void (*processor) (char *p[MAX_PARM]); |
149 | void (*processor) (char *p[MAX_PARM]); |
150 | } ptype[]={ |
150 | } ptype[]={ |
151 |
|
151 | {"complex", p_complex}, |
152 |
|
152 | {"function", p_func}, |
153 |
|
153 | {"int", p_int}, |
154 |
|
154 | {"integer", p_int}, |
155 |
|
155 | {"matrix", p_matrix}, |
156 |
|
156 | {"parameter", p_parm}, |
157 |
|
157 | {"rational", p_rational}, |
158 |
|
158 | {"real", p_real}, |
159 |
|
159 | {"text", p_text}, |
160 |
|
160 | {"variable", p_parm} |
161 | }; |
161 | }; |
162 | 162 | ||
163 | #define ptypeno (sizeof(ptype)/sizeof(ptype[0])) |
163 | #define ptypeno (sizeof(ptype)/sizeof(ptype[0])) |
164 | 164 | ||
165 | void def(char *p) |
165 | void def(char *p) |
166 | { |
166 | { |
167 |
|
167 | char *p1,*p2,*pp[2]; |
168 |
|
168 | int i; |
169 |
|
169 | p1=find_word_start(p); |
170 |
|
170 | pp[1]=strchr(p1,'='); if(*pp[1]==0) return; |
171 |
|
171 | *pp[1]=0; pp[1]++; |
172 |
|
172 | p2=find_word_start(find_word_end(p1)); |
173 |
|
173 | if(*p2==0) {pp[0]=p1; p_parm(pp); return;} |
174 |
|
174 | pp[0]=p2; *find_word_end(p1)=0; |
175 |
|
175 | for(p2=p1; *p2; p2++) *p2=tolower(*p2); |
176 |
|
176 | for(i=0;i<ptypeno;i++) if(strcmp(p1,ptype[i].name)==0) break; |
177 |
|
177 | if(i<ptypeno) ptype[i].processor(pp); |
178 |
|
178 | else p_parm(pp); |
179 | } |
179 | } |
180 | 180 |