a68g-types.h
1 //! @file a68g-types.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-2023 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 #if !defined (__A68G_TYPES_H__)
23 #define __A68G_TYPES_H__
24
25 // Type definitions
26
27 #define COMPLEX_T double complex
28
29 typedef unt char BYTE_T;
30 typedef BYTE_T *A68_STRUCT;
31
32 typedef char BUFFER[BUFFER_SIZE + 1];
33 typedef int CHAR_T;
34 typedef int LEAP_T;
35 typedef MP_T A68_LONG[DEFAULT_DOUBLE_DIGITS + 2];
36 typedef struct A68_ARRAY A68_ARRAY;
37 typedef struct A68_BITS A68_BITS;
38 typedef struct A68_BOOL A68_BOOL;
39 typedef struct A68_BYTES A68_BYTES;
40 typedef struct A68_CHANNEL A68_CHANNEL;
41 typedef struct A68_CHAR A68_CHAR;
42 typedef struct A68_COLLITEM A68_COLLITEM;
43 typedef struct A68_FILE A68_FILE;
44 typedef struct A68_FORMAT A68_FORMAT;
45 typedef struct A68_HANDLE A68_HANDLE;
46 typedef struct A68_INT A68_INT;
47 typedef struct A68_LONG_BYTES A68_LONG_BYTES;
48 typedef struct A68_PROCEDURE A68_PROCEDURE;
49 typedef struct A68_REAL A68_REAL;
50 typedef struct A68_REF A68_REF, A68_ROW;
51 typedef struct A68_SOUND A68_SOUND;
52 typedef struct A68_STREAM A68_STREAM;
53 typedef struct A68_TUPLE A68_TUPLE;
54 typedef struct A68_UNION A68_UNION;
55 typedef struct ACTIVATION_RECORD ACTIVATION_RECORD;
56 typedef struct DEC_T DEC_T;
57 typedef struct DIAGNOSTIC_T DIAGNOSTIC_T;
58 typedef struct FILES_T FILES_T;
59 typedef struct GINFO_T GINFO_T;
60 typedef struct KEYWORD_T KEYWORD_T;
61 typedef struct LINE_T LINE_T;
62 typedef struct MODES_T MODES_T;
63 typedef struct MOID_T MOID_T;
64 typedef struct NODE_INFO_T NODE_INFO_T;
65 typedef struct OPTION_LIST_T OPTION_LIST_T;
66 typedef struct OPTIONS_T OPTIONS_T;
67 typedef struct PACK_T PACK_T;
68 typedef struct POSTULATE_T POSTULATE_T;
69 typedef struct PROP_T PROP_T;
70 typedef struct REFINEMENT_T REFINEMENT_T;
71 typedef struct SOID_T SOID_T;
72 typedef struct TABLE_T TABLE_T;
73 typedef struct TAG_T TAG_T;
74 typedef struct TOKEN_T TOKEN_T;
75 typedef unt FILE_T, MOOD_T;
76 typedef void GPROC (NODE_T *);
77
78 typedef PROP_T PROP_PROC (NODE_T *);
79
80 struct A68_REAL
81 {
82 STATUS_MASK_T status;
83 REAL_T value;
84 } ALIGNED;
85
86 struct DEC_T
87 {
88 char *text;
89 int level;
90 DEC_T *sub, *less, *more;
91 };
92
93 struct ACTIVATION_RECORD
94 {
95 ADDR_T static_link, dynamic_link, dynamic_scope, parameters;
96 NODE_T *node;
97 jmp_buf *jump_stat;
98 BOOL_T proc_frame;
99 int frame_no, frame_level, parameter_level;
100 #if defined (BUILD_PARALLEL_CLAUSE)
101 pthread_t thread_id;
102 #endif
103 };
104
105 struct PROP_T
106 {
107 PROP_PROC *unit;
108 NODE_T *source;
109 };
110
111 struct A68_STREAM
112 {
113 char *name;
114 FILE_T fd;
115 BOOL_T opened, writemood;
116 } ALIGNED;
117
118 struct DIAGNOSTIC_T
119 {
120 int attribute, number;
121 NODE_T *where;
122 LINE_T *line;
123 char *text, *symbol;
124 DIAGNOSTIC_T *next;
125 };
126
127 struct FILES_T
128 {
129 char *path, *initial_name, *generic_name;
130 struct A68_STREAM binary, diags, plugin, script, object, source, listing, pretty;
131 };
132
133 struct KEYWORD_T
134 {
135 int attribute;
136 char *text;
137 KEYWORD_T *less, *more;
138 };
139
140 struct MODES_T
141 {
142 MOID_T *BITS, *BOOL, *BYTES, *CHANNEL, *CHAR, *COLLITEM, *COMPL, *COMPLEX,
143 *C_STRING, *ERROR, *FILE, *FORMAT, *HEX_NUMBER, *HIP, *INT, *LONG_BITS, *LONG_BYTES,
144 *LONG_COMPL, *LONG_COMPLEX, *LONG_INT, *LONG_LONG_BITS, *LONG_LONG_COMPL,
145 *LONG_LONG_COMPLEX, *LONG_LONG_INT, *LONG_LONG_REAL, *LONG_REAL, *NUMBER, *PIPE,
146 *PROC_REAL_REAL, *PROC_LONG_REAL_LONG_REAL, *PROC_REF_FILE_BOOL, *PROC_REF_FILE_VOID, *PROC_ROW_CHAR,
147 *PROC_STRING, *PROC_VOID, *REAL, *REF_BITS, *REF_BOOL, *REF_BYTES,
148 *REF_CHAR, *REF_COMPL, *REF_COMPLEX, *REF_FILE, *REF_FORMAT, *REF_INT,
149 *REF_LONG_BITS, *REF_LONG_BYTES, *REF_LONG_COMPL, *REF_LONG_COMPLEX,
150 *REF_LONG_INT, *REF_LONG_LONG_BITS, *REF_LONG_LONG_COMPL,
151 *REF_LONG_LONG_COMPLEX, *REF_LONG_LONG_INT, *REF_LONG_LONG_REAL, *REF_LONG_REAL,
152 *REF_PIPE, *REF_REAL, *REF_REF_FILE, *REF_ROW_CHAR, *REF_ROW_COMPLEX, *REF_ROW_INT,
153 *REF_ROW_REAL, *REF_ROW_ROW_COMPLEX, *REF_ROW_ROW_REAL, *REF_SOUND, *REF_STRING,
154 *ROW_BITS, *ROW_BOOL, *ROW_CHAR, *ROW_COMPLEX, *ROW_INT, *ROW_LONG_BITS, *ROW_LONG_LONG_BITS,
155 *ROW_REAL, *ROW_ROW_CHAR, *ROW_ROW_COMPLEX, *ROW_ROW_REAL, *ROWS, *ROW_SIMPLIN, *ROW_SIMPLOUT,
156 *ROW_STRING, *SEMA, *SIMPLIN, *SIMPLOUT, *SOUND, *SOUND_DATA, *STRING, *FLEX_ROW_CHAR,
157 *FLEX_ROW_BOOL, *UNDEFINED, *VACUUM, *VOID;
158 };
159
160 struct OPTIONS_T
161 {
162 OPTION_LIST_T *list;
163 BOOL_T backtrace, brackets, check_only, clock, cross_reference, debug, compile, compile_check, keep, fold, license, moid_listing, object_listing, portcheck, pragmat_sema, pretty, reductions, regression_test, run, rerun, run_script, source_listing, standard_prelude_listing, statistics_listing, strict, stropping, trace, tree_listing, unused, verbose, version, no_warnings, quiet;
164 int time_limit, opt_level, indent;
165 STATUS_MASK_T nodemask;
166 };
167
168 struct MOID_T
169 {
170 int attribute, dim, number, short_id, size, digits, sizec, digitsc;
171 BOOL_T has_rows, use, portable, derivate;
172 NODE_T *node;
173 PACK_T *pack;
174 MOID_T *sub, *equivalent_mode, *slice, *deflexed_mode, *name, *multiple_mode, *next, *rowed, *trim;
175 };
176 #define NO_MOID ((MOID_T *) NULL)
177
178 struct NODE_T
179 {
180 GINFO_T *genie;
181 int number, attribute, annotation;
182 MOID_T *type;
183 NODE_INFO_T *info;
184 NODE_T *next, *previous, *sub, *sequence, *nest;
185 PACK_T *pack;
186 STATUS_MASK_T status, codex;
187 TABLE_T *symbol_table, *non_local;
188 TAG_T *tag;
189 };
190 #define NO_NODE ((NODE_T *) NULL)
191
192 struct NODE_INFO_T
193 {
194 int procedure_level, priority, pragment_type;
195 char *char_in_line, *symbol, *pragment, *expr;
196 LINE_T *line;
197 };
198
199 struct GINFO_T
200 {
201 PROP_T propagator;
202 BOOL_T is_coercion, is_new_lexical_level, need_dns;
203 BYTE_T *offset;
204 MOID_T *partial_proc, *partial_locale;
205 NODE_T *parent;
206 char *compile_name;
207 int level, argsize, size, compile_node;
208 void *constant;
209 };
210
211 struct OPTION_LIST_T
212 {
213 char *str;
214 int scan;
215 BOOL_T processed;
216 LINE_T *line;
217 OPTION_LIST_T *next;
218 };
219
220 struct PACK_T
221 {
222 MOID_T *type;
223 char *text;
224 NODE_T *node;
225 PACK_T *next, *previous;
226 int size;
227 ADDR_T offset;
228 };
229
230 struct POSTULATE_T
231 {
232 MOID_T *a, *b;
233 POSTULATE_T *next;
234 };
235
236 struct REFINEMENT_T
237 {
238 REFINEMENT_T *next;
239 char *name;
240 LINE_T *line_defined, *line_applied;
241 int applications;
242 NODE_T *node_defined, *begin, *end;
243 };
244
245 struct SOID_T
246 {
247 int attribute, sort, cast;
248 MOID_T *type;
249 NODE_T *node;
250 SOID_T *next;
251 };
252
253 struct LINE_T
254 {
255 char marker[6], *string, *filename;
256 DIAGNOSTIC_T *diagnostics;
257 int number, print_status;
258 BOOL_T list;
259 LINE_T *next, *previous;
260 };
261 #define NO_LINE ((LINE_T *) NULL)
262
263 struct TABLE_T
264 {
265 int num, level, nest, attribute;
266 BOOL_T initialise_frame, initialise_anon, proc_ops;
267 ADDR_T ap_increment;
268 TABLE_T *previous, *outer;
269 TAG_T *identifiers, *operators, *priority, *indicants, *labels, *anonymous;
270 NODE_T *jump_to, *sequence;
271 };
272 #define NO_TABLE ((TABLE_T *) NULL)
273
274 struct TAG_T
275 {
276 STATUS_MASK_T status, codex;
277 TABLE_T *symbol_table;
278 MOID_T *type;
279 NODE_T *node, *unit;
280 char *value;
281 GPROC *procedure;
282 BOOL_T scope_assigned, use, in_proc, a68_standenv_proc, loc_assigned, portable;
283 int priority, heap, scope, size, youngest_environ, number;
284 ADDR_T offset;
285 TAG_T *next, *body;
286 };
287 #define NO_TAG ((TAG_T *) NULL)
288
289 struct TOKEN_T
290 {
291 char *text;
292 TOKEN_T *less, *more;
293 };
294
295 //! @struct A68_HANDLE
296 //! @brief Handle for REF into the HEAP.
297 //! @details
298 //! A REF into the HEAP points at a HANDLE.
299 //! The HANDLE points at the actual object in the HEAP.
300 //! Garbage collection modifies HANDLEs, but not REFs.
301
302 struct A68_HANDLE
303 {
304 STATUS_MASK_T status;
305 BYTE_T *pointer;
306 int size;
307 MOID_T *type;
308 A68_HANDLE *next, *previous;
309 } ALIGNED;
310
311 //! @struct A68_REF
312 //! @brief Fat A68 pointer.
313
314 struct A68_REF
315 {
316 STATUS_MASK_T status;
317 ADDR_T offset;
318 ADDR_T scope; // Dynamic scope.
319 A68_HANDLE *handle;
320 } ALIGNED;
321
322 //! @struct A68_ARRAY
323 //! @brief A68 array descriptor.
324 //! @details
325 //! A row is an A68_REF to an A68_ARRAY.
326 //!
327 //! An A68_ARRAY is followed by one A68_TUPLE per dimension.
328 //!
329 //! @verbatim
330 //! A68_REF row -> A68_ARRAY ----+ ARRAY: Description of row, ref to elements
331 //! A68_TUPLE 1 | TUPLE: Bounds, one for every dimension
332 //! ... |
333 //! A68_TUPLE dim |
334 //! ... |
335 //! ... |
336 //! Element 1 <---+ Element: Sequential row elements, in the heap
337 //! ... Not always contiguous - trims!
338 //! @endverbatim
339
340 struct A68_ARRAY
341 {
342 MOID_T *type;
343 int dim, elem_size;
344 ADDR_T slice_offset, field_offset;
345 A68_REF array;
346 } ALIGNED;
347
348 struct A68_BITS
349 {
350 STATUS_MASK_T status;
351 UNSIGNED_T value;
352 } ALIGNED;
353
354 struct A68_BYTES
355 {
356 STATUS_MASK_T status;
357 char value[BYTES_WIDTH + 1];
358 } ALIGNED;
359
360 struct A68_CHANNEL
361 {
362 STATUS_MASK_T status;
363 BOOL_T reset, set, get, put, bin, draw, compress;
364 } ALIGNED;
365
366 struct A68_BOOL
367 {
368 STATUS_MASK_T status;
369 BOOL_T value;
370 } ALIGNED;
371
372 struct A68_CHAR
373 {
374 STATUS_MASK_T status;
375 CHAR_T value;
376 } ALIGNED;
377
378 struct A68_COLLITEM
379 {
380 STATUS_MASK_T status;
381 int count;
382 };
383
384 struct A68_INT
385 {
386 STATUS_MASK_T status;
387 INT_T value;
388 } ALIGNED;
389
390 //! @struct A68_FORMAT
391 //! @brief A68 format descriptor.
392 //! @details
393 //! A format behaves very much like a procedure.
394
395 struct A68_FORMAT
396 {
397 STATUS_MASK_T status;
398 NODE_T *body; // Entry point in syntax tree.
399 ADDR_T fp_environ; // Frame pointer to environ.
400 } ALIGNED;
401
402 struct A68_LONG_BYTES
403 {
404 STATUS_MASK_T status;
405 char value[LONG_BYTES_WIDTH + 1];
406 } ALIGNED;
407
408 //! @struct A68_PROCEDURE
409 //! @brief A68 procedure descriptor.
410
411 struct A68_PROCEDURE
412 {
413 STATUS_MASK_T status;
414 union
415 {
416 NODE_T *node;
417 GPROC *procedure;
418 } body; // Entry point in syntax tree or precompiled C procedure.
419 A68_HANDLE *locale; // Locale for partial parametrisation.
420 MOID_T *type;
421 ADDR_T fp_environ; // Frame pointer to environ.
422 } ALIGNED;
423
424 typedef A68_REAL A68_COMPLEX[2];
425
426 //! @struct A68_TUPLE
427 //! @brief A tuple containing bounds etcetera for one dimension.
428
429 struct A68_TUPLE
430 {
431 INT_T upper_bound, lower_bound, shift, span, k;
432 } ALIGNED;
433
434 struct A68_UNION
435 {
436 STATUS_MASK_T status;
437 void *value;
438 } ALIGNED;
439
440 struct A68_SOUND
441 {
442 STATUS_MASK_T status;
443 unt num_channels, sample_rate, bits_per_sample, num_samples, data_size;
444 A68_REF data;
445 };
446
447 struct A68_FILE
448 {
449 STATUS_MASK_T status;
450 A68_CHANNEL channel;
451 A68_FORMAT format;
452 A68_PROCEDURE file_end_mended, page_end_mended, line_end_mended, value_error_mended, open_error_mended, transput_error_mended, format_end_mended, format_error_mended;
453 A68_REF identification, terminator, string;
454 ADDR_T frame_pointer, stack_pointer; // Since formats open frames
455 BOOL_T read_mood, write_mood, char_mood, draw_mood, opened, open_exclusive, end_of_file, tmp_file;
456 FILE_T fd;
457 int transput_buffer, strpos, file_entry;
458 struct
459 {
460 FILE *stream;
461 #if defined (HAVE_GNU_PLOTUTILS)
462 plPlotter *plotter;
463 plPlotterParams *plotter_params;
464 #endif
465 BOOL_T device_made, device_opened;
466 A68_REF device, page_size;
467 int device_handle /* deprecated */ , window_x_size, window_y_size;
468 REAL_T x_coord, y_coord, red, green, blue;
469 }
470 device;
471 #if defined (HAVE_POSTGRESQL)
472 # if ! defined (A68_OPTIMISE)
473 PGconn *connection;
474 PGresult *result;
475 # endif
476 #endif
477 };
478
479 #define M_BITS (MODE (BITS))
480 #define M_BOOL (MODE (BOOL))
481 #define M_BYTES (MODE (BYTES))
482 #define M_CHANNEL (MODE (CHANNEL))
483 #define M_CHAR (MODE (CHAR))
484 #define M_COLLITEM (MODE (COLLITEM))
485 #define M_COMPLEX (MODE (COMPLEX))
486 #define M_COMPL (MODE (COMPL))
487 #define M_C_STRING (MODE (C_STRING))
488 #define M_ERROR (MODE (ERROR))
489 #define M_FILE (MODE (FILE))
490 #define M_FLEX_ROW_BOOL (MODE (FLEX_ROW_BOOL))
491 #define M_FLEX_ROW_CHAR (MODE (FLEX_ROW_CHAR))
492 #define M_FORMAT (MODE (FORMAT))
493 #define M_HEX_NUMBER (MODE (HEX_NUMBER))
494 #define M_HIP (MODE (HIP))
495 #define M_INT (MODE (INT))
496 #define M_LONG_BITS (MODE (LONG_BITS))
497 #define M_LONG_BYTES (MODE (LONG_BYTES))
498 #define M_LONG_COMPLEX (MODE (LONG_COMPLEX))
499 #define M_LONG_COMPL (MODE (LONG_COMPL))
500 #define M_LONG_INT (MODE (LONG_INT))
501 #define M_LONG_LONG_BITS (MODE (LONG_LONG_BITS))
502 #define M_LONG_LONG_COMPLEX (MODE (LONG_LONG_COMPLEX))
503 #define M_LONG_LONG_COMPL (MODE (LONG_LONG_COMPL))
504 #define M_LONG_LONG_INT (MODE (LONG_LONG_INT))
505 #define M_LONG_LONG_REAL (MODE (LONG_LONG_REAL))
506 #define M_LONG_REAL (MODE (LONG_REAL))
507 #define M_NIL (MODE (NIL))
508 #define M_NUMBER (MODE (NUMBER))
509 #define M_PIPE (MODE (PIPE))
510 #define M_PROC_LONG_REAL_LONG_REAL (MODE (PROC_LONG_REAL_LONG_REAL))
511 #define M_PROC_REAL_REAL (MODE (PROC_REAL_REAL))
512 #define M_PROC_REF_FILE_BOOL (MODE (PROC_REF_FILE_BOOL))
513 #define M_PROC_REF_FILE_VOID (MODE (PROC_REF_FILE_VOID))
514 #define M_PROC_ROW_CHAR (MODE (PROC_ROW_CHAR))
515 #define M_PROC_STRING (MODE (PROC_STRING))
516 #define M_PROC_VOID (MODE (PROC_VOID))
517 #define M_REAL (MODE (REAL))
518 #define M_REF_BITS (MODE (REF_BITS))
519 #define M_REF_BOOL (MODE (REF_BOOL))
520 #define M_REF_BYTES (MODE (REF_BYTES))
521 #define M_REF_CHAR (MODE (REF_CHAR))
522 #define M_REF_COMPLEX (MODE (REF_COMPLEX))
523 #define M_REF_COMPL (MODE (REF_COMPL))
524 #define M_REF_FILE (MODE (REF_FILE))
525 #define M_REF_FORMAT (MODE (REF_FORMAT))
526 #define M_REF_INT (MODE (REF_INT))
527 #define M_REF_LONG_BITS (MODE (REF_LONG_BITS))
528 #define M_REF_LONG_BYTES (MODE (REF_LONG_BYTES))
529 #define M_REF_LONG_COMPLEX (MODE (REF_LONG_COMPLEX))
530 #define M_REF_LONG_COMPL (MODE (REF_LONG_COMPL))
531 #define M_REF_LONG_INT (MODE (REF_LONG_INT))
532 #define M_REF_LONG_LONG_COMPLEX (MODE (REF_LONG_LONG_COMPLEX))
533 #define M_REF_LONG_LONG_COMPL (MODE (REF_LONG_LONG_COMPL))
534 #define M_REF_LONG_LONG_INT (MODE (REF_LONG_LONG_INT))
535 #define M_REF_LONG_LONG_REAL (MODE (REF_LONG_LONG_REAL))
536 #define M_REF_LONG_REAL (MODE (REF_LONG_REAL))
537 #define M_REF_PIPE (MODE (REF_PIPE))
538 #define M_REF_REAL (MODE (REF_REAL))
539 #define M_REF_REF_FILE (MODE (REF_REF_FILE))
540 #define M_REF_ROW_CHAR (MODE (REF_ROW_CHAR))
541 #define M_REF_ROW_COMPLEX (MODE (REF_ROW_COMPLEX))
542 #define M_REF_ROW_INT (MODE (REF_ROW_INT))
543 #define M_REF_ROW_REAL (MODE (REF_ROW_REAL))
544 #define M_REF_ROW_ROW_COMPLEX (MODE (REF_ROW_ROW_COMPLEX))
545 #define M_REF_ROW_ROW_REAL (MODE (REF_ROW_ROW_REAL))
546 #define M_REF_SOUND (MODE (REF_SOUND))
547 #define M_REF_STRING (MODE (REF_STRING))
548 #define M_ROW_BITS (MODE (ROW_BITS))
549 #define M_ROW_BOOL (MODE (ROW_BOOL))
550 #define M_ROW_CHAR (MODE (ROW_CHAR))
551 #define M_ROW_COMPLEX (MODE (ROW_COMPLEX))
552 #define M_ROW_INT (MODE (ROW_INT))
553 #define M_ROW_LONG_BITS (MODE (ROW_LONG_BITS))
554 #define M_ROW_LONG_LONG_BITS (MODE (ROW_LONG_LONG_BITS))
555 #define M_ROW_REAL (MODE (ROW_REAL))
556 #define M_ROW_ROW_CHAR (MODE (ROW_ROW_CHAR))
557 #define M_ROW_ROW_COMPLEX (MODE (ROW_ROW_COMPLEX))
558 #define M_ROW_ROW_REAL (MODE (ROW_ROW_REAL))
559 #define M_ROW_SIMPLIN (MODE (ROW_SIMPLIN))
560 #define M_ROW_SIMPLOUT (MODE (ROW_SIMPLOUT))
561 #define M_ROWS (MODE (ROWS))
562 #define M_ROW_STRING (MODE (ROW_STRING))
563 #define M_SEMA (MODE (SEMA))
564 #define M_SIMPLIN (MODE (SIMPLIN))
565 #define M_SIMPLOUT (MODE (SIMPLOUT))
566 #define M_SOUND_DATA (MODE (SOUND_DATA))
567 #define M_SOUND (MODE (SOUND))
568 #define M_STRING (MODE (STRING))
569 #define M_UNDEFINED (MODE (UNDEFINED))
570 #define M_VACUUM (MODE (VACUUM))
571 #define M_VOID (MODE (VOID))
572
573 #endif