| 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 | |