a68g-common.h

     
   1  //! @file a68g-common.h
   2  //! @author J. Marcel van der Veer
   3  
   4  //! @section Copyright
   5  //!
   6  //! This file is part of Algol68G - an Algol 68 compiler-interpreter.
   7  //! Copyright 2001-2024 J. Marcel van der Veer [algol68g@xs4all.nl].
   8  
   9  //! @section License
  10  //!
  11  //! This program is free software; you can redistribute it and/or modify it 
  12  //! under the terms of the GNU General Public License as published by the 
  13  //! Free Software Foundation; either version 3 of the License, or 
  14  //! (at your option) any later version.
  15  //!
  16  //! This program is distributed in the hope that it will be useful, but 
  17  //! WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY 
  18  //! or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 
  19  //! more details. You should have received a copy of the GNU General Public 
  20  //! License along with this program. If not, see [http://www.gnu.org/licenses/].
  21  
  22  //! @section Synopsis
  23  //!
  24  //! Common definitions.
  25  
  26  #if !defined (__A68G_COMMON_H__)
  27  #define __A68G_COMMON_H__
  28  
  29  typedef struct MODULE_T MODULE_T;
  30  struct MODULE_T
  31  {
  32    BOOL_T tree_listing_safe, cross_reference_safe;
  33    FILES_T files;
  34    int error_count, warning_count, source_scan;
  35    jmp_buf rendez_vous;
  36    LINE_T *top_line;
  37    MOID_T *top_moid, *standenv_moid;
  38    NODE_T *top_node;
  39    OPTIONS_T options;
  40    PROP_T global_prop;
  41    REFINEMENT_T *top_refinement;
  42    struct
  43    {
  44      LINE_T *save_l;
  45      char *save_s, save_c;
  46    } scan_state;
  47  };
  48  
  49  typedef struct MODE_CACHE_T MODE_CACHE_T;
  50  #define MODE(p)        A68 (a68_modes.p)
  51  struct MODE_CACHE_T
  52  {
  53    MOID_T *proc_bool;
  54    MOID_T *proc_char;
  55    MOID_T *proc_complex_complex;
  56    MOID_T *proc_int;
  57    MOID_T *proc_int_int;
  58    MOID_T *proc_int_int_real;
  59    MOID_T *proc_int_real;
  60    MOID_T *proc_int_real_real;
  61    MOID_T *proc_int_real_real_real;
  62    MOID_T *proc_real;
  63    MOID_T *proc_real_int_real;
  64    MOID_T *proc_real_real;
  65    MOID_T *proc_real_real_int_real;
  66    MOID_T *proc_real_real_real;
  67    MOID_T *proc_real_real_real_int;
  68    MOID_T *proc_real_real_real_real;
  69    MOID_T *proc_real_real_real_real_real;
  70    MOID_T *proc_real_real_real_real_real_real;
  71    MOID_T *proc_real_ref_real_ref_int_void;
  72    MOID_T *proc_void;
  73  };
  74  
  75  #define MAX_OPEN_FILES 64       // Some OS's won't open more than this number
  76  #define MAX_TRANSPUT_BUFFER (MAX_OPEN_FILES)
  77  
  78  typedef struct FILE_ENTRY FILE_ENTRY;
  79  struct FILE_ENTRY
  80  {
  81    NODE_T *pos;
  82    BOOL_T is_open, is_tmp;
  83    FILE_T fd;
  84    A68_REF idf;
  85  };
  86  
  87  // Administration for common (sub) expression elimination.
  88  // BOOK keeps track of already seen (temporary) variables and denotations.
  89  
  90  enum
  91  { BOOK_NONE = 0, BOOK_DECL, BOOK_INIT, BOOK_DEREF, BOOK_ARRAY, BOOK_COMPILE };
  92  
  93  typedef struct BOOK_T BOOK_T;
  94  struct BOOK_T
  95  {
  96    int action, phase;
  97    char *idf;
  98    void *info;
  99    int number;
 100  };
 101  
 102  typedef struct UNIC_T UNIC_T;
 103  struct UNIC_T
 104  {
 105    char *fun;
 106  };
 107  
 108  
 109  #define A68(z)         (common.z)
 110  #define A68_JOB        A68 (job)
 111  #define A68_STANDENV   A68 (standenv)
 112  #define A68_MCACHE(z)  A68 (mode_cache.z)
 113  
 114  #define A68_SP         A68 (stack_pointer)
 115  #define A68_FP         A68 (frame_pointer)
 116  #define A68_HP         A68 (heap_pointer)
 117  #define A68_GLOBALS    A68 (global_pointer)
 118  #define A68_STACK      A68 (stack_segment)
 119  #define A68_HEAP       A68 (heap_segment)
 120  #define A68_HANDLES    A68 (handle_segment)
 121  
 122  typedef struct GC_GLOBALS_T GC_GLOBALS_T;
 123  #define A68_GC(z)      A68 (gc.z)
 124  struct GC_GLOBALS_T
 125  {
 126    A68_HANDLE *available_handles, *busy_handles;
 127    UNSIGNED_T free_handles, max_handles, sweeps, refused, freed, total;
 128    unt preemptive, sema;
 129    REAL_T seconds;
 130  };
 131  
 132  typedef struct INDENT_GLOBALS_T INDENT_GLOBALS_T;
 133  #define A68_INDENT(z)  A68 (indent.z)
 134  struct INDENT_GLOBALS_T
 135  {
 136    FILE_T fd;
 137    int ind, col;
 138    int indentation;
 139    BOOL_T use_folder;
 140  };
 141  
 142  #define MON_STACK_SIZE 32
 143  
 144  typedef struct MONITOR_GLOBALS_T MONITOR_GLOBALS_T;
 145  #define A68_MON(z)     A68 (mon.z)
 146  struct MONITOR_GLOBALS_T
 147  {
 148    ADDR_T finish_frame_pointer;
 149    BOOL_T in_monitor;
 150    BOOL_T prompt_set;
 151    BUFFER prompt, symbol, error_text, expr;
 152    char *watchpoint_expression;
 153    int break_proc_level;
 154    int current_frame;
 155    int max_row_elems;
 156    int mon_errors;
 157    int _m_sp;
 158    int pos, attr;
 159    int tabs;
 160    MOID_T *_m_stack[MON_STACK_SIZE];
 161  };
 162  
 163  typedef struct MP_GLOBALS_T MP_GLOBALS_T;
 164  #define A68_MP(z)      A68 (mp.z)
 165  
 166  struct MP_GLOBALS_T
 167  {
 168    int mp_gamma_size;
 169    int mp_ln_10_size;
 170    int mp_ln_scale_size;
 171    int mp_one_size;
 172    int mp_pi_size;
 173    int varying_mp_digits;
 174    MP_T *mp_180_over_pi;
 175    MP_T **mp_gam_ck;
 176    MP_T *mp_half_pi;
 177    MP_T *mp_ln_10;
 178    MP_T *mp_ln_pi;
 179    MP_T *mp_ln_scale;
 180    MP_T *mp_one;
 181    MP_T *mp_pi;
 182    MP_T *mp_pi_over_180;
 183    MP_T *mp_sqrt_pi;
 184    MP_T *mp_sqrt_two_pi;
 185    MP_T *mp_two_pi;
 186  };
 187  
 188  #define MAX_BOOK 1024
 189  #define MAX_UNIC 2048
 190  
 191  typedef struct OPTIMISER_GLOBALS_T OPTIMISER_GLOBALS_T;
 192  #define A68_OPT(z)     A68 (optimiser.z)
 193  struct OPTIMISER_GLOBALS_T
 194  {
 195    BOOK_T cse_book[MAX_BOOK];
 196    BOOL_T put_idf_comma;
 197    DEC_T *root_idf;
 198    int code_errors;
 199    int cse_pointer;
 200    int indentation;
 201    int OPTION_CODE_LEVEL;
 202    int procedures;
 203    int unic_pointer;
 204    UNIC_T unic_functions[MAX_UNIC];
 205  };
 206  
 207  #if defined (BUILD_PARALLEL_CLAUSE)
 208  
 209  typedef struct A68_STACK_DESCRIPTOR A68_STACK_DESCRIPTOR;
 210  typedef struct A68_THREAD_CONTEXT A68_THREAD_CONTEXT;
 211  
 212  struct A68_STACK_DESCRIPTOR
 213  {
 214    ADDR_T cur_ptr, ini_ptr;
 215    BYTE_T *swap, *start;
 216    int bytes;
 217  };
 218  
 219  struct A68_THREAD_CONTEXT
 220  {
 221    A68_STACK_DESCRIPTOR stack, frame;
 222    BOOL_T active;
 223    BYTE_T *thread_stack_offset;
 224    int stack_used;
 225    NODE_T *unit;
 226    pthread_t parent, id;
 227  };
 228  
 229  // Set an upper limit for number of threads.
 230  // Note that _POSIX_THREAD_THREADS_MAX may be ULONG_MAX.
 231  
 232  #define THREAD_LIMIT 256
 233  
 234  #if defined (_POSIX_THREAD_THREADS_MAX)
 235    #if ((_POSIX_THREAD_THREADS_MAX) < THREAD_LIMIT)
 236      #define THREAD_MAX (_POSIX_THREAD_THREADS_MAX)
 237    #else
 238      #define THREAD_MAX (THREAD_LIMIT)
 239    #endif
 240  #else
 241    #define THREAD_MAX (THREAD_LIMIT)
 242  #endif
 243  
 244  typedef struct PARALLEL_GLOBALS_T PARALLEL_GLOBALS_T;
 245  #define A68_PAR(z)     A68 (parallel.z)
 246  struct PARALLEL_GLOBALS_T
 247  {
 248    A68_THREAD_CONTEXT context[THREAD_MAX];
 249    ADDR_T fp0, sp0;
 250    BOOL_T abend_all_threads, exit_from_threads;
 251    int context_index;
 252    int par_return_code;
 253    jmp_buf *jump_buffer;
 254    NODE_T *jump_label;
 255    pthread_mutex_t unit_sema;
 256    pthread_t main_thread_id;
 257    pthread_t parent_thread_id;
 258  };
 259  
 260  #endif
 261  
 262  typedef struct PARSER_GLOBALS_T PARSER_GLOBALS_T;
 263  #define A68_PARSER(z)  A68 (parser.z)
 264  struct PARSER_GLOBALS_T
 265  {
 266    TAG_T *error_tag;
 267    BOOL_T stop_scanner, read_error, no_preprocessing;
 268    char *scan_buf;
 269    int max_scan_buf_length, source_file_size;
 270    int reductions;
 271    int tag_number;
 272    jmp_buf bottom_up_crash_exit, top_down_crash_exit;
 273  };
 274  
 275  typedef struct GLOBALS_T GLOBALS_T;
 276  
 277  struct GLOBALS_T
 278  {
 279    A68_CHANNEL stand_draw_channel, stand_error_channel, associate_channel, skip_channel;
 280    A68_CHANNEL stand_in_channel, stand_out_channel, stand_back_channel;
 281    A68_PROCEDURE on_gc_event;
 282    A68_REF stand_in, stand_out, stand_back, stand_error, skip_file;
 283    ADDR_T fixed_heap_pointer, temp_heap_pointer;
 284    ADDR_T frame_pointer, stack_pointer, heap_pointer, global_pointer;
 285    ADDR_T frame_start, frame_end, stack_start, stack_end;
 286    BOOL_T close_tty_on_exit;
 287    BOOL_T curses_mode;
 288    BOOL_T do_confirm_exit; 
 289    BOOL_T halt_typing;
 290    BOOL_T heap_is_fluid;
 291    BOOL_T in_execution;
 292    BOOL_T in_monitor;
 293    BOOL_T no_warnings;
 294    BYTE_T *stack_segment, *heap_segment, *handle_segment;
 295    BYTE_T *system_stack_offset;
 296    BUFFER a68_cmd_name;
 297    char **argv;
 298    char *f_plugin;
 299    char *marker[BUFFER_SIZE];
 300    BUFFER output_line, edit_line, input_line;
 301    clock_t clock_res;
 302    FILE_ENTRY file_entries[MAX_OPEN_FILES];
 303    GC_GLOBALS_T gc;
 304    INDENT_GLOBALS_T indent;
 305    int argc;
 306    int chars_in_stderr, chars_in_stdout;
 307    int global_level, max_lex_lvl;
 308    int max_simplout_size;
 309    int new_nodes, new_modes, new_postulates, new_node_infos, new_genie_infos;
 310    int ret_code, ret_line_number, ret_char_number;
 311    int symbol_table_count, mode_count; 
 312    int term_heigth, term_width;
 313    jmp_buf genie_exit_label;
 314    KEYWORD_T *top_keyword;
 315    MODE_CACHE_T mode_cache;
 316    MODES_T a68_modes;
 317    MODULE_T job;
 318    MONITOR_GLOBALS_T mon;
 319    MP_GLOBALS_T mp;
 320    NODE_T *f_entry;
 321    NODE_T **node_register;
 322    OPTIMISER_GLOBALS_T optimiser;
 323    OPTIONS_T *options;
 324    PARSER_GLOBALS_T parser;
 325    POSTULATE_T *postulates, *top_postulate, *top_postulate_list;
 326    REAL_T cputime_0;
 327    SOID_T *top_soid_list;
 328    TABLE_T *standenv;
 329    TAG_T *error_tag;
 330    TOKEN_T *top_token;
 331    unt frame_stack_size, expr_stack_size, heap_size, handle_pool_size, stack_size;
 332    unt stack_limit, frame_stack_limit, expr_stack_limit;
 333    unt storage_overhead;
 334  #if defined (BUILD_PARALLEL_CLAUSE)
 335    PARALLEL_GLOBALS_T parallel;
 336  #endif
 337  };
 338  
 339  extern GLOBALS_T common;
 340  
 341  #endif