3 typedef unsigned char byte
;
4 typedef unsigned short symbol
;
9 #define MALLOC check_malloc
10 #define FREE check_free
12 #define NEW(type, p) struct type * p = (struct type *) MALLOC(sizeof(struct type))
13 #define NEWVEC(type, p, n) struct type * p = (struct type *) MALLOC(sizeof(struct type) * n)
16 #define SIZE(p) ((int *)(p))[-1]
17 #define CAPACITY(p) ((int *)(p))[-2]
19 extern symbol
* create_b(int n
);
20 extern void report_b(FILE * out
, const symbol
* p
);
21 extern void lose_b(symbol
* p
);
22 extern symbol
* increase_capacity(symbol
* p
, int n
);
23 extern symbol
* move_to_b(symbol
* p
, int n
, const symbol
* q
);
24 extern symbol
* add_to_b(symbol
* p
, int n
, const symbol
* q
);
25 extern symbol
* copy_b(const symbol
* p
);
26 extern char * b_to_s(const symbol
* p
);
27 extern symbol
* add_s_to_b(symbol
* p
, const char * s
);
29 #define MOVE_TO_B(B, LIT) \
30 move_to_b(B, sizeof(LIT) / sizeof(LIT[0]), LIT)
32 struct str
; /* defined in space.c */
34 extern struct str
* str_new(void);
35 extern void str_delete(struct str
* str
);
36 extern void str_append(struct str
* str
, struct str
* add
);
37 extern void str_append_ch(struct str
* str
, char add
);
38 extern void str_append_b(struct str
* str
, symbol
* q
);
39 extern void str_append_string(struct str
* str
, const char * s
);
40 extern void str_append_int(struct str
* str
, int i
);
41 extern void str_clear(struct str
* str
);
42 extern void str_assign(struct str
* str
, char * s
);
43 extern struct str
* str_copy(struct str
* old
);
44 extern symbol
* str_data(struct str
* str
);
45 extern int str_len(struct str
* str
);
46 extern int str_back(struct str
*str
);
47 extern int get_utf8(const symbol
* p
, int * slot
);
48 extern int put_utf8(int ch
, symbol
* p
);
49 extern void output_str(FILE * outfile
, struct str
* str
);
51 typedef enum { ENC_SINGLEBYTE
, ENC_UTF8
, ENC_WIDECHARS
} enc
;
61 /* struct input must be a prefix of struct tokeniser. */
74 struct include
* next
;
81 #include "syswords2.h"
101 /* struct input must be a prefix of struct tokeniser. */
114 struct m_pair
* m_pairs
;
123 struct include
* includes
;
125 /* Mode in which U+ has been used:
126 * UPLUS_NONE - not used yet
127 * UPLUS_DEFINED - stringdef U+xxxx ....
128 * UPLUS_UNICODE - {U+xxxx} used with implicit meaning
132 char token_disabled
[NUM_TOKEN_CODES
];
135 extern symbol
* get_input(symbol
* p
, char ** p_file
);
136 extern struct tokeniser
* create_tokeniser(symbol
* b
, char * file
);
137 extern int read_token(struct tokeniser
* t
);
138 extern const char * name_of_token(int code
);
139 extern void disable_token(struct tokeniser
* t
, int code
);
140 extern void close_tokeniser(struct tokeniser
* t
);
142 extern int space_count
;
143 extern void * check_malloc(int n
);
144 extern void check_free(void * p
);
152 int type
; /* t_string etc */
153 int mode
; /* )_ for routines, externals */
154 struct node
* definition
; /* ) */
155 int count
; /* 0, 1, 2 for each type */
156 int among_func_count
; /* 1, 2, 3 for routines called by among */
157 struct grouping
* grouping
; /* for grouping names */
159 byte used_in_among
; /* Function used in among? */
160 struct node
* used
; /* First use, or NULL if not used */
161 struct name
* local_to
; /* Local to one routine/external */
162 int declaration_line_number
;/* Line number of declaration */
166 struct literalstring
{
168 struct literalstring
* next
;
175 symbol
* b
; /* the string giving the case */
176 int size
; /* - and its size */
177 struct node
* p
; /* the corresponding node for this string */
178 int i
; /* the amongvec index of the longest substring of b */
179 int result
; /* the numeric result for the case */
180 struct name
* function
;
187 struct amongvec
* b
; /* pointer to the amongvec */
188 int number
; /* amongs are numbered 0, 1, 2 ... */
189 int literalstring_count
; /* in this among */
190 int command_count
; /* in this among */
191 int function_count
; /* in this among */
192 struct node
* starter
; /* i.e. among( (starter) 'string' ... ) */
193 struct node
* substring
; /* i.e. substring ... among ( ... ) */
198 struct grouping
* next
;
199 int number
; /* groupings are numbered 0, 1, 2 ... */
200 symbol
* b
; /* the characters of this group */
201 int largest_ch
; /* character with max code */
202 int smallest_ch
; /* character with min code */
203 struct name
* name
; /* so g->name->grouping == g */
211 struct node
* aux
; /* used in setlimit */
212 struct among
* among
; /* used in among */
218 symbol
* literalstring
;
221 int amongvar_needed
; /* used in routine definitions */
228 t_string
= 0, t_boolean
= 1, t_integer
= 2, t_routine
= 3, t_external
= 4,
231 /* If this list is extended, adjust wvn in generator.c */
234 /* In name_count[i] below, remember that
247 struct tokeniser
* tokeniser
;
250 struct literalstring
* literalstrings
;
252 byte modifyable
; /* false inside reverse(...) */
253 struct node
* program
;
254 struct node
* program_end
;
255 int name_count
[t_size
]; /* name_count[i] counts the number of names of type i */
256 struct among
* amongs
;
257 struct among
* amongs_end
;
259 int amongvar_needed
; /* used in reading routine definitions */
260 struct grouping
* groupings
;
261 struct grouping
* groupings_end
;
262 struct node
* substring
; /* pending 'substring' in current routine definition */
264 byte int_limits_used
; /* are maxint or minint used? */
267 enum analyser_modes
{
269 m_forward
= 0, m_backward
/*, m_integer */
273 extern void print_program(struct analyser
* a
);
274 extern struct analyser
* create_analyser(struct tokeniser
* t
);
275 extern void close_analyser(struct analyser
* a
);
277 extern void read_program(struct analyser
* a
);
281 struct analyser
* analyser
;
282 struct options
* options
;
283 int unreachable
; /* 0 if code can be reached, 1 if current code
285 int var_number
; /* Number of next variable to use. */
286 struct str
* outbuf
; /* temporary str to store output */
287 struct str
* declarations
; /* str storing variable declarations */
289 #ifndef DISABLE_PYTHON
294 /* if > 0, keep_count to restore in case of a failure;
295 * if < 0, the negated keep_count for the limit to restore in case of
297 int failure_keep_count
;
298 #if !defined(DISABLE_JAVA) && !defined(DISABLE_JS) && !defined(DISABLE_PYTHON) && !defined(DISABLE_CSHARP)
299 struct str
* failure_str
; /* This is used by some generators instead of failure_keep_count */
302 int label_used
; /* Keep track of whether the failure label is used. */
305 int copy_from_count
; /* count of calls to copy_from() */
307 const char * S
[10]; /* strings */
308 symbol
* B
[10]; /* blocks */
309 int I
[10]; /* integers */
310 struct name
* V
[5]; /* variables */
311 symbol
* L
[5]; /* literals, used in formatted write */
313 int line_count
; /* counts number of lines output */
314 int line_labelled
; /* in ISO C, will need extra ';' if it is a block end */
315 int literalstring_count
;
316 int keep_count
; /* used to number keep/restore pairs to avoid compiler warnings
317 about shadowed variables */
322 /* for the command line: */
324 const char * output_file
;
330 enum { LANG_JAVA
, LANG_C
, LANG_CPLUSPLUS
, LANG_CSHARP
, LANG_PYTHON
, LANG_JAVASCRIPT
, LANG_RUST
, LANG_GO
} make_lang
;
331 const char * externals_prefix
;
332 const char * variables_prefix
;
333 const char * runtime_path
;
334 const char * parent_class_name
;
335 const char * package
;
336 const char * go_package
;
337 const char * go_snowball_runtime
;
338 const char * string_class
;
339 const char * among_class
;
340 struct include
* includes
;
341 struct include
* includes_end
;
344 /* Generator functions common to several backends. */
346 extern struct generator
* create_generator(struct analyser
* a
, struct options
* o
);
347 extern void close_generator(struct generator
* g
);
349 extern void write_char(struct generator
* g
, int ch
);
350 extern void write_newline(struct generator
* g
);
351 extern void write_string(struct generator
* g
, const char * s
);
352 extern void write_int(struct generator
* g
, int i
);
353 extern void write_b(struct generator
* g
, symbol
* b
);
354 extern void write_str(struct generator
* g
, struct str
* str
);
356 extern int K_needed(struct generator
* g
, struct node
* p
);
357 extern int repeat_restore(struct generator
* g
, struct node
* p
);
359 /* Generator for C code. */
360 extern void generate_program_c(struct generator
* g
);
363 /* Generator for Java code. */
364 extern void generate_program_java(struct generator
* g
);
367 #ifndef DISABLE_CSHARP
368 /* Generator for C# code. */
369 extern void generate_program_csharp(struct generator
* g
);
372 #ifndef DISABLE_PYTHON
373 /* Generator for Python code. */
374 extern void generate_program_python(struct generator
* g
);
378 extern void generate_program_js(struct generator
* g
);
382 extern void generate_program_rust(struct generator
* g
);
386 extern void generate_program_go(struct generator
* g
);