| 1 | // This file is part of SmallBASIC | 
|---|
| 2 | // | 
|---|
| 3 | // COMPILER/EXECUTOR/IDE COMMON DEFS | 
|---|
| 4 | // | 
|---|
| 5 | // This program is distributed under the terms of the GPL v2.0 or later | 
|---|
| 6 | // Download the GNU Public License (GPL) from www.gnu.org | 
|---|
| 7 | // | 
|---|
| 8 | // Copyright(C) 2000 Nicholas Christopoulos | 
|---|
| 9 |  | 
|---|
| 10 | #if !defined(_smbas_h) | 
|---|
| 11 | #define _smbas_h | 
|---|
| 12 |  | 
|---|
| 13 | #include "common/sys.h" | 
|---|
| 14 | #include "common/var.h" | 
|---|
| 15 | #include "common/kw.h" | 
|---|
| 16 | #include "common/scan.h" | 
|---|
| 17 |  | 
|---|
| 18 | #if defined(__cplusplus) | 
|---|
| 19 | extern "C"{ | 
|---|
| 20 | #endif | 
|---|
| 21 |  | 
|---|
| 22 | /** | 
|---|
| 23 | * @ingroup exec | 
|---|
| 24 | * | 
|---|
| 25 | * @typedef bc_head_t | 
|---|
| 26 | * byte-code header | 
|---|
| 27 | */ | 
|---|
| 28 | typedef struct { | 
|---|
| 29 | char sign[4]; /**< always "SBEx" */ | 
|---|
| 30 | uint32_t ver; /**< version of this structure */ | 
|---|
| 31 | uint32_t sbver; /**< version of SB */ | 
|---|
| 32 | uint32_t flags; /**< flags | 
|---|
| 33 | b0 = Big-endian CPU | 
|---|
| 34 | b1 = BC 16bit | 
|---|
| 35 | b2 = BC 32bit */ | 
|---|
| 36 |  | 
|---|
| 37 | uint32_t size; /**< total size (include label-table and bc) */ | 
|---|
| 38 | uint32_t bc_count; /**< BC length */ | 
|---|
| 39 | uint32_t var_count; /**< number of variables */ | 
|---|
| 40 | uint32_t lab_count; /**< number of labels */ | 
|---|
| 41 | uint32_t data_ip; /**< default DATA position */ | 
|---|
| 42 |  | 
|---|
| 43 | // ver 2 | 
|---|
| 44 | uint32_t lib_count; /**< libraries count (needed units) */ | 
|---|
| 45 | uint32_t sym_count; /**< symbol count (linked-symbols) */ | 
|---|
| 46 | } bc_head_t; | 
|---|
| 47 |  | 
|---|
| 48 | /** | 
|---|
| 49 | * @ingroup exec | 
|---|
| 50 | * | 
|---|
| 51 | * @typedef bc_unit_rec_t | 
|---|
| 52 | * byte-code linked-unit record | 
|---|
| 53 | */ | 
|---|
| 54 | typedef struct { | 
|---|
| 55 | char lib[OS_FILENAME_SIZE + 1]; /**< library name */ | 
|---|
| 56 | char alias[OS_FILENAME_SIZE + 1]; /**< library name alias */ | 
|---|
| 57 | int  type; /**< library type (unit, c-module) */ | 
|---|
| 58 | int id; /**< lib-id in this byte-code */ | 
|---|
| 59 | int tid; /**< task id (updated on loading) */ | 
|---|
| 60 | } bc_lib_rec_t; | 
|---|
| 61 |  | 
|---|
| 62 | typedef struct { | 
|---|
| 63 | int count; | 
|---|
| 64 | bc_lib_rec_t **elem; | 
|---|
| 65 | } bc_lib_rec_table_t; | 
|---|
| 66 |  | 
|---|
| 67 | /** | 
|---|
| 68 | * @ingroup exec | 
|---|
| 69 | * | 
|---|
| 70 | * @typedef bc_symbol_rec_t | 
|---|
| 71 | * byte-code linked-symbol record | 
|---|
| 72 | */ | 
|---|
| 73 | typedef struct { | 
|---|
| 74 | char symbol[SB_KEYWORD_SIZE + 1]; /**< symbol name */ | 
|---|
| 75 | int type; /**< symbol type */ | 
|---|
| 76 | int lib_id; /**< lib-id in this byte-code */ | 
|---|
| 77 | int sym_id; /**< symbol-id in this byte-code */ | 
|---|
| 78 | int var_id; /**< related variable-id in this byte-code */ | 
|---|
| 79 | int task_id; /**< task id which library is loaded (updated on loading) */ | 
|---|
| 80 | int exp_idx; /**< export symbol-index in librarys space (updated on loading) */ | 
|---|
| 81 | } bc_symbol_rec_t; | 
|---|
| 82 |  | 
|---|
| 83 | typedef struct { | 
|---|
| 84 | int count; | 
|---|
| 85 | bc_symbol_rec_t **elem; | 
|---|
| 86 | } bc_symbol_rec_table_t; | 
|---|
| 87 |  | 
|---|
| 88 | #define BRUN_RUNNING    0       /**< brun_status(), the program is still running  @ingroup exec */ | 
|---|
| 89 | #define BRUN_STOPPED    1       /**< brun_status(), an error or 'break' has already stoped the program @ingroup exec */ | 
|---|
| 90 |  | 
|---|
| 91 | /* | 
|---|
| 92 | * compiler options | 
|---|
| 93 | */ | 
|---|
| 94 | #if defined(BRUN_MODULE) | 
|---|
| 95 | #define EXTERN | 
|---|
| 96 | #else | 
|---|
| 97 | #define EXTERN  extern | 
|---|
| 98 | #endif | 
|---|
| 99 |  | 
|---|
| 100 | #define OPT_CMD_SZ  1024 | 
|---|
| 101 | #define OPT_MOD_SZ  1024 | 
|---|
| 102 |  | 
|---|
| 103 | EXTERN byte opt_graphics; /**< command-line option: start in graphics mode   */ | 
|---|
| 104 | EXTERN byte opt_quiet; /**< command-line option: quiet                       */ | 
|---|
| 105 | EXTERN char opt_command[OPT_CMD_SZ]; /**< command-line parameters (COMMAND$) */ | 
|---|
| 106 | EXTERN int opt_base; /**< OPTION BASE x                                      */ | 
|---|
| 107 | EXTERN byte opt_loadmod; /**< load all modules                               */ | 
|---|
| 108 | EXTERN char opt_modpath[OPT_MOD_SZ]; /**< Modules path                       */ | 
|---|
| 109 | EXTERN int opt_verbose; /**< print some additional infos                     */ | 
|---|
| 110 | EXTERN int opt_ide; /**< 0=no IDE, 1=IDE is linked, 2=IDE is external exe)   */ | 
|---|
| 111 | EXTERN byte os_charset; /**< use charset encoding                            */ | 
|---|
| 112 | EXTERN int opt_pref_width; /**< prefered graphics mode width (0 = undefined) */ | 
|---|
| 113 | EXTERN int opt_pref_height; /**< prefered graphics mode height               */ | 
|---|
| 114 | EXTERN byte opt_nosave; /**< do not create .sbx files                        */ | 
|---|
| 115 | EXTERN byte opt_usepcre; /**< OPTION PREDEF PCRE                             */ | 
|---|
| 116 | EXTERN byte opt_file_permitted; /**< file system permission                  */ | 
|---|
| 117 | EXTERN byte opt_show_page; /**< SHOWPAGE graphics flush mode                 */ | 
|---|
| 118 | EXTERN byte opt_mute_audio; /**< whether to mute sounds                      */ | 
|---|
| 119 | EXTERN byte opt_antialias; /**< OPTION ANTIALIAS OFF                         */ | 
|---|
| 120 | EXTERN byte opt_autolocal; /**< OPTION AUTOLOCAL                             */ | 
|---|
| 121 | EXTERN byte opt_trace_on; /**< initial value for the TRON command            */ | 
|---|
| 122 |  | 
|---|
| 123 | #define IDE_NONE        0 | 
|---|
| 124 | #define IDE_INTERNAL    1 | 
|---|
| 125 | #define IDE_EXTERNAL    2 | 
|---|
| 126 |  | 
|---|
| 127 | // globals | 
|---|
| 128 | EXTERN int gsb_last_line; /**< source code line of the last error            */ | 
|---|
| 129 | EXTERN int gsb_last_error; /**< error code, 0 = no error,  < 0 = local messages (i.e. break), > 0 = error       */ | 
|---|
| 130 | EXTERN char gsb_last_file[OS_PATHNAME_SIZE + 1]; /**< source code file-name of the last error     */ | 
|---|
| 131 | EXTERN char gsb_bas_dir[OS_PATHNAME_SIZE + 1]; /**< source code home dir     */ | 
|---|
| 132 | EXTERN char gsb_last_errmsg[SB_ERRMSG_SIZE + 1]; /**< last error message     */ | 
|---|
| 133 |  | 
|---|
| 134 | #include "common/units.h" | 
|---|
| 135 | #include "common/tasks.h" | 
|---|
| 136 |  | 
|---|
| 137 | #define IF_PROG_ERR_RTN if (ctask->error) { return; } | 
|---|
| 138 | #define IF_PROG_ERR_BRK if (ctask->error) { break; } | 
|---|
| 139 |  | 
|---|
| 140 | // emulation | 
|---|
| 141 | #define prog_line           ctask->line | 
|---|
| 142 | #define comp_line           ctask->line | 
|---|
| 143 | #define prog_error          ctask->error | 
|---|
| 144 | #define comp_error          ctask->error | 
|---|
| 145 | #define prog_file           ctask->file | 
|---|
| 146 | #define prog_errmsg         ctask->errmsg | 
|---|
| 147 | #define prog_length         ctask->sbe.exec.length | 
|---|
| 148 | #define prog_ip             ctask->sbe.exec.ip | 
|---|
| 149 | #define prog_source         ctask->sbe.exec.bytecode | 
|---|
| 150 | #define prog_dp             ctask->sbe.exec.dp | 
|---|
| 151 | #define data_org            ctask->sbe.exec.org | 
|---|
| 152 | #define prog_stack          ctask->sbe.exec.stack | 
|---|
| 153 | #define prog_stack_alloc    ctask->sbe.exec.stack_alloc | 
|---|
| 154 | #define prog_sp             ctask->sbe.exec.sp | 
|---|
| 155 | #define eval_stk            ctask->sbe.exec.eval_stk | 
|---|
| 156 | #define eval_stk_size       ctask->sbe.exec.eval_stk_size | 
|---|
| 157 | #define eval_sp             ctask->sbe.exec.eval_esp | 
|---|
| 158 | #define prog_varcount       ctask->sbe.exec.varcount | 
|---|
| 159 | #define prog_labcount       ctask->sbe.exec.labcount | 
|---|
| 160 | #define prog_libcount       ctask->sbe.exec.libcount | 
|---|
| 161 | #define prog_symcount       ctask->sbe.exec.symcount | 
|---|
| 162 | #define prog_expcount       ctask->sbe.exec.expcount | 
|---|
| 163 | #define prog_vartable       ctask->sbe.exec.vartable | 
|---|
| 164 | #define prog_labtable       ctask->sbe.exec.labtable | 
|---|
| 165 | #define prog_libtable       ctask->sbe.exec.libtable | 
|---|
| 166 | #define prog_symtable       ctask->sbe.exec.symtable | 
|---|
| 167 | #define prog_exptable       ctask->sbe.exec.exptable | 
|---|
| 168 | #define prog_timer          ctask->sbe.exec.timer | 
|---|
| 169 | #define comp_extfunctable   ctask->sbe.comp.extfunctable | 
|---|
| 170 | #define comp_extfunccount   ctask->sbe.comp.extfunccount | 
|---|
| 171 | #define comp_extfuncsize    ctask->sbe.comp.extfuncsize | 
|---|
| 172 | #define comp_extproctable   ctask->sbe.comp.extproctable | 
|---|
| 173 | #define comp_extproccount   ctask->sbe.comp.extproccount | 
|---|
| 174 | #define comp_extprocsize    ctask->sbe.comp.extprocsize | 
|---|
| 175 | #define comp_vartable       ctask->sbe.comp.vartable | 
|---|
| 176 | #define comp_varcount       ctask->sbe.comp.varcount | 
|---|
| 177 | #define comp_varsize        ctask->sbe.comp.varsize | 
|---|
| 178 | #define comp_imptable       ctask->sbe.comp.imptable | 
|---|
| 179 | #define comp_impcount       ctask->sbe.comp.imptable.count | 
|---|
| 180 | #define comp_exptable       ctask->sbe.comp.exptable | 
|---|
| 181 | #define comp_expcount       ctask->sbe.comp.exptable.count | 
|---|
| 182 | #define comp_libtable       ctask->sbe.comp.libtable | 
|---|
| 183 | #define comp_libcount       ctask->sbe.comp.libtable.count | 
|---|
| 184 | #define comp_labtable       ctask->sbe.comp.labtable | 
|---|
| 185 | #define comp_labcount       ctask->sbe.comp.labtable.count | 
|---|
| 186 | #define comp_bc_sec         ctask->sbe.comp.bc_sec | 
|---|
| 187 | #define comp_block_level    ctask->sbe.comp.block_level | 
|---|
| 188 | #define comp_block_id       ctask->sbe.comp.block_id | 
|---|
| 189 | #define comp_prog           ctask->sbe.comp.bc_prog | 
|---|
| 190 | #define comp_data           ctask->sbe.comp.bc_data | 
|---|
| 191 | #define comp_proc_level     ctask->sbe.comp.proc_level | 
|---|
| 192 | #define comp_bc_proc        ctask->sbe.comp.bc_proc | 
|---|
| 193 | #define comp_bc_temp        ctask->sbe.comp.bc_temp | 
|---|
| 194 | #define comp_bc_tmp2        ctask->sbe.comp.bc_tmp2 | 
|---|
| 195 | #define comp_bc_name        ctask->sbe.comp.bc_name | 
|---|
| 196 | #define comp_bc_parm        ctask->sbe.comp.bc_parm | 
|---|
| 197 | #define comp_udptable       ctask->sbe.comp.udptable | 
|---|
| 198 | #define comp_udpcount       ctask->sbe.comp.udpcount | 
|---|
| 199 | #define comp_udpsize        ctask->sbe.comp.udpsize | 
|---|
| 200 | #define comp_use_global_vartable    ctask->sbe.comp.use_global_vartable | 
|---|
| 201 | #define comp_stack          ctask->sbe.comp.stack | 
|---|
| 202 | #define comp_sp             ctask->sbe.comp.stack.count | 
|---|
| 203 | #define comp_do_close_cmd   ctask->sbe.comp.do_close_cmd | 
|---|
| 204 | #define comp_unit_flag      ctask->sbe.comp.unit_flag | 
|---|
| 205 | #define comp_unit_name      ctask->sbe.comp.unit_name | 
|---|
| 206 | #define comp_first_data_ip  ctask->sbe.comp.first_data_ip | 
|---|
| 207 | #define comp_file_name      ctask->sbe.comp.file_name | 
|---|
| 208 | #define tlab                prog_labtable | 
|---|
| 209 | #define tvar                prog_vartable | 
|---|
| 210 | #define eval_size           eval_stk_size | 
|---|
| 211 | #define prog_stack_sp       prog_sp | 
|---|
| 212 | #define prog_stack_count    prog_stack_sp | 
|---|
| 213 |  | 
|---|
| 214 | #undef EXTERN | 
|---|
| 215 |  | 
|---|
| 216 | #include "common/hotspots.h" | 
|---|
| 217 |  | 
|---|
| 218 | /** | 
|---|
| 219 | * @ingroup exec | 
|---|
| 220 | * | 
|---|
| 221 | * create a 'break' - display message, too | 
|---|
| 222 | * | 
|---|
| 223 | * the 'break' will stops the program's execution | 
|---|
| 224 | */ | 
|---|
| 225 | void brun_break(void); | 
|---|
| 226 |  | 
|---|
| 227 | /** | 
|---|
| 228 | * @ingroup exec | 
|---|
| 229 | * | 
|---|
| 230 | * stops the program's execution | 
|---|
| 231 | */ | 
|---|
| 232 | void brun_stop(void); | 
|---|
| 233 |  | 
|---|
| 234 | /** | 
|---|
| 235 | * @ingroup exec | 
|---|
| 236 | * | 
|---|
| 237 | * returns the execution status (runing or stopped) | 
|---|
| 238 | * | 
|---|
| 239 | * @return BRUN_STOPPED or BRUN_RUNNING | 
|---|
| 240 | */ | 
|---|
| 241 | int brun_status(void); | 
|---|
| 242 |  | 
|---|
| 243 | /** | 
|---|
| 244 | * returns the last-modified time of the file | 
|---|
| 245 | * | 
|---|
| 246 | * @param file the filename | 
|---|
| 247 | * @return the last-modified time of the file; on error returns 0L | 
|---|
| 248 | */ | 
|---|
| 249 | time_t sys_filetime(const char *file); | 
|---|
| 250 |  | 
|---|
| 251 | /** | 
|---|
| 252 | * search a set of directories for the given file | 
|---|
| 253 | * directories on path must be separated with symbol ':' | 
|---|
| 254 | * | 
|---|
| 255 | * @param path the path | 
|---|
| 256 | * @param file the file | 
|---|
| 257 | * @param retbuf a buffer to store the full-path-name file (can be NULL) | 
|---|
| 258 | * @return non-zero if found | 
|---|
| 259 | */ | 
|---|
| 260 | int sys_search_path(const char *path, const char *file, char *retbuf); | 
|---|
| 261 |  | 
|---|
| 262 | /** | 
|---|
| 263 | *   synchronize exported variables | 
|---|
| 264 | */ | 
|---|
| 265 | void exec_sync_variables(int dir); | 
|---|
| 266 |  | 
|---|
| 267 | #if defined(__cplusplus) | 
|---|
| 268 | } | 
|---|
| 269 | #endif | 
|---|
| 270 | #endif | 
|---|
| 271 |  | 
|---|