1 /*
2  *      Small C+ Compiler
3  *
4  *      The master header file
5  *      Includes everything else!!!
6  *
7  *      $Id: ccdefs.h,v 1.5 2016-08-26 05:44:47 aralbrec Exp $
8  */
9 
10 
11 #ifndef CCDEFS_H
12 #define CCDEFS_H
13 
14 #include <sys/types.h>
15 #include <stdint.h>
16 #include <string.h>
17 #include <stdio.h>
18 #include <ctype.h>
19 #include <math.h>
20 
21 typedef long double zdouble;
22 
23 #include "define.h"
24 
25 /*
26  * 	Now the fix for HP-UX
27  *	Darn short filename filesystems!
28  */
29 
30 #ifdef hpux
31 #define FILENAME_LEN 1024
32 #else
33 #define FILENAME_LEN FILENAME_MAX
34 #endif
35 
36 
37 /*
38  *      Now some system files for good luck
39  */
40 
41 #include <stdio.h>
42 #include <stdlib.h>
43 #include <string.h>
44 #include <ctype.h>
45 
46 /*
47  *      Prototypes
48  */
49 
50 extern void     callfunction(SYMBOL *ptr, Type *func_ptr_call_type);
51 
52 
53 /* cdbfile.c */
54 extern void     debug_write_module();
55 extern void     debug_write_symbol(SYMBOL *sym);
56 extern void     debug_write_type(Type *type);
57 
58 #include "codegen.h"
59 
60 extern void gen_comment(const char *comment);
61 extern void gen_file_header(void);
62 extern void gen_file_footer(void);
63 extern void gen_switch_section(const char *section_name);
64 
65 
66 extern void gen_store_to_tos(Kind typeobj);
67 extern void gen_conv_uint2char(void);
68 extern void gen_conv_sint2char(void);
69 extern void gen_conv_uint2long(void);
70 extern void gen_conv_sint2long(void);
71 extern void gen_conv_carry2int(void);
72 extern void gen_call(int nargs_count, const char *name, SYMBOL *sym);
73 
74 extern void gen_intrinsic_in(SYMBOL *sym);
75 extern void gen_intrinsic_out(SYMBOL *sym);
76 
77 extern void gen_swap_float(Kind float_type);
78 extern void gen_pop_frame(void);
79 extern void gen_push_frame(void);
80 extern void gen_push_float(Kind typeToPush);
81 extern void gen_push_primary(LVALUE *lval);
82 
83 extern int zinterruptoffset(SYMBOL *sym);
84 extern void gen_interrupt_enter(SYMBOL *func);
85 extern void gen_interrupt_leave(SYMBOL *func);
86 
87 extern void gen_critical_enter(void);
88 extern void gen_critical_leave(void);
89 extern void gen_shortcall(Type *functype, int rst, int value);
90 extern void gen_bankedcall(SYMBOL *sym);
91 extern void gen_hl_call(Type *functype, int module, int address);
92 extern void gen_emit_line(int);
93 
94 extern void gen_load_indirect(LVALUE *lval);
95 extern void gen_load_static(SYMBOL *sym);
96 extern void gen_store_static(SYMBOL *sym);
97 extern void gen_load_constant_as_float(double value, Kind to, unsigned char isunsigned);
98 extern void gen_leave_function(Kind save,char type, int incritical);
99 extern int gen_push_function_argument(Kind expr, Type *type, int push_sdccchar);
100 extern void gen_switch_preamble(Kind kind);
101 extern void gen_switch_case(Kind kind, int64_t value, int label);
102 extern void gen_switch_postamble(Kind kind);
103 extern void gen_jp_label(int label);
104 extern void gen_save_pointer(LVALUE *lval);
105 
106 extern int gen_restore_frame_after_call(int offset, Kind save, int saveaf, int usebc);
107 
108 extern void opjump(char *, int);
109 extern void testjump(LVALUE *,int label);
110 extern void zerojump(void (*oper)(LVALUE *,int), int label, LVALUE *lval);
111 
112 extern void zadd_const(LVALUE *lval, int64_t value);
113 extern void zadd(LVALUE *);
114 extern void zsub(LVALUE *);
115 extern void mult(LVALUE *);
116 extern void mult_const(LVALUE *lval, int64_t value);
117 extern int mult_dconst(LVALUE *lval, double value, int isrhs);
118 extern void zdiv(LVALUE *);
119 extern void zdiv_const(LVALUE *lval, int64_t value);
120 extern int zdiv_dconst(LVALUE *lval, double value, int isrhs);
121 extern void zmod(LVALUE *);
122 extern void zmod_const(LVALUE *lval, int64_t value);
123 extern void zor(LVALUE *);
124 extern void zor_const(LVALUE *lval, int64_t value);
125 extern void zxor(LVALUE *);
126 extern void zxor_const(LVALUE *lval, int64_t value);
127 extern void zand(LVALUE *);
128 extern void zand_const(LVALUE *lval, int64_t value);
129 extern void asr(LVALUE *);
130 extern void asr_const(LVALUE *lval, int64_t value);
131 extern void asl(LVALUE *);
132 extern void asl_const(LVALUE *lval, int64_t value);
133 extern void lneg(LVALUE *);
134 extern void neg(LVALUE *);
135 extern void com(LVALUE *);
136 extern void inc(LVALUE *);
137 extern void dec(LVALUE *);
138 extern void zeq(LVALUE *);
139 extern void zeq_const(LVALUE *m, int64_t value);
140 extern void eq0(LVALUE *,int label);
141 extern void zne(LVALUE *);
142 extern void zne_const(LVALUE *, int64_t value);
143 extern void zlt(LVALUE *);
144 extern void zlt_const(LVALUE *, int64_t value);
145 extern void zle(LVALUE *);
146 extern void zle_const(LVALUE *, int64_t value);
147 extern void zgt(LVALUE *);
148 extern void zgt_const(LVALUE *, int64_t value);
149 extern void zge(LVALUE *);
150 extern void zge_const(LVALUE *, int64_t value);
151 extern void dummy(LVALUE *);
152 
153 
154 extern void copy_to_stack(char *label, int stack_offset,  int size);
155 extern void copy_to_extern(const char *src, const char *dest, int size);
156 extern void gen_builtin_strcpy();
157 extern void gen_builtin_strchr(int32_t c);
158 extern void gen_builtin_memset(int32_t c, int32_t s);
159 extern void gen_builtin_memcpy(int32_t src, int32_t n);
160 
161 extern void zconvert_to_long(unsigned char tounsigned, Kind from, unsigned char fromunsigned);
162 extern void zconvert_to_llong(unsigned char tounsigned, Kind from, unsigned char fromunsigned);
163 
164 
165 /* const.c */
166 extern int        constant(LVALUE *lval);
167 
168 extern void       address(SYMBOL *ptr);
169 
170 extern int        storeq(int length, unsigned char *queue,int32_t *val);
171 extern int        qstr(double *val);
172 extern void       stowlit(int value, int size);
173 extern unsigned char litchar(void);
174 extern void       size_of(LVALUE *lval);
175 extern void       offset_of(LVALUE *lval);
176 extern void       load_double_into_fa(LVALUE *lval);
177 extern void       load_llong_into_acc(zdouble val);
178 extern void       write_constant_queue(void);
179 extern void       indicate_constant_written(int litlab);
180 
181 extern void       dofloat(enum maths_mode mode, double raw, unsigned char fa[]);
182 #include "data.h"
183 
184 /* declinit.c */
185 extern int        initials(const char *dropname, Type *type);
186 extern int        str_init(Type *tag);
187 
188 extern void       array_free(array *arr);
189 extern size_t     array_len(array *arr);
190 extern void       array_add(array *arr, void *elem);
191 extern void      *array_get_byindex(array *arr, int index);
192 extern Type      *find_tag(const char *name);
193 extern Type      *find_tag_field(Type *tag, const char *fieldname);
194 extern Type      *parse_expr_type();
195 extern Type      *default_function(const char *name);
196 extern Type      *default_function_with_type(const char *name, Type *return_type);
197 extern Type     *asm_function(const char *name);
198 extern Type      *make_pointer(Type *base_type);
199 extern Type      *dodeclare(enum storage_type storage);
200 extern int        declare_local(int local_static);
201 extern void       declare_func_kr();
202 extern int        ispointer(Type *type);
203 extern void       type_describe(Type *type, UT_string *output);
204 extern int        type_matches(Type *t1, Type *t2);
205 extern void       parse_addressmod(void);
206 extern namespace *get_namespace(const char *name);
207 extern void       check_pointer_namespace(Type *lhs, Type *rhs);
208 extern int        isutype(Type *type);
209 
210 /* error.c */
211 extern int        endst(void);
212 extern void       illname(char *sname);
213 extern void       multidef(const char *sname);
214 extern void       needtoken(char *str);
215 extern void       needchar(char c);
216 extern void       needlval(void);
217 extern void       warningfmt(const char *category,const char *fmt, ...);
218 extern void       debug(int num,char *str,...);
219 extern void       errorfmt(const char *fmt, int fatal, ...);
220 extern void       parse_warning_option(const char *value);
221 
222 /* expr.c */
223 extern Kind       expression(int *con, zdouble *val, Type **type);
224 extern int        heir1(LVALUE *lval);
225 extern int        heira(LVALUE *lval);
226 
227 
228 /* goto.c */
229 extern GOTO_TAB *gotoq; /* Pointer for gotoq */
230 extern int      dolabel(void);
231 extern void     dogoto(void);
232 extern void     goto_cleanup(void);
233 
234 #include "io.h"
235 extern void     discardbuffer(t_buffer *buf);
236 
237 /* lex.c */
238 extern int      streq(char str1[], char str2[]);
239 extern int      astreq(char *str1, char *str2);
240 extern int      match(char *lit);
241 extern int      cmatch(char lit);
242 extern int      acmatch(char lit);
243 extern int      rmatch2(char* lit);
244 extern int      rcmatch(char lit);
245 extern int      amatch(char *lit);
246 extern int      swallow(char *lit);
247 extern int      checkws();
248 
249 
250 
251 /* main.c */
252 extern void     ccabort(void);
253 extern void     dumplits(int size, int pr_label, int queueptr, int queuelab, unsigned char *queue);
254 extern int      dumpzero(int size, int count);
255 extern void     openin(void);
256 extern void     newfile(void);
257 extern void     doinclude(void);
258 extern void     endinclude(void);
259 extern void     closeout(void);
260 extern void     WriteDefined(char *sname, int value);
261 
262 extern int      c_notaltreg;
263 extern int      c_cline_directive;
264 extern int      c_cpu;
265 extern int      c_fp_mantissa_bytes;
266 extern int      c_fp_exponent_bias;
267 extern int      c_old_diagnostic_fmt;
268 
269 
270 #include "misc.h"
271 
272 /* plunge.c */
273 extern int      skim(char *opstr, void (*testfuncz)(LVALUE* lval, int label), void (*testfuncq)(int label), int dropval, int endval, int (*heir)(LVALUE* lval), LVALUE *lval);
274 extern void     dropout(int k, void (*testfuncz)(LVALUE* lval, int label), void (*testfuncq)(int label), int exit1, LVALUE *lval);
275 extern int      plnge1(int (*heir)(LVALUE* lval), LVALUE *lval);
276 extern void     plnge2a(int (*heir)(LVALUE* lval), LVALUE *lval, LVALUE *lval2, void (*oper)(LVALUE *lval), void (*doper)(LVALUE *lval), void (*constoper)(LVALUE *lval, int64_t constval), int (*dconstoper)(LVALUE *lval, double const_val, int isrhs));
277 extern void     plnge2b(int (*heir)(LVALUE* lval), LVALUE *lval, LVALUE *lval2, void (*oper)(LVALUE *lval));
278 extern void     load_constant(LVALUE *lval);
279 
280 /* preproc.c */
281 extern void     junk(void);
282 extern char     ch(void);
283 extern char     nch(void);
284 extern char     gch(void);
285 extern void     clear(void);
286 extern char     inbyte(void);
287 extern void     vinline(void);
288 extern void     preprocess(void);
289 extern void     addmac(void);
290 extern void     delmac(void);
291 extern char     putmac(char c);
292 extern void     defmac(char *text);
293 extern void     set_temporary_input(FILE *temp);
294 extern void     restore_input(void);
295 extern void     push_buffer_fp(FILE *fp);
296 extern void     pop_buffer_fp(void);
297 
298 /* primary.c */
299 extern int      primary(LVALUE *lval);
300 extern zdouble  calc(Kind left_kind, zdouble left, void (*oper)(LVALUE *), Kind right_kind, zdouble right, int is16bit);
301 extern zdouble  calcun(Kind left_kind, zdouble left, void (*oper)(LVALUE *), Kind right_kind, zdouble right);
302 extern int      intcheck(LVALUE *lval, LVALUE *lval2);
303 extern void     force(Kind to, Kind from, char to_sign, char from_sign, int lconst);
304 extern int      widen_if_float(LVALUE *lval, LVALUE *lval2, int operator_is_commutative);
305 extern void     widenintegers(LVALUE *lval, LVALUE *lval2);
306 extern int      dbltest(LVALUE *lval, LVALUE *lval2);
307 extern void     result(LVALUE *lval, LVALUE *lval2);
308 extern void     prestep(LVALUE *lval, int n, void (*step)(LVALUE *lval));
309 extern void     poststep(int k, LVALUE *lval, int n, void (*step)(LVALUE *lval), void (*unstep)(LVALUE *lval));
310 extern void     smartpush(LVALUE *lval, char *before);
311 extern void     smartstore(LVALUE *lval);
312 extern void     rvaluest(LVALUE *lval);
313 extern void     rvalue(LVALUE *lval);
314 extern int      test(int label, int parens);
315 extern int      constexpr(double *val, Kind *valtype, int flag);
316 extern void     cscale(Type *type, int *val);
317 extern int      docast(LVALUE *lval,LVALUE *dest_lval);
318 extern void     convert_int_to_double(char type, char zunsign);
319 extern int      ulvalue(LVALUE *lval);
320 extern int      check_lastop_was_testjump(LVALUE *lval);
321 extern int      check_range(LVALUE *lval, int32_t min_value, int32_t max_value) ;
322 extern void     check_assign_range(Type *type, double const_value);
323 
324 /* stmt.c */
325 extern int      statement(void);
326 extern void     gen_leave_function(Kind save,char type, int incritical);
327 extern void     doasm(void);
328 extern void     dopragma(void);
329 extern void     doasmfunc(char wantbr);
330 
331 
332 /* sym.c */
333 extern SYMBOL  *findstc(char *sname);
334 extern SYMBOL  *findglb(const char *sname);
335 extern SYMBOL  *findloc(char *sname);
336 extern SYMBOL  *addglb(char *sname, Type *type, enum ident_type id, Kind kind, int value, enum storage_type storage);
337 extern SYMBOL  *addloc(char *sname, Type *type, enum ident_type id, Kind kind, int where);
338 
339 /* while.c */
340 extern void     addwhile(WHILE_TAB *ptr);
341 extern void     delwhile(void);
342 extern WHILE_TAB *readwhile(WHILE_TAB *ptr);
343 #endif
344