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