annotate mc-parse.c @ 91:9b1aeb62e0b9

powerpc continue... (floating point)
author kono
date Fri, 07 Mar 2003 05:22:01 +0900
parents 1738f313f98b
children 1ad7045741a7
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1
0529f5abe9d0 *** empty log message ***
kono
parents: 0
diff changeset
1 /* Micro-C Parser Part */
0529f5abe9d0 *** empty log message ***
kono
parents: 0
diff changeset
2 /* $Id$ */
0529f5abe9d0 *** empty log message ***
kono
parents: 0
diff changeset
3
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
4 #define EXTERN /**/
d35df41eac69 Initial revision
kono
parents:
diff changeset
5 #include "mc.h"
61
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents: 59
diff changeset
6 #include "mc-codegen.h"
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
7
61
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents: 59
diff changeset
8 static NMTBL *decl0(void),*decl1(void),*lsearch(char *name),*gsearch(void);
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents: 59
diff changeset
9 static NMTBL *def(NMTBL *n);
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents: 59
diff changeset
10 static NMTBL *free_nptr();
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents: 59
diff changeset
11 static NMTBL *msearch(char *name);
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents: 59
diff changeset
12 static NMTBL *msearch0(char *name);
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents: 59
diff changeset
13 static char * mappend(int lists);
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
14 static int alpha(char c);
61
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents: 59
diff changeset
15 static int append3(int p,int a1,int a2);
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
16 static int binop(int op, int e1, int e2, int t1, int t2);
61
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents: 59
diff changeset
17 static int cexpr(int e);
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents: 59
diff changeset
18 static int decl_data(int t, NMTBL *n,int offset);
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
19 static int digit(char c);
69
dba8d111b7a0 c output
kono
parents: 68
diff changeset
20 static int expr(int);
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
21 static int expr0(void);
d35df41eac69 Initial revision
kono
parents:
diff changeset
22 static int expr1(void);
61
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents: 59
diff changeset
23 static int expr10(void);
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents: 59
diff changeset
24 static int expr11(void);
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents: 59
diff changeset
25 static int expr12(void);
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents: 59
diff changeset
26 static int expr13(void);
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents: 59
diff changeset
27 static int expr14(void);
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents: 59
diff changeset
28 static int expr15(int e1);
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents: 59
diff changeset
29 static int expr16(int e1);
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
30 static int expr2(void);
d35df41eac69 Initial revision
kono
parents:
diff changeset
31 static int expr3(void);
d35df41eac69 Initial revision
kono
parents:
diff changeset
32 static int expr4(void);
d35df41eac69 Initial revision
kono
parents:
diff changeset
33 static int expr5(void);
d35df41eac69 Initial revision
kono
parents:
diff changeset
34 static int expr6(void);
d35df41eac69 Initial revision
kono
parents:
diff changeset
35 static int expr7(void);
d35df41eac69 Initial revision
kono
parents:
diff changeset
36 static int expr8(void);
d35df41eac69 Initial revision
kono
parents:
diff changeset
37 static int expr9(void);
d35df41eac69 Initial revision
kono
parents:
diff changeset
38 static int getch(void);
d35df41eac69 Initial revision
kono
parents:
diff changeset
39 static int getfree(int n);
d35df41eac69 Initial revision
kono
parents:
diff changeset
40 static int getsym(void);
d35df41eac69 Initial revision
kono
parents:
diff changeset
41 static int indop(int e);
61
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents: 59
diff changeset
42 static int macro_args(char **pcheapp,char* max,char **pchptr);
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents: 59
diff changeset
43 static int macro_eval(int macrop,char *body,int history);
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents: 59
diff changeset
44 static int macro_function(int macrop,char **pchptr,NMTBL *nptr,int history);
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
45 static int macroeq(char *s);
d35df41eac69 Initial revision
kono
parents:
diff changeset
46 static int ndecl0(void);
d35df41eac69 Initial revision
kono
parents:
diff changeset
47 static int ndecl1(void);
30
20ed2786a276 still macro
kono
parents: 29
diff changeset
48 static int neqname(char *p,char *name);
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
49 static int postequ(int s1, int s2);
d35df41eac69 Initial revision
kono
parents:
diff changeset
50 static int rvalue(int e);
d35df41eac69 Initial revision
kono
parents:
diff changeset
51 static int sdecl(int s);
d35df41eac69 Initial revision
kono
parents:
diff changeset
52 static int skipspc(void);
d35df41eac69 Initial revision
kono
parents:
diff changeset
53 static int strop(int e);
d35df41eac69 Initial revision
kono
parents:
diff changeset
54 static int typeid(int s);
d35df41eac69 Initial revision
kono
parents:
diff changeset
55 static int typename(void);
d35df41eac69 Initial revision
kono
parents:
diff changeset
56 static int typespec(void);
87
1738f313f98b floating point (at most) done.
kono
parents: 86
diff changeset
57 static int adecl(NMTBL *n);
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
58 static void code_decl(NMTBL *n);
61
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents: 59
diff changeset
59 static void compatible(int t1, int t2);
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents: 59
diff changeset
60 static void copy(NMTBL *nptr, char *s);
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents: 59
diff changeset
61 static void decl(void);
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents: 59
diff changeset
62 static void docase(void);
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents: 59
diff changeset
63 static void docomp(void);
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents: 59
diff changeset
64 static void dodefault(void);
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents: 59
diff changeset
65 static void dodo(void);
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents: 59
diff changeset
66 static void dofor(void);
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents: 59
diff changeset
67 static void dogoto(void);
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents: 59
diff changeset
68 static void doif(void);
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents: 59
diff changeset
69 static void dolabel(void);
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents: 59
diff changeset
70 static void doreturn(void);
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents: 59
diff changeset
71 static void doswitch(void);
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents: 59
diff changeset
72 static void dowhile(void);
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents: 59
diff changeset
73 static void errmsg(void);
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents: 59
diff changeset
74 static void fcheck(NMTBL *n);
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents: 59
diff changeset
75 static void fdecl(NMTBL *n);
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents: 59
diff changeset
76 static void fdecl_struct(int type);
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents: 59
diff changeset
77 static void getline(void);
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents: 59
diff changeset
78 static void getstring(void);
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents: 59
diff changeset
79 static void init(void);
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents: 59
diff changeset
80 static void lcheck(int e);
28
c6994794f084 functional macro (imcomplete)
kono
parents: 25
diff changeset
81 static void local_define();
c6994794f084 functional macro (imcomplete)
kono
parents: 25
diff changeset
82 static void local_undef();
61
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents: 59
diff changeset
83 static void macro_define();
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents: 59
diff changeset
84 static void macro_define0();
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents: 59
diff changeset
85 static void macro_processing();
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents: 59
diff changeset
86 static void newfile(void);
39
c63c4fdeb9a7 struct done.
kono
parents: 38
diff changeset
87 static void replace_return_struct(int func,int left);
61
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents: 59
diff changeset
88 static void reserve(char *s, int d);
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents: 59
diff changeset
89 static void reverse(int t1);
59
eeca07d1b1c2 *** empty log message ***
kono
parents: 55
diff changeset
90 static void set_converter(char *s);
61
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents: 59
diff changeset
91 static void statement(void);
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
92
18
df7fa8cee67b pass -Wall
kono
parents: 16
diff changeset
93
37
412ad2e6c2a2 struct copy
kono
parents: 36
diff changeset
94 static int struct_return = 0;
76
fb3fb9e9a462 *** empty log message ***
kono
parents: 75
diff changeset
95 static int sdecl_f = 1;
fb3fb9e9a462 *** empty log message ***
kono
parents: 75
diff changeset
96 static int stypedecl;
37
412ad2e6c2a2 struct copy
kono
parents: 36
diff changeset
97
82
25654dc29ecc First Floating Point coding done.
kono
parents: 81
diff changeset
98 Converter *conv = &null_converter;
25654dc29ecc First Floating Point coding done.
kono
parents: 81
diff changeset
99 /* Converter *conv = &c_converter; */
59
eeca07d1b1c2 *** empty log message ***
kono
parents: 55
diff changeset
100
65
8ad746efa4f8 *** empty log message ***
kono
parents: 62
diff changeset
101 static char *ccout = 0;
8ad746efa4f8 *** empty log message ***
kono
parents: 62
diff changeset
102
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
103 int
d35df41eac69 Initial revision
kono
parents:
diff changeset
104 main(int argc, char **argv)
d35df41eac69 Initial revision
kono
parents:
diff changeset
105 {
d35df41eac69 Initial revision
kono
parents:
diff changeset
106 NMTBL *nptr;
d35df41eac69 Initial revision
kono
parents:
diff changeset
107 int i;
d35df41eac69 Initial revision
kono
parents:
diff changeset
108
d35df41eac69 Initial revision
kono
parents:
diff changeset
109 if(argc==1) exit(1);
d35df41eac69 Initial revision
kono
parents:
diff changeset
110 lsrc = chk = asmf = 0;
d35df41eac69 Initial revision
kono
parents:
diff changeset
111 ac=argc;
d35df41eac69 Initial revision
kono
parents:
diff changeset
112 av=argv;
d35df41eac69 Initial revision
kono
parents:
diff changeset
113 for (ac2=1; (ac2 < ac) && (*av[ac2] == '-'); ++ac2) {
d35df41eac69 Initial revision
kono
parents:
diff changeset
114 switch (*(av[ac2]+1)) {
59
eeca07d1b1c2 *** empty log message ***
kono
parents: 55
diff changeset
115 case 's':
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
116 lsrc = 1;
d35df41eac69 Initial revision
kono
parents:
diff changeset
117 break;
59
eeca07d1b1c2 *** empty log message ***
kono
parents: 55
diff changeset
118 case 'o':
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
119 ccout = av[ac2]+2;
d35df41eac69 Initial revision
kono
parents:
diff changeset
120 break;
59
eeca07d1b1c2 *** empty log message ***
kono
parents: 55
diff changeset
121 case 'c':
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
122 chk = 1;
d35df41eac69 Initial revision
kono
parents:
diff changeset
123 break;
59
eeca07d1b1c2 *** empty log message ***
kono
parents: 55
diff changeset
124 case 'd':
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
125 debug = 1;
d35df41eac69 Initial revision
kono
parents:
diff changeset
126 break;
59
eeca07d1b1c2 *** empty log message ***
kono
parents: 55
diff changeset
127 case 'C':
66
0b068058dd67 *** empty log message ***
kono
parents: 65
diff changeset
128 if (av[ac2+1]) set_converter(av[ac2]+2);
0b068058dd67 *** empty log message ***
kono
parents: 65
diff changeset
129 chk = 1;
0b068058dd67 *** empty log message ***
kono
parents: 65
diff changeset
130 ccout=0;
59
eeca07d1b1c2 *** empty log message ***
kono
parents: 55
diff changeset
131 break;
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
132 default:
d35df41eac69 Initial revision
kono
parents:
diff changeset
133 error(OPTION);
d35df41eac69 Initial revision
kono
parents:
diff changeset
134 exit(1);
d35df41eac69 Initial revision
kono
parents:
diff changeset
135 }
d35df41eac69 Initial revision
kono
parents:
diff changeset
136 }
65
8ad746efa4f8 *** empty log message ***
kono
parents: 62
diff changeset
137 if (!chk && ccout)
18
df7fa8cee67b pass -Wall
kono
parents: 16
diff changeset
138 if ( (freopen(ccout,"w",stdout)) == NULL ) error(FILERR);
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
139 init();
d35df41eac69 Initial revision
kono
parents:
diff changeset
140 while(1) {
2
kono
parents: 1
diff changeset
141 for (nptr = &ntable[GSYMS],i=LSYMS; i--;) {
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
142 (nptr++)->sc = 0;
2
kono
parents: 1
diff changeset
143 }
kono
parents: 1
diff changeset
144 emit_init();
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
145 mode=TOP;
d35df41eac69 Initial revision
kono
parents:
diff changeset
146 lfree= HEAPSIZE;
66
0b068058dd67 *** empty log message ***
kono
parents: 65
diff changeset
147 while(getsym()==SM) conv->sm_();
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
148 mode=GDECL;
d35df41eac69 Initial revision
kono
parents:
diff changeset
149 stmode=0;
d35df41eac69 Initial revision
kono
parents:
diff changeset
150 args=0;
d35df41eac69 Initial revision
kono
parents:
diff changeset
151 decl();
d35df41eac69 Initial revision
kono
parents:
diff changeset
152 }
d35df41eac69 Initial revision
kono
parents:
diff changeset
153 /*NOTREACHED*/
d35df41eac69 Initial revision
kono
parents:
diff changeset
154 }
d35df41eac69 Initial revision
kono
parents:
diff changeset
155
d35df41eac69 Initial revision
kono
parents:
diff changeset
156 void
d35df41eac69 Initial revision
kono
parents:
diff changeset
157 error(int n)
d35df41eac69 Initial revision
kono
parents:
diff changeset
158 {
d35df41eac69 Initial revision
kono
parents:
diff changeset
159 if(n == EOFERR) {
d35df41eac69 Initial revision
kono
parents:
diff changeset
160 if(filep!=filestack) {
d35df41eac69 Initial revision
kono
parents:
diff changeset
161 fclose(filep->fcb);
d35df41eac69 Initial revision
kono
parents:
diff changeset
162 lineno=filep->ln;
d35df41eac69 Initial revision
kono
parents:
diff changeset
163 --filep;
d35df41eac69 Initial revision
kono
parents:
diff changeset
164 return;
d35df41eac69 Initial revision
kono
parents:
diff changeset
165 } else if(ac2!=ac) {
d35df41eac69 Initial revision
kono
parents:
diff changeset
166 fclose(filep->fcb);
d35df41eac69 Initial revision
kono
parents:
diff changeset
167 newfile();
d35df41eac69 Initial revision
kono
parents:
diff changeset
168 return;
d35df41eac69 Initial revision
kono
parents:
diff changeset
169 } else if(mode == TOP) {
66
0b068058dd67 *** empty log message ***
kono
parents: 65
diff changeset
170 if (chk) {
0b068058dd67 *** empty log message ***
kono
parents: 65
diff changeset
171 fprintf(stderr, "Total internal labels : %u.\n",labelno-1);
0b068058dd67 *** empty log message ***
kono
parents: 65
diff changeset
172 fprintf(stderr, "Total global variables: %u bytes.\n",gpc);
0b068058dd67 *** empty log message ***
kono
parents: 65
diff changeset
173 }
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
174 closing();
d35df41eac69 Initial revision
kono
parents:
diff changeset
175 exit(0);
d35df41eac69 Initial revision
kono
parents:
diff changeset
176 }
d35df41eac69 Initial revision
kono
parents:
diff changeset
177 }
66
0b068058dd67 *** empty log message ***
kono
parents: 65
diff changeset
178 if (conv->error_(n)) return;
25
b7a94557bf92 *** empty log message ***
kono
parents: 23
diff changeset
179 fprintf(stderr,"%s:%d:%s\n",filep->name0,lineno,
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
180 (n==FILERR) ? "Can't open specified file" :
d35df41eac69 Initial revision
kono
parents:
diff changeset
181 (n==DCERR) ? "Declaration syntax" :
d35df41eac69 Initial revision
kono
parents:
diff changeset
182 (n==STERR) ? "Statement syntax" :
d35df41eac69 Initial revision
kono
parents:
diff changeset
183 (n==EXERR) ? "Expression syntax" :
d35df41eac69 Initial revision
kono
parents:
diff changeset
184 (n==CNERR) ? "Constant required" :
d35df41eac69 Initial revision
kono
parents:
diff changeset
185 (n==CHERR) ? "Illegal character" :
d35df41eac69 Initial revision
kono
parents:
diff changeset
186 (n==GSERR) ? "Too many global symbols" :
d35df41eac69 Initial revision
kono
parents:
diff changeset
187 (n==LSERR) ? "Too many local symbols" :
29
160e20394f80 macro function (imcomplete)
kono
parents: 28
diff changeset
188 (n==MSERR) ? "Too many macro symbols" :
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
189 (n==STRERR) ? "Too many strings or macros" :
d35df41eac69 Initial revision
kono
parents:
diff changeset
190 (n==LNERR) ? "Line too long" :
d35df41eac69 Initial revision
kono
parents:
diff changeset
191 (n==EOFERR) ? "Unexpected end of file" :
d35df41eac69 Initial revision
kono
parents:
diff changeset
192 (n==MCERR) ? "Macro syntax" :
d35df41eac69 Initial revision
kono
parents:
diff changeset
193 (n==INCERR) ? "Include syntax" :
d35df41eac69 Initial revision
kono
parents:
diff changeset
194 (n==HPERR) ? "Too long expression" :
d35df41eac69 Initial revision
kono
parents:
diff changeset
195 (n==TYERR) ? "Type mismatch" :
d35df41eac69 Initial revision
kono
parents:
diff changeset
196 (n==LVERR) ? "Lvalue required" :
d35df41eac69 Initial revision
kono
parents:
diff changeset
197 (n==UDERR) ? "Undeclared identifier" :
d35df41eac69 Initial revision
kono
parents:
diff changeset
198 (n==OPTION) ? "Illegal option" :
d35df41eac69 Initial revision
kono
parents:
diff changeset
199 (n==REG_ERR) ? "illegal register var" :
d35df41eac69 Initial revision
kono
parents:
diff changeset
200 (n==CODE_ERR) ? "goto code is necessary" :
d35df41eac69 Initial revision
kono
parents:
diff changeset
201 "Bug of compiler");
d35df41eac69 Initial revision
kono
parents:
diff changeset
202 errmsg();
d35df41eac69 Initial revision
kono
parents:
diff changeset
203 exit(1);
d35df41eac69 Initial revision
kono
parents:
diff changeset
204 }
d35df41eac69 Initial revision
kono
parents:
diff changeset
205
61
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents: 59
diff changeset
206 static void
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
207 errmsg(void)
d35df41eac69 Initial revision
kono
parents:
diff changeset
208 {
d35df41eac69 Initial revision
kono
parents:
diff changeset
209 char *p,*lim;
d35df41eac69 Initial revision
kono
parents:
diff changeset
210
d35df41eac69 Initial revision
kono
parents:
diff changeset
211 if(lineno==0) return;
d35df41eac69 Initial revision
kono
parents:
diff changeset
212 fprintf(stderr,"%s",linebuf);
29
160e20394f80 macro function (imcomplete)
kono
parents: 28
diff changeset
213 lim=chptr;
34
0756caa79167 macro function recursive and copy method
kono
parents: 33
diff changeset
214 if (chptrsave) {
0756caa79167 macro function recursive and copy method
kono
parents: 33
diff changeset
215 lim = chptrsave;
29
160e20394f80 macro function (imcomplete)
kono
parents: 28
diff changeset
216 }
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
217 for (p=linebuf; p < lim;)
d35df41eac69 Initial revision
kono
parents:
diff changeset
218 fprintf(stderr,(*p++ == '\t') ? "\t" : " ");
d35df41eac69 Initial revision
kono
parents:
diff changeset
219 fprintf (stderr,"^\n");
d35df41eac69 Initial revision
kono
parents:
diff changeset
220 }
d35df41eac69 Initial revision
kono
parents:
diff changeset
221
61
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents: 59
diff changeset
222 static void
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
223 checksym(int s)
d35df41eac69 Initial revision
kono
parents:
diff changeset
224 {
d35df41eac69 Initial revision
kono
parents:
diff changeset
225 char *p;
d35df41eac69 Initial revision
kono
parents:
diff changeset
226
d35df41eac69 Initial revision
kono
parents:
diff changeset
227 if (sym != s) {
d35df41eac69 Initial revision
kono
parents:
diff changeset
228 p=(s==RPAR) ? "')'": (s==RBRA) ? "']'": (s==SM) ? "';'":
d35df41eac69 Initial revision
kono
parents:
diff changeset
229 (s==LPAR) ? "'('": (s==WHILE) ? "'while'":
d35df41eac69 Initial revision
kono
parents:
diff changeset
230 (s==COLON) ? "':'": "Identifier";
d35df41eac69 Initial revision
kono
parents:
diff changeset
231 fprintf(stderr,"%d:%s expected.\n",lineno,p);
d35df41eac69 Initial revision
kono
parents:
diff changeset
232 errmsg();
d35df41eac69 Initial revision
kono
parents:
diff changeset
233 } else
d35df41eac69 Initial revision
kono
parents:
diff changeset
234 getsym();
d35df41eac69 Initial revision
kono
parents:
diff changeset
235 }
d35df41eac69 Initial revision
kono
parents:
diff changeset
236
61
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents: 59
diff changeset
237 static void
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
238 init(void)
d35df41eac69 Initial revision
kono
parents:
diff changeset
239 {
d35df41eac69 Initial revision
kono
parents:
diff changeset
240 NMTBL *nptr;
d35df41eac69 Initial revision
kono
parents:
diff changeset
241 int i;
d35df41eac69 Initial revision
kono
parents:
diff changeset
242
d35df41eac69 Initial revision
kono
parents:
diff changeset
243 cheapp=cheap;
d35df41eac69 Initial revision
kono
parents:
diff changeset
244 for(nptr = ntable,i = GSYMS; i--;) (nptr++)->sc = 0;
30
20ed2786a276 still macro
kono
parents: 29
diff changeset
245 for(nptr = mtable,i = MSYMS; i--;) (nptr++)->sc = 0;
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
246 reserve("int",INT);
d35df41eac69 Initial revision
kono
parents:
diff changeset
247 reserve("void",VOID);
d35df41eac69 Initial revision
kono
parents:
diff changeset
248 reserve("char",CHAR);
20
8d3db5fc8a97 *** empty log message ***
kono
parents: 19
diff changeset
249 reserve("const",KONST);
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
250 reserve("struct",STRUCT);
d35df41eac69 Initial revision
kono
parents:
diff changeset
251 reserve("union",UNION);
d35df41eac69 Initial revision
kono
parents:
diff changeset
252 reserve("unsigned",UNSIGNED);
d35df41eac69 Initial revision
kono
parents:
diff changeset
253 reserve("static",STATIC);
d35df41eac69 Initial revision
kono
parents:
diff changeset
254 reserve("goto",GOTO);
d35df41eac69 Initial revision
kono
parents:
diff changeset
255 reserve("return",RETURN);
d35df41eac69 Initial revision
kono
parents:
diff changeset
256 reserve("break",BREAK);
d35df41eac69 Initial revision
kono
parents:
diff changeset
257 reserve("continue",CONTINUE);
d35df41eac69 Initial revision
kono
parents:
diff changeset
258 reserve("if",IF);
d35df41eac69 Initial revision
kono
parents:
diff changeset
259 reserve("else",ELSE);
d35df41eac69 Initial revision
kono
parents:
diff changeset
260 reserve("for",FOR);
d35df41eac69 Initial revision
kono
parents:
diff changeset
261 reserve("do",DO);
d35df41eac69 Initial revision
kono
parents:
diff changeset
262 reserve("while",WHILE);
d35df41eac69 Initial revision
kono
parents:
diff changeset
263 reserve("switch",SWITCH);
d35df41eac69 Initial revision
kono
parents:
diff changeset
264 reserve("case",CASE);
d35df41eac69 Initial revision
kono
parents:
diff changeset
265 reserve("default",DEFAULT);
d35df41eac69 Initial revision
kono
parents:
diff changeset
266 reserve("typedef",TYPEDEF);
d35df41eac69 Initial revision
kono
parents:
diff changeset
267 reserve("sizeof",SIZEOF);
d35df41eac69 Initial revision
kono
parents:
diff changeset
268 reserve("long",LONG);
d35df41eac69 Initial revision
kono
parents:
diff changeset
269 reserve("short",SHORT);
d35df41eac69 Initial revision
kono
parents:
diff changeset
270 reserve("extern",EXTRN);
18
df7fa8cee67b pass -Wall
kono
parents: 16
diff changeset
271 reserve("defined",DEFINED);
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
272 reserve("register",REGISTER);
d35df41eac69 Initial revision
kono
parents:
diff changeset
273 reserve("code",CODE);
d35df41eac69 Initial revision
kono
parents:
diff changeset
274 reserve("environment",ENVIRONMENT);
78
8418d4b7caa7 *** empty log message ***
kono
parents: 77
diff changeset
275 reserve("float",FLOAT);
8418d4b7caa7 *** empty log message ***
kono
parents: 77
diff changeset
276 reserve("double",DOUBLE);
19
b62230ea38f6 ifdef debug
kono
parents: 18
diff changeset
277
34
0756caa79167 macro function recursive and copy method
kono
parents: 33
diff changeset
278 gpc=glineno=0;
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
279 gfree=ilabel=1;
d35df41eac69 Initial revision
kono
parents:
diff changeset
280 labelno=2;
d35df41eac69 Initial revision
kono
parents:
diff changeset
281 lfree=HEAPSIZE;
d35df41eac69 Initial revision
kono
parents:
diff changeset
282 filep=filestack;
d35df41eac69 Initial revision
kono
parents:
diff changeset
283 code_init();
d35df41eac69 Initial revision
kono
parents:
diff changeset
284 newfile();
32
b35787d8a442 macro initialization
kono
parents: 31
diff changeset
285
b35787d8a442 macro initialization
kono
parents: 31
diff changeset
286 macro_define("__micro_c__ 1\n");
b35787d8a442 macro initialization
kono
parents: 31
diff changeset
287
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
288 getline();
d35df41eac69 Initial revision
kono
parents:
diff changeset
289 getch();
d35df41eac69 Initial revision
kono
parents:
diff changeset
290 }
d35df41eac69 Initial revision
kono
parents:
diff changeset
291
61
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents: 59
diff changeset
292 static void
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
293 newfile(void)
d35df41eac69 Initial revision
kono
parents:
diff changeset
294 {
25
b7a94557bf92 *** empty log message ***
kono
parents: 23
diff changeset
295 char *s;
65
8ad746efa4f8 *** empty log message ***
kono
parents: 62
diff changeset
296
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
297 lineno=0;
66
0b068058dd67 *** empty log message ***
kono
parents: 65
diff changeset
298 if (chk) fprintf(stderr,"%s:\n",av[ac2]);
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
299 if ( (filep->fcb = fopen(av[ac2++],"r")) == NULL ) error(FILERR);
25
b7a94557bf92 *** empty log message ***
kono
parents: 23
diff changeset
300 s = av[ac2-1];
b7a94557bf92 *** empty log message ***
kono
parents: 23
diff changeset
301 filep->name0 = cheapp;
b7a94557bf92 *** empty log message ***
kono
parents: 23
diff changeset
302 while((*cheapp++ = *s++));
65
8ad746efa4f8 *** empty log message ***
kono
parents: 62
diff changeset
303 if(!ccout) {
8ad746efa4f8 *** empty log message ***
kono
parents: 62
diff changeset
304 ccout=s=cheapp; s= filep->name0;
8ad746efa4f8 *** empty log message ***
kono
parents: 62
diff changeset
305 while((*cheapp++ = *s++)) {
8ad746efa4f8 *** empty log message ***
kono
parents: 62
diff changeset
306 if(s[0]=='.'&&s[1]=='c') {
8ad746efa4f8 *** empty log message ***
kono
parents: 62
diff changeset
307 *cheapp++=*s++; *cheapp++=*s++;
8ad746efa4f8 *** empty log message ***
kono
parents: 62
diff changeset
308 cheapp[-1]='s';
8ad746efa4f8 *** empty log message ***
kono
parents: 62
diff changeset
309 }
8ad746efa4f8 *** empty log message ***
kono
parents: 62
diff changeset
310 }
8ad746efa4f8 *** empty log message ***
kono
parents: 62
diff changeset
311 if ( (freopen(ccout,"w",stdout)) == NULL ) error(FILERR);
8ad746efa4f8 *** empty log message ***
kono
parents: 62
diff changeset
312 cheapp=ccout;
8ad746efa4f8 *** empty log message ***
kono
parents: 62
diff changeset
313 ccout=0;
8ad746efa4f8 *** empty log message ***
kono
parents: 62
diff changeset
314 }
8ad746efa4f8 *** empty log message ***
kono
parents: 62
diff changeset
315 opening(filep->name0);
67
254a0c576114 argument type list
kono
parents: 66
diff changeset
316 conv->open_(filep->name0);
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
317 }
d35df41eac69 Initial revision
kono
parents:
diff changeset
318
61
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents: 59
diff changeset
319 static void
59
eeca07d1b1c2 *** empty log message ***
kono
parents: 55
diff changeset
320 set_converter(char *s)
eeca07d1b1c2 *** empty log message ***
kono
parents: 55
diff changeset
321 {
eeca07d1b1c2 *** empty log message ***
kono
parents: 55
diff changeset
322 chptr = s;
66
0b068058dd67 *** empty log message ***
kono
parents: 65
diff changeset
323 #if 0
59
eeca07d1b1c2 *** empty log message ***
kono
parents: 55
diff changeset
324 if (macroeq("c2cbc")) conv=&c2cbc_converter;
eeca07d1b1c2 *** empty log message ***
kono
parents: 55
diff changeset
325 else if (macroeq("cbc2c")) conv=&cbc2c_converter;
eeca07d1b1c2 *** empty log message ***
kono
parents: 55
diff changeset
326 else if (macroeq("c")) conv=&c_converter;
66
0b068058dd67 *** empty log message ***
kono
parents: 65
diff changeset
327 #else
0b068058dd67 *** empty log message ***
kono
parents: 65
diff changeset
328 if (macroeq("c")) conv=&c_converter;
82
25654dc29ecc First Floating Point coding done.
kono
parents: 81
diff changeset
329 else conv=&null_converter;
66
0b068058dd67 *** empty log message ***
kono
parents: 65
diff changeset
330 #endif
59
eeca07d1b1c2 *** empty log message ***
kono
parents: 55
diff changeset
331 }
eeca07d1b1c2 *** empty log message ***
kono
parents: 55
diff changeset
332
61
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents: 59
diff changeset
333 static void
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
334 reserve(char *s, int d)
d35df41eac69 Initial revision
kono
parents:
diff changeset
335 {
d35df41eac69 Initial revision
kono
parents:
diff changeset
336 NMTBL *nptr;
d35df41eac69 Initial revision
kono
parents:
diff changeset
337 int i;
d35df41eac69 Initial revision
kono
parents:
diff changeset
338
d35df41eac69 Initial revision
kono
parents:
diff changeset
339 hash=0; name=namebuf; i=0;
d35df41eac69 Initial revision
kono
parents:
diff changeset
340 while((name[i++] = *s)) {
d35df41eac69 Initial revision
kono
parents:
diff changeset
341 hash=((7*hash) ^ *s++);
d35df41eac69 Initial revision
kono
parents:
diff changeset
342 }
d35df41eac69 Initial revision
kono
parents:
diff changeset
343 if (cheapp+i >= cheap+CHEAPSIZE) error(STRERR);
d35df41eac69 Initial revision
kono
parents:
diff changeset
344 name[i++] = 0;
d35df41eac69 Initial revision
kono
parents:
diff changeset
345 (nptr = gsearch())->sc = RESERVE;
19
b62230ea38f6 ifdef debug
kono
parents: 18
diff changeset
346 if (d==0) {
b62230ea38f6 ifdef debug
kono
parents: 18
diff changeset
347 nptr->sc = MACRO;
29
160e20394f80 macro function (imcomplete)
kono
parents: 28
diff changeset
348 nptr->dsp = (int)""; nptr->ty=0;
19
b62230ea38f6 ifdef debug
kono
parents: 18
diff changeset
349 } else {
b62230ea38f6 ifdef debug
kono
parents: 18
diff changeset
350 nptr->dsp = d;
b62230ea38f6 ifdef debug
kono
parents: 18
diff changeset
351 }
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
352 }
d35df41eac69 Initial revision
kono
parents:
diff changeset
353
d35df41eac69 Initial revision
kono
parents:
diff changeset
354 static
d35df41eac69 Initial revision
kono
parents:
diff changeset
355 NMTBL null_nptr;
d35df41eac69 Initial revision
kono
parents:
diff changeset
356
61
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents: 59
diff changeset
357 static void
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
358 decl(void)
d35df41eac69 Initial revision
kono
parents:
diff changeset
359 {
d35df41eac69 Initial revision
kono
parents:
diff changeset
360 NMTBL *n;
76
fb3fb9e9a462 *** empty log message ***
kono
parents: 75
diff changeset
361 int t,sd;
77
2b8ba655e572 fix arg type
kono
parents: 76
diff changeset
362 if (mode==GDECL) { typedefed=0; }
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
363
d35df41eac69 Initial revision
kono
parents:
diff changeset
364 if(sym==STATIC) {
d35df41eac69 Initial revision
kono
parents:
diff changeset
365 if(mode==LDECL) {
d35df41eac69 Initial revision
kono
parents:
diff changeset
366 getsym();
69
dba8d111b7a0 c output
kono
parents: 68
diff changeset
367 conv->static_();
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
368 mode=STADECL;
d35df41eac69 Initial revision
kono
parents:
diff changeset
369 stmode=LDECL;
d35df41eac69 Initial revision
kono
parents:
diff changeset
370 } else if(mode==GDECL) {
d35df41eac69 Initial revision
kono
parents:
diff changeset
371 getsym();
69
dba8d111b7a0 c output
kono
parents: 68
diff changeset
372 conv->static_();
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
373 stmode=STATIC;
d35df41eac69 Initial revision
kono
parents:
diff changeset
374 } else
d35df41eac69 Initial revision
kono
parents:
diff changeset
375 error(DCERR);
d35df41eac69 Initial revision
kono
parents:
diff changeset
376 } else if(sym==REGISTER) {
d35df41eac69 Initial revision
kono
parents:
diff changeset
377 if(mode!=LDECL)
d35df41eac69 Initial revision
kono
parents:
diff changeset
378 error(DCERR);
d35df41eac69 Initial revision
kono
parents:
diff changeset
379 stmode=REGISTER;
d35df41eac69 Initial revision
kono
parents:
diff changeset
380 getsym();
69
dba8d111b7a0 c output
kono
parents: 68
diff changeset
381 conv->register_();
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
382 } else if(sym==EXTRN) {
69
dba8d111b7a0 c output
kono
parents: 68
diff changeset
383 getsym();
66
0b068058dd67 *** empty log message ***
kono
parents: 65
diff changeset
384 conv->extern_();
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
385 stmode=EXTRN;
d35df41eac69 Initial revision
kono
parents:
diff changeset
386 } else if(sym==TYPEDEF) {
d35df41eac69 Initial revision
kono
parents:
diff changeset
387 if(mode==GDECL) {
d35df41eac69 Initial revision
kono
parents:
diff changeset
388 getsym();
69
dba8d111b7a0 c output
kono
parents: 68
diff changeset
389 conv->typedef_();
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
390 mode=GTDECL;
d35df41eac69 Initial revision
kono
parents:
diff changeset
391 } else if(mode==LDECL) {
d35df41eac69 Initial revision
kono
parents:
diff changeset
392 getsym();
69
dba8d111b7a0 c output
kono
parents: 68
diff changeset
393 conv->typedef_();
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
394 mode=LTDECL;
d35df41eac69 Initial revision
kono
parents:
diff changeset
395 } else
d35df41eac69 Initial revision
kono
parents:
diff changeset
396 error(DCERR);
d35df41eac69 Initial revision
kono
parents:
diff changeset
397 }
d35df41eac69 Initial revision
kono
parents:
diff changeset
398 if((t=typespec())==0) return;
66
0b068058dd67 *** empty log message ***
kono
parents: 65
diff changeset
399 if(sym==SM) {
72
3b5d293cea36 type def etc
kono
parents: 71
diff changeset
400 conv->return_type_(t,0,stypedecl);
66
0b068058dd67 *** empty log message ***
kono
parents: 65
diff changeset
401 conv->sm_(); return;
0b068058dd67 *** empty log message ***
kono
parents: 65
diff changeset
402 }
76
fb3fb9e9a462 *** empty log message ***
kono
parents: 75
diff changeset
403 type=t;sd=stypedecl;
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
404 n=decl0();
d35df41eac69 Initial revision
kono
parents:
diff changeset
405 reverse(t);
d35df41eac69 Initial revision
kono
parents:
diff changeset
406 if (n == &null_nptr) {
d35df41eac69 Initial revision
kono
parents:
diff changeset
407 error(DCERR);
d35df41eac69 Initial revision
kono
parents:
diff changeset
408 return;
d35df41eac69 Initial revision
kono
parents:
diff changeset
409 }
d35df41eac69 Initial revision
kono
parents:
diff changeset
410 if(sym==LC || ( sym!=SM && sym!=COMMA && sym!=ASS )) {
76
fb3fb9e9a462 *** empty log message ***
kono
parents: 75
diff changeset
411 stypedecl=sd;
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
412 if (car(type)==CODE) {
d35df41eac69 Initial revision
kono
parents:
diff changeset
413 code_decl(n); return;
d35df41eac69 Initial revision
kono
parents:
diff changeset
414 } else if (car(type)==FUNCTION) {
d35df41eac69 Initial revision
kono
parents:
diff changeset
415 fdecl(n); return;
66
0b068058dd67 *** empty log message ***
kono
parents: 65
diff changeset
416 } else error(TYERR);
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
417 }
75
92dcf107a837 c code output
kono
parents: 72
diff changeset
418 conv->return_type_(type,n,sd);
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
419 def(n);
d35df41eac69 Initial revision
kono
parents:
diff changeset
420 while(sym==COMMA) {
66
0b068058dd67 *** empty log message ***
kono
parents: 65
diff changeset
421 conv->comma_();
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
422 getsym();
d35df41eac69 Initial revision
kono
parents:
diff changeset
423 type=t;
d35df41eac69 Initial revision
kono
parents:
diff changeset
424 n=decl0();
d35df41eac69 Initial revision
kono
parents:
diff changeset
425 reverse(t);
d35df41eac69 Initial revision
kono
parents:
diff changeset
426 if(n == &null_nptr) error(DCERR);
d35df41eac69 Initial revision
kono
parents:
diff changeset
427 /* if(args) error(DCERR); */
69
dba8d111b7a0 c output
kono
parents: 68
diff changeset
428 conv->return_type_(type,n,1);
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
429 def(n);
d35df41eac69 Initial revision
kono
parents:
diff changeset
430 }
d35df41eac69 Initial revision
kono
parents:
diff changeset
431 if(sym!=SM) error(DCERR);
66
0b068058dd67 *** empty log message ***
kono
parents: 65
diff changeset
432 conv->sm_();
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
433 if(mode==GTDECL)
d35df41eac69 Initial revision
kono
parents:
diff changeset
434 mode=GDECL;
d35df41eac69 Initial revision
kono
parents:
diff changeset
435 if(mode==STADECL||mode==LTDECL)
d35df41eac69 Initial revision
kono
parents:
diff changeset
436 mode=LDECL;
d35df41eac69 Initial revision
kono
parents:
diff changeset
437 }
d35df41eac69 Initial revision
kono
parents:
diff changeset
438
61
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents: 59
diff changeset
439 static int
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
440 typespec(void)
d35df41eac69 Initial revision
kono
parents:
diff changeset
441 {
d35df41eac69 Initial revision
kono
parents:
diff changeset
442 int t;
72
3b5d293cea36 type def etc
kono
parents: 71
diff changeset
443 stypedecl = 0;
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
444
20
8d3db5fc8a97 *** empty log message ***
kono
parents: 19
diff changeset
445 while (sym==KONST) {
8d3db5fc8a97 *** empty log message ***
kono
parents: 19
diff changeset
446 getsym();
8d3db5fc8a97 *** empty log message ***
kono
parents: 19
diff changeset
447 }
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
448 switch(sym) {
d35df41eac69 Initial revision
kono
parents:
diff changeset
449 case VOID:
d35df41eac69 Initial revision
kono
parents:
diff changeset
450 case INT:
d35df41eac69 Initial revision
kono
parents:
diff changeset
451 case CHAR:
d35df41eac69 Initial revision
kono
parents:
diff changeset
452 case CODE:
78
8418d4b7caa7 *** empty log message ***
kono
parents: 77
diff changeset
453 case FLOAT:
8418d4b7caa7 *** empty log message ***
kono
parents: 77
diff changeset
454 case DOUBLE:
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
455 t= sym;
d35df41eac69 Initial revision
kono
parents:
diff changeset
456 getsym();
d35df41eac69 Initial revision
kono
parents:
diff changeset
457 break;
d35df41eac69 Initial revision
kono
parents:
diff changeset
458 case STRUCT:
d35df41eac69 Initial revision
kono
parents:
diff changeset
459 case UNION:
d35df41eac69 Initial revision
kono
parents:
diff changeset
460 t=sdecl(sym);
d35df41eac69 Initial revision
kono
parents:
diff changeset
461 break;
d35df41eac69 Initial revision
kono
parents:
diff changeset
462 case UNSIGNED:
d35df41eac69 Initial revision
kono
parents:
diff changeset
463 t = UNSIGNED;
d35df41eac69 Initial revision
kono
parents:
diff changeset
464 if(getsym()==INT) getsym();
d35df41eac69 Initial revision
kono
parents:
diff changeset
465 break;
d35df41eac69 Initial revision
kono
parents:
diff changeset
466 case SHORT:
78
8418d4b7caa7 *** empty log message ***
kono
parents: 77
diff changeset
467 t=INT;
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
468 if(getsym()==INT) getsym();
d35df41eac69 Initial revision
kono
parents:
diff changeset
469 break;
d35df41eac69 Initial revision
kono
parents:
diff changeset
470 case LONG:
d35df41eac69 Initial revision
kono
parents:
diff changeset
471 t=INT;
78
8418d4b7caa7 *** empty log message ***
kono
parents: 77
diff changeset
472 getsym();
8418d4b7caa7 *** empty log message ***
kono
parents: 77
diff changeset
473 if(sym==LONG) {
8418d4b7caa7 *** empty log message ***
kono
parents: 77
diff changeset
474 getsym();
8418d4b7caa7 *** empty log message ***
kono
parents: 77
diff changeset
475 t=LONGLONG;
8418d4b7caa7 *** empty log message ***
kono
parents: 77
diff changeset
476 }
8418d4b7caa7 *** empty log message ***
kono
parents: 77
diff changeset
477 if(sym==INT) getsym();
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
478 break;
d35df41eac69 Initial revision
kono
parents:
diff changeset
479 default:
d35df41eac69 Initial revision
kono
parents:
diff changeset
480 if(sym==IDENT) {
d35df41eac69 Initial revision
kono
parents:
diff changeset
481 if(nptr->sc==TYPE) {
d35df41eac69 Initial revision
kono
parents:
diff changeset
482 t=nptr->ty;
72
3b5d293cea36 type def etc
kono
parents: 71
diff changeset
483 typedefed=glist2((int)nptr,typedefed);
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
484 getsym();
d35df41eac69 Initial revision
kono
parents:
diff changeset
485 break;
d35df41eac69 Initial revision
kono
parents:
diff changeset
486 } else if(nptr->sc==EMPTY && gnptr->sc==TYPE) {
d35df41eac69 Initial revision
kono
parents:
diff changeset
487 getsym();
d35df41eac69 Initial revision
kono
parents:
diff changeset
488 break;
d35df41eac69 Initial revision
kono
parents:
diff changeset
489 }
d35df41eac69 Initial revision
kono
parents:
diff changeset
490 }
20
8d3db5fc8a97 *** empty log message ***
kono
parents: 19
diff changeset
491 while (sym==KONST) {
8d3db5fc8a97 *** empty log message ***
kono
parents: 19
diff changeset
492 getsym();
8d3db5fc8a97 *** empty log message ***
kono
parents: 19
diff changeset
493 }
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
494 if(mode==LDECL) return 0;
d35df41eac69 Initial revision
kono
parents:
diff changeset
495 t= INT;
d35df41eac69 Initial revision
kono
parents:
diff changeset
496 }
20
8d3db5fc8a97 *** empty log message ***
kono
parents: 19
diff changeset
497 while (sym==KONST) {
8d3db5fc8a97 *** empty log message ***
kono
parents: 19
diff changeset
498 getsym();
8d3db5fc8a97 *** empty log message ***
kono
parents: 19
diff changeset
499 }
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
500 return t;
d35df41eac69 Initial revision
kono
parents:
diff changeset
501 }
d35df41eac69 Initial revision
kono
parents:
diff changeset
502
61
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents: 59
diff changeset
503 static struct nametable *
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
504 decl0(void)
d35df41eac69 Initial revision
kono
parents:
diff changeset
505 {
d35df41eac69 Initial revision
kono
parents:
diff changeset
506 NMTBL *n;
d35df41eac69 Initial revision
kono
parents:
diff changeset
507 if(sym==MUL) {
d35df41eac69 Initial revision
kono
parents:
diff changeset
508 getsym();
d35df41eac69 Initial revision
kono
parents:
diff changeset
509 n=decl0();
d35df41eac69 Initial revision
kono
parents:
diff changeset
510 type=list2(POINTER,type);
d35df41eac69 Initial revision
kono
parents:
diff changeset
511 return n;
d35df41eac69 Initial revision
kono
parents:
diff changeset
512 }
d35df41eac69 Initial revision
kono
parents:
diff changeset
513 return decl1();
d35df41eac69 Initial revision
kono
parents:
diff changeset
514 }
d35df41eac69 Initial revision
kono
parents:
diff changeset
515
d35df41eac69 Initial revision
kono
parents:
diff changeset
516
61
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents: 59
diff changeset
517 static NMTBL *
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
518 decl1(void)
d35df41eac69 Initial revision
kono
parents:
diff changeset
519 {
d35df41eac69 Initial revision
kono
parents:
diff changeset
520 NMTBL *n;
d35df41eac69 Initial revision
kono
parents:
diff changeset
521 int i,t;
d35df41eac69 Initial revision
kono
parents:
diff changeset
522
d35df41eac69 Initial revision
kono
parents:
diff changeset
523 if(sym==LPAR) {
d35df41eac69 Initial revision
kono
parents:
diff changeset
524 getsym();
d35df41eac69 Initial revision
kono
parents:
diff changeset
525 n=decl0();
d35df41eac69 Initial revision
kono
parents:
diff changeset
526 checksym(RPAR);
d35df41eac69 Initial revision
kono
parents:
diff changeset
527 } else if (sym == IDENT) {
d35df41eac69 Initial revision
kono
parents:
diff changeset
528 n=nptr;
d35df41eac69 Initial revision
kono
parents:
diff changeset
529 getsym();
d35df41eac69 Initial revision
kono
parents:
diff changeset
530 } else {
d35df41eac69 Initial revision
kono
parents:
diff changeset
531 /* error(DCERR); */
d35df41eac69 Initial revision
kono
parents:
diff changeset
532 n= &null_nptr;
d35df41eac69 Initial revision
kono
parents:
diff changeset
533 }
d35df41eac69 Initial revision
kono
parents:
diff changeset
534 while(1) {
d35df41eac69 Initial revision
kono
parents:
diff changeset
535 if(sym==LBRA) {
d35df41eac69 Initial revision
kono
parents:
diff changeset
536 if(getsym()==RBRA) {
d35df41eac69 Initial revision
kono
parents:
diff changeset
537 getsym();
d35df41eac69 Initial revision
kono
parents:
diff changeset
538 if(mode==ADECL) {
d35df41eac69 Initial revision
kono
parents:
diff changeset
539 type=list2(POINTER,type);
d35df41eac69 Initial revision
kono
parents:
diff changeset
540 } else if (mode==GDECL) {
79
82d0e30f61dd *** empty log message ***
kono
parents: 78
diff changeset
541 type=list3(ARRAY,type,0);
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
542 } else {
d35df41eac69 Initial revision
kono
parents:
diff changeset
543 error(DCERR);
d35df41eac69 Initial revision
kono
parents:
diff changeset
544 }
d35df41eac69 Initial revision
kono
parents:
diff changeset
545 } else {
d35df41eac69 Initial revision
kono
parents:
diff changeset
546 t=type;
69
dba8d111b7a0 c output
kono
parents: 68
diff changeset
547 i=cexpr(expr(1));
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
548 checksym(RBRA);
d35df41eac69 Initial revision
kono
parents:
diff changeset
549 type=list3(ARRAY,t,i);
d35df41eac69 Initial revision
kono
parents:
diff changeset
550 }
d35df41eac69 Initial revision
kono
parents:
diff changeset
551 } else if(sym==LPAR) {
d35df41eac69 Initial revision
kono
parents:
diff changeset
552 if(mode==GDECL) {
d35df41eac69 Initial revision
kono
parents:
diff changeset
553 mode=ADECL;getsym();mode=GDECL; /* ??? */
d35df41eac69 Initial revision
kono
parents:
diff changeset
554 } else
d35df41eac69 Initial revision
kono
parents:
diff changeset
555 getsym();
77
2b8ba655e572 fix arg type
kono
parents: 76
diff changeset
556 n->dsp=0;
2b8ba655e572 fix arg type
kono
parents: 76
diff changeset
557 if (type==CODE) {
87
1738f313f98b floating point (at most) done.
kono
parents: 86
diff changeset
558 n->ty=CODE;
77
2b8ba655e572 fix arg type
kono
parents: 76
diff changeset
559 n->sc=EMPTY;
2b8ba655e572 fix arg type
kono
parents: 76
diff changeset
560 if(sym==RPAR) {
87
1738f313f98b floating point (at most) done.
kono
parents: 86
diff changeset
561 getsym();t=0;
77
2b8ba655e572 fix arg type
kono
parents: 76
diff changeset
562 } else {
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
563 stmode=REGISTER;
87
1738f313f98b floating point (at most) done.
kono
parents: 86
diff changeset
564 t=adecl(n);
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
565 stmode=0;
77
2b8ba655e572 fix arg type
kono
parents: 76
diff changeset
566 }
87
1738f313f98b floating point (at most) done.
kono
parents: 86
diff changeset
567 type=list3(CODE,CODE,t);
77
2b8ba655e572 fix arg type
kono
parents: 76
diff changeset
568 } else {
2b8ba655e572 fix arg type
kono
parents: 76
diff changeset
569 n->ty=type;
2b8ba655e572 fix arg type
kono
parents: 76
diff changeset
570 n->sc=EMPTY;
2b8ba655e572 fix arg type
kono
parents: 76
diff changeset
571 if(sym==RPAR) {
87
1738f313f98b floating point (at most) done.
kono
parents: 86
diff changeset
572 getsym();t=0;
77
2b8ba655e572 fix arg type
kono
parents: 76
diff changeset
573 } else
87
1738f313f98b floating point (at most) done.
kono
parents: 86
diff changeset
574 t=adecl(n);
1738f313f98b floating point (at most) done.
kono
parents: 86
diff changeset
575 type=list3(FUNCTION,type,t);
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
576 }
87
1738f313f98b floating point (at most) done.
kono
parents: 86
diff changeset
577 /* in GDECL mode dsp contains real parameter, if not,
1738f313f98b floating point (at most) done.
kono
parents: 86
diff changeset
578 it contains arg type list. Real parameter list is compatible
1738f313f98b floating point (at most) done.
kono
parents: 86
diff changeset
579 with arg type list. See def/ADECL */
1738f313f98b floating point (at most) done.
kono
parents: 86
diff changeset
580 if (mode!=GDECL)
1738f313f98b floating point (at most) done.
kono
parents: 86
diff changeset
581 n->dsp=t;
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
582 } else
d35df41eac69 Initial revision
kono
parents:
diff changeset
583 return n;
d35df41eac69 Initial revision
kono
parents:
diff changeset
584 }
77
2b8ba655e572 fix arg type
kono
parents: 76
diff changeset
585 /* NOT REACHED */
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
586 }
d35df41eac69 Initial revision
kono
parents:
diff changeset
587
d35df41eac69 Initial revision
kono
parents:
diff changeset
588
87
1738f313f98b floating point (at most) done.
kono
parents: 86
diff changeset
589 static int
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
590 adecl(NMTBL *n)
d35df41eac69 Initial revision
kono
parents:
diff changeset
591 {
d35df41eac69 Initial revision
kono
parents:
diff changeset
592 NMTBL *arg,*sfnptr;
d35df41eac69 Initial revision
kono
parents:
diff changeset
593 int sreg_var,t;
79
82d0e30f61dd *** empty log message ***
kono
parents: 78
diff changeset
594 int stype,smode,sd,sargs;
87
1738f313f98b floating point (at most) done.
kono
parents: 86
diff changeset
595 int argtypes;
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
596
d35df41eac69 Initial revision
kono
parents:
diff changeset
597 stype=type;
d35df41eac69 Initial revision
kono
parents:
diff changeset
598 sfnptr=fnptr;
d35df41eac69 Initial revision
kono
parents:
diff changeset
599 fnptr=n;
76
fb3fb9e9a462 *** empty log message ***
kono
parents: 75
diff changeset
600 sd = sdecl_f;
fb3fb9e9a462 *** empty log message ***
kono
parents: 75
diff changeset
601 sdecl_f = 0;
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
602 sreg_var=reg_var;
d35df41eac69 Initial revision
kono
parents:
diff changeset
603 reg_var=0;
87
1738f313f98b floating point (at most) done.
kono
parents: 86
diff changeset
604 argtypes = 0;
16
ca0bce3b4810 struct copy
kono
parents: 14
diff changeset
605 smode = mode;
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
606 mode=ADECL;
46
b1c8ac8c308d fix cascading struct retrun. Now it should be compatible with gcc
kono
parents: 45
diff changeset
607 args = 0;
67
254a0c576114 argument type list
kono
parents: 66
diff changeset
608 n->dsp=0;
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
609 for(;;) {
d35df41eac69 Initial revision
kono
parents:
diff changeset
610 if(sym==IDENT && nptr->sc!=TYPE) {
76
fb3fb9e9a462 *** empty log message ***
kono
parents: 75
diff changeset
611 type=INT; /* naked argument, old K&R C */
46
b1c8ac8c308d fix cascading struct retrun. Now it should be compatible with gcc
kono
parents: 45
diff changeset
612 def(nptr);
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
613 getsym();
d35df41eac69 Initial revision
kono
parents:
diff changeset
614 if(sym==RPAR) break;
d35df41eac69 Initial revision
kono
parents:
diff changeset
615 } else {
d35df41eac69 Initial revision
kono
parents:
diff changeset
616 if(sym==DOTS) {
87
1738f313f98b floating point (at most) done.
kono
parents: 86
diff changeset
617 argtypes=list2(DOTS,argtypes);
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
618 getsym();
d35df41eac69 Initial revision
kono
parents:
diff changeset
619 break;
d35df41eac69 Initial revision
kono
parents:
diff changeset
620 }
d35df41eac69 Initial revision
kono
parents:
diff changeset
621 if((t=typespec())==0) {
d35df41eac69 Initial revision
kono
parents:
diff changeset
622 error(DCERR);
d35df41eac69 Initial revision
kono
parents:
diff changeset
623 break;
d35df41eac69 Initial revision
kono
parents:
diff changeset
624 }
d35df41eac69 Initial revision
kono
parents:
diff changeset
625 if(sym!=COMMA && sym!=RPAR) {
d35df41eac69 Initial revision
kono
parents:
diff changeset
626 if(sym==RPAR) break;
d35df41eac69 Initial revision
kono
parents:
diff changeset
627 type=t;
79
82d0e30f61dd *** empty log message ***
kono
parents: 78
diff changeset
628 sargs = args;
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
629 arg=decl0();
79
82d0e30f61dd *** empty log message ***
kono
parents: 78
diff changeset
630 args = sargs;
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
631 reverse(t);
67
254a0c576114 argument type list
kono
parents: 66
diff changeset
632 if (arg != &null_nptr) {
254a0c576114 argument type list
kono
parents: 66
diff changeset
633 if (smode==GDECL)
254a0c576114 argument type list
kono
parents: 66
diff changeset
634 def(arg);
87
1738f313f98b floating point (at most) done.
kono
parents: 86
diff changeset
635 }
1738f313f98b floating point (at most) done.
kono
parents: 86
diff changeset
636 argtypes=list2(type,argtypes);
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
637 }
d35df41eac69 Initial revision
kono
parents:
diff changeset
638 if(sym==RPAR) break;
d35df41eac69 Initial revision
kono
parents:
diff changeset
639 }
d35df41eac69 Initial revision
kono
parents:
diff changeset
640 if (sym!=COMMA) error(DCERR);
d35df41eac69 Initial revision
kono
parents:
diff changeset
641 getsym();
d35df41eac69 Initial revision
kono
parents:
diff changeset
642 }
87
1738f313f98b floating point (at most) done.
kono
parents: 86
diff changeset
643 argtypes=reverse0(argtypes);
67
254a0c576114 argument type list
kono
parents: 66
diff changeset
644 n->dsp=reverse0(n->dsp);
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
645 checksym(RPAR);
16
ca0bce3b4810 struct copy
kono
parents: 14
diff changeset
646 mode=smode;
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
647 reg_var=sreg_var;
d35df41eac69 Initial revision
kono
parents:
diff changeset
648 fnptr=sfnptr;
d35df41eac69 Initial revision
kono
parents:
diff changeset
649 type=stype;
76
fb3fb9e9a462 *** empty log message ***
kono
parents: 75
diff changeset
650 sdecl_f = sd;
87
1738f313f98b floating point (at most) done.
kono
parents: 86
diff changeset
651 return argtypes;
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
652 }
d35df41eac69 Initial revision
kono
parents:
diff changeset
653
61
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents: 59
diff changeset
654 static void
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
655 reverse(int t1)
d35df41eac69 Initial revision
kono
parents:
diff changeset
656 {
d35df41eac69 Initial revision
kono
parents:
diff changeset
657 int t2,t3;
d35df41eac69 Initial revision
kono
parents:
diff changeset
658 t2=t1;
d35df41eac69 Initial revision
kono
parents:
diff changeset
659
d35df41eac69 Initial revision
kono
parents:
diff changeset
660 while(type!=t1) {
d35df41eac69 Initial revision
kono
parents:
diff changeset
661 t3=cadr(type);
d35df41eac69 Initial revision
kono
parents:
diff changeset
662 rplacad(type,t2);
d35df41eac69 Initial revision
kono
parents:
diff changeset
663 t2=type;
d35df41eac69 Initial revision
kono
parents:
diff changeset
664 type=t3;
d35df41eac69 Initial revision
kono
parents:
diff changeset
665 }
d35df41eac69 Initial revision
kono
parents:
diff changeset
666 type = t2;
d35df41eac69 Initial revision
kono
parents:
diff changeset
667 }
d35df41eac69 Initial revision
kono
parents:
diff changeset
668
d35df41eac69 Initial revision
kono
parents:
diff changeset
669 int
d35df41eac69 Initial revision
kono
parents:
diff changeset
670 reverse0(int t1)
d35df41eac69 Initial revision
kono
parents:
diff changeset
671 {
d35df41eac69 Initial revision
kono
parents:
diff changeset
672 int t2,t3;
d35df41eac69 Initial revision
kono
parents:
diff changeset
673
d35df41eac69 Initial revision
kono
parents:
diff changeset
674 t2=0;
d35df41eac69 Initial revision
kono
parents:
diff changeset
675 while(t1) {
d35df41eac69 Initial revision
kono
parents:
diff changeset
676 t3=cadr(t1);
d35df41eac69 Initial revision
kono
parents:
diff changeset
677 rplacad(t1,t2);
d35df41eac69 Initial revision
kono
parents:
diff changeset
678 t2=t1;
d35df41eac69 Initial revision
kono
parents:
diff changeset
679 t1=t3;
d35df41eac69 Initial revision
kono
parents:
diff changeset
680 }
d35df41eac69 Initial revision
kono
parents:
diff changeset
681 return t2;
d35df41eac69 Initial revision
kono
parents:
diff changeset
682 }
d35df41eac69 Initial revision
kono
parents:
diff changeset
683
d35df41eac69 Initial revision
kono
parents:
diff changeset
684 int
d35df41eac69 Initial revision
kono
parents:
diff changeset
685 size(int t)
d35df41eac69 Initial revision
kono
parents:
diff changeset
686 {
d35df41eac69 Initial revision
kono
parents:
diff changeset
687 if(t==CHAR) return 1;
d35df41eac69 Initial revision
kono
parents:
diff changeset
688 if(t==VOID) return 0;
76
fb3fb9e9a462 *** empty log message ***
kono
parents: 75
diff changeset
689 if(t==REGISTER) return size_of_int; /* could be float? */
3
kono
parents: 2
diff changeset
690 if(scalar(t)) return size_of_int;
81
f94ca1168520 float first try...
kono
parents: 80
diff changeset
691 if(t==FLOAT) return size_of_float;
f94ca1168520 float first try...
kono
parents: 80
diff changeset
692 if(t==DOUBLE) return size_of_double;
f94ca1168520 float first try...
kono
parents: 80
diff changeset
693 if(t==LONGLONG) return size_of_longlong;
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
694 if(car(t)==STRUCT||car(t)==UNION) {
d35df41eac69 Initial revision
kono
parents:
diff changeset
695 if(cadr(t)==-1) error(DCERR);
d35df41eac69 Initial revision
kono
parents:
diff changeset
696 return(cadr(t));
d35df41eac69 Initial revision
kono
parents:
diff changeset
697 }
d35df41eac69 Initial revision
kono
parents:
diff changeset
698 if(car(t)==ARRAY)
d35df41eac69 Initial revision
kono
parents:
diff changeset
699 return(size(cadr(t))*caddr(t));
77
2b8ba655e572 fix arg type
kono
parents: 76
diff changeset
700 else if(car(t)==CODE)
2b8ba655e572 fix arg type
kono
parents: 76
diff changeset
701 return size_of_int;
2b8ba655e572 fix arg type
kono
parents: 76
diff changeset
702 else if(car(t)==FUNCTION)
2b8ba655e572 fix arg type
kono
parents: 76
diff changeset
703 return size_of_int;
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
704 else
d35df41eac69 Initial revision
kono
parents:
diff changeset
705 error(DCERR);
d35df41eac69 Initial revision
kono
parents:
diff changeset
706 return 0;
d35df41eac69 Initial revision
kono
parents:
diff changeset
707 }
d35df41eac69 Initial revision
kono
parents:
diff changeset
708
61
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents: 59
diff changeset
709 static NMTBL *
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
710 def(NMTBL *n)
d35df41eac69 Initial revision
kono
parents:
diff changeset
711 {
81
f94ca1168520 float first try...
kono
parents: 80
diff changeset
712 int sz,nsc,ndsp;
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
713
67
254a0c576114 argument type list
kono
parents: 66
diff changeset
714 conv->def_(n);
37
412ad2e6c2a2 struct copy
kono
parents: 36
diff changeset
715 if (n==0) {
412ad2e6c2a2 struct copy
kono
parents: 36
diff changeset
716 n=free_nptr();
412ad2e6c2a2 struct copy
kono
parents: 36
diff changeset
717 n->nm = "_";
412ad2e6c2a2 struct copy
kono
parents: 36
diff changeset
718 }
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
719 nsc=ndsp=0;
d35df41eac69 Initial revision
kono
parents:
diff changeset
720 if(car(type)==FUNCTION) {
53
64a4e3789fd2 parallel assign works.
kono
parents: 50
diff changeset
721 if (n->sc==EXTRN || (mode==GDECL)) {
64a4e3789fd2 parallel assign works.
kono
parents: 50
diff changeset
722 fcheck(n);
64a4e3789fd2 parallel assign works.
kono
parents: 50
diff changeset
723 return n;
64a4e3789fd2 parallel assign works.
kono
parents: 50
diff changeset
724 }
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
725 }
d35df41eac69 Initial revision
kono
parents:
diff changeset
726 if (n->sc!=EMPTY &&
d35df41eac69 Initial revision
kono
parents:
diff changeset
727 !(n->sc==GVAR&&n->dsp==EXTRN) &&
d35df41eac69 Initial revision
kono
parents:
diff changeset
728 !(n->sc==FUNCTION&&n->dsp==EXTRN) &&
d35df41eac69 Initial revision
kono
parents:
diff changeset
729 (mode!=ADECL || n->sc!=LVAR || n->ty!=INT) &&
d35df41eac69 Initial revision
kono
parents:
diff changeset
730 (mode!=ADECL || n->sc!=REGISTER || n->ty!=INT) &&
d35df41eac69 Initial revision
kono
parents:
diff changeset
731 ((mode!=GSDECL&&mode!=LSDECL) || n->sc!=FIELD || n->dsp!=disp) &&
d35df41eac69 Initial revision
kono
parents:
diff changeset
732 ((mode!=GUDECL&&mode!=LUDECL) || n->sc!=FIELD || n->dsp!=0) )
d35df41eac69 Initial revision
kono
parents:
diff changeset
733 error(DCERR);
d35df41eac69 Initial revision
kono
parents:
diff changeset
734 sz = size(n->ty = type);
d35df41eac69 Initial revision
kono
parents:
diff changeset
735 switch(mode) {
d35df41eac69 Initial revision
kono
parents:
diff changeset
736 case GDECL:
d35df41eac69 Initial revision
kono
parents:
diff changeset
737 gen_gdecl(n->nm,gpc);
d35df41eac69 Initial revision
kono
parents:
diff changeset
738 case STADECL:
d35df41eac69 Initial revision
kono
parents:
diff changeset
739 nsc = GVAR;
d35df41eac69 Initial revision
kono
parents:
diff changeset
740 ndsp = gpc;
d35df41eac69 Initial revision
kono
parents:
diff changeset
741 if (stmode==EXTRN)
d35df41eac69 Initial revision
kono
parents:
diff changeset
742 n->dsp = EXTRN;
d35df41eac69 Initial revision
kono
parents:
diff changeset
743 else
d35df41eac69 Initial revision
kono
parents:
diff changeset
744 n->dsp = ndsp; /* emit_data will override this */
d35df41eac69 Initial revision
kono
parents:
diff changeset
745 n->sc = nsc;
d35df41eac69 Initial revision
kono
parents:
diff changeset
746 if (stmode==LDECL) {
d35df41eac69 Initial revision
kono
parents:
diff changeset
747 copy(n,n->nm);
d35df41eac69 Initial revision
kono
parents:
diff changeset
748 cheapp[-1] = '.';
d35df41eac69 Initial revision
kono
parents:
diff changeset
749 ndsp = ++stat_no;
d35df41eac69 Initial revision
kono
parents:
diff changeset
750 while(ndsp>0) {
d35df41eac69 Initial revision
kono
parents:
diff changeset
751 *cheapp++ = ndsp%10+'0';
d35df41eac69 Initial revision
kono
parents:
diff changeset
752 ndsp /= 10;
d35df41eac69 Initial revision
kono
parents:
diff changeset
753 }
d35df41eac69 Initial revision
kono
parents:
diff changeset
754 *cheapp++ = 0;
d35df41eac69 Initial revision
kono
parents:
diff changeset
755 }
d35df41eac69 Initial revision
kono
parents:
diff changeset
756 if(sym==ASS) {
76
fb3fb9e9a462 *** empty log message ***
kono
parents: 75
diff changeset
757 conv->op_(sym);
13
a8a812dace23 struct local initialization
kono
parents: 7
diff changeset
758 decl_data(type,n,0);
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
759 emit_data_closing(n);
d35df41eac69 Initial revision
kono
parents:
diff changeset
760 /* gpc is incremented by emit_data */
d35df41eac69 Initial revision
kono
parents:
diff changeset
761 } else
d35df41eac69 Initial revision
kono
parents:
diff changeset
762 gpc +=sz;
37
412ad2e6c2a2 struct copy
kono
parents: 36
diff changeset
763 return n;
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
764 case GSDECL:
d35df41eac69 Initial revision
kono
parents:
diff changeset
765 nsc = FIELD;
d35df41eac69 Initial revision
kono
parents:
diff changeset
766 ndsp = disp;
d35df41eac69 Initial revision
kono
parents:
diff changeset
767 disp += sz;
d35df41eac69 Initial revision
kono
parents:
diff changeset
768 break;
d35df41eac69 Initial revision
kono
parents:
diff changeset
769 case GUDECL:
d35df41eac69 Initial revision
kono
parents:
diff changeset
770 nsc = FIELD;
d35df41eac69 Initial revision
kono
parents:
diff changeset
771 ndsp = 0;
d35df41eac69 Initial revision
kono
parents:
diff changeset
772 if (disp < sz) disp = sz;
d35df41eac69 Initial revision
kono
parents:
diff changeset
773 break;
d35df41eac69 Initial revision
kono
parents:
diff changeset
774 case GTDECL:
d35df41eac69 Initial revision
kono
parents:
diff changeset
775 nsc = TYPE;
75
92dcf107a837 c code output
kono
parents: 72
diff changeset
776 if (gnptr!=n) error(-1);
92dcf107a837 c code output
kono
parents: 72
diff changeset
777 gtypedefed=glist2((int)gnptr,gtypedefed);
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
778 break;
d35df41eac69 Initial revision
kono
parents:
diff changeset
779 case ADECL:
79
82d0e30f61dd *** empty log message ***
kono
parents: 78
diff changeset
780 if(!integral(type)&&(car(type)==FUNCTION||car(type)==CODE)) {
82d0e30f61dd *** empty log message ***
kono
parents: 78
diff changeset
781 type=list2(POINTER,type); n->ty = type;
82d0e30f61dd *** empty log message ***
kono
parents: 78
diff changeset
782 }
82d0e30f61dd *** empty log message ***
kono
parents: 78
diff changeset
783 fnptr->dsp=list4(type,fnptr->dsp,(int)n,0);
53
64a4e3789fd2 parallel assign works.
kono
parents: 50
diff changeset
784 if (stmode==REGISTER && reg_var <MAX_REGISTER_VAR &&
80
83d901658ce9 *** empty log message ***
kono
parents: 79
diff changeset
785 size(type)==size_of_int) {
39
c63c4fdeb9a7 struct done.
kono
parents: 38
diff changeset
786 n->sc = REGISTER;
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
787 reg_var++;
79
82d0e30f61dd *** empty log message ***
kono
parents: 78
diff changeset
788 cadddr(fnptr->dsp)=size_of_int;
37
412ad2e6c2a2 struct copy
kono
parents: 36
diff changeset
789 return n;
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
790 }
39
c63c4fdeb9a7 struct done.
kono
parents: 38
diff changeset
791 n->sc = LVAR;
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
792 if(type==CHAR) {
39
c63c4fdeb9a7 struct done.
kono
parents: 38
diff changeset
793 if (n->dsp==0) {
c63c4fdeb9a7 struct done.
kono
parents: 38
diff changeset
794 n->dsp = args;
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
795 if (endian)
3
kono
parents: 2
diff changeset
796 n->dsp += size_of_int-1;
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
797 }
3
kono
parents: 2
diff changeset
798 args += size_of_int;
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
799 } else {
39
c63c4fdeb9a7 struct done.
kono
parents: 38
diff changeset
800 if (n->dsp==0)
c63c4fdeb9a7 struct done.
kono
parents: 38
diff changeset
801 n->dsp = args;
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
802 args += sz;
d35df41eac69 Initial revision
kono
parents:
diff changeset
803 }
79
82d0e30f61dd *** empty log message ***
kono
parents: 78
diff changeset
804 cadddr(fnptr->dsp)=sz;
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
805 if(type==VOID) {
81
f94ca1168520 float first try...
kono
parents: 80
diff changeset
806 } else {
f94ca1168520 float first try...
kono
parents: 80
diff changeset
807 n->ty = type;
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
808 }
37
412ad2e6c2a2 struct copy
kono
parents: 36
diff changeset
809 return n;
412ad2e6c2a2 struct copy
kono
parents: 36
diff changeset
810 case STAT: /* of course this is wrong */
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
811 case LDECL:
d35df41eac69 Initial revision
kono
parents:
diff changeset
812 if (stmode==REGISTER && reg_var <=MAX_REGISTER_VAR) {
d35df41eac69 Initial revision
kono
parents:
diff changeset
813 if(!scalar(type)) /* non integer register type ... */
d35df41eac69 Initial revision
kono
parents:
diff changeset
814 error(DCERR);
d35df41eac69 Initial revision
kono
parents:
diff changeset
815 nsc = REGISTER;
d35df41eac69 Initial revision
kono
parents:
diff changeset
816 reg_var++;
77
2b8ba655e572 fix arg type
kono
parents: 76
diff changeset
817 if ((ndsp = get_register_var())<0)
2b8ba655e572 fix arg type
kono
parents: 76
diff changeset
818 error(-1);
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
819 } else {
d35df41eac69 Initial revision
kono
parents:
diff changeset
820 nsc = LVAR;
d35df41eac69 Initial revision
kono
parents:
diff changeset
821 ndsp = (disp -= sz);
d35df41eac69 Initial revision
kono
parents:
diff changeset
822 }
14
77c0710a8729 struct copy
kono
parents: 13
diff changeset
823 n->sc = nsc;
77c0710a8729 struct copy
kono
parents: 13
diff changeset
824 n->dsp = ndsp;
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
825 if(sym==ASS) {
76
fb3fb9e9a462 *** empty log message ***
kono
parents: 75
diff changeset
826 conv->op_(sym);
13
a8a812dace23 struct local initialization
kono
parents: 7
diff changeset
827 decl_data(type,n,0);
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
828 }
37
412ad2e6c2a2 struct copy
kono
parents: 36
diff changeset
829 return n;
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
830 case LSDECL:
d35df41eac69 Initial revision
kono
parents:
diff changeset
831 nsc = FIELD;
d35df41eac69 Initial revision
kono
parents:
diff changeset
832 ndsp = disp;
d35df41eac69 Initial revision
kono
parents:
diff changeset
833 disp += sz;
d35df41eac69 Initial revision
kono
parents:
diff changeset
834 break;
d35df41eac69 Initial revision
kono
parents:
diff changeset
835 case LUDECL:
d35df41eac69 Initial revision
kono
parents:
diff changeset
836 nsc = FIELD;
d35df41eac69 Initial revision
kono
parents:
diff changeset
837 ndsp = 0;
d35df41eac69 Initial revision
kono
parents:
diff changeset
838 if (disp < sz) disp = sz;
d35df41eac69 Initial revision
kono
parents:
diff changeset
839 break;
d35df41eac69 Initial revision
kono
parents:
diff changeset
840 case LTDECL:
d35df41eac69 Initial revision
kono
parents:
diff changeset
841 nsc = TYPE;
d35df41eac69 Initial revision
kono
parents:
diff changeset
842 break;
d35df41eac69 Initial revision
kono
parents:
diff changeset
843 default:
d35df41eac69 Initial revision
kono
parents:
diff changeset
844 error(DCERR);
d35df41eac69 Initial revision
kono
parents:
diff changeset
845 }
d35df41eac69 Initial revision
kono
parents:
diff changeset
846 n->sc = nsc;
d35df41eac69 Initial revision
kono
parents:
diff changeset
847 if (stmode==EXTRN)
d35df41eac69 Initial revision
kono
parents:
diff changeset
848 n->dsp = EXTRN;
d35df41eac69 Initial revision
kono
parents:
diff changeset
849 else
d35df41eac69 Initial revision
kono
parents:
diff changeset
850 n->dsp = ndsp;
37
412ad2e6c2a2 struct copy
kono
parents: 36
diff changeset
851 return n;
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
852 }
d35df41eac69 Initial revision
kono
parents:
diff changeset
853
61
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents: 59
diff changeset
854 static void
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
855 emit_init_vars(void)
d35df41eac69 Initial revision
kono
parents:
diff changeset
856 {
13
a8a812dace23 struct local initialization
kono
parents: 7
diff changeset
857 if (!init_vars) return;
a8a812dace23 struct local initialization
kono
parents: 7
diff changeset
858 init_vars = reverse0(init_vars);
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
859 while(init_vars) {
83
f3f75911d62c *** empty log message ***
kono
parents: 82
diff changeset
860 gexpr(car(init_vars),0);
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
861 init_vars = cadr(init_vars);
d35df41eac69 Initial revision
kono
parents:
diff changeset
862 }
d35df41eac69 Initial revision
kono
parents:
diff changeset
863 }
d35df41eac69 Initial revision
kono
parents:
diff changeset
864
13
a8a812dace23 struct local initialization
kono
parents: 7
diff changeset
865 int
a8a812dace23 struct local initialization
kono
parents: 7
diff changeset
866 assign_data(int e, int t, NMTBL *n,int offset)
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
867 {
d35df41eac69 Initial revision
kono
parents:
diff changeset
868 int ass;
d35df41eac69 Initial revision
kono
parents:
diff changeset
869
d35df41eac69 Initial revision
kono
parents:
diff changeset
870 if(mode==GDECL) {
13
a8a812dace23 struct local initialization
kono
parents: 7
diff changeset
871 emit_data(e,t,n);
a8a812dace23 struct local initialization
kono
parents: 7
diff changeset
872 return offset+size(t);
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
873 } else if(mode==LDECL) {
82
25654dc29ecc First Floating Point coding done.
kono
parents: 81
diff changeset
874 ass = assign_expr0(list2(LVAR,n->dsp+offset),e,t,type);
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
875 init_vars = list2(ass,init_vars);
13
a8a812dace23 struct local initialization
kono
parents: 7
diff changeset
876 return offset+size(t);
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
877 } else {
d35df41eac69 Initial revision
kono
parents:
diff changeset
878 error(DCERR);
d35df41eac69 Initial revision
kono
parents:
diff changeset
879 }
18
df7fa8cee67b pass -Wall
kono
parents: 16
diff changeset
880 return 0; /* not reached */
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
881 }
d35df41eac69 Initial revision
kono
parents:
diff changeset
882
61
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents: 59
diff changeset
883 static int
13
a8a812dace23 struct local initialization
kono
parents: 7
diff changeset
884 decl_data(int t, NMTBL *n,int offset)
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
885 {
32
b35787d8a442 macro initialization
kono
parents: 31
diff changeset
886 int t1,e,i,mode_save;
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
887
69
dba8d111b7a0 c output
kono
parents: 68
diff changeset
888 conv->decl_data_();
32
b35787d8a442 macro initialization
kono
parents: 31
diff changeset
889 mode_save = mode;
b35787d8a442 macro initialization
kono
parents: 31
diff changeset
890 mode=STAT;
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
891 getsym();
d35df41eac69 Initial revision
kono
parents:
diff changeset
892 if (scalar(t)) {
d35df41eac69 Initial revision
kono
parents:
diff changeset
893 e=expr1();
32
b35787d8a442 macro initialization
kono
parents: 31
diff changeset
894 mode = mode_save;
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
895 if(car(e)!=CONST && t==CHAR)
d35df41eac69 Initial revision
kono
parents:
diff changeset
896 error(TYERR);
13
a8a812dace23 struct local initialization
kono
parents: 7
diff changeset
897 offset = assign_data(e,t,n,offset);
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
898 type=t;
13
a8a812dace23 struct local initialization
kono
parents: 7
diff changeset
899 return offset;
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
900 }
82
25654dc29ecc First Floating Point coding done.
kono
parents: 81
diff changeset
901 if (t==FLOAT||t==DOUBLE) {
25654dc29ecc First Floating Point coding done.
kono
parents: 81
diff changeset
902 e=expr1();
25654dc29ecc First Floating Point coding done.
kono
parents: 81
diff changeset
903 mode = mode_save;
25654dc29ecc First Floating Point coding done.
kono
parents: 81
diff changeset
904 offset = assign_data(e,t,n,offset);
25654dc29ecc First Floating Point coding done.
kono
parents: 81
diff changeset
905 type=t;
25654dc29ecc First Floating Point coding done.
kono
parents: 81
diff changeset
906 return offset;
25654dc29ecc First Floating Point coding done.
kono
parents: 81
diff changeset
907 }
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
908 t1 = car(t);
d35df41eac69 Initial revision
kono
parents:
diff changeset
909 if (t1==ARRAY) {
d35df41eac69 Initial revision
kono
parents:
diff changeset
910 if (sym==LC) {
66
0b068058dd67 *** empty log message ***
kono
parents: 65
diff changeset
911 conv->decl_data_begin_();
32
b35787d8a442 macro initialization
kono
parents: 31
diff changeset
912 mode = mode_save;
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
913 t1 = cadr(t);
d35df41eac69 Initial revision
kono
parents:
diff changeset
914 for(i=0;;i++) {
d35df41eac69 Initial revision
kono
parents:
diff changeset
915 if (sym!=RC)
32
b35787d8a442 macro initialization
kono
parents: 31
diff changeset
916 offset=decl_data(t1,n,offset); /* array of some thing */
66
0b068058dd67 *** empty log message ***
kono
parents: 65
diff changeset
917 if (sym==COMMA) {
0b068058dd67 *** empty log message ***
kono
parents: 65
diff changeset
918 conv->comma_();
0b068058dd67 *** empty log message ***
kono
parents: 65
diff changeset
919 continue;
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
920 } else if (sym==RC) {
66
0b068058dd67 *** empty log message ***
kono
parents: 65
diff changeset
921 conv->decl_data_end_();
13
a8a812dace23 struct local initialization
kono
parents: 7
diff changeset
922 if (caddr(t)==0) { /* size not defined */
a8a812dace23 struct local initialization
kono
parents: 7
diff changeset
923 heap[t+2]=i+1; /* define array size */
a8a812dace23 struct local initialization
kono
parents: 7
diff changeset
924 } else if (caddr(t)!=i+1) { /* size match? */
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
925 error(TYERR);
d35df41eac69 Initial revision
kono
parents:
diff changeset
926 }
d35df41eac69 Initial revision
kono
parents:
diff changeset
927 getsym();
13
a8a812dace23 struct local initialization
kono
parents: 7
diff changeset
928 return offset;
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
929 } else {
d35df41eac69 Initial revision
kono
parents:
diff changeset
930 error(TYERR);
d35df41eac69 Initial revision
kono
parents:
diff changeset
931 }
d35df41eac69 Initial revision
kono
parents:
diff changeset
932 }
66
0b068058dd67 *** empty log message ***
kono
parents: 65
diff changeset
933 /* NOT REACHED */
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
934 } else if (cadr(t)==CHAR) {
d35df41eac69 Initial revision
kono
parents:
diff changeset
935 e=expr1();
32
b35787d8a442 macro initialization
kono
parents: 31
diff changeset
936 mode = mode_save;
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
937 if(car(e)!=STRING)
d35df41eac69 Initial revision
kono
parents:
diff changeset
938 error(TYERR);
13
a8a812dace23 struct local initialization
kono
parents: 7
diff changeset
939 offset=assign_data(e,list3(ARRAY,CHAR,size(type)),n,offset);
a8a812dace23 struct local initialization
kono
parents: 7
diff changeset
940 if (caddr(t)==0) { /* size not defined */
a8a812dace23 struct local initialization
kono
parents: 7
diff changeset
941 heap[t+2]=size(type); /* define array size */
a8a812dace23 struct local initialization
kono
parents: 7
diff changeset
942 } else if (caddr(t)!=size(type)) { /* size match? */
a8a812dace23 struct local initialization
kono
parents: 7
diff changeset
943 error(TYERR);
a8a812dace23 struct local initialization
kono
parents: 7
diff changeset
944 }
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
945 } else
d35df41eac69 Initial revision
kono
parents:
diff changeset
946 error(DCERR);
d35df41eac69 Initial revision
kono
parents:
diff changeset
947 } else if (t1==STRUCT) {
76
fb3fb9e9a462 *** empty log message ***
kono
parents: 75
diff changeset
948 if (sym==LC) {
fb3fb9e9a462 *** empty log message ***
kono
parents: 75
diff changeset
949 conv->lc_(); conv->decl_data_begin_();
fb3fb9e9a462 *** empty log message ***
kono
parents: 75
diff changeset
950 mode = mode_save;
fb3fb9e9a462 *** empty log message ***
kono
parents: 75
diff changeset
951 if(cadr(t)==-1) error(DCERR);
fb3fb9e9a462 *** empty log message ***
kono
parents: 75
diff changeset
952 t1 = caddr(t); /* list of fields */
fb3fb9e9a462 *** empty log message ***
kono
parents: 75
diff changeset
953 while(t1) {
fb3fb9e9a462 *** empty log message ***
kono
parents: 75
diff changeset
954 offset = decl_data(car(t1),n,offset); /* alignment? */
fb3fb9e9a462 *** empty log message ***
kono
parents: 75
diff changeset
955 t1 = cadr(t1);
fb3fb9e9a462 *** empty log message ***
kono
parents: 75
diff changeset
956 if ( t1 && sym==COMMA) { conv->comma_(); continue; }
fb3fb9e9a462 *** empty log message ***
kono
parents: 75
diff changeset
957 if (!t1 && sym!=RC) error(DCERR);
fb3fb9e9a462 *** empty log message ***
kono
parents: 75
diff changeset
958 }
fb3fb9e9a462 *** empty log message ***
kono
parents: 75
diff changeset
959 conv->decl_data_end_(); conv->rc_();
fb3fb9e9a462 *** empty log message ***
kono
parents: 75
diff changeset
960 getsym();
fb3fb9e9a462 *** empty log message ***
kono
parents: 75
diff changeset
961 return offset;
fb3fb9e9a462 *** empty log message ***
kono
parents: 75
diff changeset
962 } else
fb3fb9e9a462 *** empty log message ***
kono
parents: 75
diff changeset
963 error(DCERR);
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
964 } else {
32
b35787d8a442 macro initialization
kono
parents: 31
diff changeset
965 mode = mode_save;
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
966 error(TYERR); /* should be initialization error */
d35df41eac69 Initial revision
kono
parents:
diff changeset
967 }
18
df7fa8cee67b pass -Wall
kono
parents: 16
diff changeset
968 return offset; /* not reached */
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
969 }
d35df41eac69 Initial revision
kono
parents:
diff changeset
970
61
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents: 59
diff changeset
971 static int
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
972 sdecl(int s)
d35df41eac69 Initial revision
kono
parents:
diff changeset
973 {
18
df7fa8cee67b pass -Wall
kono
parents: 16
diff changeset
974 int smode,sdisp,type0;
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
975 NMTBL *nptr0,*gnptr0;
d35df41eac69 Initial revision
kono
parents:
diff changeset
976 int tags;
d35df41eac69 Initial revision
kono
parents:
diff changeset
977
d35df41eac69 Initial revision
kono
parents:
diff changeset
978 smode=mode;
d35df41eac69 Initial revision
kono
parents:
diff changeset
979 if (mode==GDECL || mode==GSDECL || mode==GUDECL || mode==GTDECL)
d35df41eac69 Initial revision
kono
parents:
diff changeset
980 mode=(s==STRUCT?GSDECL:GUDECL);
d35df41eac69 Initial revision
kono
parents:
diff changeset
981 else
d35df41eac69 Initial revision
kono
parents:
diff changeset
982 mode=(s==STRUCT?LSDECL:LUDECL);
d35df41eac69 Initial revision
kono
parents:
diff changeset
983 sdisp=disp;
d35df41eac69 Initial revision
kono
parents:
diff changeset
984 disp=0;
76
fb3fb9e9a462 *** empty log message ***
kono
parents: 75
diff changeset
985 if (sdecl_f) conv->sdecl_(s);
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
986 if (getsym() == IDENT) {
d35df41eac69 Initial revision
kono
parents:
diff changeset
987 nptr0 = nptr;
d35df41eac69 Initial revision
kono
parents:
diff changeset
988 gnptr0 = gnptr;
76
fb3fb9e9a462 *** empty log message ***
kono
parents: 75
diff changeset
989 if (sdecl_f) conv->id_(sym,nptr);
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
990 if (getsym() == LC) {
76
fb3fb9e9a462 *** empty log message ***
kono
parents: 75
diff changeset
991 if (sdecl_f) conv->lc_();
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
992 if (nptr0->sc != EMPTY) error(DCERR);
d35df41eac69 Initial revision
kono
parents:
diff changeset
993 nptr0->sc = TAG;
d35df41eac69 Initial revision
kono
parents:
diff changeset
994 tags = 0;
67
254a0c576114 argument type list
kono
parents: 66
diff changeset
995 nptr0->ty = list4(s,-1,tags,(int)nptr0);
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
996 while (getsym() != RC) {
d35df41eac69 Initial revision
kono
parents:
diff changeset
997 decl();
67
254a0c576114 argument type list
kono
parents: 66
diff changeset
998 tags = list3(type,tags,(int)nptr);
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
999 }
76
fb3fb9e9a462 *** empty log message ***
kono
parents: 75
diff changeset
1000 if (sdecl_f) conv->rc_();
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
1001 getsym();
d35df41eac69 Initial revision
kono
parents:
diff changeset
1002 tags=reverse0(tags);
d35df41eac69 Initial revision
kono
parents:
diff changeset
1003 heap[nptr0->ty+2]=tags;
d35df41eac69 Initial revision
kono
parents:
diff changeset
1004 rplacad(type0 = nptr0->ty,disp);
d35df41eac69 Initial revision
kono
parents:
diff changeset
1005 } else {
13
a8a812dace23 struct local initialization
kono
parents: 7
diff changeset
1006 /* struct tag name */
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
1007 if(nptr0->sc == EMPTY) nptr0=gnptr0;
d35df41eac69 Initial revision
kono
parents:
diff changeset
1008 if(nptr0->sc == EMPTY) error(UDERR);
d35df41eac69 Initial revision
kono
parents:
diff changeset
1009 if(nptr0->sc != TAG) error(TYERR);
13
a8a812dace23 struct local initialization
kono
parents: 7
diff changeset
1010 tags = caddr(nptr0->ty);
a8a812dace23 struct local initialization
kono
parents: 7
diff changeset
1011 disp = cadr(nptr0->ty);
76
fb3fb9e9a462 *** empty log message ***
kono
parents: 75
diff changeset
1012 conv->comment_(' ');
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
1013 }
67
254a0c576114 argument type list
kono
parents: 66
diff changeset
1014 type0 = list4(s,disp,tags,(int)nptr0);
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
1015 } else if(sym==LC) {
76
fb3fb9e9a462 *** empty log message ***
kono
parents: 75
diff changeset
1016 if (sdecl_f) conv->lc_();
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
1017 tags = 0;
d35df41eac69 Initial revision
kono
parents:
diff changeset
1018 while(getsym() != RC) {
d35df41eac69 Initial revision
kono
parents:
diff changeset
1019 decl();
67
254a0c576114 argument type list
kono
parents: 66
diff changeset
1020 tags = list3(type,tags,(int)nptr);
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
1021 }
76
fb3fb9e9a462 *** empty log message ***
kono
parents: 75
diff changeset
1022 if (sdecl_f) conv->rc_();
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
1023 getsym();
d35df41eac69 Initial revision
kono
parents:
diff changeset
1024 tags=reverse0(tags);
67
254a0c576114 argument type list
kono
parents: 66
diff changeset
1025 type0 = list4(s,disp,tags,0);
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
1026 }
d35df41eac69 Initial revision
kono
parents:
diff changeset
1027 else error(DCERR);
72
3b5d293cea36 type def etc
kono
parents: 71
diff changeset
1028 stypedecl=1;
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
1029 disp=sdisp;
d35df41eac69 Initial revision
kono
parents:
diff changeset
1030 mode=smode;
d35df41eac69 Initial revision
kono
parents:
diff changeset
1031 return type0;
d35df41eac69 Initial revision
kono
parents:
diff changeset
1032 }
d35df41eac69 Initial revision
kono
parents:
diff changeset
1033
61
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents: 59
diff changeset
1034 static void
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
1035 code_decl(NMTBL *n)
d35df41eac69 Initial revision
kono
parents:
diff changeset
1036 {
79
82d0e30f61dd *** empty log message ***
kono
parents: 78
diff changeset
1037 int t,arglist;
53
64a4e3789fd2 parallel assign works.
kono
parents: 50
diff changeset
1038
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
1039 if (n->sc==EMPTY) n->sc = CODE;
66
0b068058dd67 *** empty log message ***
kono
parents: 65
diff changeset
1040 if(!chk) code_enter(n->nm);
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
1041 fnptr=n;
3
kono
parents: 2
diff changeset
1042 disp = -args;
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
1043 mode=ADECL;
76
fb3fb9e9a462 *** empty log message ***
kono
parents: 75
diff changeset
1044 if (sym!=LC) {
fb3fb9e9a462 *** empty log message ***
kono
parents: 75
diff changeset
1045 stmode=REGISTER;
fb3fb9e9a462 *** empty log message ***
kono
parents: 75
diff changeset
1046 reg_var=0;
79
82d0e30f61dd *** empty log message ***
kono
parents: 78
diff changeset
1047 args=0; fnptr->dsp=0;
76
fb3fb9e9a462 *** empty log message ***
kono
parents: 75
diff changeset
1048 while (sym!=LC) { /* argument declaration !ANSI */
fb3fb9e9a462 *** empty log message ***
kono
parents: 75
diff changeset
1049 decl(); getsym();
fb3fb9e9a462 *** empty log message ***
kono
parents: 75
diff changeset
1050 }
fb3fb9e9a462 *** empty log message ***
kono
parents: 75
diff changeset
1051 fnptr->dsp=reverse0(fnptr->dsp);
fb3fb9e9a462 *** empty log message ***
kono
parents: 75
diff changeset
1052 disp = -args;
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
1053 }
53
64a4e3789fd2 parallel assign works.
kono
parents: 50
diff changeset
1054 /* reverse all argument offset (with size) */
79
82d0e30f61dd *** empty log message ***
kono
parents: 78
diff changeset
1055 arglist = fnptr->dsp;
53
64a4e3789fd2 parallel assign works.
kono
parents: 50
diff changeset
1056 for(t=arglist;t;t=cadr(t)) {
79
82d0e30f61dd *** empty log message ***
kono
parents: 78
diff changeset
1057 n=(NMTBL *)caddr(t);
53
64a4e3789fd2 parallel assign works.
kono
parents: 50
diff changeset
1058 if(n->sc==LVAR)
79
82d0e30f61dd *** empty log message ***
kono
parents: 78
diff changeset
1059 n->dsp = -n->dsp-cadddr(t);
53
64a4e3789fd2 parallel assign works.
kono
parents: 50
diff changeset
1060 }
79
82d0e30f61dd *** empty log message ***
kono
parents: 78
diff changeset
1061 arg_register(fnptr);
82d0e30f61dd *** empty log message ***
kono
parents: 78
diff changeset
1062 conv->code_(fnptr);
70
2e84590720a6 typedef name
kono
parents: 69
diff changeset
1063 typedefed=0;
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
1064 /* local variable declaration */
d35df41eac69 Initial revision
kono
parents:
diff changeset
1065 stmode=0;
d35df41eac69 Initial revision
kono
parents:
diff changeset
1066 mode=STAT;
d35df41eac69 Initial revision
kono
parents:
diff changeset
1067 init_vars=0;
d35df41eac69 Initial revision
kono
parents:
diff changeset
1068 while (typeid(getsym()) || sym==STATIC || sym==EXTRN || sym==TYPEDEF) {
d35df41eac69 Initial revision
kono
parents:
diff changeset
1069 mode=LDECL;
d35df41eac69 Initial revision
kono
parents:
diff changeset
1070 decl();
d35df41eac69 Initial revision
kono
parents:
diff changeset
1071 mode=STAT;
d35df41eac69 Initial revision
kono
parents:
diff changeset
1072 }
66
0b068058dd67 *** empty log message ***
kono
parents: 65
diff changeset
1073 conv->localvar_end_();
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
1074 control=1;
66
0b068058dd67 *** empty log message ***
kono
parents: 65
diff changeset
1075 if(!chk) code_enter1(args);
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
1076 emit_init_vars();
d35df41eac69 Initial revision
kono
parents:
diff changeset
1077 while(sym!=RC) statement();
d35df41eac69 Initial revision
kono
parents:
diff changeset
1078 if(control)
d35df41eac69 Initial revision
kono
parents:
diff changeset
1079 error(STERR);
d35df41eac69 Initial revision
kono
parents:
diff changeset
1080 control=0;
66
0b068058dd67 *** empty log message ***
kono
parents: 65
diff changeset
1081 conv->code_end_();
0b068058dd67 *** empty log message ***
kono
parents: 65
diff changeset
1082 if(!chk) code_leave(n->nm);
79
82d0e30f61dd *** empty log message ***
kono
parents: 78
diff changeset
1083 args = 0;
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
1084 }
d35df41eac69 Initial revision
kono
parents:
diff changeset
1085
45
b9266c88495c *** empty log message ***
kono
parents: 42
diff changeset
1086 static NMTBL *tmp_struct;
b9266c88495c *** empty log message ***
kono
parents: 42
diff changeset
1087
61
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents: 59
diff changeset
1088 static void
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
1089 fdecl(NMTBL *n)
d35df41eac69 Initial revision
kono
parents:
diff changeset
1090 {
75
92dcf107a837 c code output
kono
parents: 72
diff changeset
1091 int sd = stypedecl;
66
0b068058dd67 *** empty log message ***
kono
parents: 65
diff changeset
1092 if(!chk) enter(n->nm);
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
1093 fnptr=n;
d35df41eac69 Initial revision
kono
parents:
diff changeset
1094 retlabel=fwdlabel();
d35df41eac69 Initial revision
kono
parents:
diff changeset
1095 retcont = 0;
45
b9266c88495c *** empty log message ***
kono
parents: 42
diff changeset
1096 tmp_struct = 0;
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
1097
d35df41eac69 Initial revision
kono
parents:
diff changeset
1098 reg_var=0;
d35df41eac69 Initial revision
kono
parents:
diff changeset
1099 fcheck(n);
d35df41eac69 Initial revision
kono
parents:
diff changeset
1100 mode=ADECL;
67
254a0c576114 argument type list
kono
parents: 66
diff changeset
1101 if (sym!=LC) {
79
82d0e30f61dd *** empty log message ***
kono
parents: 78
diff changeset
1102 args=0; fnptr->dsp=0;
67
254a0c576114 argument type list
kono
parents: 66
diff changeset
1103 while (sym!=LC) { /* argument declaration !ANSI */
254a0c576114 argument type list
kono
parents: 66
diff changeset
1104 stmode=0;
254a0c576114 argument type list
kono
parents: 66
diff changeset
1105 decl(); getsym();
254a0c576114 argument type list
kono
parents: 66
diff changeset
1106 }
79
82d0e30f61dd *** empty log message ***
kono
parents: 78
diff changeset
1107 } else
67
254a0c576114 argument type list
kono
parents: 66
diff changeset
1108 fnptr->dsp=reverse0(fnptr->dsp);
46
b1c8ac8c308d fix cascading struct retrun. Now it should be compatible with gcc
kono
parents: 45
diff changeset
1109 fdecl_struct(fnptr->ty);
79
82d0e30f61dd *** empty log message ***
kono
parents: 78
diff changeset
1110 arg_register(fnptr);
70
2e84590720a6 typedef name
kono
parents: 69
diff changeset
1111 typedefed=0;
79
82d0e30f61dd *** empty log message ***
kono
parents: 78
diff changeset
1112 conv->function_(fnptr,sd); conv->lc_();
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
1113 disp=0;
d35df41eac69 Initial revision
kono
parents:
diff changeset
1114 init_vars=0;
d35df41eac69 Initial revision
kono
parents:
diff changeset
1115 /* local variable declaration */
d35df41eac69 Initial revision
kono
parents:
diff changeset
1116 mode=STAT;
d35df41eac69 Initial revision
kono
parents:
diff changeset
1117 while (typeid(getsym()) || sym==STATIC || sym==EXTRN
d35df41eac69 Initial revision
kono
parents:
diff changeset
1118 || sym==REGISTER || sym==TYPEDEF) {
d35df41eac69 Initial revision
kono
parents:
diff changeset
1119 mode=LDECL;
d35df41eac69 Initial revision
kono
parents:
diff changeset
1120 stmode=0;
d35df41eac69 Initial revision
kono
parents:
diff changeset
1121 decl();
d35df41eac69 Initial revision
kono
parents:
diff changeset
1122 mode=STAT;
d35df41eac69 Initial revision
kono
parents:
diff changeset
1123 }
66
0b068058dd67 *** empty log message ***
kono
parents: 65
diff changeset
1124 conv->localvar_end_();
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
1125 control=1;
66
0b068058dd67 *** empty log message ***
kono
parents: 65
diff changeset
1126 if(!chk) enter1();
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
1127 emit_init_vars();
d35df41eac69 Initial revision
kono
parents:
diff changeset
1128 while(sym!=RC) statement();
d35df41eac69 Initial revision
kono
parents:
diff changeset
1129
68
0266905063b5 *** empty log message ***
kono
parents: 67
diff changeset
1130 conv->function_end_(); conv->rc_();
66
0b068058dd67 *** empty log message ***
kono
parents: 65
diff changeset
1131 if(!chk) leave(control,n->nm);
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
1132 retpending = 0;
d35df41eac69 Initial revision
kono
parents:
diff changeset
1133 control=0;
75
92dcf107a837 c code output
kono
parents: 72
diff changeset
1134 arglist=0;
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
1135 }
d35df41eac69 Initial revision
kono
parents:
diff changeset
1136
76
fb3fb9e9a462 *** empty log message ***
kono
parents: 75
diff changeset
1137 extern NMTBL str_ret;
fb3fb9e9a462 *** empty log message ***
kono
parents: 75
diff changeset
1138 NMTBL str_ret;
46
b1c8ac8c308d fix cascading struct retrun. Now it should be compatible with gcc
kono
parents: 45
diff changeset
1139
66
0b068058dd67 *** empty log message ***
kono
parents: 65
diff changeset
1140 /*
0b068058dd67 *** empty log message ***
kono
parents: 65
diff changeset
1141 If function has structure return value, it has extra
0b068058dd67 *** empty log message ***
kono
parents: 65
diff changeset
1142 argument for where to write the structure. It have to be
0b068058dd67 *** empty log message ***
kono
parents: 65
diff changeset
1143 a first argument. We add it here and we have to fix all arguments'
0b068058dd67 *** empty log message ***
kono
parents: 65
diff changeset
1144 offset. If it is the last value, we don't have to fix, but
0b068058dd67 *** empty log message ***
kono
parents: 65
diff changeset
1145 gcc has a first argument convention.
0b068058dd67 *** empty log message ***
kono
parents: 65
diff changeset
1146 */
0b068058dd67 *** empty log message ***
kono
parents: 65
diff changeset
1147
61
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents: 59
diff changeset
1148 static void
46
b1c8ac8c308d fix cascading struct retrun. Now it should be compatible with gcc
kono
parents: 45
diff changeset
1149 fdecl_struct(int fntype)
b1c8ac8c308d fix cascading struct retrun. Now it should be compatible with gcc
kono
parents: 45
diff changeset
1150 {
b1c8ac8c308d fix cascading struct retrun. Now it should be compatible with gcc
kono
parents: 45
diff changeset
1151 int type_save,mode_save,t,sz;
b1c8ac8c308d fix cascading struct retrun. Now it should be compatible with gcc
kono
parents: 45
diff changeset
1152 NMTBL *n;
b1c8ac8c308d fix cascading struct retrun. Now it should be compatible with gcc
kono
parents: 45
diff changeset
1153
67
254a0c576114 argument type list
kono
parents: 66
diff changeset
1154 t = fntype;
46
b1c8ac8c308d fix cascading struct retrun. Now it should be compatible with gcc
kono
parents: 45
diff changeset
1155 if (!scalar(t) && (car(t)==STRUCT||car(t)==UNION)) {
b1c8ac8c308d fix cascading struct retrun. Now it should be compatible with gcc
kono
parents: 45
diff changeset
1156 mode_save = mode;
b1c8ac8c308d fix cascading struct retrun. Now it should be compatible with gcc
kono
parents: 45
diff changeset
1157 mode=ADECL;
b1c8ac8c308d fix cascading struct retrun. Now it should be compatible with gcc
kono
parents: 45
diff changeset
1158 type_save = type;
b1c8ac8c308d fix cascading struct retrun. Now it should be compatible with gcc
kono
parents: 45
diff changeset
1159 /* extra argument for struct return */
b1c8ac8c308d fix cascading struct retrun. Now it should be compatible with gcc
kono
parents: 45
diff changeset
1160 /* this extra dummy arguments are set at calling sequence */
b1c8ac8c308d fix cascading struct retrun. Now it should be compatible with gcc
kono
parents: 45
diff changeset
1161 str_ret.nm = "str_ret"; str_ret.sc = EMPTY;
b1c8ac8c308d fix cascading struct retrun. Now it should be compatible with gcc
kono
parents: 45
diff changeset
1162 str_ret.dsp = 0; str_ret.ty = 0;
b1c8ac8c308d fix cascading struct retrun. Now it should be compatible with gcc
kono
parents: 45
diff changeset
1163 type=list2(POINTER,t);
b1c8ac8c308d fix cascading struct retrun. Now it should be compatible with gcc
kono
parents: 45
diff changeset
1164 /* fix all arguments's offset */
b1c8ac8c308d fix cascading struct retrun. Now it should be compatible with gcc
kono
parents: 45
diff changeset
1165 sz = size(type);
79
82d0e30f61dd *** empty log message ***
kono
parents: 78
diff changeset
1166 for(t=fnptr->dsp;t;t=cadr(t)) {
82d0e30f61dd *** empty log message ***
kono
parents: 78
diff changeset
1167 n=(NMTBL *)caddr(t);
46
b1c8ac8c308d fix cascading struct retrun. Now it should be compatible with gcc
kono
parents: 45
diff changeset
1168 n->dsp += sz;
b1c8ac8c308d fix cascading struct retrun. Now it should be compatible with gcc
kono
parents: 45
diff changeset
1169 }
79
82d0e30f61dd *** empty log message ***
kono
parents: 78
diff changeset
1170 fnptr->dsp = reverse0(fnptr->dsp);
67
254a0c576114 argument type list
kono
parents: 66
diff changeset
1171 if ((t=size(fntype))==-1) error(TYERR);
46
b1c8ac8c308d fix cascading struct retrun. Now it should be compatible with gcc
kono
parents: 45
diff changeset
1172 else {
b1c8ac8c308d fix cascading struct retrun. Now it should be compatible with gcc
kono
parents: 45
diff changeset
1173 args = 0;
b1c8ac8c308d fix cascading struct retrun. Now it should be compatible with gcc
kono
parents: 45
diff changeset
1174 def(&str_ret);
b1c8ac8c308d fix cascading struct retrun. Now it should be compatible with gcc
kono
parents: 45
diff changeset
1175 struct_return = list3(list2(LVAR,str_ret.dsp),t,type);
b1c8ac8c308d fix cascading struct retrun. Now it should be compatible with gcc
kono
parents: 45
diff changeset
1176 }
b1c8ac8c308d fix cascading struct retrun. Now it should be compatible with gcc
kono
parents: 45
diff changeset
1177 type = type_save;
b1c8ac8c308d fix cascading struct retrun. Now it should be compatible with gcc
kono
parents: 45
diff changeset
1178 mode = mode_save;
b1c8ac8c308d fix cascading struct retrun. Now it should be compatible with gcc
kono
parents: 45
diff changeset
1179 } else {
b1c8ac8c308d fix cascading struct retrun. Now it should be compatible with gcc
kono
parents: 45
diff changeset
1180 struct_return = 0;
79
82d0e30f61dd *** empty log message ***
kono
parents: 78
diff changeset
1181 fnptr->dsp = reverse0(fnptr->dsp);
46
b1c8ac8c308d fix cascading struct retrun. Now it should be compatible with gcc
kono
parents: 45
diff changeset
1182 }
b1c8ac8c308d fix cascading struct retrun. Now it should be compatible with gcc
kono
parents: 45
diff changeset
1183 }
b1c8ac8c308d fix cascading struct retrun. Now it should be compatible with gcc
kono
parents: 45
diff changeset
1184
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
1185 void
d35df41eac69 Initial revision
kono
parents:
diff changeset
1186 fcheck(NMTBL *n)
d35df41eac69 Initial revision
kono
parents:
diff changeset
1187 {
53
64a4e3789fd2 parallel assign works.
kono
parents: 50
diff changeset
1188 if(!(mode==GDECL||mode==ADECL)||car(type)!=FUNCTION) error(DCERR);
67
254a0c576114 argument type list
kono
parents: 66
diff changeset
1189 if(n->sc==FUNCTION) compatible(n->ty,cadr(type));
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
1190 else {
d35df41eac69 Initial revision
kono
parents:
diff changeset
1191 if(n->sc!=EMPTY)
d35df41eac69 Initial revision
kono
parents:
diff changeset
1192 error(DCERR);
d35df41eac69 Initial revision
kono
parents:
diff changeset
1193 else {
d35df41eac69 Initial revision
kono
parents:
diff changeset
1194 n->sc=FUNCTION;
67
254a0c576114 argument type list
kono
parents: 66
diff changeset
1195 n->ty=cadr(type);
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
1196 }
d35df41eac69 Initial revision
kono
parents:
diff changeset
1197 }
d35df41eac69 Initial revision
kono
parents:
diff changeset
1198 }
d35df41eac69 Initial revision
kono
parents:
diff changeset
1199
61
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents: 59
diff changeset
1200 static void
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
1201 compatible(int t1, int t2)
d35df41eac69 Initial revision
kono
parents:
diff changeset
1202 {
d35df41eac69 Initial revision
kono
parents:
diff changeset
1203 if(integral(t1)) {
d35df41eac69 Initial revision
kono
parents:
diff changeset
1204 if(t1!=t2) error(TYERR);
d35df41eac69 Initial revision
kono
parents:
diff changeset
1205 }
d35df41eac69 Initial revision
kono
parents:
diff changeset
1206 else if(car(t1)!=car(t2))
d35df41eac69 Initial revision
kono
parents:
diff changeset
1207 error(TYERR);
d35df41eac69 Initial revision
kono
parents:
diff changeset
1208 else if((car(t1)==STRUCT || car(t1)==UNION) && cadr(t1)!=cadr(t2))
d35df41eac69 Initial revision
kono
parents:
diff changeset
1209 error(TYERR);
d35df41eac69 Initial revision
kono
parents:
diff changeset
1210 else if(car(t1)==POINTER || car(t1)==ARRAY ||car(t1)==FUNCTION)
d35df41eac69 Initial revision
kono
parents:
diff changeset
1211 compatible(cadr(t1),cadr(t2));
d35df41eac69 Initial revision
kono
parents:
diff changeset
1212 }
d35df41eac69 Initial revision
kono
parents:
diff changeset
1213
d35df41eac69 Initial revision
kono
parents:
diff changeset
1214 int
d35df41eac69 Initial revision
kono
parents:
diff changeset
1215 scalar(int t)
d35df41eac69 Initial revision
kono
parents:
diff changeset
1216 {
d35df41eac69 Initial revision
kono
parents:
diff changeset
1217 return(integral(t)||car(t)==POINTER);
d35df41eac69 Initial revision
kono
parents:
diff changeset
1218 }
d35df41eac69 Initial revision
kono
parents:
diff changeset
1219
d35df41eac69 Initial revision
kono
parents:
diff changeset
1220 int
d35df41eac69 Initial revision
kono
parents:
diff changeset
1221 integral(int t)
d35df41eac69 Initial revision
kono
parents:
diff changeset
1222 {
d35df41eac69 Initial revision
kono
parents:
diff changeset
1223 return(t==INT||t==CHAR||t==UNSIGNED);
d35df41eac69 Initial revision
kono
parents:
diff changeset
1224 }
d35df41eac69 Initial revision
kono
parents:
diff changeset
1225
61
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents: 59
diff changeset
1226 static void
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
1227 checkret(void)
d35df41eac69 Initial revision
kono
parents:
diff changeset
1228 {
d35df41eac69 Initial revision
kono
parents:
diff changeset
1229 if (retpending) {
d35df41eac69 Initial revision
kono
parents:
diff changeset
1230 ret();
d35df41eac69 Initial revision
kono
parents:
diff changeset
1231 control=0;
d35df41eac69 Initial revision
kono
parents:
diff changeset
1232 retpending=0;
d35df41eac69 Initial revision
kono
parents:
diff changeset
1233 }
d35df41eac69 Initial revision
kono
parents:
diff changeset
1234 }
d35df41eac69 Initial revision
kono
parents:
diff changeset
1235
61
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents: 59
diff changeset
1236 static void
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
1237 statement(void)
d35df41eac69 Initial revision
kono
parents:
diff changeset
1238 {
d35df41eac69 Initial revision
kono
parents:
diff changeset
1239 int slfree;
d35df41eac69 Initial revision
kono
parents:
diff changeset
1240
d35df41eac69 Initial revision
kono
parents:
diff changeset
1241 if(sym==SM) {
66
0b068058dd67 *** empty log message ***
kono
parents: 65
diff changeset
1242 conv->sm_();
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
1243 getsym(); return;
d35df41eac69 Initial revision
kono
parents:
diff changeset
1244 }
d35df41eac69 Initial revision
kono
parents:
diff changeset
1245 checkret();
d35df41eac69 Initial revision
kono
parents:
diff changeset
1246 switch(sym) {
d35df41eac69 Initial revision
kono
parents:
diff changeset
1247 case IF:
d35df41eac69 Initial revision
kono
parents:
diff changeset
1248 doif();
d35df41eac69 Initial revision
kono
parents:
diff changeset
1249 return;
d35df41eac69 Initial revision
kono
parents:
diff changeset
1250 case WHILE:
d35df41eac69 Initial revision
kono
parents:
diff changeset
1251 dowhile();
d35df41eac69 Initial revision
kono
parents:
diff changeset
1252 return;
d35df41eac69 Initial revision
kono
parents:
diff changeset
1253 case DO:
d35df41eac69 Initial revision
kono
parents:
diff changeset
1254 dodo();
d35df41eac69 Initial revision
kono
parents:
diff changeset
1255 return;
d35df41eac69 Initial revision
kono
parents:
diff changeset
1256 case FOR:
d35df41eac69 Initial revision
kono
parents:
diff changeset
1257 dofor();
d35df41eac69 Initial revision
kono
parents:
diff changeset
1258 return;
d35df41eac69 Initial revision
kono
parents:
diff changeset
1259 case SWITCH:
d35df41eac69 Initial revision
kono
parents:
diff changeset
1260 doswitch();
d35df41eac69 Initial revision
kono
parents:
diff changeset
1261 return;
d35df41eac69 Initial revision
kono
parents:
diff changeset
1262 case LC:
d35df41eac69 Initial revision
kono
parents:
diff changeset
1263 docomp();
d35df41eac69 Initial revision
kono
parents:
diff changeset
1264 return;
d35df41eac69 Initial revision
kono
parents:
diff changeset
1265 case BREAK:
69
dba8d111b7a0 c output
kono
parents: 68
diff changeset
1266 conv->break_();
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
1267 jmp(blabel);
d35df41eac69 Initial revision
kono
parents:
diff changeset
1268 getsym();
d35df41eac69 Initial revision
kono
parents:
diff changeset
1269 checksym(SM);
d35df41eac69 Initial revision
kono
parents:
diff changeset
1270 return;
d35df41eac69 Initial revision
kono
parents:
diff changeset
1271 case CONTINUE:
69
dba8d111b7a0 c output
kono
parents: 68
diff changeset
1272 conv->continue_();
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
1273 jmp(clabel);
d35df41eac69 Initial revision
kono
parents:
diff changeset
1274 getsym();
d35df41eac69 Initial revision
kono
parents:
diff changeset
1275 checksym(SM);
d35df41eac69 Initial revision
kono
parents:
diff changeset
1276 return;
d35df41eac69 Initial revision
kono
parents:
diff changeset
1277 case CASE:
d35df41eac69 Initial revision
kono
parents:
diff changeset
1278 docase();
d35df41eac69 Initial revision
kono
parents:
diff changeset
1279 statement();
d35df41eac69 Initial revision
kono
parents:
diff changeset
1280 return;
d35df41eac69 Initial revision
kono
parents:
diff changeset
1281 case DEFAULT:
d35df41eac69 Initial revision
kono
parents:
diff changeset
1282 dodefault();
d35df41eac69 Initial revision
kono
parents:
diff changeset
1283 statement();
d35df41eac69 Initial revision
kono
parents:
diff changeset
1284 return;
d35df41eac69 Initial revision
kono
parents:
diff changeset
1285 case RETURN:
d35df41eac69 Initial revision
kono
parents:
diff changeset
1286 doreturn();
d35df41eac69 Initial revision
kono
parents:
diff changeset
1287 return;
d35df41eac69 Initial revision
kono
parents:
diff changeset
1288 case GOTO:
d35df41eac69 Initial revision
kono
parents:
diff changeset
1289 dogoto();
d35df41eac69 Initial revision
kono
parents:
diff changeset
1290 return;
d35df41eac69 Initial revision
kono
parents:
diff changeset
1291 default:
d35df41eac69 Initial revision
kono
parents:
diff changeset
1292 if(sym==IDENT&&skipspc()==':') {
d35df41eac69 Initial revision
kono
parents:
diff changeset
1293 dolabel();
d35df41eac69 Initial revision
kono
parents:
diff changeset
1294 statement();
d35df41eac69 Initial revision
kono
parents:
diff changeset
1295 } else {
d35df41eac69 Initial revision
kono
parents:
diff changeset
1296 slfree=lfree;
83
f3f75911d62c *** empty log message ***
kono
parents: 82
diff changeset
1297 gexpr(expr(0),0);
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
1298 lfree=slfree;
69
dba8d111b7a0 c output
kono
parents: 68
diff changeset
1299 conv->sm_();
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
1300 checksym(SM);
d35df41eac69 Initial revision
kono
parents:
diff changeset
1301 }
d35df41eac69 Initial revision
kono
parents:
diff changeset
1302 }
d35df41eac69 Initial revision
kono
parents:
diff changeset
1303 }
d35df41eac69 Initial revision
kono
parents:
diff changeset
1304
61
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents: 59
diff changeset
1305 static void
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
1306 doif(void)
d35df41eac69 Initial revision
kono
parents:
diff changeset
1307 {
d35df41eac69 Initial revision
kono
parents:
diff changeset
1308 int l1,l2,slfree;
d35df41eac69 Initial revision
kono
parents:
diff changeset
1309 getsym();
d35df41eac69 Initial revision
kono
parents:
diff changeset
1310 checksym(LPAR);
66
0b068058dd67 *** empty log message ***
kono
parents: 65
diff changeset
1311 conv->if_();
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
1312 slfree=lfree;
69
dba8d111b7a0 c output
kono
parents: 68
diff changeset
1313 bexpr(expr(0),0,l1=fwdlabel());
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
1314 lfree=slfree;
71
be313430f90b *** empty log message ***
kono
parents: 70
diff changeset
1315 conv->if_then_();
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
1316 checksym(RPAR);
d35df41eac69 Initial revision
kono
parents:
diff changeset
1317 statement();
d35df41eac69 Initial revision
kono
parents:
diff changeset
1318 checkret();
d35df41eac69 Initial revision
kono
parents:
diff changeset
1319 if(sym==ELSE) {
66
0b068058dd67 *** empty log message ***
kono
parents: 65
diff changeset
1320 conv->if_else_();
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
1321 if ((l2 = control))
d35df41eac69 Initial revision
kono
parents:
diff changeset
1322 jmp(l2=fwdlabel());
d35df41eac69 Initial revision
kono
parents:
diff changeset
1323 fwddef(l1);
d35df41eac69 Initial revision
kono
parents:
diff changeset
1324 getsym();
d35df41eac69 Initial revision
kono
parents:
diff changeset
1325 statement();
d35df41eac69 Initial revision
kono
parents:
diff changeset
1326 checkret();
d35df41eac69 Initial revision
kono
parents:
diff changeset
1327 if (l2) fwddef(l2);
d35df41eac69 Initial revision
kono
parents:
diff changeset
1328 }
d35df41eac69 Initial revision
kono
parents:
diff changeset
1329 else fwddef(l1);
66
0b068058dd67 *** empty log message ***
kono
parents: 65
diff changeset
1330 conv->if_endif_();
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
1331 }
d35df41eac69 Initial revision
kono
parents:
diff changeset
1332
61
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents: 59
diff changeset
1333 static void
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
1334 dowhile(void)
d35df41eac69 Initial revision
kono
parents:
diff changeset
1335 {
d35df41eac69 Initial revision
kono
parents:
diff changeset
1336 int sbreak,scontinue,slfree,e;
d35df41eac69 Initial revision
kono
parents:
diff changeset
1337
d35df41eac69 Initial revision
kono
parents:
diff changeset
1338 sbreak=blabel;
d35df41eac69 Initial revision
kono
parents:
diff changeset
1339 scontinue=clabel;
d35df41eac69 Initial revision
kono
parents:
diff changeset
1340 blabel=fwdlabel();
d35df41eac69 Initial revision
kono
parents:
diff changeset
1341 clabel=backdef();
66
0b068058dd67 *** empty log message ***
kono
parents: 65
diff changeset
1342 conv->while_();
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
1343 getsym();
d35df41eac69 Initial revision
kono
parents:
diff changeset
1344 checksym(LPAR);
d35df41eac69 Initial revision
kono
parents:
diff changeset
1345 slfree=lfree;
69
dba8d111b7a0 c output
kono
parents: 68
diff changeset
1346 e=expr(0);
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
1347 checksym(RPAR);
66
0b068058dd67 *** empty log message ***
kono
parents: 65
diff changeset
1348 conv->while_body_();
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
1349 if(sym==SM) {
d35df41eac69 Initial revision
kono
parents:
diff changeset
1350 bexpr(e,1,clabel);
d35df41eac69 Initial revision
kono
parents:
diff changeset
1351 lfree=slfree;
72
3b5d293cea36 type def etc
kono
parents: 71
diff changeset
1352 conv->sm_();
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
1353 getsym();
d35df41eac69 Initial revision
kono
parents:
diff changeset
1354 } else {
d35df41eac69 Initial revision
kono
parents:
diff changeset
1355 bexpr(e,0,blabel);
d35df41eac69 Initial revision
kono
parents:
diff changeset
1356 lfree=slfree;
d35df41eac69 Initial revision
kono
parents:
diff changeset
1357 statement();
d35df41eac69 Initial revision
kono
parents:
diff changeset
1358 checkret();
d35df41eac69 Initial revision
kono
parents:
diff changeset
1359 if(control)
d35df41eac69 Initial revision
kono
parents:
diff changeset
1360 jmp(clabel);
d35df41eac69 Initial revision
kono
parents:
diff changeset
1361 }
66
0b068058dd67 *** empty log message ***
kono
parents: 65
diff changeset
1362 conv->while_end_();
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
1363 fwddef(blabel);
d35df41eac69 Initial revision
kono
parents:
diff changeset
1364 clabel=scontinue;
d35df41eac69 Initial revision
kono
parents:
diff changeset
1365 blabel=sbreak;
d35df41eac69 Initial revision
kono
parents:
diff changeset
1366 }
d35df41eac69 Initial revision
kono
parents:
diff changeset
1367
61
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents: 59
diff changeset
1368 static void
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
1369 dodo(void)
d35df41eac69 Initial revision
kono
parents:
diff changeset
1370 {
d35df41eac69 Initial revision
kono
parents:
diff changeset
1371 int sbreak,scontinue,l,slfree;
d35df41eac69 Initial revision
kono
parents:
diff changeset
1372
d35df41eac69 Initial revision
kono
parents:
diff changeset
1373 sbreak=blabel;
d35df41eac69 Initial revision
kono
parents:
diff changeset
1374 scontinue=clabel;
d35df41eac69 Initial revision
kono
parents:
diff changeset
1375 blabel=fwdlabel();
d35df41eac69 Initial revision
kono
parents:
diff changeset
1376 clabel=fwdlabel();
d35df41eac69 Initial revision
kono
parents:
diff changeset
1377 l=backdef();
66
0b068058dd67 *** empty log message ***
kono
parents: 65
diff changeset
1378 conv->dowhile_();
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
1379 getsym();
d35df41eac69 Initial revision
kono
parents:
diff changeset
1380 statement();
d35df41eac69 Initial revision
kono
parents:
diff changeset
1381 checkret();
d35df41eac69 Initial revision
kono
parents:
diff changeset
1382 fwddef(clabel);
d35df41eac69 Initial revision
kono
parents:
diff changeset
1383 checksym(WHILE);
d35df41eac69 Initial revision
kono
parents:
diff changeset
1384 checksym(LPAR);
d35df41eac69 Initial revision
kono
parents:
diff changeset
1385 slfree=lfree;
66
0b068058dd67 *** empty log message ***
kono
parents: 65
diff changeset
1386 conv->dowhile_cond_();
69
dba8d111b7a0 c output
kono
parents: 68
diff changeset
1387 bexpr(expr(0),1,l);
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
1388 lfree=slfree;
d35df41eac69 Initial revision
kono
parents:
diff changeset
1389 checksym(RPAR);
72
3b5d293cea36 type def etc
kono
parents: 71
diff changeset
1390 conv->dowhile_end_();
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
1391 checksym(SM);
d35df41eac69 Initial revision
kono
parents:
diff changeset
1392 fwddef(blabel);
d35df41eac69 Initial revision
kono
parents:
diff changeset
1393 clabel=scontinue;
d35df41eac69 Initial revision
kono
parents:
diff changeset
1394 blabel=sbreak;
d35df41eac69 Initial revision
kono
parents:
diff changeset
1395 }
d35df41eac69 Initial revision
kono
parents:
diff changeset
1396
61
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents: 59
diff changeset
1397 static void
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
1398 dofor(void)
d35df41eac69 Initial revision
kono
parents:
diff changeset
1399 {
d35df41eac69 Initial revision
kono
parents:
diff changeset
1400 int sbreak,scontinue,l,e,slfree;
d35df41eac69 Initial revision
kono
parents:
diff changeset
1401
d35df41eac69 Initial revision
kono
parents:
diff changeset
1402 sbreak=blabel;
d35df41eac69 Initial revision
kono
parents:
diff changeset
1403 scontinue=clabel;
d35df41eac69 Initial revision
kono
parents:
diff changeset
1404 blabel=fwdlabel();
66
0b068058dd67 *** empty log message ***
kono
parents: 65
diff changeset
1405 conv->for_();
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
1406 getsym();
d35df41eac69 Initial revision
kono
parents:
diff changeset
1407 checksym(LPAR);
d35df41eac69 Initial revision
kono
parents:
diff changeset
1408 slfree=lfree;
d35df41eac69 Initial revision
kono
parents:
diff changeset
1409 if(sym!=SM) {
83
f3f75911d62c *** empty log message ***
kono
parents: 82
diff changeset
1410 gexpr(expr(0),0);
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
1411 checksym(SM);
69
dba8d111b7a0 c output
kono
parents: 68
diff changeset
1412 conv->for1_();
72
3b5d293cea36 type def etc
kono
parents: 71
diff changeset
1413 } else {
3b5d293cea36 type def etc
kono
parents: 71
diff changeset
1414 conv->for1_();
3b5d293cea36 type def etc
kono
parents: 71
diff changeset
1415 getsym();
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
1416 }
d35df41eac69 Initial revision
kono
parents:
diff changeset
1417 lfree=slfree;
d35df41eac69 Initial revision
kono
parents:
diff changeset
1418 l=backdef();
d35df41eac69 Initial revision
kono
parents:
diff changeset
1419 if(sym!=SM) {
69
dba8d111b7a0 c output
kono
parents: 68
diff changeset
1420 bexpr(expr(0),0,blabel);
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
1421 checksym(SM);
69
dba8d111b7a0 c output
kono
parents: 68
diff changeset
1422 conv->for2_();
72
3b5d293cea36 type def etc
kono
parents: 71
diff changeset
1423 } else {
3b5d293cea36 type def etc
kono
parents: 71
diff changeset
1424 conv->for2_();
3b5d293cea36 type def etc
kono
parents: 71
diff changeset
1425 getsym();
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
1426 }
d35df41eac69 Initial revision
kono
parents:
diff changeset
1427 lfree=slfree;
d35df41eac69 Initial revision
kono
parents:
diff changeset
1428 if(sym==RPAR) {
d35df41eac69 Initial revision
kono
parents:
diff changeset
1429 clabel=l;
69
dba8d111b7a0 c output
kono
parents: 68
diff changeset
1430 conv->for_body_();
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
1431 getsym();
d35df41eac69 Initial revision
kono
parents:
diff changeset
1432 statement();
d35df41eac69 Initial revision
kono
parents:
diff changeset
1433 checkret();
d35df41eac69 Initial revision
kono
parents:
diff changeset
1434 } else {
d35df41eac69 Initial revision
kono
parents:
diff changeset
1435 clabel=fwdlabel();
69
dba8d111b7a0 c output
kono
parents: 68
diff changeset
1436 e=expr(0);
66
0b068058dd67 *** empty log message ***
kono
parents: 65
diff changeset
1437 conv->for_body_();
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
1438 checksym(RPAR);
d35df41eac69 Initial revision
kono
parents:
diff changeset
1439 statement();
d35df41eac69 Initial revision
kono
parents:
diff changeset
1440 checkret();
d35df41eac69 Initial revision
kono
parents:
diff changeset
1441 fwddef(clabel);
83
f3f75911d62c *** empty log message ***
kono
parents: 82
diff changeset
1442 gexpr(e,0);
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
1443 lfree=slfree;
d35df41eac69 Initial revision
kono
parents:
diff changeset
1444 }
66
0b068058dd67 *** empty log message ***
kono
parents: 65
diff changeset
1445 conv->for_end_();
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
1446 jmp(l);
d35df41eac69 Initial revision
kono
parents:
diff changeset
1447 fwddef(blabel);
d35df41eac69 Initial revision
kono
parents:
diff changeset
1448 clabel=scontinue;
d35df41eac69 Initial revision
kono
parents:
diff changeset
1449 blabel=sbreak;
d35df41eac69 Initial revision
kono
parents:
diff changeset
1450 }
d35df41eac69 Initial revision
kono
parents:
diff changeset
1451
61
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents: 59
diff changeset
1452 static void
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
1453 doswitch(void)
d35df41eac69 Initial revision
kono
parents:
diff changeset
1454 {
d35df41eac69 Initial revision
kono
parents:
diff changeset
1455 int sbreak,scase,sdefault,slfree,svalue;
d35df41eac69 Initial revision
kono
parents:
diff changeset
1456
d35df41eac69 Initial revision
kono
parents:
diff changeset
1457 sbreak=blabel; /* save parents break label */
d35df41eac69 Initial revision
kono
parents:
diff changeset
1458 blabel=fwdlabel();
d35df41eac69 Initial revision
kono
parents:
diff changeset
1459 sdefault=dlabel; /* save parents default label */
d35df41eac69 Initial revision
kono
parents:
diff changeset
1460 dlabel=0;
d35df41eac69 Initial revision
kono
parents:
diff changeset
1461 scase=cslabel; /* save parents next case label */
66
0b068058dd67 *** empty log message ***
kono
parents: 65
diff changeset
1462 conv->switch_();
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
1463 getsym();
d35df41eac69 Initial revision
kono
parents:
diff changeset
1464 checksym(LPAR);
d35df41eac69 Initial revision
kono
parents:
diff changeset
1465 slfree=lfree;
d35df41eac69 Initial revision
kono
parents:
diff changeset
1466 svalue=csvalue1; /* save parents switch value */
83
f3f75911d62c *** empty log message ***
kono
parents: 82
diff changeset
1467 gexpr(expr(0),1);
42
a89cf0d6904f regv assop
kono
parents: 40
diff changeset
1468 csvalue1=csvalue() ;
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
1469 lfree=slfree;
d35df41eac69 Initial revision
kono
parents:
diff changeset
1470 checksym(RPAR);
66
0b068058dd67 *** empty log message ***
kono
parents: 65
diff changeset
1471 conv->switch_body_();
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
1472 cslabel = control = 0;
d35df41eac69 Initial revision
kono
parents:
diff changeset
1473 /* should be case statement but... */
d35df41eac69 Initial revision
kono
parents:
diff changeset
1474 statement();
66
0b068058dd67 *** empty log message ***
kono
parents: 65
diff changeset
1475 conv->switch_end_();
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
1476 checkret();
d35df41eac69 Initial revision
kono
parents:
diff changeset
1477 if(dlabel) def_label(cslabel,dlabel);
d35df41eac69 Initial revision
kono
parents:
diff changeset
1478 else fwddef(cslabel);
d35df41eac69 Initial revision
kono
parents:
diff changeset
1479 csvalue1=svalue;
d35df41eac69 Initial revision
kono
parents:
diff changeset
1480 cslabel=scase;
d35df41eac69 Initial revision
kono
parents:
diff changeset
1481 dlabel=sdefault;
d35df41eac69 Initial revision
kono
parents:
diff changeset
1482 fwddef(blabel);
d35df41eac69 Initial revision
kono
parents:
diff changeset
1483 blabel=sbreak;
d35df41eac69 Initial revision
kono
parents:
diff changeset
1484 }
d35df41eac69 Initial revision
kono
parents:
diff changeset
1485
61
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents: 59
diff changeset
1486 static void
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
1487 docomp(void)
d35df41eac69 Initial revision
kono
parents:
diff changeset
1488 {
66
0b068058dd67 *** empty log message ***
kono
parents: 65
diff changeset
1489 conv->lc_();
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
1490 getsym();
d35df41eac69 Initial revision
kono
parents:
diff changeset
1491 while(sym!=RC) { statement(); checkret();}
66
0b068058dd67 *** empty log message ***
kono
parents: 65
diff changeset
1492 conv->rc_();
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
1493 getsym();
d35df41eac69 Initial revision
kono
parents:
diff changeset
1494 }
d35df41eac69 Initial revision
kono
parents:
diff changeset
1495
61
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents: 59
diff changeset
1496 static void
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
1497 docase(void)
d35df41eac69 Initial revision
kono
parents:
diff changeset
1498 {
d35df41eac69 Initial revision
kono
parents:
diff changeset
1499 int c,l,slfree;
d35df41eac69 Initial revision
kono
parents:
diff changeset
1500
d35df41eac69 Initial revision
kono
parents:
diff changeset
1501 c=0;
d35df41eac69 Initial revision
kono
parents:
diff changeset
1502 slfree=lfree;
d35df41eac69 Initial revision
kono
parents:
diff changeset
1503 while(sym==CASE) {
67
254a0c576114 argument type list
kono
parents: 66
diff changeset
1504 conv->case_begin_(c,0);
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
1505 getsym();
69
dba8d111b7a0 c output
kono
parents: 68
diff changeset
1506 c=list2(cexpr(expr(1)),c);
66
0b068058dd67 *** empty log message ***
kono
parents: 65
diff changeset
1507 conv->case_(c,0);
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
1508 checksym(COLON);
d35df41eac69 Initial revision
kono
parents:
diff changeset
1509 }
d35df41eac69 Initial revision
kono
parents:
diff changeset
1510 l=fwdlabel();
d35df41eac69 Initial revision
kono
parents:
diff changeset
1511 if (control) {
d35df41eac69 Initial revision
kono
parents:
diff changeset
1512 control=0;
d35df41eac69 Initial revision
kono
parents:
diff changeset
1513 jmp(l);
d35df41eac69 Initial revision
kono
parents:
diff changeset
1514 }
d35df41eac69 Initial revision
kono
parents:
diff changeset
1515 if (cslabel) fwddef(cslabel);
d35df41eac69 Initial revision
kono
parents:
diff changeset
1516 while(cadr(c)) {
d35df41eac69 Initial revision
kono
parents:
diff changeset
1517 cmpdimm(car(c),csvalue1);
d35df41eac69 Initial revision
kono
parents:
diff changeset
1518 jcond(l,0);
d35df41eac69 Initial revision
kono
parents:
diff changeset
1519 c=cadr(c);
d35df41eac69 Initial revision
kono
parents:
diff changeset
1520 }
d35df41eac69 Initial revision
kono
parents:
diff changeset
1521 lfree=slfree;
d35df41eac69 Initial revision
kono
parents:
diff changeset
1522 cmpdimm(car(c),csvalue1);
d35df41eac69 Initial revision
kono
parents:
diff changeset
1523 jcond(cslabel=fwdlabel(),1);
d35df41eac69 Initial revision
kono
parents:
diff changeset
1524 fwddef(l);
d35df41eac69 Initial revision
kono
parents:
diff changeset
1525 }
d35df41eac69 Initial revision
kono
parents:
diff changeset
1526
61
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents: 59
diff changeset
1527 static void
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
1528 dodefault(void)
d35df41eac69 Initial revision
kono
parents:
diff changeset
1529 {
d35df41eac69 Initial revision
kono
parents:
diff changeset
1530 getsym();
d35df41eac69 Initial revision
kono
parents:
diff changeset
1531 checksym(COLON);
d35df41eac69 Initial revision
kono
parents:
diff changeset
1532 if (dlabel) error(STERR);
d35df41eac69 Initial revision
kono
parents:
diff changeset
1533 if (!cslabel) jmp(cslabel = fwdlabel());
d35df41eac69 Initial revision
kono
parents:
diff changeset
1534 dlabel = backdef();
66
0b068058dd67 *** empty log message ***
kono
parents: 65
diff changeset
1535 conv->case_(0,1);
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
1536 }
d35df41eac69 Initial revision
kono
parents:
diff changeset
1537
61
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents: 59
diff changeset
1538 static void
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
1539 doreturn(void)
d35df41eac69 Initial revision
kono
parents:
diff changeset
1540 {
39
c63c4fdeb9a7 struct done.
kono
parents: 38
diff changeset
1541 int slfree,e,e1;
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
1542
d35df41eac69 Initial revision
kono
parents:
diff changeset
1543 if(getsym()==SM) {
71
be313430f90b *** empty log message ***
kono
parents: 70
diff changeset
1544 conv->return_();
be313430f90b *** empty log message ***
kono
parents: 70
diff changeset
1545 conv->return_end_();
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
1546 getsym();
d35df41eac69 Initial revision
kono
parents:
diff changeset
1547 retpending = 1;
d35df41eac69 Initial revision
kono
parents:
diff changeset
1548 return;
d35df41eac69 Initial revision
kono
parents:
diff changeset
1549 }
66
0b068058dd67 *** empty log message ***
kono
parents: 65
diff changeset
1550 conv->return_();
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
1551 slfree=lfree;
37
412ad2e6c2a2 struct copy
kono
parents: 36
diff changeset
1552 if (struct_return) {
69
dba8d111b7a0 c output
kono
parents: 68
diff changeset
1553 e = expr(0);
37
412ad2e6c2a2 struct copy
kono
parents: 36
diff changeset
1554 if ((car(type)==STRUCT || car(type)==UNION)&&
412ad2e6c2a2 struct copy
kono
parents: 36
diff changeset
1555 size(type)==cadr(struct_return)) {
46
b1c8ac8c308d fix cascading struct retrun. Now it should be compatible with gcc
kono
parents: 45
diff changeset
1556 if(car(e)==RSTRUCT && car(cadr(e))==FUNCTION) {
83
f3f75911d62c *** empty log message ***
kono
parents: 82
diff changeset
1557 /* pass the return pointer to the called function */
46
b1c8ac8c308d fix cascading struct retrun. Now it should be compatible with gcc
kono
parents: 45
diff changeset
1558 replace_return_struct(cadr(e),
b1c8ac8c308d fix cascading struct retrun. Now it should be compatible with gcc
kono
parents: 45
diff changeset
1559 rvalue_t(car(struct_return),caddr(struct_return)));
83
f3f75911d62c *** empty log message ***
kono
parents: 82
diff changeset
1560 gexpr(cadr(e),0);
46
b1c8ac8c308d fix cascading struct retrun. Now it should be compatible with gcc
kono
parents: 45
diff changeset
1561 } else {
b1c8ac8c308d fix cascading struct retrun. Now it should be compatible with gcc
kono
parents: 45
diff changeset
1562 e = rvalue(e);
b1c8ac8c308d fix cascading struct retrun. Now it should be compatible with gcc
kono
parents: 45
diff changeset
1563 type = caddr(struct_return);
b1c8ac8c308d fix cascading struct retrun. Now it should be compatible with gcc
kono
parents: 45
diff changeset
1564 e1 = rvalue_t(cadr(struct_return),INT); /* size */
83
f3f75911d62c *** empty log message ***
kono
parents: 82
diff changeset
1565 gexpr(list4(SASS,rvalue(car(struct_return)),e,e1),0);
46
b1c8ac8c308d fix cascading struct retrun. Now it should be compatible with gcc
kono
parents: 45
diff changeset
1566 }
37
412ad2e6c2a2 struct copy
kono
parents: 36
diff changeset
1567 } else {
39
c63c4fdeb9a7 struct done.
kono
parents: 38
diff changeset
1568 error(TYERR); /* should check compatible */
37
412ad2e6c2a2 struct copy
kono
parents: 36
diff changeset
1569 }
412ad2e6c2a2 struct copy
kono
parents: 36
diff changeset
1570 } else {
83
f3f75911d62c *** empty log message ***
kono
parents: 82
diff changeset
1571 gexpr(expr(0),1);
37
412ad2e6c2a2 struct copy
kono
parents: 36
diff changeset
1572 }
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
1573 lfree=slfree;
69
dba8d111b7a0 c output
kono
parents: 68
diff changeset
1574 conv->return_end_();
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
1575 checksym(SM);
39
c63c4fdeb9a7 struct done.
kono
parents: 38
diff changeset
1576 /* control = 0; still control continue until pending return emittion */
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
1577 retpending = 1;
d35df41eac69 Initial revision
kono
parents:
diff changeset
1578 }
d35df41eac69 Initial revision
kono
parents:
diff changeset
1579
39
c63c4fdeb9a7 struct done.
kono
parents: 38
diff changeset
1580 void
c63c4fdeb9a7 struct done.
kono
parents: 38
diff changeset
1581 replace_return_struct(int func,int left) {
46
b1c8ac8c308d fix cascading struct retrun. Now it should be compatible with gcc
kono
parents: 45
diff changeset
1582 int e = caddr(func); /* arg lists */
b1c8ac8c308d fix cascading struct retrun. Now it should be compatible with gcc
kono
parents: 45
diff changeset
1583 while(cadr(e)) e=cadr(e); /* find first arg */
b1c8ac8c308d fix cascading struct retrun. Now it should be compatible with gcc
kono
parents: 45
diff changeset
1584 e = car(e); /* return_struct arg */
39
c63c4fdeb9a7 struct done.
kono
parents: 38
diff changeset
1585 rplacad(e,left);
c63c4fdeb9a7 struct done.
kono
parents: 38
diff changeset
1586 }
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
1587
61
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents: 59
diff changeset
1588 static void
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
1589 dogoto(void)
d35df41eac69 Initial revision
kono
parents:
diff changeset
1590 {
d35df41eac69 Initial revision
kono
parents:
diff changeset
1591 NMTBL *nptr0;
d35df41eac69 Initial revision
kono
parents:
diff changeset
1592 int t,e1,e2,env;
d35df41eac69 Initial revision
kono
parents:
diff changeset
1593
66
0b068058dd67 *** empty log message ***
kono
parents: 65
diff changeset
1594 conv->goto_();
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
1595 getsym();
69
dba8d111b7a0 c output
kono
parents: 68
diff changeset
1596 e1 = expr(0);
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
1597 t=car(e1);
d35df41eac69 Initial revision
kono
parents:
diff changeset
1598 if (t==FNAME) {
d35df41eac69 Initial revision
kono
parents:
diff changeset
1599 nptr0 = (NMTBL *)cadr(e1);
d35df41eac69 Initial revision
kono
parents:
diff changeset
1600 t = nptr0->sc;
d35df41eac69 Initial revision
kono
parents:
diff changeset
1601 if (t==EMPTY) {
d35df41eac69 Initial revision
kono
parents:
diff changeset
1602 nptr0->sc = FLABEL;
d35df41eac69 Initial revision
kono
parents:
diff changeset
1603 jmp(nptr0->dsp = fwdlabel());
d35df41eac69 Initial revision
kono
parents:
diff changeset
1604 } else if (t==FLABEL||t==BLABEL) {
d35df41eac69 Initial revision
kono
parents:
diff changeset
1605 jmp(nptr0->dsp);
d35df41eac69 Initial revision
kono
parents:
diff changeset
1606 }
d35df41eac69 Initial revision
kono
parents:
diff changeset
1607 control=0;
76
fb3fb9e9a462 *** empty log message ***
kono
parents: 75
diff changeset
1608 conv->sm_();
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
1609 checksym(SM);
66
0b068058dd67 *** empty log message ***
kono
parents: 65
diff changeset
1610 conv->goto_label_(nptr0);
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
1611 return;
d35df41eac69 Initial revision
kono
parents:
diff changeset
1612 }
d35df41eac69 Initial revision
kono
parents:
diff changeset
1613 if (t==COMMA) {
d35df41eac69 Initial revision
kono
parents:
diff changeset
1614 env = caddr(e1);
d35df41eac69 Initial revision
kono
parents:
diff changeset
1615 e1 = cadr(e1);
d35df41eac69 Initial revision
kono
parents:
diff changeset
1616 t = car(e1);
d35df41eac69 Initial revision
kono
parents:
diff changeset
1617 } else {
d35df41eac69 Initial revision
kono
parents:
diff changeset
1618 env = 0;
d35df41eac69 Initial revision
kono
parents:
diff changeset
1619 }
d35df41eac69 Initial revision
kono
parents:
diff changeset
1620 if (t==FUNCTION) {
66
0b068058dd67 *** empty log message ***
kono
parents: 65
diff changeset
1621 conv->jump_(env);
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
1622 e2 = cadr(e1);
d35df41eac69 Initial revision
kono
parents:
diff changeset
1623 if (car(e2) == FNAME) {
d35df41eac69 Initial revision
kono
parents:
diff changeset
1624 nptr0=(NMTBL *)cadr(e2);
d35df41eac69 Initial revision
kono
parents:
diff changeset
1625 nptr0->sc = CODE;
d35df41eac69 Initial revision
kono
parents:
diff changeset
1626 }
83
f3f75911d62c *** empty log message ***
kono
parents: 82
diff changeset
1627 gexpr(list3(CODE,e1,env),0);
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
1628 control=0;
76
fb3fb9e9a462 *** empty log message ***
kono
parents: 75
diff changeset
1629 conv->sm_();
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
1630 checksym(SM);
d35df41eac69 Initial revision
kono
parents:
diff changeset
1631 return;
d35df41eac69 Initial revision
kono
parents:
diff changeset
1632 }
d35df41eac69 Initial revision
kono
parents:
diff changeset
1633 error(STERR);
d35df41eac69 Initial revision
kono
parents:
diff changeset
1634 return;
d35df41eac69 Initial revision
kono
parents:
diff changeset
1635 }
d35df41eac69 Initial revision
kono
parents:
diff changeset
1636
61
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents: 59
diff changeset
1637 static void
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
1638 dolabel(void)
d35df41eac69 Initial revision
kono
parents:
diff changeset
1639 {
d35df41eac69 Initial revision
kono
parents:
diff changeset
1640 if(nptr->sc == FLABEL)
d35df41eac69 Initial revision
kono
parents:
diff changeset
1641 fwddef(nptr->dsp);
d35df41eac69 Initial revision
kono
parents:
diff changeset
1642 else if(nptr->sc != EMPTY)
d35df41eac69 Initial revision
kono
parents:
diff changeset
1643 error(TYERR);
d35df41eac69 Initial revision
kono
parents:
diff changeset
1644 nptr->sc = BLABEL;
d35df41eac69 Initial revision
kono
parents:
diff changeset
1645 nptr->dsp = backdef();
72
3b5d293cea36 type def etc
kono
parents: 71
diff changeset
1646 conv->label_();
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
1647 getsym();
d35df41eac69 Initial revision
kono
parents:
diff changeset
1648 checksym(COLON);
d35df41eac69 Initial revision
kono
parents:
diff changeset
1649 }
d35df41eac69 Initial revision
kono
parents:
diff changeset
1650
d35df41eac69 Initial revision
kono
parents:
diff changeset
1651 int
85
3789aef7331d minor fix
kono
parents: 83
diff changeset
1652 float_value(int e2,int type)
3789aef7331d minor fix
kono
parents: 83
diff changeset
1653 {
3789aef7331d minor fix
kono
parents: 83
diff changeset
1654 if (car(e2)==CONST) return dlist2(DCONST,(double)cadr(e2));
3789aef7331d minor fix
kono
parents: 83
diff changeset
1655 if(type==FLOAT||type==DOUBLE) return e2;
3789aef7331d minor fix
kono
parents: 83
diff changeset
1656 if(type==UNSIGNED) return list2(U2D,e2);
3789aef7331d minor fix
kono
parents: 83
diff changeset
1657 if(integral(type)) return list2(I2D,e2);
3789aef7331d minor fix
kono
parents: 83
diff changeset
1658 error(TYERR); return dlist2(DCONST,1.0);
3789aef7331d minor fix
kono
parents: 83
diff changeset
1659 }
3789aef7331d minor fix
kono
parents: 83
diff changeset
1660
3789aef7331d minor fix
kono
parents: 83
diff changeset
1661 int
3789aef7331d minor fix
kono
parents: 83
diff changeset
1662 int_value(int e2,int type)
3789aef7331d minor fix
kono
parents: 83
diff changeset
1663 {
3789aef7331d minor fix
kono
parents: 83
diff changeset
1664 if (car(e2)==DCONST||car(e2)==FCONST) return list2(CONST,(int)dcadr(e2));
86
4d1275f8a5b5 *** empty log message ***
kono
parents: 85
diff changeset
1665 if(scalar(type)||car(type)==ARRAY) return e2;
85
3789aef7331d minor fix
kono
parents: 83
diff changeset
1666 if(type==FLOAT||type==DOUBLE) return list2(D2I,e2);
3789aef7331d minor fix
kono
parents: 83
diff changeset
1667 error(TYERR); return list2(CONST,1);
3789aef7331d minor fix
kono
parents: 83
diff changeset
1668 }
3789aef7331d minor fix
kono
parents: 83
diff changeset
1669
3789aef7331d minor fix
kono
parents: 83
diff changeset
1670 int
3789aef7331d minor fix
kono
parents: 83
diff changeset
1671 unsigned_value(int e2,int type)
3789aef7331d minor fix
kono
parents: 83
diff changeset
1672 {
3789aef7331d minor fix
kono
parents: 83
diff changeset
1673 if(scalar(type)) return e2;
86
4d1275f8a5b5 *** empty log message ***
kono
parents: 85
diff changeset
1674 if(type==FLOAT||type==DOUBLE) return list2(D2U,e2);
85
3789aef7331d minor fix
kono
parents: 83
diff changeset
1675 error(TYERR); return e2;
3789aef7331d minor fix
kono
parents: 83
diff changeset
1676 }
3789aef7331d minor fix
kono
parents: 83
diff changeset
1677
3789aef7331d minor fix
kono
parents: 83
diff changeset
1678
3789aef7331d minor fix
kono
parents: 83
diff changeset
1679 int
49
884c74e6a2f7 no compile error
kono
parents: 48
diff changeset
1680 assign_expr0(int e1,int e2,int t,int type) {
884c74e6a2f7 no compile error
kono
parents: 48
diff changeset
1681 int stype;
884c74e6a2f7 no compile error
kono
parents: 48
diff changeset
1682 stype=type;
50
kono
parents: 49
diff changeset
1683 e1=assign_expr(e1,rvalue_t(e2,type),t,type);
49
884c74e6a2f7 no compile error
kono
parents: 48
diff changeset
1684 type=stype;
884c74e6a2f7 no compile error
kono
parents: 48
diff changeset
1685 return e1;
884c74e6a2f7 no compile error
kono
parents: 48
diff changeset
1686 }
884c74e6a2f7 no compile error
kono
parents: 48
diff changeset
1687
884c74e6a2f7 no compile error
kono
parents: 48
diff changeset
1688 int
48
8575ec496cd4 jump with overrupped struct (first code)
kono
parents: 46
diff changeset
1689 assign_expr(int e1,int e2,int t,int type) {
8575ec496cd4 jump with overrupped struct (first code)
kono
parents: 46
diff changeset
1690 if(t==VOID)
8575ec496cd4 jump with overrupped struct (first code)
kono
parents: 46
diff changeset
1691 error(TYERR);
8575ec496cd4 jump with overrupped struct (first code)
kono
parents: 46
diff changeset
1692 if(t==CHAR) {
85
3789aef7331d minor fix
kono
parents: 83
diff changeset
1693 e2=int_value(e2,type);
3789aef7331d minor fix
kono
parents: 83
diff changeset
1694 if (!integral(type)) error(TYERR);
48
8575ec496cd4 jump with overrupped struct (first code)
kono
parents: 46
diff changeset
1695 type= INT;return(list3(CASS,e1,e2));
81
f94ca1168520 float first try...
kono
parents: 80
diff changeset
1696 } else if(t==DOUBLE) {
85
3789aef7331d minor fix
kono
parents: 83
diff changeset
1697 e2=float_value(e2,type);
82
25654dc29ecc First Floating Point coding done.
kono
parents: 81
diff changeset
1698 type= t;return(list3(DASS,e1,e2));
81
f94ca1168520 float first try...
kono
parents: 80
diff changeset
1699 } else if(t==FLOAT) {
85
3789aef7331d minor fix
kono
parents: 83
diff changeset
1700 e2=float_value(e2,type);
82
25654dc29ecc First Floating Point coding done.
kono
parents: 81
diff changeset
1701 type= t;return(list3(FASS,e1,e2));
25654dc29ecc First Floating Point coding done.
kono
parents: 81
diff changeset
1702 } else if(scalar(t)) {
86
4d1275f8a5b5 *** empty log message ***
kono
parents: 85
diff changeset
1703 e2=(t==UNSIGNED)?unsigned_value(e2,type):int_value(e2,type);
82
25654dc29ecc First Floating Point coding done.
kono
parents: 81
diff changeset
1704 type=t;
25654dc29ecc First Floating Point coding done.
kono
parents: 81
diff changeset
1705 return(list3(ASS,e1,e2));
25654dc29ecc First Floating Point coding done.
kono
parents: 81
diff changeset
1706 } else if((car(t)==STRUCT||car(t)==UNION)) {
48
8575ec496cd4 jump with overrupped struct (first code)
kono
parents: 46
diff changeset
1707 if (size(t)!=size(type)) error(TYERR);
49
884c74e6a2f7 no compile error
kono
parents: 48
diff changeset
1708 type=t;
48
8575ec496cd4 jump with overrupped struct (first code)
kono
parents: 46
diff changeset
1709 if(car(e2)==RSTRUCT && car(cadr(e2))==FUNCTION) {
8575ec496cd4 jump with overrupped struct (first code)
kono
parents: 46
diff changeset
1710 replace_return_struct(cadr(e2),e1);
8575ec496cd4 jump with overrupped struct (first code)
kono
parents: 46
diff changeset
1711 return cadr(e2);
8575ec496cd4 jump with overrupped struct (first code)
kono
parents: 46
diff changeset
1712 } else {
8575ec496cd4 jump with overrupped struct (first code)
kono
parents: 46
diff changeset
1713 return (list4(SASS,e1,e2,size(t)));
8575ec496cd4 jump with overrupped struct (first code)
kono
parents: 46
diff changeset
1714 }
8575ec496cd4 jump with overrupped struct (first code)
kono
parents: 46
diff changeset
1715 } else {
82
25654dc29ecc First Floating Point coding done.
kono
parents: 81
diff changeset
1716 error(TYERR); return list3(ASS,e1,e2);
48
8575ec496cd4 jump with overrupped struct (first code)
kono
parents: 46
diff changeset
1717 }
8575ec496cd4 jump with overrupped struct (first code)
kono
parents: 46
diff changeset
1718 }
8575ec496cd4 jump with overrupped struct (first code)
kono
parents: 46
diff changeset
1719
8575ec496cd4 jump with overrupped struct (first code)
kono
parents: 46
diff changeset
1720 int
69
dba8d111b7a0 c output
kono
parents: 68
diff changeset
1721 expr(int noconv)
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
1722 {
66
0b068058dd67 *** empty log message ***
kono
parents: 65
diff changeset
1723 int r;
69
dba8d111b7a0 c output
kono
parents: 68
diff changeset
1724 conv->noconv_(noconv);
66
0b068058dd67 *** empty log message ***
kono
parents: 65
diff changeset
1725 r=rvalue(expr0());
0b068058dd67 *** empty log message ***
kono
parents: 65
diff changeset
1726 return r;
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
1727 }
d35df41eac69 Initial revision
kono
parents:
diff changeset
1728
61
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents: 59
diff changeset
1729 static int
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
1730 expr0(void)
d35df41eac69 Initial revision
kono
parents:
diff changeset
1731 {
d35df41eac69 Initial revision
kono
parents:
diff changeset
1732 int e;
d35df41eac69 Initial revision
kono
parents:
diff changeset
1733
d35df41eac69 Initial revision
kono
parents:
diff changeset
1734 e=expr1();
d35df41eac69 Initial revision
kono
parents:
diff changeset
1735 while(sym==COMMA) {
66
0b068058dd67 *** empty log message ***
kono
parents: 65
diff changeset
1736 conv->op_(sym);
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
1737 getsym();e=list3(COMMA,e,rvalue(expr1()));
d35df41eac69 Initial revision
kono
parents:
diff changeset
1738 }
d35df41eac69 Initial revision
kono
parents:
diff changeset
1739 return e;
d35df41eac69 Initial revision
kono
parents:
diff changeset
1740 }
d35df41eac69 Initial revision
kono
parents:
diff changeset
1741
61
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents: 59
diff changeset
1742 static int
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
1743 expr1(void)
d35df41eac69 Initial revision
kono
parents:
diff changeset
1744 {
d35df41eac69 Initial revision
kono
parents:
diff changeset
1745 int e1,e2,t,op;
d35df41eac69 Initial revision
kono
parents:
diff changeset
1746 e1=expr2();
d35df41eac69 Initial revision
kono
parents:
diff changeset
1747 switch (sym) {
d35df41eac69 Initial revision
kono
parents:
diff changeset
1748 case ASS:
69
dba8d111b7a0 c output
kono
parents: 68
diff changeset
1749 conv->op_(sym);
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
1750 lcheck(e1);
d35df41eac69 Initial revision
kono
parents:
diff changeset
1751 t=type;
d35df41eac69 Initial revision
kono
parents:
diff changeset
1752 getsym();
d35df41eac69 Initial revision
kono
parents:
diff changeset
1753 e2=rvalue(expr1());
48
8575ec496cd4 jump with overrupped struct (first code)
kono
parents: 46
diff changeset
1754 return assign_expr(e1,e2,t,type);
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
1755 case ADD+AS: case SUB+AS: case MUL+AS: case DIV+AS: case MOD+AS:
d35df41eac69 Initial revision
kono
parents:
diff changeset
1756 case RSHIFT+AS: case LSHIFT+AS: case BAND+AS: case EOR+AS: case BOR+AS:
69
dba8d111b7a0 c output
kono
parents: 68
diff changeset
1757 conv->op_(sym);
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
1758 op = sym-AS;
d35df41eac69 Initial revision
kono
parents:
diff changeset
1759 lcheck(e1);
d35df41eac69 Initial revision
kono
parents:
diff changeset
1760 t=type;
d35df41eac69 Initial revision
kono
parents:
diff changeset
1761 getsym();
d35df41eac69 Initial revision
kono
parents:
diff changeset
1762 e2=rvalue(expr1());
66
0b068058dd67 *** empty log message ***
kono
parents: 65
diff changeset
1763
85
3789aef7331d minor fix
kono
parents: 83
diff changeset
1764 if(!(integral(type)||type==FLOAT||type==DOUBLE)) error(TYERR);
3789aef7331d minor fix
kono
parents: 83
diff changeset
1765 if (t==FLOAT) {
3789aef7331d minor fix
kono
parents: 83
diff changeset
1766 e2=float_value(e2,type); type=t;
86
4d1275f8a5b5 *** empty log message ***
kono
parents: 85
diff changeset
1767 return(list4(FASSOP,e1,e2,op+DOP));
85
3789aef7331d minor fix
kono
parents: 83
diff changeset
1768 }
3789aef7331d minor fix
kono
parents: 83
diff changeset
1769 if (t==DOUBLE) {
3789aef7331d minor fix
kono
parents: 83
diff changeset
1770 e2=float_value(e2,type); type=t;
86
4d1275f8a5b5 *** empty log message ***
kono
parents: 85
diff changeset
1771 return(list4(DASSOP,e1,e2,op+DOP));
85
3789aef7331d minor fix
kono
parents: 83
diff changeset
1772 }
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
1773 if(!integral(type)) error(TYERR);
d35df41eac69 Initial revision
kono
parents:
diff changeset
1774 if((t==UNSIGNED||type==UNSIGNED)&&
d35df41eac69 Initial revision
kono
parents:
diff changeset
1775 (op==MUL||op==DIV||op==MOD||op==RSHIFT||op==LSHIFT))
d35df41eac69 Initial revision
kono
parents:
diff changeset
1776 op=op+US;
d35df41eac69 Initial revision
kono
parents:
diff changeset
1777 if(t==CHAR) {
d35df41eac69 Initial revision
kono
parents:
diff changeset
1778 type= INT;
d35df41eac69 Initial revision
kono
parents:
diff changeset
1779 return(list4(CASSOP,e1,e2,op));
d35df41eac69 Initial revision
kono
parents:
diff changeset
1780 }
d35df41eac69 Initial revision
kono
parents:
diff changeset
1781 type=t;
d35df41eac69 Initial revision
kono
parents:
diff changeset
1782 if(integral(t)) return(list4(ASSOP,e1,e2,op));
d35df41eac69 Initial revision
kono
parents:
diff changeset
1783 if((op!=ADD&&op!=SUB)||car(t)!=POINTER) error(TYERR);
d35df41eac69 Initial revision
kono
parents:
diff changeset
1784 e2=binop(MUL,e2,list2(CONST,size(cadr(t))),INT,UNSIGNED);
d35df41eac69 Initial revision
kono
parents:
diff changeset
1785 type=t;
66
0b068058dd67 *** empty log message ***
kono
parents: 65
diff changeset
1786
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
1787 return list4(ASSOP,e1,e2,op);
d35df41eac69 Initial revision
kono
parents:
diff changeset
1788 default:
d35df41eac69 Initial revision
kono
parents:
diff changeset
1789 return(e1);
d35df41eac69 Initial revision
kono
parents:
diff changeset
1790 }
d35df41eac69 Initial revision
kono
parents:
diff changeset
1791 }
d35df41eac69 Initial revision
kono
parents:
diff changeset
1792
61
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents: 59
diff changeset
1793 static int
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
1794 expr2(void)
d35df41eac69 Initial revision
kono
parents:
diff changeset
1795 {
d35df41eac69 Initial revision
kono
parents:
diff changeset
1796 int e1,e2,e3,t;
d35df41eac69 Initial revision
kono
parents:
diff changeset
1797
d35df41eac69 Initial revision
kono
parents:
diff changeset
1798 e1=expr3();
d35df41eac69 Initial revision
kono
parents:
diff changeset
1799 if(sym==COND) {
82
25654dc29ecc First Floating Point coding done.
kono
parents: 81
diff changeset
1800 conv->cond_();
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
1801 e1=rvalue(e1);
d35df41eac69 Initial revision
kono
parents:
diff changeset
1802 getsym();
66
0b068058dd67 *** empty log message ***
kono
parents: 65
diff changeset
1803 conv->cond1_();
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
1804 e2=rvalue(expr2());
d35df41eac69 Initial revision
kono
parents:
diff changeset
1805 t=type;
69
dba8d111b7a0 c output
kono
parents: 68
diff changeset
1806 conv->cond2_();
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
1807 checksym(COLON);
d35df41eac69 Initial revision
kono
parents:
diff changeset
1808 e3=rvalue(expr2());
66
0b068058dd67 *** empty log message ***
kono
parents: 65
diff changeset
1809 conv->cond_end_();
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
1810 if(car(e1)==CONST) {
d35df41eac69 Initial revision
kono
parents:
diff changeset
1811 if(cadr(e1)) {
d35df41eac69 Initial revision
kono
parents:
diff changeset
1812 type=t;return e2;
d35df41eac69 Initial revision
kono
parents:
diff changeset
1813 } else
d35df41eac69 Initial revision
kono
parents:
diff changeset
1814 return e3;
d35df41eac69 Initial revision
kono
parents:
diff changeset
1815 }
d35df41eac69 Initial revision
kono
parents:
diff changeset
1816 if(type==INT||(t!=INT&&type==UNSIGNED))
d35df41eac69 Initial revision
kono
parents:
diff changeset
1817 type=t;
d35df41eac69 Initial revision
kono
parents:
diff changeset
1818 return(list4(COND,e1,e2,e3));
d35df41eac69 Initial revision
kono
parents:
diff changeset
1819 }
d35df41eac69 Initial revision
kono
parents:
diff changeset
1820 return(e1);
d35df41eac69 Initial revision
kono
parents:
diff changeset
1821 }
d35df41eac69 Initial revision
kono
parents:
diff changeset
1822
61
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents: 59
diff changeset
1823 static int
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
1824 expr3(void)
d35df41eac69 Initial revision
kono
parents:
diff changeset
1825 {
d35df41eac69 Initial revision
kono
parents:
diff changeset
1826 int e;
d35df41eac69 Initial revision
kono
parents:
diff changeset
1827
d35df41eac69 Initial revision
kono
parents:
diff changeset
1828 e=expr4();
d35df41eac69 Initial revision
kono
parents:
diff changeset
1829 while(sym==LOR) {
66
0b068058dd67 *** empty log message ***
kono
parents: 65
diff changeset
1830 conv->op_(sym);
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
1831 e=rvalue(e);
d35df41eac69 Initial revision
kono
parents:
diff changeset
1832 getsym();
d35df41eac69 Initial revision
kono
parents:
diff changeset
1833 e=list3(LOR,e,rvalue(expr4()));
d35df41eac69 Initial revision
kono
parents:
diff changeset
1834 type= INT;
d35df41eac69 Initial revision
kono
parents:
diff changeset
1835 }
d35df41eac69 Initial revision
kono
parents:
diff changeset
1836 return(e);
d35df41eac69 Initial revision
kono
parents:
diff changeset
1837 }
d35df41eac69 Initial revision
kono
parents:
diff changeset
1838
61
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents: 59
diff changeset
1839 static int
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
1840 expr4(void)
d35df41eac69 Initial revision
kono
parents:
diff changeset
1841 {
d35df41eac69 Initial revision
kono
parents:
diff changeset
1842 int e;
d35df41eac69 Initial revision
kono
parents:
diff changeset
1843
d35df41eac69 Initial revision
kono
parents:
diff changeset
1844 e=expr5();
d35df41eac69 Initial revision
kono
parents:
diff changeset
1845 while(sym==LAND) {
66
0b068058dd67 *** empty log message ***
kono
parents: 65
diff changeset
1846 conv->op_(sym);
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
1847 e=rvalue(e);
d35df41eac69 Initial revision
kono
parents:
diff changeset
1848 getsym();
d35df41eac69 Initial revision
kono
parents:
diff changeset
1849 e=list3(LAND,e,rvalue(expr5()));
d35df41eac69 Initial revision
kono
parents:
diff changeset
1850 type= INT;
d35df41eac69 Initial revision
kono
parents:
diff changeset
1851 }
d35df41eac69 Initial revision
kono
parents:
diff changeset
1852 return(e);
d35df41eac69 Initial revision
kono
parents:
diff changeset
1853 }
d35df41eac69 Initial revision
kono
parents:
diff changeset
1854
61
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents: 59
diff changeset
1855 static int
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
1856 expr5(void)
d35df41eac69 Initial revision
kono
parents:
diff changeset
1857 {
d35df41eac69 Initial revision
kono
parents:
diff changeset
1858 int e1,e2,t;
d35df41eac69 Initial revision
kono
parents:
diff changeset
1859
d35df41eac69 Initial revision
kono
parents:
diff changeset
1860 e1=expr6();
d35df41eac69 Initial revision
kono
parents:
diff changeset
1861 while(sym==BOR) {
66
0b068058dd67 *** empty log message ***
kono
parents: 65
diff changeset
1862 conv->op_(sym);
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
1863 e1=rvalue(e1);
d35df41eac69 Initial revision
kono
parents:
diff changeset
1864 t=type;
d35df41eac69 Initial revision
kono
parents:
diff changeset
1865 getsym();
d35df41eac69 Initial revision
kono
parents:
diff changeset
1866 e2=rvalue(expr6());
d35df41eac69 Initial revision
kono
parents:
diff changeset
1867 e1=binop(BOR,e1,e2,t,type);
d35df41eac69 Initial revision
kono
parents:
diff changeset
1868 }
d35df41eac69 Initial revision
kono
parents:
diff changeset
1869 return(e1);
d35df41eac69 Initial revision
kono
parents:
diff changeset
1870 }
d35df41eac69 Initial revision
kono
parents:
diff changeset
1871
61
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents: 59
diff changeset
1872 static int
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
1873 expr6(void)
d35df41eac69 Initial revision
kono
parents:
diff changeset
1874 {
d35df41eac69 Initial revision
kono
parents:
diff changeset
1875 int e1,e2,t;
d35df41eac69 Initial revision
kono
parents:
diff changeset
1876
d35df41eac69 Initial revision
kono
parents:
diff changeset
1877 e1=expr7();
d35df41eac69 Initial revision
kono
parents:
diff changeset
1878 while(sym==EOR) {
66
0b068058dd67 *** empty log message ***
kono
parents: 65
diff changeset
1879 conv->op_(sym);
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
1880 e1=rvalue(e1);
d35df41eac69 Initial revision
kono
parents:
diff changeset
1881 t=type;
d35df41eac69 Initial revision
kono
parents:
diff changeset
1882 getsym();
d35df41eac69 Initial revision
kono
parents:
diff changeset
1883 e2=rvalue(expr7());
d35df41eac69 Initial revision
kono
parents:
diff changeset
1884 e1=binop(EOR,e1,e2,t,type);
d35df41eac69 Initial revision
kono
parents:
diff changeset
1885 }
d35df41eac69 Initial revision
kono
parents:
diff changeset
1886 return(e1);
d35df41eac69 Initial revision
kono
parents:
diff changeset
1887 }
d35df41eac69 Initial revision
kono
parents:
diff changeset
1888
61
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents: 59
diff changeset
1889 static int
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
1890 expr7(void)
d35df41eac69 Initial revision
kono
parents:
diff changeset
1891 {
d35df41eac69 Initial revision
kono
parents:
diff changeset
1892 int e1,e2,t;
d35df41eac69 Initial revision
kono
parents:
diff changeset
1893
d35df41eac69 Initial revision
kono
parents:
diff changeset
1894 e1=expr8();
d35df41eac69 Initial revision
kono
parents:
diff changeset
1895 while(sym==BAND) {
66
0b068058dd67 *** empty log message ***
kono
parents: 65
diff changeset
1896 conv->op_(sym);
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
1897 e1=rvalue(e1);
d35df41eac69 Initial revision
kono
parents:
diff changeset
1898 t=type;
d35df41eac69 Initial revision
kono
parents:
diff changeset
1899 getsym();
d35df41eac69 Initial revision
kono
parents:
diff changeset
1900 e2=rvalue(expr8());
d35df41eac69 Initial revision
kono
parents:
diff changeset
1901 e1=binop(BAND,e1,e2,t,type);
d35df41eac69 Initial revision
kono
parents:
diff changeset
1902 }
d35df41eac69 Initial revision
kono
parents:
diff changeset
1903 return(e1);
d35df41eac69 Initial revision
kono
parents:
diff changeset
1904 }
d35df41eac69 Initial revision
kono
parents:
diff changeset
1905
61
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents: 59
diff changeset
1906 static int
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
1907 expr8(void)
d35df41eac69 Initial revision
kono
parents:
diff changeset
1908 {
82
25654dc29ecc First Floating Point coding done.
kono
parents: 81
diff changeset
1909 int e1,e2,op,t;
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
1910
82
25654dc29ecc First Floating Point coding done.
kono
parents: 81
diff changeset
1911 e1=expr9();
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
1912 while((op=sym)==EQ||op==NEQ) {
66
0b068058dd67 *** empty log message ***
kono
parents: 65
diff changeset
1913 conv->op_(sym);
82
25654dc29ecc First Floating Point coding done.
kono
parents: 81
diff changeset
1914 e1=rvalue(e1);
25654dc29ecc First Floating Point coding done.
kono
parents: 81
diff changeset
1915 t=type;
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
1916 getsym();
82
25654dc29ecc First Floating Point coding done.
kono
parents: 81
diff changeset
1917 e2=rvalue(expr9());
25654dc29ecc First Floating Point coding done.
kono
parents: 81
diff changeset
1918 e1=binop(op,e1,e2,t,type);
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
1919 type= INT;
d35df41eac69 Initial revision
kono
parents:
diff changeset
1920 }
82
25654dc29ecc First Floating Point coding done.
kono
parents: 81
diff changeset
1921 return e1;
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
1922 }
d35df41eac69 Initial revision
kono
parents:
diff changeset
1923
61
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents: 59
diff changeset
1924 static int
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
1925 expr9(void)
d35df41eac69 Initial revision
kono
parents:
diff changeset
1926 {
d35df41eac69 Initial revision
kono
parents:
diff changeset
1927 int e1,e2,t,op;
d35df41eac69 Initial revision
kono
parents:
diff changeset
1928
d35df41eac69 Initial revision
kono
parents:
diff changeset
1929 e1=expr10();
d35df41eac69 Initial revision
kono
parents:
diff changeset
1930 while((op=sym)==GT||op==GE||op==LT||op==LE) {
66
0b068058dd67 *** empty log message ***
kono
parents: 65
diff changeset
1931 conv->op_(sym);
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
1932 e1=rvalue(e1);
d35df41eac69 Initial revision
kono
parents:
diff changeset
1933 t=type;
d35df41eac69 Initial revision
kono
parents:
diff changeset
1934 getsym();
d35df41eac69 Initial revision
kono
parents:
diff changeset
1935 e2=rvalue(expr10());
d35df41eac69 Initial revision
kono
parents:
diff changeset
1936 if(t==INT&&type==INT)
62
129f4802b027 separation done
kono
parents: 61
diff changeset
1937 e1=binop(op,e1,e2,t,type);
82
25654dc29ecc First Floating Point coding done.
kono
parents: 81
diff changeset
1938 else if(t==DOUBLE||type==DOUBLE||
25654dc29ecc First Floating Point coding done.
kono
parents: 81
diff changeset
1939 t==FLOAT||type==FLOAT)
25654dc29ecc First Floating Point coding done.
kono
parents: 81
diff changeset
1940 /* binop will handle op+DOP */
25654dc29ecc First Floating Point coding done.
kono
parents: 81
diff changeset
1941 e1=binop(op,e1,e2,t,type);
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
1942 else
62
129f4802b027 separation done
kono
parents: 61
diff changeset
1943 e1=binop(op+US,e1,e2,t,type);
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
1944 type= INT;
d35df41eac69 Initial revision
kono
parents:
diff changeset
1945 }
d35df41eac69 Initial revision
kono
parents:
diff changeset
1946 return e1;
d35df41eac69 Initial revision
kono
parents:
diff changeset
1947 }
d35df41eac69 Initial revision
kono
parents:
diff changeset
1948
61
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents: 59
diff changeset
1949 static int
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
1950 expr10(void)
d35df41eac69 Initial revision
kono
parents:
diff changeset
1951 {
d35df41eac69 Initial revision
kono
parents:
diff changeset
1952 int e1,e2,t,op;
d35df41eac69 Initial revision
kono
parents:
diff changeset
1953
d35df41eac69 Initial revision
kono
parents:
diff changeset
1954 e1=expr11();
d35df41eac69 Initial revision
kono
parents:
diff changeset
1955 while((op=sym)==RSHIFT||op==LSHIFT) {
66
0b068058dd67 *** empty log message ***
kono
parents: 65
diff changeset
1956 conv->op_(sym);
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
1957 e1=rvalue(e1);
d35df41eac69 Initial revision
kono
parents:
diff changeset
1958 t=type;
d35df41eac69 Initial revision
kono
parents:
diff changeset
1959 getsym();
d35df41eac69 Initial revision
kono
parents:
diff changeset
1960 e2=rvalue(expr11());
d35df41eac69 Initial revision
kono
parents:
diff changeset
1961 e1=binop(op,e1,e2,t,type);
d35df41eac69 Initial revision
kono
parents:
diff changeset
1962 }
d35df41eac69 Initial revision
kono
parents:
diff changeset
1963 return e1;
d35df41eac69 Initial revision
kono
parents:
diff changeset
1964 }
d35df41eac69 Initial revision
kono
parents:
diff changeset
1965
61
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents: 59
diff changeset
1966 static int
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
1967 expr11(void)
d35df41eac69 Initial revision
kono
parents:
diff changeset
1968 {
d35df41eac69 Initial revision
kono
parents:
diff changeset
1969 int e1,e2,t,op;
d35df41eac69 Initial revision
kono
parents:
diff changeset
1970
d35df41eac69 Initial revision
kono
parents:
diff changeset
1971 e1=expr12();
d35df41eac69 Initial revision
kono
parents:
diff changeset
1972 while((op=sym)==ADD||op==SUB) {
66
0b068058dd67 *** empty log message ***
kono
parents: 65
diff changeset
1973 conv->op_(sym);
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
1974 e1=rvalue(e1);
d35df41eac69 Initial revision
kono
parents:
diff changeset
1975 t=type;
d35df41eac69 Initial revision
kono
parents:
diff changeset
1976 getsym();
d35df41eac69 Initial revision
kono
parents:
diff changeset
1977 e2=rvalue(expr12());
d35df41eac69 Initial revision
kono
parents:
diff changeset
1978 e1=binop(op,e1,e2,t,type);
d35df41eac69 Initial revision
kono
parents:
diff changeset
1979 }
d35df41eac69 Initial revision
kono
parents:
diff changeset
1980 return e1;
d35df41eac69 Initial revision
kono
parents:
diff changeset
1981 }
d35df41eac69 Initial revision
kono
parents:
diff changeset
1982
61
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents: 59
diff changeset
1983 static int
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
1984 expr12(void)
d35df41eac69 Initial revision
kono
parents:
diff changeset
1985 {
d35df41eac69 Initial revision
kono
parents:
diff changeset
1986 int e1,e2,t,op;
d35df41eac69 Initial revision
kono
parents:
diff changeset
1987
d35df41eac69 Initial revision
kono
parents:
diff changeset
1988 e1=expr13();
d35df41eac69 Initial revision
kono
parents:
diff changeset
1989 while((op=sym)==MUL||op==DIV||op==MOD) {
66
0b068058dd67 *** empty log message ***
kono
parents: 65
diff changeset
1990 conv->op_(sym);
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
1991 e1=rvalue(e1);
d35df41eac69 Initial revision
kono
parents:
diff changeset
1992 t=type;
d35df41eac69 Initial revision
kono
parents:
diff changeset
1993 getsym();
d35df41eac69 Initial revision
kono
parents:
diff changeset
1994 e2=rvalue(expr13());
d35df41eac69 Initial revision
kono
parents:
diff changeset
1995 e1=binop(op,e1,e2,t,type);
d35df41eac69 Initial revision
kono
parents:
diff changeset
1996 }
d35df41eac69 Initial revision
kono
parents:
diff changeset
1997 return e1;
d35df41eac69 Initial revision
kono
parents:
diff changeset
1998 }
d35df41eac69 Initial revision
kono
parents:
diff changeset
1999
61
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents: 59
diff changeset
2000 static int
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
2001 expr13(void)
d35df41eac69 Initial revision
kono
parents:
diff changeset
2002 {
d35df41eac69 Initial revision
kono
parents:
diff changeset
2003 int e,op;
d35df41eac69 Initial revision
kono
parents:
diff changeset
2004
d35df41eac69 Initial revision
kono
parents:
diff changeset
2005 switch (op = sym) {
66
0b068058dd67 *** empty log message ***
kono
parents: 65
diff changeset
2006 case INC: case DEC:
69
dba8d111b7a0 c output
kono
parents: 68
diff changeset
2007 conv->prefix_(sym);
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
2008 getsym();
d35df41eac69 Initial revision
kono
parents:
diff changeset
2009 lcheck(e=expr13());
d35df41eac69 Initial revision
kono
parents:
diff changeset
2010 if(type==CHAR) {
d35df41eac69 Initial revision
kono
parents:
diff changeset
2011 type= INT;
d35df41eac69 Initial revision
kono
parents:
diff changeset
2012 return(list2(op==INC?CPREINC:CPREDEC,e));
d35df41eac69 Initial revision
kono
parents:
diff changeset
2013 }
d35df41eac69 Initial revision
kono
parents:
diff changeset
2014 if(integral(type))
d35df41eac69 Initial revision
kono
parents:
diff changeset
2015 return(list3(PREINC,e,op==INC?1:-1));
83
f3f75911d62c *** empty log message ***
kono
parents: 82
diff changeset
2016 if(type==FLOAT)
f3f75911d62c *** empty log message ***
kono
parents: 82
diff changeset
2017 return(list3(FPREINC,e,op==INC?1:-1));
f3f75911d62c *** empty log message ***
kono
parents: 82
diff changeset
2018 if(type==DOUBLE)
f3f75911d62c *** empty log message ***
kono
parents: 82
diff changeset
2019 return(list3(DPREINC,e,op==INC?1:-1));
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
2020 if(car(type)!=POINTER)
d35df41eac69 Initial revision
kono
parents:
diff changeset
2021 error(TYERR);
d35df41eac69 Initial revision
kono
parents:
diff changeset
2022 return(list3(PREINC,e,
d35df41eac69 Initial revision
kono
parents:
diff changeset
2023 op==INC?size(cadr(type)):-size(cadr(type)) ));
d35df41eac69 Initial revision
kono
parents:
diff changeset
2024 case MUL:
69
dba8d111b7a0 c output
kono
parents: 68
diff changeset
2025 conv->prefix_(sym);
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
2026 getsym();
d35df41eac69 Initial revision
kono
parents:
diff changeset
2027 e=rvalue(expr13());
d35df41eac69 Initial revision
kono
parents:
diff changeset
2028 return(indop(e));
d35df41eac69 Initial revision
kono
parents:
diff changeset
2029 case BAND:
69
dba8d111b7a0 c output
kono
parents: 68
diff changeset
2030 conv->prefix_(sym);
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
2031 getsym();
d35df41eac69 Initial revision
kono
parents:
diff changeset
2032 switch(car(e=expr13())) {
d35df41eac69 Initial revision
kono
parents:
diff changeset
2033 case INDIRECT:
d35df41eac69 Initial revision
kono
parents:
diff changeset
2034 e=cadr(e);
d35df41eac69 Initial revision
kono
parents:
diff changeset
2035 break;
d35df41eac69 Initial revision
kono
parents:
diff changeset
2036 case GVAR:
d35df41eac69 Initial revision
kono
parents:
diff changeset
2037 case LVAR:
d35df41eac69 Initial revision
kono
parents:
diff changeset
2038 e=list2(ADDRESS,e);
d35df41eac69 Initial revision
kono
parents:
diff changeset
2039 break;
d35df41eac69 Initial revision
kono
parents:
diff changeset
2040 case FNAME:
d35df41eac69 Initial revision
kono
parents:
diff changeset
2041 return e;
d35df41eac69 Initial revision
kono
parents:
diff changeset
2042 default:error(LVERR);
d35df41eac69 Initial revision
kono
parents:
diff changeset
2043 }
d35df41eac69 Initial revision
kono
parents:
diff changeset
2044 type=list2(POINTER,type);
d35df41eac69 Initial revision
kono
parents:
diff changeset
2045 return e;
d35df41eac69 Initial revision
kono
parents:
diff changeset
2046 case SUB:
69
dba8d111b7a0 c output
kono
parents: 68
diff changeset
2047 conv->prefix_(sym);
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
2048 getsym();
d35df41eac69 Initial revision
kono
parents:
diff changeset
2049 e=rvalue(expr13());
82
25654dc29ecc First Floating Point coding done.
kono
parents: 81
diff changeset
2050 if(type==FLOAT||type==DOUBLE)
25654dc29ecc First Floating Point coding done.
kono
parents: 81
diff changeset
2051 return list2(DMINUS,e);
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
2052 if(!integral(type))
d35df41eac69 Initial revision
kono
parents:
diff changeset
2053 error(TYERR);
d35df41eac69 Initial revision
kono
parents:
diff changeset
2054 return(car(e)==CONST?list2(CONST,-cadr(e)):list2(MINUS,e));
d35df41eac69 Initial revision
kono
parents:
diff changeset
2055 case BNOT:
69
dba8d111b7a0 c output
kono
parents: 68
diff changeset
2056 conv->prefix_(sym);
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
2057 getsym();
d35df41eac69 Initial revision
kono
parents:
diff changeset
2058 e=rvalue(expr13());
d35df41eac69 Initial revision
kono
parents:
diff changeset
2059 if(!integral(type))
d35df41eac69 Initial revision
kono
parents:
diff changeset
2060 error(TYERR);
d35df41eac69 Initial revision
kono
parents:
diff changeset
2061 return(car(e)==CONST?list2(CONST,~cadr(e)):list2(BNOT,e));
d35df41eac69 Initial revision
kono
parents:
diff changeset
2062 case LNOT:
69
dba8d111b7a0 c output
kono
parents: 68
diff changeset
2063 conv->prefix_(sym);
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
2064 getsym();
19
b62230ea38f6 ifdef debug
kono
parents: 18
diff changeset
2065 e=rvalue(expr13());
82
25654dc29ecc First Floating Point coding done.
kono
parents: 81
diff changeset
2066 if(type==FLOAT||type==DOUBLE)
25654dc29ecc First Floating Point coding done.
kono
parents: 81
diff changeset
2067 return(car(e)==DCONST?list2(CONST,!dcadr(e)):
25654dc29ecc First Floating Point coding done.
kono
parents: 81
diff changeset
2068 list3(DOP+NEQ,list2(CONST,0),e));
20
8d3db5fc8a97 *** empty log message ***
kono
parents: 19
diff changeset
2069 if(!scalar(type))
19
b62230ea38f6 ifdef debug
kono
parents: 18
diff changeset
2070 error(TYERR);
b62230ea38f6 ifdef debug
kono
parents: 18
diff changeset
2071 return(car(e)==CONST?list2(CONST,!cadr(e)):list2(LNOT,e));
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
2072 case SIZEOF:
69
dba8d111b7a0 c output
kono
parents: 68
diff changeset
2073 conv->prefix_(sym);
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
2074 if(getsym()==LPAR) {
d35df41eac69 Initial revision
kono
parents:
diff changeset
2075 if(typeid(getsym())) {
d35df41eac69 Initial revision
kono
parents:
diff changeset
2076 e=list2(CONST,size(typename()));
d35df41eac69 Initial revision
kono
parents:
diff changeset
2077 type=INT;
d35df41eac69 Initial revision
kono
parents:
diff changeset
2078 checksym(RPAR);
d35df41eac69 Initial revision
kono
parents:
diff changeset
2079 return e;
d35df41eac69 Initial revision
kono
parents:
diff changeset
2080 } else {
d35df41eac69 Initial revision
kono
parents:
diff changeset
2081 e=expr0();
d35df41eac69 Initial revision
kono
parents:
diff changeset
2082 checksym(RPAR);
d35df41eac69 Initial revision
kono
parents:
diff changeset
2083 expr16(e);
d35df41eac69 Initial revision
kono
parents:
diff changeset
2084 if(sym==INC||sym==DEC) {
d35df41eac69 Initial revision
kono
parents:
diff changeset
2085 getsym();
d35df41eac69 Initial revision
kono
parents:
diff changeset
2086 if(type==CHAR) type=INT;
83
f3f75911d62c *** empty log message ***
kono
parents: 82
diff changeset
2087 else if(!scalar(type)&&type!=FLOAT&&type!=DOUBLE)
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
2088 error(TYERR);
d35df41eac69 Initial revision
kono
parents:
diff changeset
2089 }
d35df41eac69 Initial revision
kono
parents:
diff changeset
2090 }
d35df41eac69 Initial revision
kono
parents:
diff changeset
2091 } else
d35df41eac69 Initial revision
kono
parents:
diff changeset
2092 expr13();
d35df41eac69 Initial revision
kono
parents:
diff changeset
2093 e=list2(CONST,size(type));
d35df41eac69 Initial revision
kono
parents:
diff changeset
2094 type=INT;
d35df41eac69 Initial revision
kono
parents:
diff changeset
2095 return e;
d35df41eac69 Initial revision
kono
parents:
diff changeset
2096 }
d35df41eac69 Initial revision
kono
parents:
diff changeset
2097 e=expr14();
d35df41eac69 Initial revision
kono
parents:
diff changeset
2098 if((op=sym)==INC||op==DEC) {
69
dba8d111b7a0 c output
kono
parents: 68
diff changeset
2099 conv->postfix_(sym);
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
2100 lcheck(e);
d35df41eac69 Initial revision
kono
parents:
diff changeset
2101 getsym();
d35df41eac69 Initial revision
kono
parents:
diff changeset
2102 if(type==CHAR) {
d35df41eac69 Initial revision
kono
parents:
diff changeset
2103 type= INT;
d35df41eac69 Initial revision
kono
parents:
diff changeset
2104 return(list2(op==INC?CPOSTINC:CPOSTDEC,e));
d35df41eac69 Initial revision
kono
parents:
diff changeset
2105 }
d35df41eac69 Initial revision
kono
parents:
diff changeset
2106 if(integral(type))
d35df41eac69 Initial revision
kono
parents:
diff changeset
2107 return(list3(POSTINC,e,op==INC?1:-1));
83
f3f75911d62c *** empty log message ***
kono
parents: 82
diff changeset
2108 if(type==FLOAT)
f3f75911d62c *** empty log message ***
kono
parents: 82
diff changeset
2109 return(list3(FPOSTINC,e,op==INC?1:-1));
f3f75911d62c *** empty log message ***
kono
parents: 82
diff changeset
2110 if(type==DOUBLE)
f3f75911d62c *** empty log message ***
kono
parents: 82
diff changeset
2111 return(list3(DPOSTINC,e,op==INC?1:-1));
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
2112 if(car(type)!=POINTER)
d35df41eac69 Initial revision
kono
parents:
diff changeset
2113 error(TYERR);
d35df41eac69 Initial revision
kono
parents:
diff changeset
2114 return (list3(POSTINC,e,
d35df41eac69 Initial revision
kono
parents:
diff changeset
2115 op == INC ? size(cadr(type)): -size(cadr(type)) ));
d35df41eac69 Initial revision
kono
parents:
diff changeset
2116 }
d35df41eac69 Initial revision
kono
parents:
diff changeset
2117 return e;
d35df41eac69 Initial revision
kono
parents:
diff changeset
2118 }
d35df41eac69 Initial revision
kono
parents:
diff changeset
2119
61
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents: 59
diff changeset
2120 static int
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
2121 expr14(void)
d35df41eac69 Initial revision
kono
parents:
diff changeset
2122 {
d35df41eac69 Initial revision
kono
parents:
diff changeset
2123 int e1,t;
d35df41eac69 Initial revision
kono
parents:
diff changeset
2124
d35df41eac69 Initial revision
kono
parents:
diff changeset
2125 switch(sym) {
d35df41eac69 Initial revision
kono
parents:
diff changeset
2126 case IDENT:
68
0266905063b5 *** empty log message ***
kono
parents: 67
diff changeset
2127 conv->id_(sym,nptr);
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
2128 switch(nptr->sc) {
d35df41eac69 Initial revision
kono
parents:
diff changeset
2129 case GVAR:
d35df41eac69 Initial revision
kono
parents:
diff changeset
2130 e1=list3(GVAR,nptr->dsp,(int)nptr->nm);
d35df41eac69 Initial revision
kono
parents:
diff changeset
2131 type=nptr->ty;
d35df41eac69 Initial revision
kono
parents:
diff changeset
2132 getsym();
d35df41eac69 Initial revision
kono
parents:
diff changeset
2133 break;
d35df41eac69 Initial revision
kono
parents:
diff changeset
2134 case LVAR:
d35df41eac69 Initial revision
kono
parents:
diff changeset
2135 e1=list2(LVAR,nptr->dsp);
d35df41eac69 Initial revision
kono
parents:
diff changeset
2136 type=nptr->ty;
d35df41eac69 Initial revision
kono
parents:
diff changeset
2137 getsym();
d35df41eac69 Initial revision
kono
parents:
diff changeset
2138 break;
d35df41eac69 Initial revision
kono
parents:
diff changeset
2139 case REGISTER:
d35df41eac69 Initial revision
kono
parents:
diff changeset
2140 e1=list2(REGISTER,nptr->dsp);
d35df41eac69 Initial revision
kono
parents:
diff changeset
2141 type=nptr->ty;
d35df41eac69 Initial revision
kono
parents:
diff changeset
2142 getsym();
d35df41eac69 Initial revision
kono
parents:
diff changeset
2143 break;
d35df41eac69 Initial revision
kono
parents:
diff changeset
2144 case FLABEL: case BLABEL:
d35df41eac69 Initial revision
kono
parents:
diff changeset
2145 case FUNCTION: case CODE:
d35df41eac69 Initial revision
kono
parents:
diff changeset
2146 e1=list2(FNAME,(int)nptr);
67
254a0c576114 argument type list
kono
parents: 66
diff changeset
2147 type=list3(nptr->sc,nptr->ty,nptr->dsp);
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
2148 getsym();
d35df41eac69 Initial revision
kono
parents:
diff changeset
2149 break;
d35df41eac69 Initial revision
kono
parents:
diff changeset
2150 case EMPTY:
d35df41eac69 Initial revision
kono
parents:
diff changeset
2151 if(getsym()==LPAR) {
d35df41eac69 Initial revision
kono
parents:
diff changeset
2152 nptr->sc = FUNCTION;
67
254a0c576114 argument type list
kono
parents: 66
diff changeset
2153 nptr->ty= INT;
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
2154 type= list3(FUNCTION,INT,0);
d35df41eac69 Initial revision
kono
parents:
diff changeset
2155 e1=expr15(list2(FNAME,(int)nptr));
d35df41eac69 Initial revision
kono
parents:
diff changeset
2156 break;
d35df41eac69 Initial revision
kono
parents:
diff changeset
2157 } else {
d35df41eac69 Initial revision
kono
parents:
diff changeset
2158 e1=list2(FNAME,(int)nptr);
67
254a0c576114 argument type list
kono
parents: 66
diff changeset
2159 type=list3(nptr->sc,nptr->ty,nptr->dsp);
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
2160 break;
d35df41eac69 Initial revision
kono
parents:
diff changeset
2161 }
d35df41eac69 Initial revision
kono
parents:
diff changeset
2162 default:error(UDERR);
d35df41eac69 Initial revision
kono
parents:
diff changeset
2163 }
d35df41eac69 Initial revision
kono
parents:
diff changeset
2164 break;
d35df41eac69 Initial revision
kono
parents:
diff changeset
2165 case STRING:
68
0266905063b5 *** empty log message ***
kono
parents: 67
diff changeset
2166 conv-> string_(sptr);
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
2167 e1=list3(STRING,(int)sptr,symval);
d35df41eac69 Initial revision
kono
parents:
diff changeset
2168 type=list3(ARRAY,CHAR,symval);
d35df41eac69 Initial revision
kono
parents:
diff changeset
2169 getsym();
d35df41eac69 Initial revision
kono
parents:
diff changeset
2170 break;
d35df41eac69 Initial revision
kono
parents:
diff changeset
2171 case CONST:
68
0266905063b5 *** empty log message ***
kono
parents: 67
diff changeset
2172 conv-> const_(symval);
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
2173 type= INT;
d35df41eac69 Initial revision
kono
parents:
diff changeset
2174 e1=list2(CONST,symval);
d35df41eac69 Initial revision
kono
parents:
diff changeset
2175 getsym();
d35df41eac69 Initial revision
kono
parents:
diff changeset
2176 break;
81
f94ca1168520 float first try...
kono
parents: 80
diff changeset
2177 case DCONST:
f94ca1168520 float first try...
kono
parents: 80
diff changeset
2178 conv-> const_(symval);
f94ca1168520 float first try...
kono
parents: 80
diff changeset
2179 type= DOUBLE;
f94ca1168520 float first try...
kono
parents: 80
diff changeset
2180 e1=dlist2(DCONST,dsymval);
f94ca1168520 float first try...
kono
parents: 80
diff changeset
2181 getsym();
f94ca1168520 float first try...
kono
parents: 80
diff changeset
2182 break;
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
2183 case RETURN:
68
0266905063b5 *** empty log message ***
kono
parents: 67
diff changeset
2184 conv-> return_f_();
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
2185 if (fnptr->sc != FUNCTION) {
d35df41eac69 Initial revision
kono
parents:
diff changeset
2186 error(STERR);
d35df41eac69 Initial revision
kono
parents:
diff changeset
2187 }
d35df41eac69 Initial revision
kono
parents:
diff changeset
2188 type=list2(POINTER,CODE);
d35df41eac69 Initial revision
kono
parents:
diff changeset
2189 e1=list2(RETURN,(int)fnptr);
d35df41eac69 Initial revision
kono
parents:
diff changeset
2190 getsym();
d35df41eac69 Initial revision
kono
parents:
diff changeset
2191 break;
18
df7fa8cee67b pass -Wall
kono
parents: 16
diff changeset
2192 case DEFINED:
df7fa8cee67b pass -Wall
kono
parents: 16
diff changeset
2193 getsym();
df7fa8cee67b pass -Wall
kono
parents: 16
diff changeset
2194 t = mode; mode = IFDEF;
df7fa8cee67b pass -Wall
kono
parents: 16
diff changeset
2195 checksym(LPAR);
68
0266905063b5 *** empty log message ***
kono
parents: 67
diff changeset
2196 conv-> defined_(name);
18
df7fa8cee67b pass -Wall
kono
parents: 16
diff changeset
2197 mode = t;
df7fa8cee67b pass -Wall
kono
parents: 16
diff changeset
2198 type= INT;
df7fa8cee67b pass -Wall
kono
parents: 16
diff changeset
2199 e1=list2(CONST,symval);
df7fa8cee67b pass -Wall
kono
parents: 16
diff changeset
2200 getsym();
df7fa8cee67b pass -Wall
kono
parents: 16
diff changeset
2201 checksym(RPAR);
df7fa8cee67b pass -Wall
kono
parents: 16
diff changeset
2202 break;
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
2203 case ENVIRONMENT:
68
0266905063b5 *** empty log message ***
kono
parents: 67
diff changeset
2204 conv-> environment_();
2
kono
parents: 1
diff changeset
2205 type=list2(POINTER,VOID);
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
2206 e1=list2(ENVIRONMENT,0);
d35df41eac69 Initial revision
kono
parents:
diff changeset
2207 getsym();
d35df41eac69 Initial revision
kono
parents:
diff changeset
2208 break;
d35df41eac69 Initial revision
kono
parents:
diff changeset
2209 case LPAR:
66
0b068058dd67 *** empty log message ***
kono
parents: 65
diff changeset
2210 conv->lpar_();
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
2211 if(typeid(getsym())) {
d35df41eac69 Initial revision
kono
parents:
diff changeset
2212 t=typename();
72
3b5d293cea36 type def etc
kono
parents: 71
diff changeset
2213 conv->return_type_(t,0,0);
3b5d293cea36 type def etc
kono
parents: 71
diff changeset
2214 conv->rpar_();
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
2215 checksym(RPAR);
d35df41eac69 Initial revision
kono
parents:
diff changeset
2216 e1=expr13();
85
3789aef7331d minor fix
kono
parents: 83
diff changeset
2217 if (integral(t)) {
3789aef7331d minor fix
kono
parents: 83
diff changeset
2218 if(t==UNSIGNED) e1=unsigned_value(e1,type);
3789aef7331d minor fix
kono
parents: 83
diff changeset
2219 else e1=int_value(e1,type);
3789aef7331d minor fix
kono
parents: 83
diff changeset
2220 } else if(t==FLOAT||t==DOUBLE) {
3789aef7331d minor fix
kono
parents: 83
diff changeset
2221 if(integral(type)) e1=float_value(e1,type);
81
f94ca1168520 float first try...
kono
parents: 80
diff changeset
2222 }
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
2223 type=t;
d35df41eac69 Initial revision
kono
parents:
diff changeset
2224 return e1;
d35df41eac69 Initial revision
kono
parents:
diff changeset
2225 }
d35df41eac69 Initial revision
kono
parents:
diff changeset
2226 e1=expr0();
66
0b068058dd67 *** empty log message ***
kono
parents: 65
diff changeset
2227 conv->rpar_();
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
2228 checksym(RPAR);
d35df41eac69 Initial revision
kono
parents:
diff changeset
2229 break;
d35df41eac69 Initial revision
kono
parents:
diff changeset
2230 default:error(EXERR);
d35df41eac69 Initial revision
kono
parents:
diff changeset
2231 }
d35df41eac69 Initial revision
kono
parents:
diff changeset
2232 return expr16(e1);
d35df41eac69 Initial revision
kono
parents:
diff changeset
2233 }
d35df41eac69 Initial revision
kono
parents:
diff changeset
2234
61
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents: 59
diff changeset
2235 static int
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
2236 expr16(int e1)
d35df41eac69 Initial revision
kono
parents:
diff changeset
2237 {
d35df41eac69 Initial revision
kono
parents:
diff changeset
2238 int e2,t;
d35df41eac69 Initial revision
kono
parents:
diff changeset
2239
d35df41eac69 Initial revision
kono
parents:
diff changeset
2240 while(1) {
d35df41eac69 Initial revision
kono
parents:
diff changeset
2241 if(sym==LBRA) {
66
0b068058dd67 *** empty log message ***
kono
parents: 65
diff changeset
2242 conv->lbra_(sym);
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
2243 e1=rvalue(e1);
d35df41eac69 Initial revision
kono
parents:
diff changeset
2244 t=type;
d35df41eac69 Initial revision
kono
parents:
diff changeset
2245 getsym();
d35df41eac69 Initial revision
kono
parents:
diff changeset
2246 e2=rvalue(expr0());
d35df41eac69 Initial revision
kono
parents:
diff changeset
2247 checksym(RBRA);
66
0b068058dd67 *** empty log message ***
kono
parents: 65
diff changeset
2248 conv->rbra_(sym);
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
2249 e1=binop(ADD,e1,e2,t,type);
d35df41eac69 Initial revision
kono
parents:
diff changeset
2250 e1=indop(e1);
68
0266905063b5 *** empty log message ***
kono
parents: 67
diff changeset
2251 } else if(sym==LPAR) e1=expr15(e1);
66
0b068058dd67 *** empty log message ***
kono
parents: 65
diff changeset
2252 else {
69
dba8d111b7a0 c output
kono
parents: 68
diff changeset
2253 if(sym==PERIOD) { conv->op_(sym);e1=strop(e1);
dba8d111b7a0 c output
kono
parents: 68
diff changeset
2254 } else if(sym==ARROW) { conv->op_(sym);e1=strop(indop(rvalue(e1)));
68
0266905063b5 *** empty log message ***
kono
parents: 67
diff changeset
2255 } else break;
66
0b068058dd67 *** empty log message ***
kono
parents: 65
diff changeset
2256 }
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
2257 }
d35df41eac69 Initial revision
kono
parents:
diff changeset
2258 if(car(e1)==FNAME) type=list2(POINTER,type);
d35df41eac69 Initial revision
kono
parents:
diff changeset
2259 return e1;
d35df41eac69 Initial revision
kono
parents:
diff changeset
2260 }
d35df41eac69 Initial revision
kono
parents:
diff changeset
2261
61
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents: 59
diff changeset
2262 static int
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
2263 rvalue(int e)
d35df41eac69 Initial revision
kono
parents:
diff changeset
2264 {
d35df41eac69 Initial revision
kono
parents:
diff changeset
2265 int t;
d35df41eac69 Initial revision
kono
parents:
diff changeset
2266 if(type==CHAR) {
d35df41eac69 Initial revision
kono
parents:
diff changeset
2267 type= INT;
d35df41eac69 Initial revision
kono
parents:
diff changeset
2268 switch(car(e)) {
d35df41eac69 Initial revision
kono
parents:
diff changeset
2269 case GVAR:
d35df41eac69 Initial revision
kono
parents:
diff changeset
2270 return(list3(CRGVAR,cadr(e),caddr(e)));
d35df41eac69 Initial revision
kono
parents:
diff changeset
2271 case LVAR:
d35df41eac69 Initial revision
kono
parents:
diff changeset
2272 return(list2(CRLVAR,cadr(e)));
d35df41eac69 Initial revision
kono
parents:
diff changeset
2273 case INDIRECT:
d35df41eac69 Initial revision
kono
parents:
diff changeset
2274 return(list2(CRINDIRECT,cadr(e)));
d35df41eac69 Initial revision
kono
parents:
diff changeset
2275 default:return(e);
d35df41eac69 Initial revision
kono
parents:
diff changeset
2276 }
d35df41eac69 Initial revision
kono
parents:
diff changeset
2277 }
81
f94ca1168520 float first try...
kono
parents: 80
diff changeset
2278 if(type==FLOAT) {
f94ca1168520 float first try...
kono
parents: 80
diff changeset
2279 switch(car(e)) {
f94ca1168520 float first try...
kono
parents: 80
diff changeset
2280 case GVAR:
f94ca1168520 float first try...
kono
parents: 80
diff changeset
2281 return(list3(FRGVAR,cadr(e),caddr(e)));
f94ca1168520 float first try...
kono
parents: 80
diff changeset
2282 case LVAR:
f94ca1168520 float first try...
kono
parents: 80
diff changeset
2283 return(list2(FRLVAR,cadr(e)));
f94ca1168520 float first try...
kono
parents: 80
diff changeset
2284 case INDIRECT:
f94ca1168520 float first try...
kono
parents: 80
diff changeset
2285 return(list2(FRINDIRECT,cadr(e)));
f94ca1168520 float first try...
kono
parents: 80
diff changeset
2286 default:return(e);
f94ca1168520 float first try...
kono
parents: 80
diff changeset
2287 }
f94ca1168520 float first try...
kono
parents: 80
diff changeset
2288 }
f94ca1168520 float first try...
kono
parents: 80
diff changeset
2289 if(type==DOUBLE) {
f94ca1168520 float first try...
kono
parents: 80
diff changeset
2290 switch(car(e)) {
f94ca1168520 float first try...
kono
parents: 80
diff changeset
2291 case GVAR:
f94ca1168520 float first try...
kono
parents: 80
diff changeset
2292 return(list3(DRGVAR,cadr(e),caddr(e)));
f94ca1168520 float first try...
kono
parents: 80
diff changeset
2293 case LVAR:
f94ca1168520 float first try...
kono
parents: 80
diff changeset
2294 return(list2(DRLVAR,cadr(e)));
f94ca1168520 float first try...
kono
parents: 80
diff changeset
2295 case INDIRECT:
f94ca1168520 float first try...
kono
parents: 80
diff changeset
2296 return(list2(DRINDIRECT,cadr(e)));
f94ca1168520 float first try...
kono
parents: 80
diff changeset
2297 default:return(e);
f94ca1168520 float first try...
kono
parents: 80
diff changeset
2298 }
f94ca1168520 float first try...
kono
parents: 80
diff changeset
2299 }
f94ca1168520 float first try...
kono
parents: 80
diff changeset
2300 if(type==LONGLONG) {
f94ca1168520 float first try...
kono
parents: 80
diff changeset
2301 switch(car(e)) {
f94ca1168520 float first try...
kono
parents: 80
diff changeset
2302 case GVAR:
f94ca1168520 float first try...
kono
parents: 80
diff changeset
2303 return(list3(LRGVAR,cadr(e),caddr(e)));
f94ca1168520 float first try...
kono
parents: 80
diff changeset
2304 case LVAR:
f94ca1168520 float first try...
kono
parents: 80
diff changeset
2305 return(list2(LRLVAR,cadr(e)));
f94ca1168520 float first try...
kono
parents: 80
diff changeset
2306 case INDIRECT:
f94ca1168520 float first try...
kono
parents: 80
diff changeset
2307 return(list2(LRINDIRECT,cadr(e)));
f94ca1168520 float first try...
kono
parents: 80
diff changeset
2308 default:return(e);
f94ca1168520 float first try...
kono
parents: 80
diff changeset
2309 }
f94ca1168520 float first try...
kono
parents: 80
diff changeset
2310 }
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
2311 if(!integral(type)&&type!=VOID) {
79
82d0e30f61dd *** empty log message ***
kono
parents: 78
diff changeset
2312 if(type==CODE) {
78
8418d4b7caa7 *** empty log message ***
kono
parents: 77
diff changeset
2313 return e;
79
82d0e30f61dd *** empty log message ***
kono
parents: 78
diff changeset
2314 } if((t=car(type))==ARRAY) {
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
2315 type=list2(POINTER,cadr(type));
d35df41eac69 Initial revision
kono
parents:
diff changeset
2316 if(car(e)==INDIRECT) return cadr(e);
d35df41eac69 Initial revision
kono
parents:
diff changeset
2317 return list2(ADDRESS,e);
37
412ad2e6c2a2 struct copy
kono
parents: 36
diff changeset
2318 } else if(t==STRUCT || t==UNION) {
412ad2e6c2a2 struct copy
kono
parents: 36
diff changeset
2319 t = cadr(type); /* size */
38
d48d952da354 struct copy continue
kono
parents: 37
diff changeset
2320 return list3(RSTRUCT,e,t);
79
82d0e30f61dd *** empty log message ***
kono
parents: 78
diff changeset
2321 } else if(t==FUNCTION) {
82d0e30f61dd *** empty log message ***
kono
parents: 78
diff changeset
2322 return e;
82d0e30f61dd *** empty log message ***
kono
parents: 78
diff changeset
2323 } else if(t==CODE) {
82d0e30f61dd *** empty log message ***
kono
parents: 78
diff changeset
2324 return e;
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
2325 } else if(t!=POINTER) error(TYERR);
d35df41eac69 Initial revision
kono
parents:
diff changeset
2326 }
d35df41eac69 Initial revision
kono
parents:
diff changeset
2327 switch(car(e)) {
d35df41eac69 Initial revision
kono
parents:
diff changeset
2328 case GVAR:
d35df41eac69 Initial revision
kono
parents:
diff changeset
2329 return(list3(RGVAR,cadr(e),caddr(e)));
d35df41eac69 Initial revision
kono
parents:
diff changeset
2330 case LVAR:
d35df41eac69 Initial revision
kono
parents:
diff changeset
2331 return(list2(RLVAR,cadr(e)));
d35df41eac69 Initial revision
kono
parents:
diff changeset
2332 case INDIRECT:
d35df41eac69 Initial revision
kono
parents:
diff changeset
2333 return(list2(RINDIRECT,cadr(e)));
d35df41eac69 Initial revision
kono
parents:
diff changeset
2334 default:return(e);
d35df41eac69 Initial revision
kono
parents:
diff changeset
2335 }
d35df41eac69 Initial revision
kono
parents:
diff changeset
2336 }
d35df41eac69 Initial revision
kono
parents:
diff changeset
2337
46
b1c8ac8c308d fix cascading struct retrun. Now it should be compatible with gcc
kono
parents: 45
diff changeset
2338 int
b1c8ac8c308d fix cascading struct retrun. Now it should be compatible with gcc
kono
parents: 45
diff changeset
2339 rvalue_t(int e,int t)
b1c8ac8c308d fix cascading struct retrun. Now it should be compatible with gcc
kono
parents: 45
diff changeset
2340 {
b1c8ac8c308d fix cascading struct retrun. Now it should be compatible with gcc
kono
parents: 45
diff changeset
2341 int stype = type;
b1c8ac8c308d fix cascading struct retrun. Now it should be compatible with gcc
kono
parents: 45
diff changeset
2342 type = t;
b1c8ac8c308d fix cascading struct retrun. Now it should be compatible with gcc
kono
parents: 45
diff changeset
2343 e = rvalue(e);
b1c8ac8c308d fix cascading struct retrun. Now it should be compatible with gcc
kono
parents: 45
diff changeset
2344 type = stype;
b1c8ac8c308d fix cascading struct retrun. Now it should be compatible with gcc
kono
parents: 45
diff changeset
2345 return e;
b1c8ac8c308d fix cascading struct retrun. Now it should be compatible with gcc
kono
parents: 45
diff changeset
2346 }
b1c8ac8c308d fix cascading struct retrun. Now it should be compatible with gcc
kono
parents: 45
diff changeset
2347
61
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents: 59
diff changeset
2348 static void
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
2349 lcheck(int e)
d35df41eac69 Initial revision
kono
parents:
diff changeset
2350 {
d35df41eac69 Initial revision
kono
parents:
diff changeset
2351 int t;
81
f94ca1168520 float first try...
kono
parents: 80
diff changeset
2352 if(!(scalar(type)||type==DOUBLE||type==FLOAT)||
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
2353 (car(e)!=GVAR&&car(e)!=LVAR&&car(e)!=INDIRECT&&car(e)!=REGISTER))
d35df41eac69 Initial revision
kono
parents:
diff changeset
2354 if ((t=car(type))<0 && t!=STRUCT && t!=UNION)
d35df41eac69 Initial revision
kono
parents:
diff changeset
2355 error(LVERR);
d35df41eac69 Initial revision
kono
parents:
diff changeset
2356 }
d35df41eac69 Initial revision
kono
parents:
diff changeset
2357
61
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents: 59
diff changeset
2358 static int
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
2359 indop(int e)
d35df41eac69 Initial revision
kono
parents:
diff changeset
2360 {
d35df41eac69 Initial revision
kono
parents:
diff changeset
2361 if(type!=INT&&type!=UNSIGNED) {
79
82d0e30f61dd *** empty log message ***
kono
parents: 78
diff changeset
2362 if(car(type)==POINTER)
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
2363 type=cadr(type);
79
82d0e30f61dd *** empty log message ***
kono
parents: 78
diff changeset
2364 else if(car(type)==CODE || car(type)==FUNCTION)
82d0e30f61dd *** empty log message ***
kono
parents: 78
diff changeset
2365 type=type;
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
2366 else error(TYERR);
d35df41eac69 Initial revision
kono
parents:
diff changeset
2367 } else
d35df41eac69 Initial revision
kono
parents:
diff changeset
2368 type= CHAR;
d35df41eac69 Initial revision
kono
parents:
diff changeset
2369 if(car(e)==ADDRESS)
d35df41eac69 Initial revision
kono
parents:
diff changeset
2370 return(cadr(e));
d35df41eac69 Initial revision
kono
parents:
diff changeset
2371 return(list2(INDIRECT,e));
d35df41eac69 Initial revision
kono
parents:
diff changeset
2372 }
d35df41eac69 Initial revision
kono
parents:
diff changeset
2373
61
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents: 59
diff changeset
2374 static int
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
2375 strop(int e)
d35df41eac69 Initial revision
kono
parents:
diff changeset
2376 {
d35df41eac69 Initial revision
kono
parents:
diff changeset
2377 getsym();
d35df41eac69 Initial revision
kono
parents:
diff changeset
2378 if (sym!=IDENT||nptr->sc!=FIELD) error(TYERR);
69
dba8d111b7a0 c output
kono
parents: 68
diff changeset
2379 conv->id_(sym,nptr);
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
2380 if (integral(type)||(car(type)!=STRUCT && car(type)!=UNION))
d35df41eac69 Initial revision
kono
parents:
diff changeset
2381 e=rvalue(e);
d35df41eac69 Initial revision
kono
parents:
diff changeset
2382 type = nptr->ty;
40
060d1e549fec *** empty log message ***
kono
parents: 39
diff changeset
2383 if(nptr->dsp) {
060d1e549fec *** empty log message ***
kono
parents: 39
diff changeset
2384 switch(car(e)) {
060d1e549fec *** empty log message ***
kono
parents: 39
diff changeset
2385 case GVAR:
060d1e549fec *** empty log message ***
kono
parents: 39
diff changeset
2386 e=list2(INDIRECT,list3(ADD,e,list2(CONST,nptr->dsp)));
060d1e549fec *** empty log message ***
kono
parents: 39
diff changeset
2387 break;
060d1e549fec *** empty log message ***
kono
parents: 39
diff changeset
2388 case LVAR:
53
64a4e3789fd2 parallel assign works.
kono
parents: 50
diff changeset
2389 e=list2(LVAR,cadr(e) + nptr->dsp);
40
060d1e549fec *** empty log message ***
kono
parents: 39
diff changeset
2390 break;
060d1e549fec *** empty log message ***
kono
parents: 39
diff changeset
2391 case INDIRECT:
060d1e549fec *** empty log message ***
kono
parents: 39
diff changeset
2392 e=list2(INDIRECT,list3(ADD,cadr(e),list2(CONST,nptr->dsp)));
060d1e549fec *** empty log message ***
kono
parents: 39
diff changeset
2393 break;
060d1e549fec *** empty log message ***
kono
parents: 39
diff changeset
2394 default:
060d1e549fec *** empty log message ***
kono
parents: 39
diff changeset
2395 e=list2(INDIRECT,list3(ADD,e,list2(CONST,nptr->dsp)));
060d1e549fec *** empty log message ***
kono
parents: 39
diff changeset
2396 }
060d1e549fec *** empty log message ***
kono
parents: 39
diff changeset
2397 } else {
060d1e549fec *** empty log message ***
kono
parents: 39
diff changeset
2398 switch(car(e)) {
060d1e549fec *** empty log message ***
kono
parents: 39
diff changeset
2399 case GVAR: case LVAR: case INDIRECT:
060d1e549fec *** empty log message ***
kono
parents: 39
diff changeset
2400 break;
060d1e549fec *** empty log message ***
kono
parents: 39
diff changeset
2401 default:
060d1e549fec *** empty log message ***
kono
parents: 39
diff changeset
2402 e=list2(INDIRECT,e);
060d1e549fec *** empty log message ***
kono
parents: 39
diff changeset
2403 }
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
2404 }
d35df41eac69 Initial revision
kono
parents:
diff changeset
2405 getsym();
d35df41eac69 Initial revision
kono
parents:
diff changeset
2406 return e;
d35df41eac69 Initial revision
kono
parents:
diff changeset
2407 }
d35df41eac69 Initial revision
kono
parents:
diff changeset
2408
61
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents: 59
diff changeset
2409 static int
81
f94ca1168520 float first try...
kono
parents: 80
diff changeset
2410 dbinop(int op, int e1, int e2, int t1, int t2)
f94ca1168520 float first try...
kono
parents: 80
diff changeset
2411 {
f94ca1168520 float first try...
kono
parents: 80
diff changeset
2412 double d1,d2,d;
f94ca1168520 float first try...
kono
parents: 80
diff changeset
2413
f94ca1168520 float first try...
kono
parents: 80
diff changeset
2414 type= DOUBLE;
85
3789aef7331d minor fix
kono
parents: 83
diff changeset
2415 if (integral(t1)) { e1=float_value(e1,t1); t1=DOUBLE; }
3789aef7331d minor fix
kono
parents: 83
diff changeset
2416 if (integral(t2)) { e2=float_value(e2,t2); t2=DOUBLE; }
81
f94ca1168520 float first try...
kono
parents: 80
diff changeset
2417 if(car(e1)==DCONST&&car(e2)==DCONST) {
85
3789aef7331d minor fix
kono
parents: 83
diff changeset
2418 d1=dcadr(e1);
3789aef7331d minor fix
kono
parents: 83
diff changeset
2419 d2=dcadr(e2);
81
f94ca1168520 float first try...
kono
parents: 80
diff changeset
2420 switch(op) {
f94ca1168520 float first try...
kono
parents: 80
diff changeset
2421 case ADD: d=d1+d2; break;
f94ca1168520 float first try...
kono
parents: 80
diff changeset
2422 case SUB: d=d1-d2; break;
f94ca1168520 float first try...
kono
parents: 80
diff changeset
2423 case MUL: d=d1*d2;break;
f94ca1168520 float first try...
kono
parents: 80
diff changeset
2424 case DIV:
f94ca1168520 float first try...
kono
parents: 80
diff changeset
2425 if(!d2) error(EXERR);d=d1/d2;break;
f94ca1168520 float first try...
kono
parents: 80
diff changeset
2426 case GT:
f94ca1168520 float first try...
kono
parents: 80
diff changeset
2427 d=(d1>d2);break;
f94ca1168520 float first try...
kono
parents: 80
diff changeset
2428 case GE:
f94ca1168520 float first try...
kono
parents: 80
diff changeset
2429 d=(d1>=d2);break;
f94ca1168520 float first try...
kono
parents: 80
diff changeset
2430 case LT:
f94ca1168520 float first try...
kono
parents: 80
diff changeset
2431 d=(d1<d2);break;
f94ca1168520 float first try...
kono
parents: 80
diff changeset
2432 case LE:
f94ca1168520 float first try...
kono
parents: 80
diff changeset
2433 d=(d1<=d2);break;
82
25654dc29ecc First Floating Point coding done.
kono
parents: 81
diff changeset
2434 case EQ:
25654dc29ecc First Floating Point coding done.
kono
parents: 81
diff changeset
2435 d=(d1==d2);break;
25654dc29ecc First Floating Point coding done.
kono
parents: 81
diff changeset
2436 case NEQ:
25654dc29ecc First Floating Point coding done.
kono
parents: 81
diff changeset
2437 d=(d1!=d2);break;
81
f94ca1168520 float first try...
kono
parents: 80
diff changeset
2438 }
f94ca1168520 float first try...
kono
parents: 80
diff changeset
2439 return dlist2(DCONST,d);
f94ca1168520 float first try...
kono
parents: 80
diff changeset
2440 }
82
25654dc29ecc First Floating Point coding done.
kono
parents: 81
diff changeset
2441 if(op==GT||op==GE||op==LT||op==LE||op==EQ||op==NEQ||
81
f94ca1168520 float first try...
kono
parents: 80
diff changeset
2442 ADD||SUB||MUL||DIV)
f94ca1168520 float first try...
kono
parents: 80
diff changeset
2443 return(list3(op+DOP,e1,e2));
82
25654dc29ecc First Floating Point coding done.
kono
parents: 81
diff changeset
2444 else
25654dc29ecc First Floating Point coding done.
kono
parents: 81
diff changeset
2445 error(-1);
81
f94ca1168520 float first try...
kono
parents: 80
diff changeset
2446 }
f94ca1168520 float first try...
kono
parents: 80
diff changeset
2447
f94ca1168520 float first try...
kono
parents: 80
diff changeset
2448 static int
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
2449 binop(int op, int e1, int e2, int t1, int t2)
d35df41eac69 Initial revision
kono
parents:
diff changeset
2450 {
d35df41eac69 Initial revision
kono
parents:
diff changeset
2451 int e;
d35df41eac69 Initial revision
kono
parents:
diff changeset
2452
82
25654dc29ecc First Floating Point coding done.
kono
parents: 81
diff changeset
2453 if(t1==DOUBLE||t2==DOUBLE||t1==FLOAT||t2==FLOAT)
81
f94ca1168520 float first try...
kono
parents: 80
diff changeset
2454 return dbinop(op,e1,e2,t1,t2);
f94ca1168520 float first try...
kono
parents: 80
diff changeset
2455 if(car(e1)==CONST&&car(e2)==CONST) {
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
2456 e1=cadr(e1);
d35df41eac69 Initial revision
kono
parents:
diff changeset
2457 e2=cadr(e2);
d35df41eac69 Initial revision
kono
parents:
diff changeset
2458 type= INT;
d35df41eac69 Initial revision
kono
parents:
diff changeset
2459 switch(op) {
d35df41eac69 Initial revision
kono
parents:
diff changeset
2460 case BOR:
d35df41eac69 Initial revision
kono
parents:
diff changeset
2461 e=e1|e2;break;
d35df41eac69 Initial revision
kono
parents:
diff changeset
2462 case EOR:
d35df41eac69 Initial revision
kono
parents:
diff changeset
2463 e=e1^e2;break;
d35df41eac69 Initial revision
kono
parents:
diff changeset
2464 case BAND:
d35df41eac69 Initial revision
kono
parents:
diff changeset
2465 e=e1&e2;break;
d35df41eac69 Initial revision
kono
parents:
diff changeset
2466 case ADD:
d35df41eac69 Initial revision
kono
parents:
diff changeset
2467 if(integral(t1)) {
d35df41eac69 Initial revision
kono
parents:
diff changeset
2468 if(integral(t2)) {
d35df41eac69 Initial revision
kono
parents:
diff changeset
2469 e=e1+e2;
d35df41eac69 Initial revision
kono
parents:
diff changeset
2470 } else {
d35df41eac69 Initial revision
kono
parents:
diff changeset
2471 if(car(t2)!=POINTER) error(TYERR);
d35df41eac69 Initial revision
kono
parents:
diff changeset
2472 e=size(cadr(t2))*e1+e2;
d35df41eac69 Initial revision
kono
parents:
diff changeset
2473 type=t2;
d35df41eac69 Initial revision
kono
parents:
diff changeset
2474 }
d35df41eac69 Initial revision
kono
parents:
diff changeset
2475 } else {
d35df41eac69 Initial revision
kono
parents:
diff changeset
2476 if(car(t1)!=POINTER) error(TYERR);
d35df41eac69 Initial revision
kono
parents:
diff changeset
2477 e=e1+size(cadr(t1))*e2;
d35df41eac69 Initial revision
kono
parents:
diff changeset
2478 type=t1;
d35df41eac69 Initial revision
kono
parents:
diff changeset
2479 }
d35df41eac69 Initial revision
kono
parents:
diff changeset
2480 break;
d35df41eac69 Initial revision
kono
parents:
diff changeset
2481 case SUB:
d35df41eac69 Initial revision
kono
parents:
diff changeset
2482 if(integral(t1)) {
d35df41eac69 Initial revision
kono
parents:
diff changeset
2483 e=e1-e2;
d35df41eac69 Initial revision
kono
parents:
diff changeset
2484 } else {
d35df41eac69 Initial revision
kono
parents:
diff changeset
2485 if(car(t1)!=POINTER) error(TYERR);
d35df41eac69 Initial revision
kono
parents:
diff changeset
2486 e=e1-size(cadr(t1))*e2;
d35df41eac69 Initial revision
kono
parents:
diff changeset
2487 type=t1;
d35df41eac69 Initial revision
kono
parents:
diff changeset
2488 }
d35df41eac69 Initial revision
kono
parents:
diff changeset
2489 break;
d35df41eac69 Initial revision
kono
parents:
diff changeset
2490 case MUL:
d35df41eac69 Initial revision
kono
parents:
diff changeset
2491 e=e1*e2;break;
d35df41eac69 Initial revision
kono
parents:
diff changeset
2492 case DIV:
d35df41eac69 Initial revision
kono
parents:
diff changeset
2493 if(!e2) error(EXERR);e=e1/e2;break;
d35df41eac69 Initial revision
kono
parents:
diff changeset
2494 case MOD:
d35df41eac69 Initial revision
kono
parents:
diff changeset
2495 if(!e2) error(EXERR);e=e1%e2;break;
d35df41eac69 Initial revision
kono
parents:
diff changeset
2496 case RSHIFT:
d35df41eac69 Initial revision
kono
parents:
diff changeset
2497 e=e1>>e2;break;
d35df41eac69 Initial revision
kono
parents:
diff changeset
2498 case LSHIFT:
62
129f4802b027 separation done
kono
parents: 61
diff changeset
2499 e=e1<<e2;break;
82
25654dc29ecc First Floating Point coding done.
kono
parents: 81
diff changeset
2500 case EQ:
25654dc29ecc First Floating Point coding done.
kono
parents: 81
diff changeset
2501 e=(e1==e2);break;
25654dc29ecc First Floating Point coding done.
kono
parents: 81
diff changeset
2502 case NEQ:
25654dc29ecc First Floating Point coding done.
kono
parents: 81
diff changeset
2503 e=(e1!=e2);break;
62
129f4802b027 separation done
kono
parents: 61
diff changeset
2504 case GT:
129f4802b027 separation done
kono
parents: 61
diff changeset
2505 e=(e1>e2);break;
129f4802b027 separation done
kono
parents: 61
diff changeset
2506 case GE:
129f4802b027 separation done
kono
parents: 61
diff changeset
2507 e=(e1>=e2);break;
129f4802b027 separation done
kono
parents: 61
diff changeset
2508 case LT:
129f4802b027 separation done
kono
parents: 61
diff changeset
2509 e=(e1<e2);break;
129f4802b027 separation done
kono
parents: 61
diff changeset
2510 case LE:
129f4802b027 separation done
kono
parents: 61
diff changeset
2511 e=(e1<=e2);break;
129f4802b027 separation done
kono
parents: 61
diff changeset
2512 case UGT:
129f4802b027 separation done
kono
parents: 61
diff changeset
2513 e=((unsigned)e1>(unsigned)e2);break;
129f4802b027 separation done
kono
parents: 61
diff changeset
2514 case UGE:
129f4802b027 separation done
kono
parents: 61
diff changeset
2515 e=((unsigned)e1>=(unsigned)e2);break;
129f4802b027 separation done
kono
parents: 61
diff changeset
2516 case ULT:
129f4802b027 separation done
kono
parents: 61
diff changeset
2517 e=((unsigned)e1<(unsigned)e2);break;
129f4802b027 separation done
kono
parents: 61
diff changeset
2518 case ULE:
129f4802b027 separation done
kono
parents: 61
diff changeset
2519 e=((unsigned)e1<=(unsigned)e2);break;
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
2520 }
d35df41eac69 Initial revision
kono
parents:
diff changeset
2521 return list2(CONST,e);
d35df41eac69 Initial revision
kono
parents:
diff changeset
2522 }
82
25654dc29ecc First Floating Point coding done.
kono
parents: 81
diff changeset
2523 if(op==GT||op==GE||op==LT||op==LE||
25654dc29ecc First Floating Point coding done.
kono
parents: 81
diff changeset
2524 op==UGT||op==UGE||op==ULT||op==ULE||
25654dc29ecc First Floating Point coding done.
kono
parents: 81
diff changeset
2525 op==EQ||op==NEQ
25654dc29ecc First Floating Point coding done.
kono
parents: 81
diff changeset
2526 )
62
129f4802b027 separation done
kono
parents: 61
diff changeset
2527 return(list3(op,e1,e2));
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
2528 if((op==ADD||op==MUL||op==BOR||op==EOR||op==BAND)&&
d35df41eac69 Initial revision
kono
parents:
diff changeset
2529 (car(e1)==CONST||(car(e2)!=CONST&&
d35df41eac69 Initial revision
kono
parents:
diff changeset
2530 (car(e1)==RGVAR||car(e1)==RLVAR)))) {
d35df41eac69 Initial revision
kono
parents:
diff changeset
2531 e=e1;e1=e2;e2=e;e=t1;t1=t2;t2=e;
d35df41eac69 Initial revision
kono
parents:
diff changeset
2532 }
d35df41eac69 Initial revision
kono
parents:
diff changeset
2533 if(op==ADD) {
d35df41eac69 Initial revision
kono
parents:
diff changeset
2534 if(integral(t1)) {
d35df41eac69 Initial revision
kono
parents:
diff changeset
2535 if(integral(t2)) {
d35df41eac69 Initial revision
kono
parents:
diff changeset
2536 if(t1==INT) type=t2;else type=t1;
d35df41eac69 Initial revision
kono
parents:
diff changeset
2537 return(list3(ADD,e1,e2));
d35df41eac69 Initial revision
kono
parents:
diff changeset
2538 }
d35df41eac69 Initial revision
kono
parents:
diff changeset
2539 if(car(t2)!=POINTER) error(TYERR);
d35df41eac69 Initial revision
kono
parents:
diff changeset
2540 e=binop(MUL,e1,list2(CONST,size(cadr(t2))),t1,INT);
d35df41eac69 Initial revision
kono
parents:
diff changeset
2541 type=t2;
d35df41eac69 Initial revision
kono
parents:
diff changeset
2542 return(list3(ADD,e,e2));
d35df41eac69 Initial revision
kono
parents:
diff changeset
2543 }
d35df41eac69 Initial revision
kono
parents:
diff changeset
2544 if(car(t1)!=POINTER||!integral(t2)) error(TYERR);
d35df41eac69 Initial revision
kono
parents:
diff changeset
2545 e=binop(MUL,e2,list2(CONST,size(cadr(t1))),t2,INT);
d35df41eac69 Initial revision
kono
parents:
diff changeset
2546 type=t1;
40
060d1e549fec *** empty log message ***
kono
parents: 39
diff changeset
2547 if (car(e)==CONST && cadr(e)==0)
060d1e549fec *** empty log message ***
kono
parents: 39
diff changeset
2548 return(e1);
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
2549 if(car(e1)==ADDRESS&&car(e)==CONST&&car(cadr(e1))!=GVAR)
d35df41eac69 Initial revision
kono
parents:
diff changeset
2550 return(list2(ADDRESS,list2(car(cadr(e1)),
d35df41eac69 Initial revision
kono
parents:
diff changeset
2551 cadr(cadr(e1))+cadr(e))));
d35df41eac69 Initial revision
kono
parents:
diff changeset
2552 return(list3(ADD,e1,e));
d35df41eac69 Initial revision
kono
parents:
diff changeset
2553 }
d35df41eac69 Initial revision
kono
parents:
diff changeset
2554 if(op==SUB) {
d35df41eac69 Initial revision
kono
parents:
diff changeset
2555 if(integral(t1)) {
d35df41eac69 Initial revision
kono
parents:
diff changeset
2556 if(!integral(t2)) error(TYERR);
d35df41eac69 Initial revision
kono
parents:
diff changeset
2557 if(t1==INT) type=t2;else type=t1;
d35df41eac69 Initial revision
kono
parents:
diff changeset
2558 return(list3(SUB,e1,e2));
d35df41eac69 Initial revision
kono
parents:
diff changeset
2559 }
d35df41eac69 Initial revision
kono
parents:
diff changeset
2560 if(car(t1)!=POINTER) error(TYERR);
d35df41eac69 Initial revision
kono
parents:
diff changeset
2561 if(integral(t2)) {
d35df41eac69 Initial revision
kono
parents:
diff changeset
2562 e=binop(MUL,e2,list2(CONST,size(cadr(t1))),t2,INT);
d35df41eac69 Initial revision
kono
parents:
diff changeset
2563 type=t1;
d35df41eac69 Initial revision
kono
parents:
diff changeset
2564 return(list3(SUB,e1,e));
d35df41eac69 Initial revision
kono
parents:
diff changeset
2565 }
d35df41eac69 Initial revision
kono
parents:
diff changeset
2566 if(car(t2)!=POINTER)
d35df41eac69 Initial revision
kono
parents:
diff changeset
2567 error(TYERR);
d35df41eac69 Initial revision
kono
parents:
diff changeset
2568 compatible(t1,t2);
d35df41eac69 Initial revision
kono
parents:
diff changeset
2569 e=list3(SUB,e1,e2);
d35df41eac69 Initial revision
kono
parents:
diff changeset
2570 e=binop(DIV,e,list2(CONST,size(cadr(t1))),UNSIGNED,INT);
d35df41eac69 Initial revision
kono
parents:
diff changeset
2571 type= INT;
d35df41eac69 Initial revision
kono
parents:
diff changeset
2572 return e;
d35df41eac69 Initial revision
kono
parents:
diff changeset
2573 }
d35df41eac69 Initial revision
kono
parents:
diff changeset
2574 if(!integral(t1)||!integral(t2)) error(TYERR);
87
1738f313f98b floating point (at most) done.
kono
parents: 86
diff changeset
2575 if(t1==INT) type=t2; else type=t1;
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
2576 if((op==MUL||op==DIV)&&car(e2)==CONST&&cadr(e2)==1) return e1;
d35df41eac69 Initial revision
kono
parents:
diff changeset
2577 if(op==BOR||op==EOR||op==BAND) return(list3(op,e1,e2));
d35df41eac69 Initial revision
kono
parents:
diff changeset
2578 return(list3(type==UNSIGNED?op+US:op,e1,e2));
d35df41eac69 Initial revision
kono
parents:
diff changeset
2579 }
d35df41eac69 Initial revision
kono
parents:
diff changeset
2580
87
1738f313f98b floating point (at most) done.
kono
parents: 86
diff changeset
2581 int
1738f313f98b floating point (at most) done.
kono
parents: 86
diff changeset
2582 function_args(int e,int t)
1738f313f98b floating point (at most) done.
kono
parents: 86
diff changeset
2583 {
1738f313f98b floating point (at most) done.
kono
parents: 86
diff changeset
2584 int t1;
1738f313f98b floating point (at most) done.
kono
parents: 86
diff changeset
2585 e = rvalue(e);
1738f313f98b floating point (at most) done.
kono
parents: 86
diff changeset
2586 if (type==FLOAT && t==DOTS) { type=DOUBLE;}
1738f313f98b floating point (at most) done.
kono
parents: 86
diff changeset
2587 if (type==CHAR && t==DOTS) { type=INT;}
1738f313f98b floating point (at most) done.
kono
parents: 86
diff changeset
2588 if (t==DOTS) return e;
1738f313f98b floating point (at most) done.
kono
parents: 86
diff changeset
2589 if (t==UNSIGNED) e = unsigned_value(e,type);
1738f313f98b floating point (at most) done.
kono
parents: 86
diff changeset
2590 else if (integral(t)) e = int_value(e,type);
1738f313f98b floating point (at most) done.
kono
parents: 86
diff changeset
2591 else if (t==FLOAT||t==DOUBLE) e = float_value(e,type);
1738f313f98b floating point (at most) done.
kono
parents: 86
diff changeset
2592 else if ((t1=car(t))==STRUCT||t1==UNION) {
1738f313f98b floating point (at most) done.
kono
parents: 86
diff changeset
2593 if(size(t)!=size(type)) error(TYERR);
1738f313f98b floating point (at most) done.
kono
parents: 86
diff changeset
2594 }
1738f313f98b floating point (at most) done.
kono
parents: 86
diff changeset
2595 type = t;
1738f313f98b floating point (at most) done.
kono
parents: 86
diff changeset
2596 return e;
1738f313f98b floating point (at most) done.
kono
parents: 86
diff changeset
2597 }
1738f313f98b floating point (at most) done.
kono
parents: 86
diff changeset
2598
61
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents: 59
diff changeset
2599 static int
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
2600 expr15(int e1)
d35df41eac69 Initial revision
kono
parents:
diff changeset
2601 {
87
1738f313f98b floating point (at most) done.
kono
parents: 86
diff changeset
2602 int t,arglist,e,sz,argtypes,at;
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
2603
39
c63c4fdeb9a7 struct done.
kono
parents: 38
diff changeset
2604 /* function call */
79
82d0e30f61dd *** empty log message ***
kono
parents: 78
diff changeset
2605 if(car(type)==POINTER) {
82d0e30f61dd *** empty log message ***
kono
parents: 78
diff changeset
2606 if (car(cadr(type))==FUNCTION||car(cadr(type))==CODE) {
82d0e30f61dd *** empty log message ***
kono
parents: 78
diff changeset
2607 e1=rvalue(e1);
82d0e30f61dd *** empty log message ***
kono
parents: 78
diff changeset
2608 type=cadr(type);
82d0e30f61dd *** empty log message ***
kono
parents: 78
diff changeset
2609 }
82d0e30f61dd *** empty log message ***
kono
parents: 78
diff changeset
2610 }
87
1738f313f98b floating point (at most) done.
kono
parents: 86
diff changeset
2611 if(integral(type)|| ((car(type)!=FUNCTION)&&(car(type)!=CODE))) {
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
2612 error(TYERR);
79
82d0e30f61dd *** empty log message ***
kono
parents: 78
diff changeset
2613 }
66
0b068058dd67 *** empty log message ***
kono
parents: 65
diff changeset
2614 conv->funcall_(type);
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
2615 getsym();
87
1738f313f98b floating point (at most) done.
kono
parents: 86
diff changeset
2616 argtypes = caddr(type);
1738f313f98b floating point (at most) done.
kono
parents: 86
diff changeset
2617 if (!integral(t=cadr(type))&&(car(t)==STRUCT||car(t)==UNION)) {
1738f313f98b floating point (at most) done.
kono
parents: 86
diff changeset
2618 /* skip return struct pointer */
1738f313f98b floating point (at most) done.
kono
parents: 86
diff changeset
2619 if (argtypes==0) error(-1);
1738f313f98b floating point (at most) done.
kono
parents: 86
diff changeset
2620 argtypes = cadr(argtypes);
1738f313f98b floating point (at most) done.
kono
parents: 86
diff changeset
2621 }
1738f313f98b floating point (at most) done.
kono
parents: 86
diff changeset
2622 t=type;
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
2623 arglist=0;
d35df41eac69 Initial revision
kono
parents:
diff changeset
2624 while(sym!=RPAR) {
3
kono
parents: 2
diff changeset
2625 e=rvalue(expr1());
87
1738f313f98b floating point (at most) done.
kono
parents: 86
diff changeset
2626 if(argtypes==0) at=DOTS;
1738f313f98b floating point (at most) done.
kono
parents: 86
diff changeset
2627 else if(car(argtypes)==DOTS) at=DOTS;
1738f313f98b floating point (at most) done.
kono
parents: 86
diff changeset
2628 else { at=car(argtypes); argtypes=cadr(argtypes); }
1738f313f98b floating point (at most) done.
kono
parents: 86
diff changeset
2629 e = function_args(e,at);
3
kono
parents: 2
diff changeset
2630 arglist=list3(e,arglist,type);
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
2631 if(sym!=COMMA) break;
69
dba8d111b7a0 c output
kono
parents: 68
diff changeset
2632 conv->comma_();
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
2633 getsym();
d35df41eac69 Initial revision
kono
parents:
diff changeset
2634 }
d35df41eac69 Initial revision
kono
parents:
diff changeset
2635 checksym(RPAR);
66
0b068058dd67 *** empty log message ***
kono
parents: 65
diff changeset
2636 conv->funcall_args_();
39
c63c4fdeb9a7 struct done.
kono
parents: 38
diff changeset
2637 if(car(t)==CODE)
c63c4fdeb9a7 struct done.
kono
parents: 38
diff changeset
2638 return list3(FUNCTION,e1,arglist);
c63c4fdeb9a7 struct done.
kono
parents: 38
diff changeset
2639 type=cadr(t);
c63c4fdeb9a7 struct done.
kono
parents: 38
diff changeset
2640 if(type==CHAR) type=INT;
c63c4fdeb9a7 struct done.
kono
parents: 38
diff changeset
2641 else if(car(type)==STRUCT||car(type)==UNION) {
c63c4fdeb9a7 struct done.
kono
parents: 38
diff changeset
2642 /* make temporaly struct for return value */
45
b9266c88495c *** empty log message ***
kono
parents: 42
diff changeset
2643 /* but it is better to see we can reuse old one */
b9266c88495c *** empty log message ***
kono
parents: 42
diff changeset
2644 if (tmp_struct) {
b9266c88495c *** empty log message ***
kono
parents: 42
diff changeset
2645 sz = size(tmp_struct->ty);
b9266c88495c *** empty log message ***
kono
parents: 42
diff changeset
2646 if (sz>=size(type)) {
b9266c88495c *** empty log message ***
kono
parents: 42
diff changeset
2647 /* reuse it */
b9266c88495c *** empty log message ***
kono
parents: 42
diff changeset
2648 } else if (tmp_struct->dsp-sz==disp) {
b9266c88495c *** empty log message ***
kono
parents: 42
diff changeset
2649 /* extendable */
b9266c88495c *** empty log message ***
kono
parents: 42
diff changeset
2650 disp -= tmp_struct->dsp-sz;
b9266c88495c *** empty log message ***
kono
parents: 42
diff changeset
2651 tmp_struct->dsp = disp;
b9266c88495c *** empty log message ***
kono
parents: 42
diff changeset
2652 } else {
b9266c88495c *** empty log message ***
kono
parents: 42
diff changeset
2653 tmp_struct = def(0);
b9266c88495c *** empty log message ***
kono
parents: 42
diff changeset
2654 }
b9266c88495c *** empty log message ***
kono
parents: 42
diff changeset
2655 } else {
b9266c88495c *** empty log message ***
kono
parents: 42
diff changeset
2656 tmp_struct = def(0);
b9266c88495c *** empty log message ***
kono
parents: 42
diff changeset
2657 }
b9266c88495c *** empty log message ***
kono
parents: 42
diff changeset
2658 e = list2(LVAR,tmp_struct->dsp);
b9266c88495c *** empty log message ***
kono
parents: 42
diff changeset
2659
39
c63c4fdeb9a7 struct done.
kono
parents: 38
diff changeset
2660 /* pass the pointer as an argument */
c63c4fdeb9a7 struct done.
kono
parents: 38
diff changeset
2661 /* this is recognized by called function declaration */
45
b9266c88495c *** empty log message ***
kono
parents: 42
diff changeset
2662 /* but I don't know this sequece is compatible with gcc */
b9266c88495c *** empty log message ***
kono
parents: 42
diff changeset
2663
46
b1c8ac8c308d fix cascading struct retrun. Now it should be compatible with gcc
kono
parents: 45
diff changeset
2664 append3(arglist,list2(ADDRESS,e),list2(POINTER,type));
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
2665 }
d35df41eac69 Initial revision
kono
parents:
diff changeset
2666 return list3(FUNCTION,e1,arglist);
d35df41eac69 Initial revision
kono
parents:
diff changeset
2667 }
d35df41eac69 Initial revision
kono
parents:
diff changeset
2668
61
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents: 59
diff changeset
2669 static int
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
2670 typeid(int s)
d35df41eac69 Initial revision
kono
parents:
diff changeset
2671 {
37
412ad2e6c2a2 struct copy
kono
parents: 36
diff changeset
2672 return (integral(s) || s==CODE || s==SHORT ||
412ad2e6c2a2 struct copy
kono
parents: 36
diff changeset
2673 s==LONG || s==STRUCT || s==UNION ||
81
f94ca1168520 float first try...
kono
parents: 80
diff changeset
2674 s==LONGLONG || s==FLOAT || s==DOUBLE ||
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
2675 (s==IDENT && nptr->sc==TYPE));
d35df41eac69 Initial revision
kono
parents:
diff changeset
2676 }
d35df41eac69 Initial revision
kono
parents:
diff changeset
2677
61
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents: 59
diff changeset
2678 static int
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
2679 typename(void)
d35df41eac69 Initial revision
kono
parents:
diff changeset
2680 {
d35df41eac69 Initial revision
kono
parents:
diff changeset
2681 int t;
d35df41eac69 Initial revision
kono
parents:
diff changeset
2682
d35df41eac69 Initial revision
kono
parents:
diff changeset
2683 type=t=typespec();
d35df41eac69 Initial revision
kono
parents:
diff changeset
2684 ndecl0();
d35df41eac69 Initial revision
kono
parents:
diff changeset
2685 reverse(t);
d35df41eac69 Initial revision
kono
parents:
diff changeset
2686 return type;
d35df41eac69 Initial revision
kono
parents:
diff changeset
2687 }
d35df41eac69 Initial revision
kono
parents:
diff changeset
2688
61
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents: 59
diff changeset
2689 static int
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
2690 ndecl0(void)
d35df41eac69 Initial revision
kono
parents:
diff changeset
2691 {
d35df41eac69 Initial revision
kono
parents:
diff changeset
2692 if(sym==MUL) {
d35df41eac69 Initial revision
kono
parents:
diff changeset
2693 getsym();
d35df41eac69 Initial revision
kono
parents:
diff changeset
2694 return type=list2(POINTER,ndecl0());
d35df41eac69 Initial revision
kono
parents:
diff changeset
2695 }
d35df41eac69 Initial revision
kono
parents:
diff changeset
2696 return ndecl1();
d35df41eac69 Initial revision
kono
parents:
diff changeset
2697 }
d35df41eac69 Initial revision
kono
parents:
diff changeset
2698
61
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents: 59
diff changeset
2699 static int
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
2700 ndecl1(void)
d35df41eac69 Initial revision
kono
parents:
diff changeset
2701 {
d35df41eac69 Initial revision
kono
parents:
diff changeset
2702 int i,t,arglist;
d35df41eac69 Initial revision
kono
parents:
diff changeset
2703
d35df41eac69 Initial revision
kono
parents:
diff changeset
2704 if(sym==LPAR) {
d35df41eac69 Initial revision
kono
parents:
diff changeset
2705 if(getsym()==RPAR) {
d35df41eac69 Initial revision
kono
parents:
diff changeset
2706 type=list3(FUNCTION,type,0); getsym();
d35df41eac69 Initial revision
kono
parents:
diff changeset
2707 } else {
d35df41eac69 Initial revision
kono
parents:
diff changeset
2708 ndecl0();
d35df41eac69 Initial revision
kono
parents:
diff changeset
2709 checksym(RPAR);
d35df41eac69 Initial revision
kono
parents:
diff changeset
2710 }
d35df41eac69 Initial revision
kono
parents:
diff changeset
2711 }
d35df41eac69 Initial revision
kono
parents:
diff changeset
2712 while(1) {
d35df41eac69 Initial revision
kono
parents:
diff changeset
2713 if(sym==LBRA) {
d35df41eac69 Initial revision
kono
parents:
diff changeset
2714 getsym();
d35df41eac69 Initial revision
kono
parents:
diff changeset
2715 t=type;
69
dba8d111b7a0 c output
kono
parents: 68
diff changeset
2716 i=cexpr(expr(1));
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
2717 checksym(RBRA);
d35df41eac69 Initial revision
kono
parents:
diff changeset
2718 type=list3(ARRAY,t,i);
d35df41eac69 Initial revision
kono
parents:
diff changeset
2719 } else if(sym==LPAR) {
d35df41eac69 Initial revision
kono
parents:
diff changeset
2720 t = type;
d35df41eac69 Initial revision
kono
parents:
diff changeset
2721 getsym();
d35df41eac69 Initial revision
kono
parents:
diff changeset
2722 arglist=0;
d35df41eac69 Initial revision
kono
parents:
diff changeset
2723 while(sym!=RPAR) {
d35df41eac69 Initial revision
kono
parents:
diff changeset
2724 ndecl0();
d35df41eac69 Initial revision
kono
parents:
diff changeset
2725 arglist=list2(type,arglist);
d35df41eac69 Initial revision
kono
parents:
diff changeset
2726 if(sym!=COMMA) break;
d35df41eac69 Initial revision
kono
parents:
diff changeset
2727 getsym();
d35df41eac69 Initial revision
kono
parents:
diff changeset
2728 }
d35df41eac69 Initial revision
kono
parents:
diff changeset
2729 checksym(RPAR);
d35df41eac69 Initial revision
kono
parents:
diff changeset
2730 type=list3(FUNCTION,t,arglist);
d35df41eac69 Initial revision
kono
parents:
diff changeset
2731 }
d35df41eac69 Initial revision
kono
parents:
diff changeset
2732 else return type;
d35df41eac69 Initial revision
kono
parents:
diff changeset
2733 }
d35df41eac69 Initial revision
kono
parents:
diff changeset
2734 }
d35df41eac69 Initial revision
kono
parents:
diff changeset
2735
61
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents: 59
diff changeset
2736 static int
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
2737 cexpr(int e)
d35df41eac69 Initial revision
kono
parents:
diff changeset
2738 {
69
dba8d111b7a0 c output
kono
parents: 68
diff changeset
2739 conv->conv_();
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
2740 if (car(e) != CONST) error(CNERR);
d35df41eac69 Initial revision
kono
parents:
diff changeset
2741 return (cadr(e));
d35df41eac69 Initial revision
kono
parents:
diff changeset
2742 }
d35df41eac69 Initial revision
kono
parents:
diff changeset
2743
61
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents: 59
diff changeset
2744 static int in_comment = 0;
20
8d3db5fc8a97 *** empty log message ***
kono
parents: 19
diff changeset
2745
81
f94ca1168520 float first try...
kono
parents: 80
diff changeset
2746 extern double strtod(const char *nptr, char **endptr);
f94ca1168520 float first try...
kono
parents: 80
diff changeset
2747
61
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents: 59
diff changeset
2748 static int
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
2749 getsym(void)
d35df41eac69 Initial revision
kono
parents:
diff changeset
2750 {
29
160e20394f80 macro function (imcomplete)
kono
parents: 28
diff changeset
2751 NMTBL *nptr0,*nptr1,*nptrm;
82
25654dc29ecc First Floating Point coding done.
kono
parents: 81
diff changeset
2752 int i,slfree,macrop,d;
81
f94ca1168520 float first try...
kono
parents: 80
diff changeset
2753 char *scheapp;
35
fd18d440f5ee macro function (works. but dirty. )
kono
parents: 34
diff changeset
2754 char c;
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
2755
d35df41eac69 Initial revision
kono
parents:
diff changeset
2756 if (alpha(skipspc())) {
d35df41eac69 Initial revision
kono
parents:
diff changeset
2757 i = hash = 0;
d35df41eac69 Initial revision
kono
parents:
diff changeset
2758 name = namebuf;
d35df41eac69 Initial revision
kono
parents:
diff changeset
2759 while (alpha(ch) || digit(ch)) {
d35df41eac69 Initial revision
kono
parents:
diff changeset
2760 if (i < LBUFSIZE-1)
d35df41eac69 Initial revision
kono
parents:
diff changeset
2761 hash=(7*hash ^ (name[i++]=ch));
d35df41eac69 Initial revision
kono
parents:
diff changeset
2762 getch();
d35df41eac69 Initial revision
kono
parents:
diff changeset
2763 }
d35df41eac69 Initial revision
kono
parents:
diff changeset
2764 name[i++] = '\0';
29
160e20394f80 macro function (imcomplete)
kono
parents: 28
diff changeset
2765
160e20394f80 macro function (imcomplete)
kono
parents: 28
diff changeset
2766 nptrm=msearch(name);
160e20394f80 macro function (imcomplete)
kono
parents: 28
diff changeset
2767 if (mode==MDECL) {
160e20394f80 macro function (imcomplete)
kono
parents: 28
diff changeset
2768 nptr = nptrm;
160e20394f80 macro function (imcomplete)
kono
parents: 28
diff changeset
2769 return (sym==MACRO);
160e20394f80 macro function (imcomplete)
kono
parents: 28
diff changeset
2770 }
160e20394f80 macro function (imcomplete)
kono
parents: 28
diff changeset
2771 if (mode==IFDEF) {
160e20394f80 macro function (imcomplete)
kono
parents: 28
diff changeset
2772 if (nptrm->sc == MACRO||nptrm->sc==FMACRO) {
18
df7fa8cee67b pass -Wall
kono
parents: 16
diff changeset
2773 return (symval=1);
29
160e20394f80 macro function (imcomplete)
kono
parents: 28
diff changeset
2774 } else {
160e20394f80 macro function (imcomplete)
kono
parents: 28
diff changeset
2775 return (symval=0);
18
df7fa8cee67b pass -Wall
kono
parents: 16
diff changeset
2776 }
29
160e20394f80 macro function (imcomplete)
kono
parents: 28
diff changeset
2777 }
34
0756caa79167 macro function recursive and copy method
kono
parents: 33
diff changeset
2778 if (nptrm->sc!=EMPTY) {
0756caa79167 macro function recursive and copy method
kono
parents: 33
diff changeset
2779 i = mode;
0756caa79167 macro function recursive and copy method
kono
parents: 33
diff changeset
2780 mode = STAT;
0756caa79167 macro function recursive and copy method
kono
parents: 33
diff changeset
2781 macrop = 0;
0756caa79167 macro function recursive and copy method
kono
parents: 33
diff changeset
2782 slfree = lfree;
0756caa79167 macro function recursive and copy method
kono
parents: 33
diff changeset
2783 macropp = macro_buf;
29
160e20394f80 macro function (imcomplete)
kono
parents: 28
diff changeset
2784 if (nptrm->sc == FMACRO) {
34
0756caa79167 macro function recursive and copy method
kono
parents: 33
diff changeset
2785 macrop=macro_function(macrop,&chptr,nptrm,0);
0756caa79167 macro function recursive and copy method
kono
parents: 33
diff changeset
2786 } else {
0756caa79167 macro function recursive and copy method
kono
parents: 33
diff changeset
2787 macrop=macro_eval(macrop,(char *)car(nptrm->dsp),0);
29
160e20394f80 macro function (imcomplete)
kono
parents: 28
diff changeset
2788 }
34
0756caa79167 macro function recursive and copy method
kono
parents: 33
diff changeset
2789 macropp = macro_buf;
46
b1c8ac8c308d fix cascading struct retrun. Now it should be compatible with gcc
kono
parents: 45
diff changeset
2790 mappend(reverse0(macrop));
35
fd18d440f5ee macro function (works. but dirty. )
kono
parents: 34
diff changeset
2791 macropp[-1] ='\n';
fd18d440f5ee macro function (works. but dirty. )
kono
parents: 34
diff changeset
2792 *macropp =0;
34
0756caa79167 macro function recursive and copy method
kono
parents: 33
diff changeset
2793 lfree = slfree;
42
a89cf0d6904f regv assop
kono
parents: 40
diff changeset
2794 if (lsrc && !asmf && nptrm->sc==FMACRO) gen_comment(macro_buf);
67
254a0c576114 argument type list
kono
parents: 66
diff changeset
2795 macropp[-1] =0;
34
0756caa79167 macro function recursive and copy method
kono
parents: 33
diff changeset
2796 chptrsave = chptr;
0756caa79167 macro function recursive and copy method
kono
parents: 33
diff changeset
2797 chsave = ch = chptr[-1];
0756caa79167 macro function recursive and copy method
kono
parents: 33
diff changeset
2798 chptr = macro_buf;
0756caa79167 macro function recursive and copy method
kono
parents: 33
diff changeset
2799 ch = *chptr++;
0756caa79167 macro function recursive and copy method
kono
parents: 33
diff changeset
2800 mode = i;
0756caa79167 macro function recursive and copy method
kono
parents: 33
diff changeset
2801 return getsym();
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
2802 }
29
160e20394f80 macro function (imcomplete)
kono
parents: 28
diff changeset
2803
160e20394f80 macro function (imcomplete)
kono
parents: 28
diff changeset
2804 nptr0 = gsearch();
18
df7fa8cee67b pass -Wall
kono
parents: 16
diff changeset
2805 if (nptr0->sc == RESERVE) return sym = nptr0->dsp;
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
2806 sym = IDENT;
d35df41eac69 Initial revision
kono
parents:
diff changeset
2807 gnptr=nptr=nptr0;
d35df41eac69 Initial revision
kono
parents:
diff changeset
2808 if (mode==ADECL && nptr0->sc ==TYPE) return sym;
d35df41eac69 Initial revision
kono
parents:
diff changeset
2809 if (mode==GDECL || mode==GSDECL || mode==GUDECL ||
d35df41eac69 Initial revision
kono
parents:
diff changeset
2810 mode==GTDECL || mode==TOP) {
d35df41eac69 Initial revision
kono
parents:
diff changeset
2811 return sym;
d35df41eac69 Initial revision
kono
parents:
diff changeset
2812 }
d35df41eac69 Initial revision
kono
parents:
diff changeset
2813 nptr1=lsearch(nptr0->nm);
18
df7fa8cee67b pass -Wall
kono
parents: 16
diff changeset
2814 if (mode==STAT) {
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
2815 if (nptr1->sc == EMPTY) return sym;
18
df7fa8cee67b pass -Wall
kono
parents: 16
diff changeset
2816 }
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
2817 nptr=nptr1;
d35df41eac69 Initial revision
kono
parents:
diff changeset
2818 return sym;
81
f94ca1168520 float first try...
kono
parents: 80
diff changeset
2819 } else if (digit(ch)||ch=='.') {
82
25654dc29ecc First Floating Point coding done.
kono
parents: 81
diff changeset
2820 symval=0; d=0;
81
f94ca1168520 float first try...
kono
parents: 80
diff changeset
2821 scheapp = cheapp;
f94ca1168520 float first try...
kono
parents: 80
diff changeset
2822 if(ch=='.') {
f94ca1168520 float first try...
kono
parents: 80
diff changeset
2823 getch();
f94ca1168520 float first try...
kono
parents: 80
diff changeset
2824 if(ch=='.') {
f94ca1168520 float first try...
kono
parents: 80
diff changeset
2825 getch();
f94ca1168520 float first try...
kono
parents: 80
diff changeset
2826 if (ch=='.') {
f94ca1168520 float first try...
kono
parents: 80
diff changeset
2827 getch();
f94ca1168520 float first try...
kono
parents: 80
diff changeset
2828 return sym=DOTS;
f94ca1168520 float first try...
kono
parents: 80
diff changeset
2829 }
f94ca1168520 float first try...
kono
parents: 80
diff changeset
2830 error(CHERR);
f94ca1168520 float first try...
kono
parents: 80
diff changeset
2831 return getsym();
f94ca1168520 float first try...
kono
parents: 80
diff changeset
2832 } else if (!digit(ch))
f94ca1168520 float first try...
kono
parents: 80
diff changeset
2833 return sym=PERIOD;
82
25654dc29ecc First Floating Point coding done.
kono
parents: 81
diff changeset
2834 d=1;
25654dc29ecc First Floating Point coding done.
kono
parents: 81
diff changeset
2835 *cheapp++ = '.'; /* .0 case */
25654dc29ecc First Floating Point coding done.
kono
parents: 81
diff changeset
2836 } else if (ch == '0') {
25654dc29ecc First Floating Point coding done.
kono
parents: 81
diff changeset
2837 if (getch() == 'x' || ch == 'X') {
25654dc29ecc First Floating Point coding done.
kono
parents: 81
diff changeset
2838 while(1) {
25654dc29ecc First Floating Point coding done.
kono
parents: 81
diff changeset
2839 if(digit(getch()))
25654dc29ecc First Floating Point coding done.
kono
parents: 81
diff changeset
2840 symval=symval*16+ch-'0';
25654dc29ecc First Floating Point coding done.
kono
parents: 81
diff changeset
2841 else if('a'<=ch&&ch<='f')
25654dc29ecc First Floating Point coding done.
kono
parents: 81
diff changeset
2842 symval=symval*16+ch-'a'+10;
25654dc29ecc First Floating Point coding done.
kono
parents: 81
diff changeset
2843 else if('A'<=ch&&ch<='F')
25654dc29ecc First Floating Point coding done.
kono
parents: 81
diff changeset
2844 symval=symval*16+ch-'A'+10;
25654dc29ecc First Floating Point coding done.
kono
parents: 81
diff changeset
2845 else break;
25654dc29ecc First Floating Point coding done.
kono
parents: 81
diff changeset
2846 }
25654dc29ecc First Floating Point coding done.
kono
parents: 81
diff changeset
2847 return sym=CONST;
25654dc29ecc First Floating Point coding done.
kono
parents: 81
diff changeset
2848 } else if (ch!='.') {
25654dc29ecc First Floating Point coding done.
kono
parents: 81
diff changeset
2849 while (digit(ch)) {
25654dc29ecc First Floating Point coding done.
kono
parents: 81
diff changeset
2850 symval=symval*8+ch-'0';getch();
25654dc29ecc First Floating Point coding done.
kono
parents: 81
diff changeset
2851 }
25654dc29ecc First Floating Point coding done.
kono
parents: 81
diff changeset
2852 return sym=CONST;
25654dc29ecc First Floating Point coding done.
kono
parents: 81
diff changeset
2853 }
25654dc29ecc First Floating Point coding done.
kono
parents: 81
diff changeset
2854 d=1;
25654dc29ecc First Floating Point coding done.
kono
parents: 81
diff changeset
2855 *cheapp++ = '0'; /* 0. case */
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
2856 } else {
d35df41eac69 Initial revision
kono
parents:
diff changeset
2857 while(digit(ch)) {
81
f94ca1168520 float first try...
kono
parents: 80
diff changeset
2858 *cheapp++ = ch;
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
2859 symval=symval*10+ch-'0';getch();
d35df41eac69 Initial revision
kono
parents:
diff changeset
2860 }
81
f94ca1168520 float first try...
kono
parents: 80
diff changeset
2861 if (!(ch=='.'||ch=='e')) {
f94ca1168520 float first try...
kono
parents: 80
diff changeset
2862 cheapp=scheapp;
f94ca1168520 float first try...
kono
parents: 80
diff changeset
2863 return sym=CONST;
f94ca1168520 float first try...
kono
parents: 80
diff changeset
2864 }
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
2865 }
81
f94ca1168520 float first try...
kono
parents: 80
diff changeset
2866 while(digit(ch)|| ch=='.'||ch=='e') {
f94ca1168520 float first try...
kono
parents: 80
diff changeset
2867 *cheapp++ = ch;
f94ca1168520 float first try...
kono
parents: 80
diff changeset
2868 getch();
f94ca1168520 float first try...
kono
parents: 80
diff changeset
2869 if (ch=='-' && cheapp[-1]=='e') {
f94ca1168520 float first try...
kono
parents: 80
diff changeset
2870 *cheapp++ = ch; getch();
f94ca1168520 float first try...
kono
parents: 80
diff changeset
2871 }
f94ca1168520 float first try...
kono
parents: 80
diff changeset
2872 }
f94ca1168520 float first try...
kono
parents: 80
diff changeset
2873 *cheapp++ = 0;
f94ca1168520 float first try...
kono
parents: 80
diff changeset
2874 dsymval = strtod(scheapp,0);
f94ca1168520 float first try...
kono
parents: 80
diff changeset
2875 cheapp=scheapp;
f94ca1168520 float first try...
kono
parents: 80
diff changeset
2876 return sym=DCONST;
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
2877 } else if(ch=='\'') {
d35df41eac69 Initial revision
kono
parents:
diff changeset
2878 getch();
d35df41eac69 Initial revision
kono
parents:
diff changeset
2879 symval=escape();
d35df41eac69 Initial revision
kono
parents:
diff changeset
2880 if(ch!='\'') error(CHERR);
d35df41eac69 Initial revision
kono
parents:
diff changeset
2881 getch();
d35df41eac69 Initial revision
kono
parents:
diff changeset
2882 return sym=CONST;
d35df41eac69 Initial revision
kono
parents:
diff changeset
2883 } else if(ch=='"') {
d35df41eac69 Initial revision
kono
parents:
diff changeset
2884 getstring();
d35df41eac69 Initial revision
kono
parents:
diff changeset
2885 return sym= STRING;
d35df41eac69 Initial revision
kono
parents:
diff changeset
2886 }
d35df41eac69 Initial revision
kono
parents:
diff changeset
2887 c=ch;
d35df41eac69 Initial revision
kono
parents:
diff changeset
2888 getch();
d35df41eac69 Initial revision
kono
parents:
diff changeset
2889 switch(c) {
d35df41eac69 Initial revision
kono
parents:
diff changeset
2890 case '*':
d35df41eac69 Initial revision
kono
parents:
diff changeset
2891 return postequ(MUL,MUL+AS);
d35df41eac69 Initial revision
kono
parents:
diff changeset
2892 case '&':
d35df41eac69 Initial revision
kono
parents:
diff changeset
2893 if(ch=='&') {getch();return sym=LAND;}
d35df41eac69 Initial revision
kono
parents:
diff changeset
2894 return postequ(BAND,BAND+AS);
d35df41eac69 Initial revision
kono
parents:
diff changeset
2895 case '-':
d35df41eac69 Initial revision
kono
parents:
diff changeset
2896 if(ch=='>') {getch();return sym=ARROW;}
d35df41eac69 Initial revision
kono
parents:
diff changeset
2897 if(ch=='-') {getch();return sym=DEC;}
d35df41eac69 Initial revision
kono
parents:
diff changeset
2898 return postequ(SUB,SUB+AS);
d35df41eac69 Initial revision
kono
parents:
diff changeset
2899 case '!':
d35df41eac69 Initial revision
kono
parents:
diff changeset
2900 return postequ(LNOT,NEQ);
d35df41eac69 Initial revision
kono
parents:
diff changeset
2901 case '~':
d35df41eac69 Initial revision
kono
parents:
diff changeset
2902 return sym=BNOT;
d35df41eac69 Initial revision
kono
parents:
diff changeset
2903 case '+':
d35df41eac69 Initial revision
kono
parents:
diff changeset
2904 if(ch=='+') {getch();return sym=INC;}
d35df41eac69 Initial revision
kono
parents:
diff changeset
2905 return postequ(ADD,ADD+AS);
d35df41eac69 Initial revision
kono
parents:
diff changeset
2906 case '%':
d35df41eac69 Initial revision
kono
parents:
diff changeset
2907 return postequ(MOD,MOD+AS);
d35df41eac69 Initial revision
kono
parents:
diff changeset
2908 case '^':
d35df41eac69 Initial revision
kono
parents:
diff changeset
2909 return postequ(EOR,EOR+AS);
d35df41eac69 Initial revision
kono
parents:
diff changeset
2910 case '|':
d35df41eac69 Initial revision
kono
parents:
diff changeset
2911 if(ch=='|') {getch();return sym=LOR;}
d35df41eac69 Initial revision
kono
parents:
diff changeset
2912 return postequ(BOR,BOR+AS);
d35df41eac69 Initial revision
kono
parents:
diff changeset
2913 case '=':
d35df41eac69 Initial revision
kono
parents:
diff changeset
2914 return postequ(ASS,EQ);
d35df41eac69 Initial revision
kono
parents:
diff changeset
2915 case '>':
d35df41eac69 Initial revision
kono
parents:
diff changeset
2916 if(ch=='>') {getch();return postequ(RSHIFT,RSHIFT+AS);}
d35df41eac69 Initial revision
kono
parents:
diff changeset
2917 return postequ(GT,GE);
d35df41eac69 Initial revision
kono
parents:
diff changeset
2918 case '<':
d35df41eac69 Initial revision
kono
parents:
diff changeset
2919 if(ch=='<') {getch();return postequ(LSHIFT,LSHIFT+AS);}
d35df41eac69 Initial revision
kono
parents:
diff changeset
2920 return postequ(LT,LE);
d35df41eac69 Initial revision
kono
parents:
diff changeset
2921 case '(':
d35df41eac69 Initial revision
kono
parents:
diff changeset
2922 return sym=LPAR;
d35df41eac69 Initial revision
kono
parents:
diff changeset
2923 case ')':
d35df41eac69 Initial revision
kono
parents:
diff changeset
2924 return sym=RPAR;
d35df41eac69 Initial revision
kono
parents:
diff changeset
2925 case '[':
d35df41eac69 Initial revision
kono
parents:
diff changeset
2926 return sym=LBRA;
d35df41eac69 Initial revision
kono
parents:
diff changeset
2927 case ']':
d35df41eac69 Initial revision
kono
parents:
diff changeset
2928 return sym=RBRA;
d35df41eac69 Initial revision
kono
parents:
diff changeset
2929 case '{':
d35df41eac69 Initial revision
kono
parents:
diff changeset
2930 return sym=LC;
d35df41eac69 Initial revision
kono
parents:
diff changeset
2931 case '}':
d35df41eac69 Initial revision
kono
parents:
diff changeset
2932 return sym=RC;
d35df41eac69 Initial revision
kono
parents:
diff changeset
2933 case ',':
d35df41eac69 Initial revision
kono
parents:
diff changeset
2934 return sym=COMMA;
d35df41eac69 Initial revision
kono
parents:
diff changeset
2935 case ';':
d35df41eac69 Initial revision
kono
parents:
diff changeset
2936 return sym=SM;
d35df41eac69 Initial revision
kono
parents:
diff changeset
2937 case ':':
d35df41eac69 Initial revision
kono
parents:
diff changeset
2938 return sym=COLON;
d35df41eac69 Initial revision
kono
parents:
diff changeset
2939 case '?':
d35df41eac69 Initial revision
kono
parents:
diff changeset
2940 return sym=COND;
d35df41eac69 Initial revision
kono
parents:
diff changeset
2941 case '/':
34
0756caa79167 macro function recursive and copy method
kono
parents: 33
diff changeset
2942 if(ch=='/') {
66
0b068058dd67 *** empty log message ***
kono
parents: 65
diff changeset
2943 in_comment = 1;
0b068058dd67 *** empty log message ***
kono
parents: 65
diff changeset
2944 conv->comment_('/'); conv->comment_('/');
0b068058dd67 *** empty log message ***
kono
parents: 65
diff changeset
2945 while(ch!='\n') { getch(); conv->comment_(ch); }
0b068058dd67 *** empty log message ***
kono
parents: 65
diff changeset
2946 in_comment = 0;
34
0756caa79167 macro function recursive and copy method
kono
parents: 33
diff changeset
2947 getch();
0756caa79167 macro function recursive and copy method
kono
parents: 33
diff changeset
2948 return getsym();
0756caa79167 macro function recursive and copy method
kono
parents: 33
diff changeset
2949 }
66
0b068058dd67 *** empty log message ***
kono
parents: 65
diff changeset
2950 if(ch!='*') return postequ(DIV,DIV+AS);
20
8d3db5fc8a97 *** empty log message ***
kono
parents: 19
diff changeset
2951 in_comment = 1;
66
0b068058dd67 *** empty log message ***
kono
parents: 65
diff changeset
2952 conv->comment_('/'); conv->comment_('*');
0b068058dd67 *** empty log message ***
kono
parents: 65
diff changeset
2953 do {
0b068058dd67 *** empty log message ***
kono
parents: 65
diff changeset
2954 c=ch; getch(); conv->comment_(ch);
0b068058dd67 *** empty log message ***
kono
parents: 65
diff changeset
2955 } while(!(c=='*'&&ch=='/'));
20
8d3db5fc8a97 *** empty log message ***
kono
parents: 19
diff changeset
2956 in_comment = 0;
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
2957 getch();
d35df41eac69 Initial revision
kono
parents:
diff changeset
2958 return getsym();
34
0756caa79167 macro function recursive and copy method
kono
parents: 33
diff changeset
2959 case 0:
0756caa79167 macro function recursive and copy method
kono
parents: 33
diff changeset
2960 case '\n':
0756caa79167 macro function recursive and copy method
kono
parents: 33
diff changeset
2961 getch();
0756caa79167 macro function recursive and copy method
kono
parents: 33
diff changeset
2962 return getsym();
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
2963 default:
d35df41eac69 Initial revision
kono
parents:
diff changeset
2964 error(CHERR);
d35df41eac69 Initial revision
kono
parents:
diff changeset
2965 return getsym();
d35df41eac69 Initial revision
kono
parents:
diff changeset
2966 }
d35df41eac69 Initial revision
kono
parents:
diff changeset
2967 }
d35df41eac69 Initial revision
kono
parents:
diff changeset
2968
61
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents: 59
diff changeset
2969 static int
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
2970 postequ(int s1, int s2)
d35df41eac69 Initial revision
kono
parents:
diff changeset
2971 {
d35df41eac69 Initial revision
kono
parents:
diff changeset
2972 if(ch=='=') {getch();return sym=s2;}
d35df41eac69 Initial revision
kono
parents:
diff changeset
2973 return sym=s1;
d35df41eac69 Initial revision
kono
parents:
diff changeset
2974 }
d35df41eac69 Initial revision
kono
parents:
diff changeset
2975
61
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents: 59
diff changeset
2976 static int
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
2977 alpha(char c)
d35df41eac69 Initial revision
kono
parents:
diff changeset
2978 {
d35df41eac69 Initial revision
kono
parents:
diff changeset
2979 return(('a'<=c&&c<='z')||('A'<=c&&c<='Z')||c=='_');
d35df41eac69 Initial revision
kono
parents:
diff changeset
2980 }
d35df41eac69 Initial revision
kono
parents:
diff changeset
2981
61
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents: 59
diff changeset
2982 static int
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
2983 digit(char c)
d35df41eac69 Initial revision
kono
parents:
diff changeset
2984 {
d35df41eac69 Initial revision
kono
parents:
diff changeset
2985 return('0'<=c&&c<='9');
d35df41eac69 Initial revision
kono
parents:
diff changeset
2986 }
d35df41eac69 Initial revision
kono
parents:
diff changeset
2987
37
412ad2e6c2a2 struct copy
kono
parents: 36
diff changeset
2988 int dummy_count = 0;
412ad2e6c2a2 struct copy
kono
parents: 36
diff changeset
2989
61
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents: 59
diff changeset
2990 static NMTBL *
37
412ad2e6c2a2 struct copy
kono
parents: 36
diff changeset
2991 free_nptr()
412ad2e6c2a2 struct copy
kono
parents: 36
diff changeset
2992 {
412ad2e6c2a2 struct copy
kono
parents: 36
diff changeset
2993 NMTBL *nptr,*iptr;
412ad2e6c2a2 struct copy
kono
parents: 36
diff changeset
2994
412ad2e6c2a2 struct copy
kono
parents: 36
diff changeset
2995 iptr=nptr= &ntable[hash % GSYMS];
412ad2e6c2a2 struct copy
kono
parents: 36
diff changeset
2996 while(nptr->sc!=0) {
412ad2e6c2a2 struct copy
kono
parents: 36
diff changeset
2997 if (++nptr== &ntable[GSYMS])
412ad2e6c2a2 struct copy
kono
parents: 36
diff changeset
2998 nptr=ntable;
412ad2e6c2a2 struct copy
kono
parents: 36
diff changeset
2999 if (nptr==iptr) error(GSERR);
412ad2e6c2a2 struct copy
kono
parents: 36
diff changeset
3000 }
412ad2e6c2a2 struct copy
kono
parents: 36
diff changeset
3001 copy(nptr,"_00000");
412ad2e6c2a2 struct copy
kono
parents: 36
diff changeset
3002 dummy_count++;
412ad2e6c2a2 struct copy
kono
parents: 36
diff changeset
3003 if (dummy_count>999) error(STRERR);
412ad2e6c2a2 struct copy
kono
parents: 36
diff changeset
3004 nptr->nm[5]='0'+dummy_count%10;
412ad2e6c2a2 struct copy
kono
parents: 36
diff changeset
3005 nptr->nm[4]='0'+(dummy_count/10)%10;
412ad2e6c2a2 struct copy
kono
parents: 36
diff changeset
3006 nptr->nm[3]='0'+(dummy_count/100)%10;
412ad2e6c2a2 struct copy
kono
parents: 36
diff changeset
3007 nptr->sc=EMPTY;
412ad2e6c2a2 struct copy
kono
parents: 36
diff changeset
3008 return nptr;
412ad2e6c2a2 struct copy
kono
parents: 36
diff changeset
3009 }
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
3010
61
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents: 59
diff changeset
3011 static NMTBL *
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
3012 gsearch(void)
d35df41eac69 Initial revision
kono
parents:
diff changeset
3013 {
d35df41eac69 Initial revision
kono
parents:
diff changeset
3014 NMTBL *nptr,*iptr;
d35df41eac69 Initial revision
kono
parents:
diff changeset
3015
d35df41eac69 Initial revision
kono
parents:
diff changeset
3016 iptr=nptr= &ntable[hash % GSYMS];
30
20ed2786a276 still macro
kono
parents: 29
diff changeset
3017 while(nptr->sc!=0 && neqname(nptr->nm,name)) {
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
3018 if (++nptr== &ntable[GSYMS])
d35df41eac69 Initial revision
kono
parents:
diff changeset
3019 nptr=ntable;
d35df41eac69 Initial revision
kono
parents:
diff changeset
3020 if (nptr==iptr) error(GSERR);
d35df41eac69 Initial revision
kono
parents:
diff changeset
3021 }
d35df41eac69 Initial revision
kono
parents:
diff changeset
3022 if (nptr->sc == 0) {
d35df41eac69 Initial revision
kono
parents:
diff changeset
3023 copy(nptr,name);
d35df41eac69 Initial revision
kono
parents:
diff changeset
3024 nptr->sc=EMPTY;
d35df41eac69 Initial revision
kono
parents:
diff changeset
3025 }
d35df41eac69 Initial revision
kono
parents:
diff changeset
3026 return nptr;
d35df41eac69 Initial revision
kono
parents:
diff changeset
3027 }
d35df41eac69 Initial revision
kono
parents:
diff changeset
3028
61
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents: 59
diff changeset
3029 static NMTBL *
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
3030 lsearch(char *name)
d35df41eac69 Initial revision
kono
parents:
diff changeset
3031 {
d35df41eac69 Initial revision
kono
parents:
diff changeset
3032 NMTBL *nptr,*iptr;
d35df41eac69 Initial revision
kono
parents:
diff changeset
3033
d35df41eac69 Initial revision
kono
parents:
diff changeset
3034 iptr=nptr= &ntable[hash%LSYMS+GSYMS];
30
20ed2786a276 still macro
kono
parents: 29
diff changeset
3035 while(nptr->sc!=0 && neqname(nptr->nm,name)) {
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
3036 if (++nptr== &ntable[LSYMS+GSYMS])
d35df41eac69 Initial revision
kono
parents:
diff changeset
3037 nptr= &ntable[GSYMS];
d35df41eac69 Initial revision
kono
parents:
diff changeset
3038 if (nptr==iptr) error(LSERR);
d35df41eac69 Initial revision
kono
parents:
diff changeset
3039 }
d35df41eac69 Initial revision
kono
parents:
diff changeset
3040 if (nptr->sc == 0) {
d35df41eac69 Initial revision
kono
parents:
diff changeset
3041 nptr->nm=name; /* already saved in gsearch */
d35df41eac69 Initial revision
kono
parents:
diff changeset
3042 nptr->sc=EMPTY;
d35df41eac69 Initial revision
kono
parents:
diff changeset
3043 nptr->dsp=0;
d35df41eac69 Initial revision
kono
parents:
diff changeset
3044 }
d35df41eac69 Initial revision
kono
parents:
diff changeset
3045 return nptr;
d35df41eac69 Initial revision
kono
parents:
diff changeset
3046 }
d35df41eac69 Initial revision
kono
parents:
diff changeset
3047
61
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents: 59
diff changeset
3048 static NMTBL *
29
160e20394f80 macro function (imcomplete)
kono
parents: 28
diff changeset
3049 msearch(char *name)
160e20394f80 macro function (imcomplete)
kono
parents: 28
diff changeset
3050 {
160e20394f80 macro function (imcomplete)
kono
parents: 28
diff changeset
3051 NMTBL *nptr,*iptr;
160e20394f80 macro function (imcomplete)
kono
parents: 28
diff changeset
3052
160e20394f80 macro function (imcomplete)
kono
parents: 28
diff changeset
3053 iptr=nptr= &mtable[hash%MSYMS];
30
20ed2786a276 still macro
kono
parents: 29
diff changeset
3054 while(nptr->sc!=0 && neqname(nptr->nm,name)) {
29
160e20394f80 macro function (imcomplete)
kono
parents: 28
diff changeset
3055 if (++nptr== &mtable[MSYMS])
30
20ed2786a276 still macro
kono
parents: 29
diff changeset
3056 nptr= &mtable[0];
29
160e20394f80 macro function (imcomplete)
kono
parents: 28
diff changeset
3057 if (nptr==iptr) error(MSERR);
160e20394f80 macro function (imcomplete)
kono
parents: 28
diff changeset
3058 }
160e20394f80 macro function (imcomplete)
kono
parents: 28
diff changeset
3059 if (nptr->sc == 0) {
160e20394f80 macro function (imcomplete)
kono
parents: 28
diff changeset
3060 copy(nptr,name);
160e20394f80 macro function (imcomplete)
kono
parents: 28
diff changeset
3061 nptr->sc=EMPTY;
160e20394f80 macro function (imcomplete)
kono
parents: 28
diff changeset
3062 nptr->dsp=0;
160e20394f80 macro function (imcomplete)
kono
parents: 28
diff changeset
3063 nptr->ty=0;
160e20394f80 macro function (imcomplete)
kono
parents: 28
diff changeset
3064 }
160e20394f80 macro function (imcomplete)
kono
parents: 28
diff changeset
3065 return nptr;
160e20394f80 macro function (imcomplete)
kono
parents: 28
diff changeset
3066 }
160e20394f80 macro function (imcomplete)
kono
parents: 28
diff changeset
3067
61
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents: 59
diff changeset
3068 static NMTBL *
30
20ed2786a276 still macro
kono
parents: 29
diff changeset
3069 msearch0(char *name)
20ed2786a276 still macro
kono
parents: 29
diff changeset
3070 {
20ed2786a276 still macro
kono
parents: 29
diff changeset
3071 NMTBL *nptr,*iptr;
20ed2786a276 still macro
kono
parents: 29
diff changeset
3072 int hash,i;
20ed2786a276 still macro
kono
parents: 29
diff changeset
3073
31
8b87de87eb54 *** empty log message ***
kono
parents: 30
diff changeset
3074 i = 0; hash = 0;
30
20ed2786a276 still macro
kono
parents: 29
diff changeset
3075 while((name[i])) {
20ed2786a276 still macro
kono
parents: 29
diff changeset
3076 hash=((7*hash) ^ name[i++]);
20ed2786a276 still macro
kono
parents: 29
diff changeset
3077 }
20ed2786a276 still macro
kono
parents: 29
diff changeset
3078 iptr=nptr= &mtable[hash%MSYMS];
20ed2786a276 still macro
kono
parents: 29
diff changeset
3079 while(nptr->sc!=0 && neqname(nptr->nm,name)) {
20ed2786a276 still macro
kono
parents: 29
diff changeset
3080 if (++nptr== &mtable[MSYMS])
20ed2786a276 still macro
kono
parents: 29
diff changeset
3081 nptr= &mtable[0];
20ed2786a276 still macro
kono
parents: 29
diff changeset
3082 if (nptr==iptr) error(MSERR);
20ed2786a276 still macro
kono
parents: 29
diff changeset
3083 }
20ed2786a276 still macro
kono
parents: 29
diff changeset
3084 if (nptr->sc == 0) {
20ed2786a276 still macro
kono
parents: 29
diff changeset
3085 copy(nptr,name);
20ed2786a276 still macro
kono
parents: 29
diff changeset
3086 nptr->sc=EMPTY;
20ed2786a276 still macro
kono
parents: 29
diff changeset
3087 nptr->dsp=0;
20ed2786a276 still macro
kono
parents: 29
diff changeset
3088 nptr->ty=0;
20ed2786a276 still macro
kono
parents: 29
diff changeset
3089 }
20ed2786a276 still macro
kono
parents: 29
diff changeset
3090 return nptr;
20ed2786a276 still macro
kono
parents: 29
diff changeset
3091 }
20ed2786a276 still macro
kono
parents: 29
diff changeset
3092
20ed2786a276 still macro
kono
parents: 29
diff changeset
3093
61
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents: 59
diff changeset
3094 static void
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
3095 copy(NMTBL *nptr, char *s)
d35df41eac69 Initial revision
kono
parents:
diff changeset
3096 {
d35df41eac69 Initial revision
kono
parents:
diff changeset
3097 nptr->nm = cheapp;
18
df7fa8cee67b pass -Wall
kono
parents: 16
diff changeset
3098 while((*cheapp++ = *s++));
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
3099 }
d35df41eac69 Initial revision
kono
parents:
diff changeset
3100
61
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents: 59
diff changeset
3101 static int
30
20ed2786a276 still macro
kono
parents: 29
diff changeset
3102 neqname(char *p,char *q)
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
3103 {
d35df41eac69 Initial revision
kono
parents:
diff changeset
3104 if (!p)
d35df41eac69 Initial revision
kono
parents:
diff changeset
3105 return 0;
d35df41eac69 Initial revision
kono
parents:
diff changeset
3106 while(*p && *p!='.')
d35df41eac69 Initial revision
kono
parents:
diff changeset
3107 if(*p++ != *q++) return 1;
d35df41eac69 Initial revision
kono
parents:
diff changeset
3108 return (*q!=0);
d35df41eac69 Initial revision
kono
parents:
diff changeset
3109 }
d35df41eac69 Initial revision
kono
parents:
diff changeset
3110
61
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents: 59
diff changeset
3111 static void
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
3112 getstring(void)
d35df41eac69 Initial revision
kono
parents:
diff changeset
3113 {
d35df41eac69 Initial revision
kono
parents:
diff changeset
3114 getch();
d35df41eac69 Initial revision
kono
parents:
diff changeset
3115 symval = 0;
d35df41eac69 Initial revision
kono
parents:
diff changeset
3116 sptr = cheapp;
d35df41eac69 Initial revision
kono
parents:
diff changeset
3117 while (ch != '"') {
d35df41eac69 Initial revision
kono
parents:
diff changeset
3118 *cheapp++ = escape();
d35df41eac69 Initial revision
kono
parents:
diff changeset
3119 symval++;
d35df41eac69 Initial revision
kono
parents:
diff changeset
3120 if (cheapp >= cheap+CHEAPSIZE) error(STRERR);
d35df41eac69 Initial revision
kono
parents:
diff changeset
3121 }
d35df41eac69 Initial revision
kono
parents:
diff changeset
3122 getch();
d35df41eac69 Initial revision
kono
parents:
diff changeset
3123 *cheapp++ = '\0';
d35df41eac69 Initial revision
kono
parents:
diff changeset
3124 symval++;
d35df41eac69 Initial revision
kono
parents:
diff changeset
3125 }
d35df41eac69 Initial revision
kono
parents:
diff changeset
3126
69
dba8d111b7a0 c output
kono
parents: 68
diff changeset
3127 static int topspc = 0;
dba8d111b7a0 c output
kono
parents: 68
diff changeset
3128
61
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents: 59
diff changeset
3129 static int
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
3130 skipspc(void)
d35df41eac69 Initial revision
kono
parents:
diff changeset
3131 {
69
dba8d111b7a0 c output
kono
parents: 68
diff changeset
3132 /* static int topspc = 0; */
dba8d111b7a0 c output
kono
parents: 68
diff changeset
3133
67
254a0c576114 argument type list
kono
parents: 66
diff changeset
3134 while(ch=='\t'||ch=='\n'||ch==' '||ch=='\r') {
69
dba8d111b7a0 c output
kono
parents: 68
diff changeset
3135 if (ch=='\n'||ch=='\r') topspc=1;
dba8d111b7a0 c output
kono
parents: 68
diff changeset
3136 if (topspc)
dba8d111b7a0 c output
kono
parents: 68
diff changeset
3137 conv->comment_(ch);
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
3138 getch();
67
254a0c576114 argument type list
kono
parents: 66
diff changeset
3139 }
69
dba8d111b7a0 c output
kono
parents: 68
diff changeset
3140 topspc=0;
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
3141 return ch;
d35df41eac69 Initial revision
kono
parents:
diff changeset
3142 }
d35df41eac69 Initial revision
kono
parents:
diff changeset
3143
61
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents: 59
diff changeset
3144 static int
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
3145 getch(void)
d35df41eac69 Initial revision
kono
parents:
diff changeset
3146 {
31
8b87de87eb54 *** empty log message ***
kono
parents: 30
diff changeset
3147 if(*chptr) return ch = *chptr++;
34
0756caa79167 macro function recursive and copy method
kono
parents: 33
diff changeset
3148 else if (chptrsave) {
0756caa79167 macro function recursive and copy method
kono
parents: 33
diff changeset
3149 chptr = chptrsave;
0756caa79167 macro function recursive and copy method
kono
parents: 33
diff changeset
3150 ch = chsave;
0756caa79167 macro function recursive and copy method
kono
parents: 33
diff changeset
3151 chptrsave = 0;
0756caa79167 macro function recursive and copy method
kono
parents: 33
diff changeset
3152 return ch;
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
3153 }
d35df41eac69 Initial revision
kono
parents:
diff changeset
3154 getline();
d35df41eac69 Initial revision
kono
parents:
diff changeset
3155 return getch();
d35df41eac69 Initial revision
kono
parents:
diff changeset
3156 }
d35df41eac69 Initial revision
kono
parents:
diff changeset
3157
d35df41eac69 Initial revision
kono
parents:
diff changeset
3158 char
d35df41eac69 Initial revision
kono
parents:
diff changeset
3159 escape(void)
d35df41eac69 Initial revision
kono
parents:
diff changeset
3160 {
d35df41eac69 Initial revision
kono
parents:
diff changeset
3161 char c;
d35df41eac69 Initial revision
kono
parents:
diff changeset
3162 if ((c=ch) == '\\') {
d35df41eac69 Initial revision
kono
parents:
diff changeset
3163 if (digit(c=getch())) {
d35df41eac69 Initial revision
kono
parents:
diff changeset
3164 c = ch-'0';
d35df41eac69 Initial revision
kono
parents:
diff changeset
3165 if (digit(getch())) {
d35df41eac69 Initial revision
kono
parents:
diff changeset
3166 c = c*8+ch-'0';
d35df41eac69 Initial revision
kono
parents:
diff changeset
3167 if (digit(getch())) {
d35df41eac69 Initial revision
kono
parents:
diff changeset
3168 c=c*8+ch-'0';getch();
d35df41eac69 Initial revision
kono
parents:
diff changeset
3169 }
d35df41eac69 Initial revision
kono
parents:
diff changeset
3170 }
d35df41eac69 Initial revision
kono
parents:
diff changeset
3171 return c;
d35df41eac69 Initial revision
kono
parents:
diff changeset
3172 }
d35df41eac69 Initial revision
kono
parents:
diff changeset
3173 getch();
d35df41eac69 Initial revision
kono
parents:
diff changeset
3174 switch(c) {
d35df41eac69 Initial revision
kono
parents:
diff changeset
3175 case 'n':
d35df41eac69 Initial revision
kono
parents:
diff changeset
3176 return '\n';
d35df41eac69 Initial revision
kono
parents:
diff changeset
3177 case 't':
d35df41eac69 Initial revision
kono
parents:
diff changeset
3178 return '\t';
d35df41eac69 Initial revision
kono
parents:
diff changeset
3179 case 'b':
d35df41eac69 Initial revision
kono
parents:
diff changeset
3180 return '\b';
d35df41eac69 Initial revision
kono
parents:
diff changeset
3181 case 'r':
d35df41eac69 Initial revision
kono
parents:
diff changeset
3182 return '\r';
d35df41eac69 Initial revision
kono
parents:
diff changeset
3183 case 'f':
d35df41eac69 Initial revision
kono
parents:
diff changeset
3184 return '\f';
d35df41eac69 Initial revision
kono
parents:
diff changeset
3185 case '\n':
d35df41eac69 Initial revision
kono
parents:
diff changeset
3186 return escape();
d35df41eac69 Initial revision
kono
parents:
diff changeset
3187 default:
d35df41eac69 Initial revision
kono
parents:
diff changeset
3188 return c;
d35df41eac69 Initial revision
kono
parents:
diff changeset
3189 }
d35df41eac69 Initial revision
kono
parents:
diff changeset
3190 }
d35df41eac69 Initial revision
kono
parents:
diff changeset
3191 if (c == '\n') error(EXERR);
d35df41eac69 Initial revision
kono
parents:
diff changeset
3192 getch();
d35df41eac69 Initial revision
kono
parents:
diff changeset
3193 return c;
d35df41eac69 Initial revision
kono
parents:
diff changeset
3194 }
d35df41eac69 Initial revision
kono
parents:
diff changeset
3195
61
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents: 59
diff changeset
3196 static FILE *
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
3197 getfname(void)
d35df41eac69 Initial revision
kono
parents:
diff changeset
3198 {
d35df41eac69 Initial revision
kono
parents:
diff changeset
3199 int i;
25
b7a94557bf92 *** empty log message ***
kono
parents: 23
diff changeset
3200 char *s,name[LBUFSIZE];
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
3201 FILE *fp;
d35df41eac69 Initial revision
kono
parents:
diff changeset
3202
d35df41eac69 Initial revision
kono
parents:
diff changeset
3203 getch();
d35df41eac69 Initial revision
kono
parents:
diff changeset
3204 if(skipspc()!='"') error(INCERR);
d35df41eac69 Initial revision
kono
parents:
diff changeset
3205 for(i=0;(getch()!='"' && ch!='\n');) {
d35df41eac69 Initial revision
kono
parents:
diff changeset
3206 if(i<LBUFSIZE-1) name[i++]=ch;
d35df41eac69 Initial revision
kono
parents:
diff changeset
3207 }
d35df41eac69 Initial revision
kono
parents:
diff changeset
3208 if(ch=='\n') error(INCERR);
d35df41eac69 Initial revision
kono
parents:
diff changeset
3209 name[i]=0;
d35df41eac69 Initial revision
kono
parents:
diff changeset
3210 fp = fopen(name,"r") ;
25
b7a94557bf92 *** empty log message ***
kono
parents: 23
diff changeset
3211 s = name;
b7a94557bf92 *** empty log message ***
kono
parents: 23
diff changeset
3212 (filep+1)->name0 = cheapp;
b7a94557bf92 *** empty log message ***
kono
parents: 23
diff changeset
3213 while((*cheapp++ = *s++));
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
3214 return ( (filep+1)->fcb = fp );
d35df41eac69 Initial revision
kono
parents:
diff changeset
3215 }
d35df41eac69 Initial revision
kono
parents:
diff changeset
3216
18
df7fa8cee67b pass -Wall
kono
parents: 16
diff changeset
3217 static int macro_if_depth ;
df7fa8cee67b pass -Wall
kono
parents: 16
diff changeset
3218 static int macro_if_current ;
df7fa8cee67b pass -Wall
kono
parents: 16
diff changeset
3219 static int macro_if_skip ;
df7fa8cee67b pass -Wall
kono
parents: 16
diff changeset
3220
61
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents: 59
diff changeset
3221 static void
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
3222 getline(void)
d35df41eac69 Initial revision
kono
parents:
diff changeset
3223 {
d35df41eac69 Initial revision
kono
parents:
diff changeset
3224 int i;
d35df41eac69 Initial revision
kono
parents:
diff changeset
3225 int c;
d35df41eac69 Initial revision
kono
parents:
diff changeset
3226
18
df7fa8cee67b pass -Wall
kono
parents: 16
diff changeset
3227 do {
df7fa8cee67b pass -Wall
kono
parents: 16
diff changeset
3228 lineno++;
df7fa8cee67b pass -Wall
kono
parents: 16
diff changeset
3229 glineno++;
df7fa8cee67b pass -Wall
kono
parents: 16
diff changeset
3230 chptr=linebuf;
df7fa8cee67b pass -Wall
kono
parents: 16
diff changeset
3231 i=0;
23
e605560e6146 Fix breaking edx,ecx on function call
kono
parents: 21
diff changeset
3232 while ((*chptr++ = c = getc(filep->fcb)) != '\n') {
18
df7fa8cee67b pass -Wall
kono
parents: 16
diff changeset
3233 if (++i > LBUFSIZE-2) error(LNERR);
df7fa8cee67b pass -Wall
kono
parents: 16
diff changeset
3234 if (c==EOF) {
df7fa8cee67b pass -Wall
kono
parents: 16
diff changeset
3235 error(EOFERR);
df7fa8cee67b pass -Wall
kono
parents: 16
diff changeset
3236 --chptr;
df7fa8cee67b pass -Wall
kono
parents: 16
diff changeset
3237 }
df7fa8cee67b pass -Wall
kono
parents: 16
diff changeset
3238 }
df7fa8cee67b pass -Wall
kono
parents: 16
diff changeset
3239 *chptr = '\0';
23
e605560e6146 Fix breaking edx,ecx on function call
kono
parents: 21
diff changeset
3240 if (lsrc && !asmf && !macro_if_skip) gen_comment(linebuf);
20
8d3db5fc8a97 *** empty log message ***
kono
parents: 19
diff changeset
3241 if (*(chptr = linebuf) == '#' && !in_comment) {
18
df7fa8cee67b pass -Wall
kono
parents: 16
diff changeset
3242 macro_processing();
df7fa8cee67b pass -Wall
kono
parents: 16
diff changeset
3243 }
23
e605560e6146 Fix breaking edx,ecx on function call
kono
parents: 21
diff changeset
3244 } while(macro_if_skip || linebuf[0] == '#');
18
df7fa8cee67b pass -Wall
kono
parents: 16
diff changeset
3245 }
df7fa8cee67b pass -Wall
kono
parents: 16
diff changeset
3246
61
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents: 59
diff changeset
3247 static void
18
df7fa8cee67b pass -Wall
kono
parents: 16
diff changeset
3248 macro_processing()
df7fa8cee67b pass -Wall
kono
parents: 16
diff changeset
3249 {
df7fa8cee67b pass -Wall
kono
parents: 16
diff changeset
3250 int i;
df7fa8cee67b pass -Wall
kono
parents: 16
diff changeset
3251 int c;
df7fa8cee67b pass -Wall
kono
parents: 16
diff changeset
3252 int mode_save;
df7fa8cee67b pass -Wall
kono
parents: 16
diff changeset
3253
df7fa8cee67b pass -Wall
kono
parents: 16
diff changeset
3254 ++chptr;
19
b62230ea38f6 ifdef debug
kono
parents: 18
diff changeset
3255 if (macroeq("ifdef") || macroeq("ifndef")) {
28
c6994794f084 functional macro (imcomplete)
kono
parents: 25
diff changeset
3256 c = (chptr[-4]=='n');
18
df7fa8cee67b pass -Wall
kono
parents: 16
diff changeset
3257 macro_if_current++;
df7fa8cee67b pass -Wall
kono
parents: 16
diff changeset
3258 if (!macro_if_skip) {
19
b62230ea38f6 ifdef debug
kono
parents: 18
diff changeset
3259 mode_save = mode; mode = IFDEF;
b62230ea38f6 ifdef debug
kono
parents: 18
diff changeset
3260 ch= *chptr;
b62230ea38f6 ifdef debug
kono
parents: 18
diff changeset
3261 i = getsym();
b62230ea38f6 ifdef debug
kono
parents: 18
diff changeset
3262 mode = mode_save;
b62230ea38f6 ifdef debug
kono
parents: 18
diff changeset
3263 macro_if_depth = macro_if_current;
b62230ea38f6 ifdef debug
kono
parents: 18
diff changeset
3264 macro_if_skip = (!i)^c;
b62230ea38f6 ifdef debug
kono
parents: 18
diff changeset
3265 }
b62230ea38f6 ifdef debug
kono
parents: 18
diff changeset
3266 return;
b62230ea38f6 ifdef debug
kono
parents: 18
diff changeset
3267 } else if (macroeq("if")) {
b62230ea38f6 ifdef debug
kono
parents: 18
diff changeset
3268 macro_if_current++;
b62230ea38f6 ifdef debug
kono
parents: 18
diff changeset
3269 if (!macro_if_skip) {
23
e605560e6146 Fix breaking edx,ecx on function call
kono
parents: 21
diff changeset
3270 for(c=0;chptr[c];c++);
33
8500dbb69dd9 bad macro processing. give up this method.
kono
parents: 32
diff changeset
3271 chptr[c] = ';'; /* this can't happen in macro expression */
19
b62230ea38f6 ifdef debug
kono
parents: 18
diff changeset
3272 ch= *chptr;
18
df7fa8cee67b pass -Wall
kono
parents: 16
diff changeset
3273 getsym();
69
dba8d111b7a0 c output
kono
parents: 68
diff changeset
3274 i=cexpr(expr(1));
18
df7fa8cee67b pass -Wall
kono
parents: 16
diff changeset
3275 macro_if_depth = macro_if_current;
df7fa8cee67b pass -Wall
kono
parents: 16
diff changeset
3276 macro_if_skip = !i;
df7fa8cee67b pass -Wall
kono
parents: 16
diff changeset
3277 }
19
b62230ea38f6 ifdef debug
kono
parents: 18
diff changeset
3278 return;
18
df7fa8cee67b pass -Wall
kono
parents: 16
diff changeset
3279 } else if (macroeq("else")) {
df7fa8cee67b pass -Wall
kono
parents: 16
diff changeset
3280 if (macro_if_current==0) {
df7fa8cee67b pass -Wall
kono
parents: 16
diff changeset
3281 error(MCERR); /* extra #else */
19
b62230ea38f6 ifdef debug
kono
parents: 18
diff changeset
3282 return;
18
df7fa8cee67b pass -Wall
kono
parents: 16
diff changeset
3283 }
df7fa8cee67b pass -Wall
kono
parents: 16
diff changeset
3284 if (macro_if_current == macro_if_depth)
df7fa8cee67b pass -Wall
kono
parents: 16
diff changeset
3285 macro_if_skip = !macro_if_skip;
19
b62230ea38f6 ifdef debug
kono
parents: 18
diff changeset
3286 return;
18
df7fa8cee67b pass -Wall
kono
parents: 16
diff changeset
3287 } else if (macroeq("endif")) {
df7fa8cee67b pass -Wall
kono
parents: 16
diff changeset
3288 if (macro_if_current == macro_if_depth) {
df7fa8cee67b pass -Wall
kono
parents: 16
diff changeset
3289 macro_if_skip = 0;
19
b62230ea38f6 ifdef debug
kono
parents: 18
diff changeset
3290 macro_if_depth = --macro_if_current;
18
df7fa8cee67b pass -Wall
kono
parents: 16
diff changeset
3291 } else {
19
b62230ea38f6 ifdef debug
kono
parents: 18
diff changeset
3292 if (macro_if_current<=0) {
18
df7fa8cee67b pass -Wall
kono
parents: 16
diff changeset
3293 error(MCERR); /* extra #if */
19
b62230ea38f6 ifdef debug
kono
parents: 18
diff changeset
3294 return;
18
df7fa8cee67b pass -Wall
kono
parents: 16
diff changeset
3295 }
19
b62230ea38f6 ifdef debug
kono
parents: 18
diff changeset
3296 macro_if_current--;
18
df7fa8cee67b pass -Wall
kono
parents: 16
diff changeset
3297 }
19
b62230ea38f6 ifdef debug
kono
parents: 18
diff changeset
3298 return;
b62230ea38f6 ifdef debug
kono
parents: 18
diff changeset
3299 }
b62230ea38f6 ifdef debug
kono
parents: 18
diff changeset
3300 if (macro_if_skip) return;
b62230ea38f6 ifdef debug
kono
parents: 18
diff changeset
3301 if (macroeq("define")) {
32
b35787d8a442 macro initialization
kono
parents: 31
diff changeset
3302 macro_define0();
18
df7fa8cee67b pass -Wall
kono
parents: 16
diff changeset
3303 *(chptr = linebuf) = '\0';
19
b62230ea38f6 ifdef debug
kono
parents: 18
diff changeset
3304 } else if (macroeq("undef")) {
b62230ea38f6 ifdef debug
kono
parents: 18
diff changeset
3305 i=mode;
28
c6994794f084 functional macro (imcomplete)
kono
parents: 25
diff changeset
3306 mode=LDECL;
19
b62230ea38f6 ifdef debug
kono
parents: 18
diff changeset
3307 ch= *chptr;
b62230ea38f6 ifdef debug
kono
parents: 18
diff changeset
3308 if (getsym() == IDENT) {
b62230ea38f6 ifdef debug
kono
parents: 18
diff changeset
3309 if (nptr->sc == MACRO) {
b62230ea38f6 ifdef debug
kono
parents: 18
diff changeset
3310 nptr->sc = EMPTY;
29
160e20394f80 macro function (imcomplete)
kono
parents: 28
diff changeset
3311 } else if (nptr->sc == FMACRO) {
28
c6994794f084 functional macro (imcomplete)
kono
parents: 25
diff changeset
3312 nptr->sc = EMPTY;
29
160e20394f80 macro function (imcomplete)
kono
parents: 28
diff changeset
3313 /* we cannot reclaim it's arg */
19
b62230ea38f6 ifdef debug
kono
parents: 18
diff changeset
3314 } else error(MCERR);
b62230ea38f6 ifdef debug
kono
parents: 18
diff changeset
3315 }
b62230ea38f6 ifdef debug
kono
parents: 18
diff changeset
3316 mode=i;
18
df7fa8cee67b pass -Wall
kono
parents: 16
diff changeset
3317 } else if (macroeq("include")) {
df7fa8cee67b pass -Wall
kono
parents: 16
diff changeset
3318 if(filep+1 >= filestack + FILES) error(FILERR);
df7fa8cee67b pass -Wall
kono
parents: 16
diff changeset
3319 if ( ((filep+1)->fcb=getfname()) == NULL) error(FILERR);
df7fa8cee67b pass -Wall
kono
parents: 16
diff changeset
3320 (filep+1)->ln=lineno;
df7fa8cee67b pass -Wall
kono
parents: 16
diff changeset
3321 lineno=0;
df7fa8cee67b pass -Wall
kono
parents: 16
diff changeset
3322 ++filep;
df7fa8cee67b pass -Wall
kono
parents: 16
diff changeset
3323 *(chptr = linebuf) = '\0';
df7fa8cee67b pass -Wall
kono
parents: 16
diff changeset
3324 } else if (macroeq("asm")) {
df7fa8cee67b pass -Wall
kono
parents: 16
diff changeset
3325 if (asmf) error(MCERR);
df7fa8cee67b pass -Wall
kono
parents: 16
diff changeset
3326 asmf = 1;
df7fa8cee67b pass -Wall
kono
parents: 16
diff changeset
3327 getline();
df7fa8cee67b pass -Wall
kono
parents: 16
diff changeset
3328 while (asmf) {
df7fa8cee67b pass -Wall
kono
parents: 16
diff changeset
3329 gen_source(linebuf);
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
3330 getline();
18
df7fa8cee67b pass -Wall
kono
parents: 16
diff changeset
3331 }
df7fa8cee67b pass -Wall
kono
parents: 16
diff changeset
3332 } else if (macroeq("endasm")) {
df7fa8cee67b pass -Wall
kono
parents: 16
diff changeset
3333 if (!asmf) error(MCERR);
df7fa8cee67b pass -Wall
kono
parents: 16
diff changeset
3334 asmf = 0;
df7fa8cee67b pass -Wall
kono
parents: 16
diff changeset
3335 } else if (macroeq(" "))
df7fa8cee67b pass -Wall
kono
parents: 16
diff changeset
3336 getline();
df7fa8cee67b pass -Wall
kono
parents: 16
diff changeset
3337 else error(MCERR);
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
3338 }
d35df41eac69 Initial revision
kono
parents:
diff changeset
3339
61
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents: 59
diff changeset
3340 static int
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
3341 macroeq(char *s)
d35df41eac69 Initial revision
kono
parents:
diff changeset
3342 {
d35df41eac69 Initial revision
kono
parents:
diff changeset
3343 char *p;
d35df41eac69 Initial revision
kono
parents:
diff changeset
3344
d35df41eac69 Initial revision
kono
parents:
diff changeset
3345 for (p = chptr; *s;) if (*s++ != *p++) return 0;
d35df41eac69 Initial revision
kono
parents:
diff changeset
3346 chptr = p;
d35df41eac69 Initial revision
kono
parents:
diff changeset
3347 return 1;
d35df41eac69 Initial revision
kono
parents:
diff changeset
3348 }
d35df41eac69 Initial revision
kono
parents:
diff changeset
3349
61
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents: 59
diff changeset
3350 static void
32
b35787d8a442 macro initialization
kono
parents: 31
diff changeset
3351 macro_define(char *macro)
b35787d8a442 macro initialization
kono
parents: 31
diff changeset
3352 {
b35787d8a442 macro initialization
kono
parents: 31
diff changeset
3353 char *chptr_save;
b35787d8a442 macro initialization
kono
parents: 31
diff changeset
3354 int chsave;
b35787d8a442 macro initialization
kono
parents: 31
diff changeset
3355 chptr_save = chptr;
b35787d8a442 macro initialization
kono
parents: 31
diff changeset
3356 chsave = ch;
b35787d8a442 macro initialization
kono
parents: 31
diff changeset
3357 chptr = macro;
b35787d8a442 macro initialization
kono
parents: 31
diff changeset
3358 ch= *chptr++;
b35787d8a442 macro initialization
kono
parents: 31
diff changeset
3359 macro_define0();
b35787d8a442 macro initialization
kono
parents: 31
diff changeset
3360 chptr = chptr_save;
b35787d8a442 macro initialization
kono
parents: 31
diff changeset
3361 ch = chsave;
b35787d8a442 macro initialization
kono
parents: 31
diff changeset
3362 }
b35787d8a442 macro initialization
kono
parents: 31
diff changeset
3363
61
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents: 59
diff changeset
3364 static void
32
b35787d8a442 macro initialization
kono
parents: 31
diff changeset
3365 macro_define0()
b35787d8a442 macro initialization
kono
parents: 31
diff changeset
3366 {
b35787d8a442 macro initialization
kono
parents: 31
diff changeset
3367 int i,args,c;
b35787d8a442 macro initialization
kono
parents: 31
diff changeset
3368 i=mode;
b35787d8a442 macro initialization
kono
parents: 31
diff changeset
3369 mode=MDECL;
b35787d8a442 macro initialization
kono
parents: 31
diff changeset
3370 ch= *chptr;
b35787d8a442 macro initialization
kono
parents: 31
diff changeset
3371 getsym();
35
fd18d440f5ee macro function (works. but dirty. )
kono
parents: 34
diff changeset
3372 /* fprintf(stderr,"macro def: %s =>",name); */
32
b35787d8a442 macro initialization
kono
parents: 31
diff changeset
3373 if (nptr->sc != EMPTY) { /* override exisiting macro */
b35787d8a442 macro initialization
kono
parents: 31
diff changeset
3374 }
b35787d8a442 macro initialization
kono
parents: 31
diff changeset
3375 args = 0;
b35787d8a442 macro initialization
kono
parents: 31
diff changeset
3376 if (ch=='(') {
b35787d8a442 macro initialization
kono
parents: 31
diff changeset
3377 nptr->sc = FMACRO;
37
412ad2e6c2a2 struct copy
kono
parents: 36
diff changeset
3378 args = macro_args(&cheapp,cheap+CHEAPSIZE,&chptr);
32
b35787d8a442 macro initialization
kono
parents: 31
diff changeset
3379 } else {
b35787d8a442 macro initialization
kono
parents: 31
diff changeset
3380 nptr->sc = MACRO;
33
8500dbb69dd9 bad macro processing. give up this method.
kono
parents: 32
diff changeset
3381 nptr->ty = -1;
32
b35787d8a442 macro initialization
kono
parents: 31
diff changeset
3382 }
34
0756caa79167 macro function recursive and copy method
kono
parents: 33
diff changeset
3383 nptr->dsp = list2((int)cheapp,args); /* macro body */
32
b35787d8a442 macro initialization
kono
parents: 31
diff changeset
3384 while ((*cheapp++ = c = *chptr++)
34
0756caa79167 macro function recursive and copy method
kono
parents: 33
diff changeset
3385 && c != '\n') {
0756caa79167 macro function recursive and copy method
kono
parents: 33
diff changeset
3386 if (c=='\\' && chptr[1]=='\n') {
0756caa79167 macro function recursive and copy method
kono
parents: 33
diff changeset
3387 cheapp--;
0756caa79167 macro function recursive and copy method
kono
parents: 33
diff changeset
3388 getline();
0756caa79167 macro function recursive and copy method
kono
parents: 33
diff changeset
3389 }
0756caa79167 macro function recursive and copy method
kono
parents: 33
diff changeset
3390 }
32
b35787d8a442 macro initialization
kono
parents: 31
diff changeset
3391 *cheapp++ = '\0';
b35787d8a442 macro initialization
kono
parents: 31
diff changeset
3392 if (cheapp >= cheap+CHEAPSIZE) /* too late? */
b35787d8a442 macro initialization
kono
parents: 31
diff changeset
3393 error(STRERR);
35
fd18d440f5ee macro function (works. but dirty. )
kono
parents: 34
diff changeset
3394 /* fprintf(stderr,"%s\n",(char *)car(nptr->dsp)); */
32
b35787d8a442 macro initialization
kono
parents: 31
diff changeset
3395 mode=i;
b35787d8a442 macro initialization
kono
parents: 31
diff changeset
3396 }
b35787d8a442 macro initialization
kono
parents: 31
diff changeset
3397
61
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents: 59
diff changeset
3398 static int
37
412ad2e6c2a2 struct copy
kono
parents: 36
diff changeset
3399 macro_args(char **pcheapp,char *maxcheap,char **pchptr)
28
c6994794f084 functional macro (imcomplete)
kono
parents: 25
diff changeset
3400 {
c6994794f084 functional macro (imcomplete)
kono
parents: 25
diff changeset
3401 int c;
c6994794f084 functional macro (imcomplete)
kono
parents: 25
diff changeset
3402 int in_quote = 0;
c6994794f084 functional macro (imcomplete)
kono
parents: 25
diff changeset
3403 int in_wquote = 0;
c6994794f084 functional macro (imcomplete)
kono
parents: 25
diff changeset
3404 int plevel = 0;
34
0756caa79167 macro function recursive and copy method
kono
parents: 33
diff changeset
3405 char *cheapp = *pcheapp;
0756caa79167 macro function recursive and copy method
kono
parents: 33
diff changeset
3406 char *chptr = *pchptr;
0756caa79167 macro function recursive and copy method
kono
parents: 33
diff changeset
3407 int args = list2((int)cheapp,0);
28
c6994794f084 functional macro (imcomplete)
kono
parents: 25
diff changeset
3408 for(;;) {
c6994794f084 functional macro (imcomplete)
kono
parents: 25
diff changeset
3409 *cheapp++ = c = *chptr++;
37
412ad2e6c2a2 struct copy
kono
parents: 36
diff changeset
3410 if (cheapp >= maxcheap) error(MCERR);
33
8500dbb69dd9 bad macro processing. give up this method.
kono
parents: 32
diff changeset
3411 if (!c) {
8500dbb69dd9 bad macro processing. give up this method.
kono
parents: 32
diff changeset
3412 chptr--;
8500dbb69dd9 bad macro processing. give up this method.
kono
parents: 32
diff changeset
3413 error(MCERR);
34
0756caa79167 macro function recursive and copy method
kono
parents: 33
diff changeset
3414 *pchptr = chptr;
0756caa79167 macro function recursive and copy method
kono
parents: 33
diff changeset
3415 *pcheapp = cheapp;
33
8500dbb69dd9 bad macro processing. give up this method.
kono
parents: 32
diff changeset
3416 return reverse0(args);
8500dbb69dd9 bad macro processing. give up this method.
kono
parents: 32
diff changeset
3417 }
28
c6994794f084 functional macro (imcomplete)
kono
parents: 25
diff changeset
3418 if (in_quote) {
c6994794f084 functional macro (imcomplete)
kono
parents: 25
diff changeset
3419 if (c=='\\') {
c6994794f084 functional macro (imcomplete)
kono
parents: 25
diff changeset
3420 if (*chptr != '\n') {
c6994794f084 functional macro (imcomplete)
kono
parents: 25
diff changeset
3421 *cheapp++ = *chptr++;
c6994794f084 functional macro (imcomplete)
kono
parents: 25
diff changeset
3422 } else {
c6994794f084 functional macro (imcomplete)
kono
parents: 25
diff changeset
3423 getline();
c6994794f084 functional macro (imcomplete)
kono
parents: 25
diff changeset
3424 }
c6994794f084 functional macro (imcomplete)
kono
parents: 25
diff changeset
3425 } else if (c=='\'') {
c6994794f084 functional macro (imcomplete)
kono
parents: 25
diff changeset
3426 in_quote = 0;
c6994794f084 functional macro (imcomplete)
kono
parents: 25
diff changeset
3427 }
c6994794f084 functional macro (imcomplete)
kono
parents: 25
diff changeset
3428 } else if (in_wquote) {
c6994794f084 functional macro (imcomplete)
kono
parents: 25
diff changeset
3429 if (c=='\\') {
c6994794f084 functional macro (imcomplete)
kono
parents: 25
diff changeset
3430 if (*chptr !='\n') {
c6994794f084 functional macro (imcomplete)
kono
parents: 25
diff changeset
3431 *cheapp++ = *chptr++;
c6994794f084 functional macro (imcomplete)
kono
parents: 25
diff changeset
3432 } else {
c6994794f084 functional macro (imcomplete)
kono
parents: 25
diff changeset
3433 *cheapp = '\n';
c6994794f084 functional macro (imcomplete)
kono
parents: 25
diff changeset
3434 getline();
c6994794f084 functional macro (imcomplete)
kono
parents: 25
diff changeset
3435 }
c6994794f084 functional macro (imcomplete)
kono
parents: 25
diff changeset
3436 } else if (c=='"') {
c6994794f084 functional macro (imcomplete)
kono
parents: 25
diff changeset
3437 in_wquote = 0;
c6994794f084 functional macro (imcomplete)
kono
parents: 25
diff changeset
3438 }
c6994794f084 functional macro (imcomplete)
kono
parents: 25
diff changeset
3439 } else if (c=='"') {
c6994794f084 functional macro (imcomplete)
kono
parents: 25
diff changeset
3440 in_wquote = 1;
c6994794f084 functional macro (imcomplete)
kono
parents: 25
diff changeset
3441 } else if (c=='\'') {
c6994794f084 functional macro (imcomplete)
kono
parents: 25
diff changeset
3442 in_quote = 1;
c6994794f084 functional macro (imcomplete)
kono
parents: 25
diff changeset
3443 } if (plevel==0) {
c6994794f084 functional macro (imcomplete)
kono
parents: 25
diff changeset
3444 if (c==',') {
c6994794f084 functional macro (imcomplete)
kono
parents: 25
diff changeset
3445 cheapp[-1] = 0;
34
0756caa79167 macro function recursive and copy method
kono
parents: 33
diff changeset
3446 args = list2((int)cheapp,args);
28
c6994794f084 functional macro (imcomplete)
kono
parents: 25
diff changeset
3447 } else if (c==')') {
c6994794f084 functional macro (imcomplete)
kono
parents: 25
diff changeset
3448 cheapp[-1] = 0;
c6994794f084 functional macro (imcomplete)
kono
parents: 25
diff changeset
3449 break;
c6994794f084 functional macro (imcomplete)
kono
parents: 25
diff changeset
3450 } else if (c=='(') {
c6994794f084 functional macro (imcomplete)
kono
parents: 25
diff changeset
3451 plevel++;
c6994794f084 functional macro (imcomplete)
kono
parents: 25
diff changeset
3452 } else if (c=='\\') {
c6994794f084 functional macro (imcomplete)
kono
parents: 25
diff changeset
3453 if (*chptr=='\n') {
c6994794f084 functional macro (imcomplete)
kono
parents: 25
diff changeset
3454 cheapp--;
c6994794f084 functional macro (imcomplete)
kono
parents: 25
diff changeset
3455 getline();
c6994794f084 functional macro (imcomplete)
kono
parents: 25
diff changeset
3456 }
c6994794f084 functional macro (imcomplete)
kono
parents: 25
diff changeset
3457 } else if (c==' '||c=='\t') {
c6994794f084 functional macro (imcomplete)
kono
parents: 25
diff changeset
3458 cheapp--;
c6994794f084 functional macro (imcomplete)
kono
parents: 25
diff changeset
3459 } else if (c=='\n') {
c6994794f084 functional macro (imcomplete)
kono
parents: 25
diff changeset
3460 cheapp--;
c6994794f084 functional macro (imcomplete)
kono
parents: 25
diff changeset
3461 getline();
34
0756caa79167 macro function recursive and copy method
kono
parents: 33
diff changeset
3462 chptr = *pchptr;
28
c6994794f084 functional macro (imcomplete)
kono
parents: 25
diff changeset
3463 }
c6994794f084 functional macro (imcomplete)
kono
parents: 25
diff changeset
3464 } else if (c==')') {
c6994794f084 functional macro (imcomplete)
kono
parents: 25
diff changeset
3465 plevel--;
c6994794f084 functional macro (imcomplete)
kono
parents: 25
diff changeset
3466 } else if (c=='\n') {
c6994794f084 functional macro (imcomplete)
kono
parents: 25
diff changeset
3467 cheapp--;
c6994794f084 functional macro (imcomplete)
kono
parents: 25
diff changeset
3468 getline();
34
0756caa79167 macro function recursive and copy method
kono
parents: 33
diff changeset
3469 chptr = *pchptr;
28
c6994794f084 functional macro (imcomplete)
kono
parents: 25
diff changeset
3470 }
c6994794f084 functional macro (imcomplete)
kono
parents: 25
diff changeset
3471 }
33
8500dbb69dd9 bad macro processing. give up this method.
kono
parents: 32
diff changeset
3472 ch = *chptr;
8500dbb69dd9 bad macro processing. give up this method.
kono
parents: 32
diff changeset
3473 if (ch) chptr++;
34
0756caa79167 macro function recursive and copy method
kono
parents: 33
diff changeset
3474 *pchptr = chptr;
0756caa79167 macro function recursive and copy method
kono
parents: 33
diff changeset
3475 *pcheapp = cheapp;
28
c6994794f084 functional macro (imcomplete)
kono
parents: 25
diff changeset
3476 return reverse0(args);
c6994794f084 functional macro (imcomplete)
kono
parents: 25
diff changeset
3477 }
c6994794f084 functional macro (imcomplete)
kono
parents: 25
diff changeset
3478
34
0756caa79167 macro function recursive and copy method
kono
parents: 33
diff changeset
3479 /* output macro expansion result into macrobuf (macropp) */
0756caa79167 macro function recursive and copy method
kono
parents: 33
diff changeset
3480
61
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents: 59
diff changeset
3481 static int
34
0756caa79167 macro function recursive and copy method
kono
parents: 33
diff changeset
3482 macro_function(int macrop,char **pchptr,NMTBL *nptr,int history)
28
c6994794f084 functional macro (imcomplete)
kono
parents: 25
diff changeset
3483 {
34
0756caa79167 macro function recursive and copy method
kono
parents: 33
diff changeset
3484 int args,sargs,values,evalues;
0756caa79167 macro function recursive and copy method
kono
parents: 33
diff changeset
3485 char *macro;
0756caa79167 macro function recursive and copy method
kono
parents: 33
diff changeset
3486
0756caa79167 macro function recursive and copy method
kono
parents: 33
diff changeset
3487 sargs = args = cadr(nptr->dsp);
37
412ad2e6c2a2 struct copy
kono
parents: 36
diff changeset
3488 values = macro_args(&macropp,macro_buf+MACROSIZE,pchptr);
34
0756caa79167 macro function recursive and copy method
kono
parents: 33
diff changeset
3489 evalues = 0;
0756caa79167 macro function recursive and copy method
kono
parents: 33
diff changeset
3490 while(values) {
0756caa79167 macro function recursive and copy method
kono
parents: 33
diff changeset
3491 evalues = list2(macro_eval(0,(char *)car(values),history),evalues);
28
c6994794f084 functional macro (imcomplete)
kono
parents: 25
diff changeset
3492 values = cadr(values);
c6994794f084 functional macro (imcomplete)
kono
parents: 25
diff changeset
3493 }
34
0756caa79167 macro function recursive and copy method
kono
parents: 33
diff changeset
3494 evalues = reverse0(evalues);
0756caa79167 macro function recursive and copy method
kono
parents: 33
diff changeset
3495 while(args) {
46
b1c8ac8c308d fix cascading struct retrun. Now it should be compatible with gcc
kono
parents: 45
diff changeset
3496 local_define((char *)car(args),mappend(reverse0(car(evalues))));
35
fd18d440f5ee macro function (works. but dirty. )
kono
parents: 34
diff changeset
3497 /* fprintf(stderr,"%s: %s => %s\n",nptr->nm,(char *)car(args),(char *)car(msearch0((char *)car(args))->dsp)); */
34
0756caa79167 macro function recursive and copy method
kono
parents: 33
diff changeset
3498 args = cadr(args);
0756caa79167 macro function recursive and copy method
kono
parents: 33
diff changeset
3499 evalues = cadr(evalues);
29
160e20394f80 macro function (imcomplete)
kono
parents: 28
diff changeset
3500 }
34
0756caa79167 macro function recursive and copy method
kono
parents: 33
diff changeset
3501 macro = (char *)car(nptr->dsp);
0756caa79167 macro function recursive and copy method
kono
parents: 33
diff changeset
3502 macrop = macro_eval(macrop,macro,list2((int)macro,history));
35
fd18d440f5ee macro function (works. but dirty. )
kono
parents: 34
diff changeset
3503 /* fprintf(stderr,"%s: result %s => %s\n",nptr->nm,macro,(char *)car(macrop)); */
34
0756caa79167 macro function recursive and copy method
kono
parents: 33
diff changeset
3504 args = sargs;
0756caa79167 macro function recursive and copy method
kono
parents: 33
diff changeset
3505 while(args) {
0756caa79167 macro function recursive and copy method
kono
parents: 33
diff changeset
3506 local_undef((char *)car(args));
0756caa79167 macro function recursive and copy method
kono
parents: 33
diff changeset
3507 args = cadr(args);
0756caa79167 macro function recursive and copy method
kono
parents: 33
diff changeset
3508 }
0756caa79167 macro function recursive and copy method
kono
parents: 33
diff changeset
3509 return macrop;
28
c6994794f084 functional macro (imcomplete)
kono
parents: 25
diff changeset
3510 }
c6994794f084 functional macro (imcomplete)
kono
parents: 25
diff changeset
3511
61
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents: 59
diff changeset
3512 static void
28
c6994794f084 functional macro (imcomplete)
kono
parents: 25
diff changeset
3513 local_define(char *macro,char *value)
c6994794f084 functional macro (imcomplete)
kono
parents: 25
diff changeset
3514 {
c6994794f084 functional macro (imcomplete)
kono
parents: 25
diff changeset
3515 NMTBL *nptr0;
30
20ed2786a276 still macro
kono
parents: 29
diff changeset
3516 nptr0 = msearch0(macro);
34
0756caa79167 macro function recursive and copy method
kono
parents: 33
diff changeset
3517 nptr0->ty=list3(nptr0->sc,nptr0->ty,nptr0->dsp);
29
160e20394f80 macro function (imcomplete)
kono
parents: 28
diff changeset
3518 nptr0->sc=MACRO;
160e20394f80 macro function (imcomplete)
kono
parents: 28
diff changeset
3519 nptr0->dsp=list2((int)value,0);
28
c6994794f084 functional macro (imcomplete)
kono
parents: 25
diff changeset
3520 }
c6994794f084 functional macro (imcomplete)
kono
parents: 25
diff changeset
3521
61
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents: 59
diff changeset
3522 static void
28
c6994794f084 functional macro (imcomplete)
kono
parents: 25
diff changeset
3523 local_undef(char *macro)
c6994794f084 functional macro (imcomplete)
kono
parents: 25
diff changeset
3524 {
c6994794f084 functional macro (imcomplete)
kono
parents: 25
diff changeset
3525 NMTBL *nptr0;
c6994794f084 functional macro (imcomplete)
kono
parents: 25
diff changeset
3526 int save;
30
20ed2786a276 still macro
kono
parents: 29
diff changeset
3527 nptr0 = msearch0(macro);
28
c6994794f084 functional macro (imcomplete)
kono
parents: 25
diff changeset
3528 save = nptr0->ty;
c6994794f084 functional macro (imcomplete)
kono
parents: 25
diff changeset
3529 nptr0->sc=car(save);
33
8500dbb69dd9 bad macro processing. give up this method.
kono
parents: 32
diff changeset
3530 nptr0->dsp=caddr(save);
8500dbb69dd9 bad macro processing. give up this method.
kono
parents: 32
diff changeset
3531 nptr0->ty=cadr(save);
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
3532 }
d35df41eac69 Initial revision
kono
parents:
diff changeset
3533
61
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents: 59
diff changeset
3534 static int
34
0756caa79167 macro function recursive and copy method
kono
parents: 33
diff changeset
3535 macro_eval(int macrop,char *body,int history)
0756caa79167 macro function recursive and copy method
kono
parents: 33
diff changeset
3536 {
0756caa79167 macro function recursive and copy method
kono
parents: 33
diff changeset
3537 int c;
0756caa79167 macro function recursive and copy method
kono
parents: 33
diff changeset
3538 int in_quote = 0;
0756caa79167 macro function recursive and copy method
kono
parents: 33
diff changeset
3539 int in_wquote = 0;
0756caa79167 macro function recursive and copy method
kono
parents: 33
diff changeset
3540 char *macro;
0756caa79167 macro function recursive and copy method
kono
parents: 33
diff changeset
3541 int i;
0756caa79167 macro function recursive and copy method
kono
parents: 33
diff changeset
3542 NMTBL *nptrm;
0756caa79167 macro function recursive and copy method
kono
parents: 33
diff changeset
3543 c = 1;
0756caa79167 macro function recursive and copy method
kono
parents: 33
diff changeset
3544 macrop = list2((int)macropp,macrop);
0756caa79167 macro function recursive and copy method
kono
parents: 33
diff changeset
3545 while(c && (*macropp++ = c = *body++)) {
37
412ad2e6c2a2 struct copy
kono
parents: 36
diff changeset
3546 if (macropp>macro_buf+MACROSIZE) error(STRERR);
34
0756caa79167 macro function recursive and copy method
kono
parents: 33
diff changeset
3547 if (in_quote) {
0756caa79167 macro function recursive and copy method
kono
parents: 33
diff changeset
3548 if (c=='\\') {
0756caa79167 macro function recursive and copy method
kono
parents: 33
diff changeset
3549 *macropp++ = c = *body++;
0756caa79167 macro function recursive and copy method
kono
parents: 33
diff changeset
3550 } else if (c=='\'') {
0756caa79167 macro function recursive and copy method
kono
parents: 33
diff changeset
3551 in_quote = 0;
0756caa79167 macro function recursive and copy method
kono
parents: 33
diff changeset
3552 }
0756caa79167 macro function recursive and copy method
kono
parents: 33
diff changeset
3553 } else if (in_wquote) {
0756caa79167 macro function recursive and copy method
kono
parents: 33
diff changeset
3554 if (c=='\\') {
0756caa79167 macro function recursive and copy method
kono
parents: 33
diff changeset
3555 *macropp++ = c = *body++;
0756caa79167 macro function recursive and copy method
kono
parents: 33
diff changeset
3556 } else if (c=='"') {
0756caa79167 macro function recursive and copy method
kono
parents: 33
diff changeset
3557 in_wquote = 0;
0756caa79167 macro function recursive and copy method
kono
parents: 33
diff changeset
3558 }
0756caa79167 macro function recursive and copy method
kono
parents: 33
diff changeset
3559 } else if (c=='"') {
0756caa79167 macro function recursive and copy method
kono
parents: 33
diff changeset
3560 in_wquote = 1;
0756caa79167 macro function recursive and copy method
kono
parents: 33
diff changeset
3561 } else if (c=='\'') {
0756caa79167 macro function recursive and copy method
kono
parents: 33
diff changeset
3562 in_quote = 1;
0756caa79167 macro function recursive and copy method
kono
parents: 33
diff changeset
3563 } else if (alpha(c)) {
0756caa79167 macro function recursive and copy method
kono
parents: 33
diff changeset
3564 macropp--;
0756caa79167 macro function recursive and copy method
kono
parents: 33
diff changeset
3565 for(i=0;alpha(c)||digit(c);i++) { namebuf[i] = c; c=*body++;}
0756caa79167 macro function recursive and copy method
kono
parents: 33
diff changeset
3566 namebuf[i]=0;
0756caa79167 macro function recursive and copy method
kono
parents: 33
diff changeset
3567 nptrm = msearch0(namebuf);
0756caa79167 macro function recursive and copy method
kono
parents: 33
diff changeset
3568 macro = (char *)car(nptrm->dsp);
0756caa79167 macro function recursive and copy method
kono
parents: 33
diff changeset
3569 if (nptrm->sc==MACRO) {
0756caa79167 macro function recursive and copy method
kono
parents: 33
diff changeset
3570 while((*macropp++ = *macro++));
0756caa79167 macro function recursive and copy method
kono
parents: 33
diff changeset
3571 macropp[-1]=c;
0756caa79167 macro function recursive and copy method
kono
parents: 33
diff changeset
3572 } else if (nptrm->sc==FMACRO) {
0756caa79167 macro function recursive and copy method
kono
parents: 33
diff changeset
3573 if(c!='(') error(MCERR);
0756caa79167 macro function recursive and copy method
kono
parents: 33
diff changeset
3574 *macropp++=0;
0756caa79167 macro function recursive and copy method
kono
parents: 33
diff changeset
3575 macrop = macro_function(macrop,&body,nptrm,
0756caa79167 macro function recursive and copy method
kono
parents: 33
diff changeset
3576 list2((int)macro,history));
0756caa79167 macro function recursive and copy method
kono
parents: 33
diff changeset
3577 macrop = list2((int)macropp,macrop);
0756caa79167 macro function recursive and copy method
kono
parents: 33
diff changeset
3578 } else {
0756caa79167 macro function recursive and copy method
kono
parents: 33
diff changeset
3579 macro = namebuf;
0756caa79167 macro function recursive and copy method
kono
parents: 33
diff changeset
3580 while((*macropp++ = *macro++));
0756caa79167 macro function recursive and copy method
kono
parents: 33
diff changeset
3581 macropp[-1]=c;
0756caa79167 macro function recursive and copy method
kono
parents: 33
diff changeset
3582 }
0756caa79167 macro function recursive and copy method
kono
parents: 33
diff changeset
3583 }
0756caa79167 macro function recursive and copy method
kono
parents: 33
diff changeset
3584 }
0756caa79167 macro function recursive and copy method
kono
parents: 33
diff changeset
3585 *macropp++=0;
0756caa79167 macro function recursive and copy method
kono
parents: 33
diff changeset
3586 return macrop;
0756caa79167 macro function recursive and copy method
kono
parents: 33
diff changeset
3587 }
0756caa79167 macro function recursive and copy method
kono
parents: 33
diff changeset
3588
0756caa79167 macro function recursive and copy method
kono
parents: 33
diff changeset
3589 int
81
f94ca1168520 float first try...
kono
parents: 80
diff changeset
3590 dlist2(int e1, double d1)
f94ca1168520 float first try...
kono
parents: 80
diff changeset
3591 {
f94ca1168520 float first try...
kono
parents: 80
diff changeset
3592 int e;
f94ca1168520 float first try...
kono
parents: 80
diff changeset
3593
f94ca1168520 float first try...
kono
parents: 80
diff changeset
3594 e=getfree((size_of_int+size_of_double)/size_of_int);
f94ca1168520 float first try...
kono
parents: 80
diff changeset
3595 heap[e]=e1;
f94ca1168520 float first try...
kono
parents: 80
diff changeset
3596 dcadr(e)=d1;
f94ca1168520 float first try...
kono
parents: 80
diff changeset
3597 return e;
f94ca1168520 float first try...
kono
parents: 80
diff changeset
3598 }
f94ca1168520 float first try...
kono
parents: 80
diff changeset
3599
f94ca1168520 float first try...
kono
parents: 80
diff changeset
3600 int
f94ca1168520 float first try...
kono
parents: 80
diff changeset
3601 dlist3(int e1, int e2,double d1)
f94ca1168520 float first try...
kono
parents: 80
diff changeset
3602 {
f94ca1168520 float first try...
kono
parents: 80
diff changeset
3603 int e;
f94ca1168520 float first try...
kono
parents: 80
diff changeset
3604
f94ca1168520 float first try...
kono
parents: 80
diff changeset
3605 e=getfree((size_of_int*2+size_of_double)/size_of_int);
f94ca1168520 float first try...
kono
parents: 80
diff changeset
3606 heap[e]=e1;
f94ca1168520 float first try...
kono
parents: 80
diff changeset
3607 heap[e+1]=e2;
f94ca1168520 float first try...
kono
parents: 80
diff changeset
3608 dcaddr(e)=d1;
f94ca1168520 float first try...
kono
parents: 80
diff changeset
3609 return e;
f94ca1168520 float first try...
kono
parents: 80
diff changeset
3610 }
f94ca1168520 float first try...
kono
parents: 80
diff changeset
3611
f94ca1168520 float first try...
kono
parents: 80
diff changeset
3612 int
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
3613 list2(int e1, int e2)
d35df41eac69 Initial revision
kono
parents:
diff changeset
3614 {
d35df41eac69 Initial revision
kono
parents:
diff changeset
3615 int e;
d35df41eac69 Initial revision
kono
parents:
diff changeset
3616
d35df41eac69 Initial revision
kono
parents:
diff changeset
3617 e=getfree(2);
d35df41eac69 Initial revision
kono
parents:
diff changeset
3618 heap[e]=e1;
d35df41eac69 Initial revision
kono
parents:
diff changeset
3619 heap[e+1]=e2;
d35df41eac69 Initial revision
kono
parents:
diff changeset
3620 return e;
d35df41eac69 Initial revision
kono
parents:
diff changeset
3621 }
d35df41eac69 Initial revision
kono
parents:
diff changeset
3622
d35df41eac69 Initial revision
kono
parents:
diff changeset
3623 int
d35df41eac69 Initial revision
kono
parents:
diff changeset
3624 list3(int e1, int e2, int e3)
d35df41eac69 Initial revision
kono
parents:
diff changeset
3625 {
d35df41eac69 Initial revision
kono
parents:
diff changeset
3626 int e;
d35df41eac69 Initial revision
kono
parents:
diff changeset
3627
d35df41eac69 Initial revision
kono
parents:
diff changeset
3628 e=getfree(3);
d35df41eac69 Initial revision
kono
parents:
diff changeset
3629 heap[e]=e1;
d35df41eac69 Initial revision
kono
parents:
diff changeset
3630 heap[e+1]=e2;
d35df41eac69 Initial revision
kono
parents:
diff changeset
3631 heap[e+2]=e3;
d35df41eac69 Initial revision
kono
parents:
diff changeset
3632 return e;
d35df41eac69 Initial revision
kono
parents:
diff changeset
3633 }
d35df41eac69 Initial revision
kono
parents:
diff changeset
3634
d35df41eac69 Initial revision
kono
parents:
diff changeset
3635 int
d35df41eac69 Initial revision
kono
parents:
diff changeset
3636 list4(int e1, int e2, int e3, int e4)
d35df41eac69 Initial revision
kono
parents:
diff changeset
3637 {
d35df41eac69 Initial revision
kono
parents:
diff changeset
3638 int e;
d35df41eac69 Initial revision
kono
parents:
diff changeset
3639
d35df41eac69 Initial revision
kono
parents:
diff changeset
3640 e=getfree(4);
d35df41eac69 Initial revision
kono
parents:
diff changeset
3641 heap[e]=e1;
d35df41eac69 Initial revision
kono
parents:
diff changeset
3642 heap[e+1]=e2;
d35df41eac69 Initial revision
kono
parents:
diff changeset
3643 heap[e+2]=e3;
d35df41eac69 Initial revision
kono
parents:
diff changeset
3644 heap[e+3]=e4;
d35df41eac69 Initial revision
kono
parents:
diff changeset
3645 return e;
d35df41eac69 Initial revision
kono
parents:
diff changeset
3646 }
d35df41eac69 Initial revision
kono
parents:
diff changeset
3647
61
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents: 59
diff changeset
3648 static int
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
3649 getfree(int n)
d35df41eac69 Initial revision
kono
parents:
diff changeset
3650 {
d35df41eac69 Initial revision
kono
parents:
diff changeset
3651 int e;
d35df41eac69 Initial revision
kono
parents:
diff changeset
3652
d35df41eac69 Initial revision
kono
parents:
diff changeset
3653 switch (mode) {
d35df41eac69 Initial revision
kono
parents:
diff changeset
3654 case GDECL: case GSDECL: case GUDECL: case GTDECL:
87
1738f313f98b floating point (at most) done.
kono
parents: 86
diff changeset
3655 case MDECL: case ADECL: case LSDECL: case LUDECL:
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
3656 e=gfree;
d35df41eac69 Initial revision
kono
parents:
diff changeset
3657 gfree+=n;
d35df41eac69 Initial revision
kono
parents:
diff changeset
3658 break;
d35df41eac69 Initial revision
kono
parents:
diff changeset
3659 default:
d35df41eac69 Initial revision
kono
parents:
diff changeset
3660 lfree-=n;
d35df41eac69 Initial revision
kono
parents:
diff changeset
3661 e=lfree;
d35df41eac69 Initial revision
kono
parents:
diff changeset
3662 }
d35df41eac69 Initial revision
kono
parents:
diff changeset
3663 if(lfree<gfree) error(HPERR);
d35df41eac69 Initial revision
kono
parents:
diff changeset
3664 return e;
d35df41eac69 Initial revision
kono
parents:
diff changeset
3665 }
d35df41eac69 Initial revision
kono
parents:
diff changeset
3666
d35df41eac69 Initial revision
kono
parents:
diff changeset
3667 int
33
8500dbb69dd9 bad macro processing. give up this method.
kono
parents: 32
diff changeset
3668 glist2(int e1,int e2)
8500dbb69dd9 bad macro processing. give up this method.
kono
parents: 32
diff changeset
3669 {
8500dbb69dd9 bad macro processing. give up this method.
kono
parents: 32
diff changeset
3670 int smode,ret;
8500dbb69dd9 bad macro processing. give up this method.
kono
parents: 32
diff changeset
3671 smode = mode;
8500dbb69dd9 bad macro processing. give up this method.
kono
parents: 32
diff changeset
3672 mode = GDECL;
8500dbb69dd9 bad macro processing. give up this method.
kono
parents: 32
diff changeset
3673 ret = list2(e1,e2);
8500dbb69dd9 bad macro processing. give up this method.
kono
parents: 32
diff changeset
3674 mode = smode;
8500dbb69dd9 bad macro processing. give up this method.
kono
parents: 32
diff changeset
3675 return ret;
8500dbb69dd9 bad macro processing. give up this method.
kono
parents: 32
diff changeset
3676 }
8500dbb69dd9 bad macro processing. give up this method.
kono
parents: 32
diff changeset
3677
8500dbb69dd9 bad macro processing. give up this method.
kono
parents: 32
diff changeset
3678 int
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
3679 rplacad(int e, int n)
d35df41eac69 Initial revision
kono
parents:
diff changeset
3680 {
d35df41eac69 Initial revision
kono
parents:
diff changeset
3681 heap[e+1]=n;
d35df41eac69 Initial revision
kono
parents:
diff changeset
3682 return e;
d35df41eac69 Initial revision
kono
parents:
diff changeset
3683 }
d35df41eac69 Initial revision
kono
parents:
diff changeset
3684
d35df41eac69 Initial revision
kono
parents:
diff changeset
3685 int
d35df41eac69 Initial revision
kono
parents:
diff changeset
3686 rplacadd(int e, int n)
d35df41eac69 Initial revision
kono
parents:
diff changeset
3687 {
d35df41eac69 Initial revision
kono
parents:
diff changeset
3688 heap[e+2]=n;
d35df41eac69 Initial revision
kono
parents:
diff changeset
3689 return e;
d35df41eac69 Initial revision
kono
parents:
diff changeset
3690 }
d35df41eac69 Initial revision
kono
parents:
diff changeset
3691
46
b1c8ac8c308d fix cascading struct retrun. Now it should be compatible with gcc
kono
parents: 45
diff changeset
3692 int
55
94564b45c4f3 all save implementation of parallel assignment
kono
parents: 53
diff changeset
3693 append4(int p,int a1,int a2,int a3)
94564b45c4f3 all save implementation of parallel assignment
kono
parents: 53
diff changeset
3694 {
94564b45c4f3 all save implementation of parallel assignment
kono
parents: 53
diff changeset
3695 int p1;
94564b45c4f3 all save implementation of parallel assignment
kono
parents: 53
diff changeset
3696 if(!p) return list4(a1,0,a2,a3);
94564b45c4f3 all save implementation of parallel assignment
kono
parents: 53
diff changeset
3697 p1=p;
94564b45c4f3 all save implementation of parallel assignment
kono
parents: 53
diff changeset
3698 while(cadr(p)) p = cadr(p);
94564b45c4f3 all save implementation of parallel assignment
kono
parents: 53
diff changeset
3699 rplacad(p,list4(a1,0,a2,a3));
94564b45c4f3 all save implementation of parallel assignment
kono
parents: 53
diff changeset
3700 return p1;
94564b45c4f3 all save implementation of parallel assignment
kono
parents: 53
diff changeset
3701 }
94564b45c4f3 all save implementation of parallel assignment
kono
parents: 53
diff changeset
3702
94564b45c4f3 all save implementation of parallel assignment
kono
parents: 53
diff changeset
3703 int
46
b1c8ac8c308d fix cascading struct retrun. Now it should be compatible with gcc
kono
parents: 45
diff changeset
3704 append3(int p,int a1,int a2)
b1c8ac8c308d fix cascading struct retrun. Now it should be compatible with gcc
kono
parents: 45
diff changeset
3705 {
b1c8ac8c308d fix cascading struct retrun. Now it should be compatible with gcc
kono
parents: 45
diff changeset
3706 int p1;
b1c8ac8c308d fix cascading struct retrun. Now it should be compatible with gcc
kono
parents: 45
diff changeset
3707 if(!p) return list3(a1,0,a2);
b1c8ac8c308d fix cascading struct retrun. Now it should be compatible with gcc
kono
parents: 45
diff changeset
3708 p1=p;
b1c8ac8c308d fix cascading struct retrun. Now it should be compatible with gcc
kono
parents: 45
diff changeset
3709 while(cadr(p)) p = cadr(p);
b1c8ac8c308d fix cascading struct retrun. Now it should be compatible with gcc
kono
parents: 45
diff changeset
3710 rplacad(p,list3(a1,0,a2));
b1c8ac8c308d fix cascading struct retrun. Now it should be compatible with gcc
kono
parents: 45
diff changeset
3711 return p1;
b1c8ac8c308d fix cascading struct retrun. Now it should be compatible with gcc
kono
parents: 45
diff changeset
3712 }
b1c8ac8c308d fix cascading struct retrun. Now it should be compatible with gcc
kono
parents: 45
diff changeset
3713
61
8ffb8ca3fe34 separation of architecture dependent part.
kono
parents: 59
diff changeset
3714 static char *
46
b1c8ac8c308d fix cascading struct retrun. Now it should be compatible with gcc
kono
parents: 45
diff changeset
3715 mappend(int lists)
34
0756caa79167 macro function recursive and copy method
kono
parents: 33
diff changeset
3716 {
0756caa79167 macro function recursive and copy method
kono
parents: 33
diff changeset
3717 char *p;
0756caa79167 macro function recursive and copy method
kono
parents: 33
diff changeset
3718 char *result = macropp;
0756caa79167 macro function recursive and copy method
kono
parents: 33
diff changeset
3719 while(lists) {
37
412ad2e6c2a2 struct copy
kono
parents: 36
diff changeset
3720 if (macropp>macro_buf+MACROSIZE) error(STRERR);
34
0756caa79167 macro function recursive and copy method
kono
parents: 33
diff changeset
3721 p = (char *)car(lists);
35
fd18d440f5ee macro function (works. but dirty. )
kono
parents: 34
diff changeset
3722 while((*macropp++=*p++)) if (p[-1]=='\n') macropp[-1]=' ';
34
0756caa79167 macro function recursive and copy method
kono
parents: 33
diff changeset
3723 macropp--;
0756caa79167 macro function recursive and copy method
kono
parents: 33
diff changeset
3724 lists = cadr(lists);
0756caa79167 macro function recursive and copy method
kono
parents: 33
diff changeset
3725 }
0756caa79167 macro function recursive and copy method
kono
parents: 33
diff changeset
3726 macropp++;
0756caa79167 macro function recursive and copy method
kono
parents: 33
diff changeset
3727 return result;
0756caa79167 macro function recursive and copy method
kono
parents: 33
diff changeset
3728 }
7
e2c2c0fe0785 function type definition should be in global heap
kono
parents: 6
diff changeset
3729
18
df7fa8cee67b pass -Wall
kono
parents: 16
diff changeset
3730 void
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
3731 display_ntable(NMTBL *n, char *s)
d35df41eac69 Initial revision
kono
parents:
diff changeset
3732 {
18
df7fa8cee67b pass -Wall
kono
parents: 16
diff changeset
3733 fprintf(stderr,"\n%s %0x %0x ",s,(int)n,(int)ntable);
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
3734 fprintf(stderr,"nptr->sc %d ",n->sc);
d35df41eac69 Initial revision
kono
parents:
diff changeset
3735 fprintf(stderr,"nptr->dsp %d ",n->dsp);
d35df41eac69 Initial revision
kono
parents:
diff changeset
3736 fprintf(stderr,"nptr->ty %d ",n->ty);
d35df41eac69 Initial revision
kono
parents:
diff changeset
3737 fprintf(stderr,"nptr->nm %s\n",n->nm);
d35df41eac69 Initial revision
kono
parents:
diff changeset
3738 }
d35df41eac69 Initial revision
kono
parents:
diff changeset
3739
40
060d1e549fec *** empty log message ***
kono
parents: 39
diff changeset
3740 int c0(int d) { fprintf(stderr,"heap[%d]=",d);return car(d); }
060d1e549fec *** empty log message ***
kono
parents: 39
diff changeset
3741 int c1(int d) { fprintf(stderr,"heap[%d]=",d);return cadr(d); }
060d1e549fec *** empty log message ***
kono
parents: 39
diff changeset
3742 int c2(int d) { fprintf(stderr,"heap[%d]=",d);return caddr(d); }
060d1e549fec *** empty log message ***
kono
parents: 39
diff changeset
3743 int c3(int d) { fprintf(stderr,"heap[%d]=",d);return cadddr(d); }
060d1e549fec *** empty log message ***
kono
parents: 39
diff changeset
3744 char *cc0(int d) { fprintf(stderr,"heap[%d]=",d);return (char *)car(d); }
060d1e549fec *** empty log message ***
kono
parents: 39
diff changeset
3745 char *cc1(int d) { fprintf(stderr,"heap[%d]=",d);return (char *)cadr(d); }
060d1e549fec *** empty log message ***
kono
parents: 39
diff changeset
3746 char *cc2(int d) { fprintf(stderr,"heap[%d]=",d);return (char *)caddr(d); }
060d1e549fec *** empty log message ***
kono
parents: 39
diff changeset
3747 char *cc3(int d) { fprintf(stderr,"heap[%d]=",d);return (char *)cadddr(d); }
37
412ad2e6c2a2 struct copy
kono
parents: 36
diff changeset
3748
0
d35df41eac69 Initial revision
kono
parents:
diff changeset
3749 /* end */