a68g-plugin.h
1 //! @file a68g-plugin.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_PLUGIN_H__)
23 #define __A68G_PLUGIN_H__
24
25 typedef union UFU UFU;
26
27 union UFU
28 {
29 UNSIGNED_T u;
30 REAL_T f;
31 };
32
33 #define BASIC(p, n) (basic_unit (stems_from ((p), (n))))
34
35 #define CON "const"
36 #define ELM "elem"
37 #define TMP "tmp"
38 #define ARG "arg"
39 #define ARR "array"
40 #define DEC "declarer"
41 #define DRF "deref"
42 #define DSP "display"
43 #define FUN "function"
44 #define PUP "pop"
45 #define REF "ref"
46 #define SEL "field"
47 #define TUP "tuple"
48
49 #define A68_MAKE_NOTHING 0
50 #define A68_MAKE_OTHERS 1
51 #define A68_MAKE_FUNCTION 2
52
53 #define OFFSET_OFF(s) (OFFSET (NODE_PACK (SUB (s))))
54 #define WIDEN_TO(p, a, b) (MOID (p) == MODE (b) && MOID (SUB (p)) == MODE (a))
55
56 #define NEEDS_DNS(m) (m != NO_MOID && (IS (m, REF_SYMBOL) || IS (m, PROC_SYMBOL) || IS (m, UNION_SYMBOL) || IS (m, FORMAT_SYMBOL)))
57
58 #define CODE_EXECUTE(p) {\
59 indentf (out, snprintf (A68 (edit_line), SNPRINTF_SIZE, "EXECUTE_UNIT_TRACE (_NODE_ (%d));", NUMBER (p)));\
60 }
61
62 #define NAME_SIZE 200
63
64 extern BOOK_T *signed_in (int, int, char *);
65 extern BOOL_T basic_argument (NODE_T *);
66 extern BOOL_T basic_call (NODE_T *);
67 extern BOOL_T basic_collateral (NODE_T *);
68 extern BOOL_T basic_conditional (NODE_T *);
69 extern BOOL_T basic_formula (NODE_T *);
70 extern BOOL_T basic_indexer (NODE_T *);
71 extern BOOL_T basic_mode (MOID_T *);
72 extern BOOL_T basic_mode_non_row (MOID_T *);
73 extern BOOL_T basic_monadic_formula (NODE_T *);
74 extern BOOL_T basic_serial (NODE_T *, int);
75 extern BOOL_T basic_slice (NODE_T *);
76 extern BOOL_T basic_unit (NODE_T *);
77 extern BOOL_T basic_unit (NODE_T *);
78 extern BOOL_T need_initialise_frame (NODE_T *);
79 extern BOOL_T primitive_mode (MOID_T *);
80 extern BOOL_T same_tree (NODE_T *, NODE_T *);
81 extern char *compile_call (NODE_T *, FILE_T);
82 extern char *compile_cast (NODE_T *, FILE_T);
83 extern char *compile_denotation (NODE_T *, FILE_T);
84 extern char *compile_dereference_identifier (NODE_T *, FILE_T);
85 extern char *compile_formula (NODE_T *, FILE_T);
86 extern char *compile_identifier (NODE_T *, FILE_T);
87 extern char *gen_basic_conditional (NODE_T *, FILE_T, int);
88 extern char *gen_basic (NODE_T *, FILE_T);
89 extern char *gen_call (NODE_T *, FILE_T, int);
90 extern char *gen_cast (NODE_T *, FILE_T, int);
91 extern char *gen_closed_clause (NODE_T *, FILE_T, int);
92 extern char *gen_code_clause (NODE_T *, FILE_T, int);
93 extern char *gen_collateral_clause (NODE_T *, FILE_T, int);
94 extern char *gen_conditional_clause (NODE_T *, FILE_T, int);
95 extern char *gen_denotation (NODE_T *, FILE_T, int);
96 extern char *gen_deproceduring (NODE_T *, FILE_T, int);
97 extern char *gen_dereference_identifier (NODE_T *, FILE_T, int);
98 extern char *gen_dereference_selection (NODE_T *, FILE_T, int);
99 extern char *gen_dereference_slice (NODE_T *, FILE_T, int);
100 extern char *gen_formula (NODE_T *, FILE_T, int);
101 extern char *gen_identifier (NODE_T *, FILE_T, int);
102 extern char *gen_identity_relation (NODE_T *, FILE_T, int);
103 extern char *gen_int_case_clause (NODE_T *, FILE_T, int);
104 extern char *gen_loop_clause (NODE_T *, FILE_T, int);
105 extern char *gen_selection (NODE_T *, FILE_T, int);
106 extern char *gen_slice (NODE_T *, FILE_T, int);
107 extern char *gen_uniting (NODE_T *, FILE_T, int);
108 extern char *gen_unit (NODE_T *, FILE_T, BOOL_T);
109 extern char *gen_voiding_assignation_identifier (NODE_T *, FILE_T, int);
110 extern char *gen_voiding_assignation_selection (NODE_T *, FILE_T, int);
111 extern char *gen_voiding_assignation_slice (NODE_T *, FILE_T, int);
112 extern char *gen_voiding_call (NODE_T *, FILE_T, int);
113 extern char *gen_voiding_deproceduring (NODE_T *, FILE_T, int);
114 extern char *gen_voiding_formula (NODE_T *, FILE_T, int);
115 extern char *inline_mode (MOID_T *);
116 extern char *internal_mode (MOID_T *);
117 extern char *make_name (char *, char *, char *, int);
118 extern char *make_unic_name (char *, char *, char *, char *);
119 extern char *moid_with_name (char *, MOID_T *, char *);
120 extern DEC_T *add_declaration (DEC_T **, char *, int, char *);
121 extern DEC_T *add_identifier (DEC_T **, int, char *);
122 extern NODE_T *stems_from (NODE_T *, int);
123 extern void comment_source (NODE_T *, FILE_T);
124 extern void constant_folder (NODE_T *, FILE_T, int);
125 extern void gen_assign (NODE_T *, FILE_T, char *);
126 extern void gen_basics (NODE_T *, FILE_T);
127 extern void gen_check_init (NODE_T *, FILE_T, char *);
128 extern void gen_declaration_list (NODE_T *, FILE_T, int *, char *);
129 extern void gen_push (NODE_T *, FILE_T);
130 extern void gen_serial_clause (NODE_T *, FILE_T, NODE_T **, int *, int *, char *, int);
131 extern void gen_units (NODE_T *, FILE_T);
132 extern void get_stack (NODE_T *, FILE_T, char *, char *);
133 extern void indentf (FILE_T, int);
134 extern void indentf (FILE_T, int);
135 extern void indent (FILE_T, char *);
136 extern void indent (FILE_T, char *);
137 extern void init_static_frame (FILE_T, NODE_T *);
138 extern void inline_arguments (NODE_T *, FILE_T, int, int *);
139 extern void inline_call (NODE_T *, FILE_T, int);
140 extern void inline_closed (NODE_T *, FILE_T, int);
141 extern void inline_collateral (NODE_T *, FILE_T, int);
142 extern void inline_collateral_units (NODE_T *, FILE_T, int);
143 extern void inline_comment_source (NODE_T *, FILE_T);
144 extern void inline_conditional (NODE_T *, FILE_T, int);
145 extern void inline_denotation (NODE_T *, FILE_T, int);
146 extern void inline_dereference_identifier (NODE_T *, FILE_T, int);
147 extern void inline_dereference_selection (NODE_T *, FILE_T, int);
148 extern void inline_dereference_slice (NODE_T *, FILE_T, int);
149 extern void inline_formula (NODE_T *, FILE_T, int);
150 extern void inline_identifier (NODE_T *, FILE_T, int);
151 extern void inline_identity_relation (NODE_T *, FILE_T, int);
152 extern void inline_indexer (NODE_T *, FILE_T, int, INT_T *, char *);
153 extern void inline_monadic_formula (NODE_T *, FILE_T, int);
154 extern void inline_ref_identifier (NODE_T *, FILE_T, int);
155 extern void inline_selection (NODE_T *, FILE_T, int);
156 extern void inline_selection_ref_to_ref (NODE_T *, FILE_T, int);
157 extern void inline_single_argument (NODE_T *, FILE_T, int);
158 extern void inline_slice (NODE_T *, FILE_T, int);
159 extern void inline_slice_ref_to_ref (NODE_T *, FILE_T, int);
160 extern void inline_unit (NODE_T *, FILE_T, int);
161 extern void inline_unit (NODE_T *, FILE_T, int);
162 extern void inline_widening (NODE_T *, FILE_T, int);
163 extern void print_declarations (FILE_T, DEC_T *);
164 extern void sign_in (int, int, char *, void *, int);
165 extern void sign_in_name (char *, int *);
166 extern void undentf (FILE_T, int);
167 extern void undent (FILE_T, char *);
168 extern void write_fun_postlude (NODE_T *, FILE_T, char *);
169 extern void write_fun_prelude (NODE_T *, FILE_T, char *);
170 extern void write_prelude (FILE_T);
171
172 // The phases we go through.
173
174 enum
175 { L_NONE = 0, L_DECLARE = 1, L_INITIALISE, L_EXECUTE, L_EXECUTE_2, L_YIELD, L_PUSH };
176
177 #define UNIC_NAME(k) (A68_OPT (unic_functions)[k].fun)
178
179 enum
180 { UNIC_EXISTS, UNIC_MAKE_NEW, UNIC_MAKE_ALT };
181
182 // TRANSLATION tabulates translations for genie actions.
183 // This tells what to call for an A68 action.
184
185 typedef int LEVEL_T;
186
187 typedef struct
188 {
189 GPROC *procedure;
190 char *code;
191 } TRANSLATION;
192
193 extern TRANSLATION *monadics, *dyadics, *functions;
194
195 extern TRANSLATION monadics_nocheck[];
196 extern TRANSLATION monadics_check[];
197 extern TRANSLATION dyadics_nocheck[];
198 extern TRANSLATION dyadics_check[];
199 extern TRANSLATION functions_nocheck[];
200 extern TRANSLATION functions_check[];
201 extern TRANSLATION constants[];
202
203 #endif