mittens 0.3.0 → 0.3.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (174) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +8 -0
  3. data/Gemfile +2 -1
  4. data/README.md +2 -2
  5. data/Rakefile +12 -5
  6. data/ext/mittens/extconf.rb +3 -1
  7. data/lib/mittens/version.rb +1 -1
  8. data/vendor/snowball/.github/workflows/ci.yml +144 -17
  9. data/vendor/snowball/.github/workflows/coverage.yml +117 -0
  10. data/vendor/snowball/.github/workflows/runtime-tests.yml +26 -0
  11. data/vendor/snowball/.gitignore +33 -7
  12. data/vendor/snowball/CONTRIBUTING.rst +7 -0
  13. data/vendor/snowball/COPYING +1 -1
  14. data/vendor/snowball/GNUmakefile +736 -298
  15. data/vendor/snowball/NEWS +1394 -7
  16. data/vendor/snowball/README.rst +8 -8
  17. data/vendor/snowball/ada/generate/generate.adb +5 -5
  18. data/vendor/snowball/ada/src/stemmer.adb +177 -188
  19. data/vendor/snowball/ada/src/stemmer.ads +86 -89
  20. data/vendor/snowball/ada/src/stemwords.adb +21 -5
  21. data/vendor/snowball/algorithms/czech.sbl +255 -0
  22. data/vendor/snowball/algorithms/danish.sbl +22 -10
  23. data/vendor/snowball/algorithms/english.sbl +7 -4
  24. data/vendor/snowball/algorithms/esperanto.sbl +6 -7
  25. data/vendor/snowball/algorithms/estonian.sbl +9 -4
  26. data/vendor/snowball/algorithms/finnish.sbl +33 -21
  27. data/vendor/snowball/algorithms/german.sbl +5 -0
  28. data/vendor/snowball/algorithms/indonesian.sbl +115 -96
  29. data/vendor/snowball/algorithms/italian.sbl +26 -1
  30. data/vendor/snowball/algorithms/lithuanian.sbl +13 -13
  31. data/vendor/snowball/algorithms/norwegian.sbl +17 -6
  32. data/vendor/snowball/algorithms/persian.sbl +387 -0
  33. data/vendor/snowball/algorithms/polish.sbl +177 -0
  34. data/vendor/snowball/algorithms/sesotho.sbl +115 -0
  35. data/vendor/snowball/algorithms/turkish.sbl +4 -4
  36. data/vendor/snowball/compiler/analyser.c +2002 -711
  37. data/vendor/snowball/compiler/driver.c +460 -298
  38. data/vendor/snowball/compiler/generator.c +439 -1965
  39. data/vendor/snowball/compiler/generator_ada.c +605 -430
  40. data/vendor/snowball/compiler/generator_c.c +2227 -0
  41. data/vendor/snowball/compiler/generator_csharp.c +365 -274
  42. data/vendor/snowball/compiler/generator_dart.c +1476 -0
  43. data/vendor/snowball/compiler/generator_go.c +348 -270
  44. data/vendor/snowball/compiler/generator_java.c +330 -233
  45. data/vendor/snowball/compiler/generator_js.c +534 -385
  46. data/vendor/snowball/compiler/generator_pascal.c +361 -320
  47. data/vendor/snowball/compiler/generator_php.c +1445 -0
  48. data/vendor/snowball/compiler/generator_python.c +399 -299
  49. data/vendor/snowball/compiler/generator_rust.c +370 -261
  50. data/vendor/snowball/compiler/generator_zig.c +1474 -0
  51. data/vendor/snowball/compiler/header.h +153 -86
  52. data/vendor/snowball/compiler/space.c +121 -63
  53. data/vendor/snowball/compiler/tokeniser.c +286 -182
  54. data/vendor/snowball/compiler/tokens.h +71 -0
  55. data/vendor/snowball/csharp/Snowball/Among.cs +14 -26
  56. data/vendor/snowball/csharp/Snowball/AssemblyInfo.cs +3 -3
  57. data/vendor/snowball/csharp/Snowball/Stemmer.cs +41 -45
  58. data/vendor/snowball/csharp/Stemwords/Program.cs +20 -14
  59. data/vendor/snowball/cxx/.gitignore +4 -0
  60. data/vendor/snowball/cxx/generate_algorithms.pl +87 -0
  61. data/vendor/snowball/cxx/stemmer.h +12 -0
  62. data/vendor/snowball/cxx/stemwords.cxx +176 -0
  63. data/vendor/snowball/cxx/utilities.cxx +2 -0
  64. data/vendor/snowball/dart/.gitignore +4 -0
  65. data/vendor/snowball/dart/analysis_options.yaml +1 -0
  66. data/vendor/snowball/dart/example/test_app.dart +65 -0
  67. data/vendor/snowball/dart/generate_algorithms.pl +21 -0
  68. data/vendor/snowball/dart/lib/snowball.dart +18 -0
  69. data/vendor/snowball/dart/lib/src/snowball.dart +339 -0
  70. data/vendor/snowball/dart/pubspec.yaml +17 -0
  71. data/vendor/snowball/doc/libstemmer_dart_README +37 -0
  72. data/vendor/snowball/doc/libstemmer_js_README +2 -2
  73. data/vendor/snowball/doc/libstemmer_php_README +38 -0
  74. data/vendor/snowball/doc/libstemmer_python_README +3 -3
  75. data/vendor/snowball/examples/stemwords.c +18 -3
  76. data/vendor/snowball/go/README.md +12 -4
  77. data/vendor/snowball/go/env.go +12 -14
  78. data/vendor/snowball/go/stemwords/main.go +2 -1
  79. data/vendor/snowball/java/org/tartarus/snowball/CharArraySequence.java +36 -0
  80. data/vendor/snowball/java/org/tartarus/snowball/SnowballProgram.java +17 -34
  81. data/vendor/snowball/java/org/tartarus/snowball/SnowballStemmer.java +0 -2
  82. data/vendor/snowball/javascript/base-stemmer.js +219 -252
  83. data/vendor/snowball/javascript/stemwords.js +86 -58
  84. data/vendor/snowball/libstemmer/mkmodules.pl +1 -1
  85. data/vendor/snowball/libstemmer/modules.txt +4 -0
  86. data/vendor/snowball/pascal/SnowballProgram.pas +18 -31
  87. data/vendor/snowball/php/base-stemmer.php +453 -0
  88. data/vendor/snowball/php/stemwords.php +25 -0
  89. data/vendor/snowball/python/create_init.py +16 -21
  90. data/vendor/snowball/python/pyproject.toml +3 -0
  91. data/vendor/snowball/python/setup.py +5 -7
  92. data/vendor/snowball/python/snowballstemmer/among.py +1 -2
  93. data/vendor/snowball/python/snowballstemmer/basestemmer.py +24 -33
  94. data/vendor/snowball/python/stemwords.py +72 -63
  95. data/vendor/snowball/runtime/api.c +11 -42
  96. data/vendor/snowball/runtime/api.h +11 -9
  97. data/vendor/snowball/runtime/snowball_runtime.h +110 -0
  98. data/vendor/snowball/runtime/utilities.c +282 -106
  99. data/vendor/snowball/rust/src/main.rs +2 -2
  100. data/vendor/snowball/rust/src/snowball/snowball_env.rs +7 -9
  101. data/vendor/snowball/tests/compilertest +62 -0
  102. data/vendor/snowball/tests/errors/ae-errors.sbl +53 -0
  103. data/vendor/snowball/tests/errors/ae-errors.stderr +8 -0
  104. data/vendor/snowball/tests/errors/bad-dollar.sbl +14 -0
  105. data/vendor/snowball/tests/errors/bad-dollar.stderr +4 -0
  106. data/vendor/snowball/tests/errors/bad-grouping-definition.sbl +9 -0
  107. data/vendor/snowball/tests/errors/bad-grouping-definition.stderr +6 -0
  108. data/vendor/snowball/tests/errors/missing-bra.sbl +6 -0
  109. data/vendor/snowball/tests/errors/missing-bra.stderr +3 -0
  110. data/vendor/snowball/tests/errors/missing-command.sbl +9 -0
  111. data/vendor/snowball/tests/errors/missing-command.stderr +1 -0
  112. data/vendor/snowball/tests/errors/missing-ket-backwardmode.sbl +3 -0
  113. data/vendor/snowball/tests/errors/missing-ket-backwardmode.stderr +1 -0
  114. data/vendor/snowball/tests/errors/missing-ket.sbl +7 -0
  115. data/vendor/snowball/tests/errors/missing-ket.stderr +6 -0
  116. data/vendor/snowball/tests/errors/notdefined.sbl +4 -0
  117. data/vendor/snowball/tests/errors/notdefined.stderr +2 -0
  118. data/vendor/snowball/tests/errors/string-omitted.sbl +5 -0
  119. data/vendor/snowball/tests/errors/string-omitted.stderr +1 -0
  120. data/vendor/snowball/tests/errors/undeclared.sbl +20 -0
  121. data/vendor/snowball/tests/errors/undeclared.stderr +9 -0
  122. data/vendor/snowball/tests/errors/unexpected-token.sbl +24 -0
  123. data/vendor/snowball/tests/errors/unexpected-token.stderr +17 -0
  124. data/vendor/snowball/tests/errors/wrongdirection.sbl +14 -0
  125. data/vendor/snowball/tests/errors/wrongdirection.stderr +1 -0
  126. data/vendor/snowball/tests/runtime/among.sbl +19 -0
  127. data/vendor/snowball/tests/runtime/arithmeticexpr.sbl +86 -0
  128. data/vendor/snowball/tests/runtime/attachinsert.sbl +47 -0
  129. data/vendor/snowball/tests/runtime/booleans.sbl +19 -0
  130. data/vendor/snowball/tests/runtime/externals.sbl +22 -0
  131. data/vendor/snowball/tests/runtime/hop.sbl +12 -0
  132. data/vendor/snowball/tests/runtime/integertests.sbl +60 -0
  133. data/vendor/snowball/tests/runtime/intlimits.sbl +25 -0
  134. data/vendor/snowball/tests/runtime/naming.sbl +20 -0
  135. data/vendor/snowball/tests/runtime/not.sbl +30 -0
  136. data/vendor/snowball/tests/runtime/or.sbl +17 -0
  137. data/vendor/snowball/tests/runtime/repeat.sbl +16 -0
  138. data/vendor/snowball/tests/runtime/setlimit.sbl +24 -0
  139. data/vendor/snowball/tests/runtime/sizelen.sbl +56 -0
  140. data/vendor/snowball/tests/runtime/slice.sbl +27 -0
  141. data/vendor/snowball/tests/runtime/stringdollar.sbl +39 -0
  142. data/vendor/snowball/tests/runtime/strings.sbl +66 -0
  143. data/vendor/snowball/tests/runtime/test.sbl +19 -0
  144. data/vendor/snowball/tests/stemtest.c +41 -1
  145. data/vendor/snowball/tests/syntax/canon.sbl +32 -0
  146. data/vendor/snowball/tests/syntax/canon.stderr +0 -0
  147. data/vendor/snowball/tests/syntax/canon.syntax +57 -0
  148. data/vendor/snowball/tests/syntax/emptyprogram.sbl +2 -0
  149. data/vendor/snowball/tests/syntax/emptyprogram.syntax +0 -0
  150. data/vendor/snowball/tests/syntax/groupings.sbl +11 -0
  151. data/vendor/snowball/tests/syntax/inline.sbl +144 -0
  152. data/vendor/snowball/tests/syntax/inline.stderr +0 -0
  153. data/vendor/snowball/tests/syntax/inline.syntax +121 -0
  154. data/vendor/snowball/tests/syntax/legacy.sbl +17 -0
  155. data/vendor/snowball/tests/syntax/legacy.stderr +5 -0
  156. data/vendor/snowball/tests/syntax/legacy.syntax +19 -0
  157. data/vendor/snowball/tests/syntax/loops.sbl +14 -0
  158. data/vendor/snowball/tests/syntax/loops.stderr +9 -0
  159. data/vendor/snowball/tests/syntax/loops.syntax +29 -0
  160. data/vendor/snowball/tests/syntax/noops.sbl +76 -0
  161. data/vendor/snowball/tests/syntax/noops.stderr +27 -0
  162. data/vendor/snowball/tests/syntax/noops.syntax +135 -0
  163. data/vendor/snowball/tests/syntax/simplifyae.sbl +21 -0
  164. data/vendor/snowball/tests/syntax/simplifyae.stderr +0 -0
  165. data/vendor/snowball/tests/syntax/simplifyae.syntax +39 -0
  166. data/vendor/snowball/tests/syntax/unused.sbl +18 -0
  167. data/vendor/snowball/tests/syntax/unused.stderr +7 -0
  168. data/vendor/snowball/tests/syntax/unused.syntax +3 -0
  169. data/vendor/snowball/zig/env.zig +599 -0
  170. data/vendor/snowball/zig/generate_algorithms.pl +19 -0
  171. data/vendor/snowball/zig/stemwords.zig +123 -0
  172. metadata +102 -4
  173. data/vendor/snowball/compiler/syswords.h +0 -86
  174. data/vendor/snowball/runtime/header.h +0 -62
@@ -1,21 +1,27 @@
1
1
  #include <stdio.h>
2
+ #if __STDC_VERSION__ < 202311l
3
+ # include <stdbool.h>
4
+ #endif
2
5
 
3
- #define SNOWBALL_VERSION "3.0.1"
6
+ #define SNOWBALL_VERSION "3.1.1"
4
7
 
5
8
  typedef unsigned char byte;
6
9
  typedef unsigned short symbol;
7
10
 
8
- #define true 1
9
- #define false 0
10
-
11
11
  #define MALLOC check_malloc
12
12
  #define FREE check_free
13
13
 
14
- #define NEW(type, p) struct type * p = (struct type *) MALLOC(sizeof(struct type))
15
- #define NEWVEC(type, p, n) struct type * p = (struct type *) MALLOC(sizeof(struct type) * (n))
14
+ // Declare variable `V` of type `struct TYPE *` and dynamically allocate it.
15
+ // We exit on allocation failure so `V` is always non-NULL.
16
+ #define NEW(TYPE, V) struct TYPE * V = (struct TYPE *) MALLOC(sizeof(struct TYPE))
16
17
 
17
- #define SIZE(p) ((int *)(p))[-1]
18
- #define CAPACITY(p) ((int *)(p))[-2]
18
+ // Similar to NEW() but allocates an array of N objects of type `struct TYPE *`.
19
+ #define NEWVEC(TYPE, V, N) struct TYPE * V = (struct TYPE *) MALLOC(sizeof(struct TYPE) * (N))
20
+
21
+ #define SIZE(p) ((const int *)(p))[-1]
22
+ #define SET_SIZE(p, n) ((int *)(p))[-1] = (n)
23
+ #define ADD_TO_SIZE(p, n) ((int *)(p))[-1] += (n)
24
+ #define CAPACITY(p) ((int *)(p))[-2]
19
25
 
20
26
  extern symbol * create_b(int n);
21
27
  extern void report_b(FILE * out, const symbol * p);
@@ -29,15 +35,20 @@ extern symbol * add_symbol_to_b(symbol * p, symbol ch);
29
35
  // These routines are like those above but work in byte instead of symbol.
30
36
 
31
37
  extern byte * create_s(int n);
38
+ extern byte * create_s_from_sz(const char * s);
39
+ extern byte * create_s_from_data(const char * s, int n);
40
+
32
41
  extern void report_s(FILE * out, const byte * p);
33
42
  extern void lose_s(byte * p);
34
43
  extern byte * increase_capacity_s(byte * p, int n);
44
+ extern byte * ensure_capacity_s(byte * p, int n);
35
45
  extern byte * copy_s(const byte * p);
36
- extern byte * add_s_to_s(byte * p, const char * s, int n);
46
+ extern byte * add_s_to_s(byte * p, const byte * s);
47
+ extern byte * add_slen_to_s(byte * p, const char * s, int n);
37
48
  extern byte * add_sz_to_s(byte * p, const char * s);
38
49
  extern byte * add_char_to_s(byte * p, char ch);
39
50
  // "" LIT is a trick to make compilation fail if LIT is not a string literal.
40
- #define add_literal_to_s(P, LIT) add_s_to_s(P, "" LIT, sizeof(LIT) - 1)
51
+ #define add_literal_to_s(P, LIT) add_slen_to_s(P, "" LIT, sizeof(LIT) - 1)
41
52
 
42
53
  struct str; /* defined in space.c */
43
54
 
@@ -56,12 +67,13 @@ extern byte * str_data(const struct str * str);
56
67
  extern int str_len(const struct str * str);
57
68
  extern int str_back(const struct str *str);
58
69
  extern void str_pop(const struct str *str);
70
+ extern void str_pop_n(const struct str *str, int n);
59
71
  extern void output_str(FILE * outfile, struct str * str);
60
72
 
61
73
  extern int get_utf8(const symbol * p, int * slot);
62
74
  extern int put_utf8(int ch, symbol * p);
63
75
 
64
- typedef enum { ENC_SINGLEBYTE, ENC_UTF8, ENC_WIDECHARS } enc;
76
+ typedef enum { ENC_SINGLEBYTE = 0, ENC_UTF8, ENC_WIDECHARS } enc;
65
77
 
66
78
  /* stringdef name and value */
67
79
  struct m_pair {
@@ -120,7 +132,7 @@ enum token_codes {
120
132
  c_literalstring,
121
133
 
122
134
  /* These token values are synthesised by the analyser. */
123
- c_mathassign,
135
+ c_stringassign,
124
136
  c_neg,
125
137
  c_call,
126
138
  c_grouping,
@@ -130,12 +142,13 @@ enum token_codes {
130
142
  c_gopast_grouping,
131
143
  c_goto_non,
132
144
  c_gopast_non,
145
+ c_not_booltest,
133
146
 
134
147
  NUM_TOKEN_CODES
135
148
  };
136
149
 
137
150
  enum uplus_modes {
138
- UPLUS_NONE,
151
+ UPLUS_NONE = 0,
139
152
  UPLUS_DEFINED,
140
153
  UPLUS_UNICODE
141
154
  };
@@ -157,18 +170,21 @@ struct tokeniser {
157
170
  // Used for c_name names.
158
171
  byte * s;
159
172
  int number;
173
+ // String escape start character or -1.
160
174
  int m_start;
175
+ // String escape end character.
161
176
  int m_end;
177
+ // Link list of stringdefs.
162
178
  struct m_pair * m_pairs;
179
+ // Nesting depth of get directives.
163
180
  int get_depth;
164
181
  int error_count;
165
182
  int token;
166
183
  int previous_token;
167
- byte token_held;
168
- byte token_reported_as_unexpected;
184
+ bool token_held;
185
+ bool token_reported_as_unexpected;
169
186
  enc encoding;
170
187
 
171
- int omission;
172
188
  struct include * includes;
173
189
 
174
190
  /* Mode in which U+ has been used:
@@ -194,6 +210,13 @@ extern int space_count;
194
210
  extern void * check_malloc(size_t n);
195
211
  extern void check_free(void * p);
196
212
 
213
+ extern int checked_snprintf(char *str, size_t size,
214
+ const char *restrict format, ...)
215
+ #ifdef __GNUC__
216
+ __attribute__ ((__format__ (__printf__, 3, 4)))
217
+ #endif
218
+ ;
219
+
197
220
  struct node;
198
221
 
199
222
  struct name {
@@ -201,16 +224,24 @@ struct name {
201
224
  byte * s;
202
225
  byte type; /* t_string etc */
203
226
  byte mode; /* for routines, externals (m_forward, etc) */
204
- byte referenced;
205
- byte used_in_among; /* Function used in among? */
206
- byte value_used; /* (For variables) is its value ever used? */
207
- byte initialised; /* (For variables) is it ever initialised? */
208
- byte used_in_definition; /* (grouping) used in grouping definition? */
209
- struct node * definition; /* for routines, externals */
210
- int count; /* 0, 1, 2 for each type */
227
+ bool value_used; /* (For variables) is its value ever used? */
228
+ bool initialised; /* (For variables) is it ever initialised? */
229
+ bool used_in_definition; /* (grouping) used in grouping definition? */
230
+ bool amongvar_needed; /* for routines, externals */
231
+ bool among_with_function; /* (routines/externals) contains among with func */
232
+ bool case_collision; /* A name of the same type differs only by case */
233
+ struct node * definition; /* (routines/externals) c_define node */
234
+ int uses_in_among; /* (routines/externals) Count of uses in amongs */
235
+ // Initialised to -1; set to -2 if reachable from an external.
236
+ // Reachable names are then numbered 0, 1, 2, ... with separate numbering
237
+ // per type.
238
+ int count;
239
+ // Number of references to this name.
240
+ int references;
211
241
  struct grouping * grouping; /* for grouping names */
212
242
  struct node * used; /* First use, or NULL if not used */
213
243
  struct name * local_to; /* Local to one routine/external */
244
+ int among_index; /* for functions used in among */
214
245
  int declaration_line_number;/* Line number of declaration */
215
246
  };
216
247
 
@@ -225,7 +256,11 @@ struct amongvec {
225
256
  struct node * action; /* the corresponding action */
226
257
  int i; /* the amongvec index of the longest substring of b */
227
258
  int result; /* the numeric result for the case */
228
- int line_number; /* for diagnostics and stable sorting */
259
+ int line_number; /* for diagnostics */
260
+ int function_index; /* 1-based */
261
+ // 0-based index giving order of strings in source. Used for stable
262
+ // sorting of amongvec entries and -coverage.
263
+ int string_index;
229
264
  struct name * function;
230
265
  };
231
266
 
@@ -234,15 +269,19 @@ struct among {
234
269
  struct amongvec * b; /* pointer to the amongvec */
235
270
  int number; /* amongs are numbered 0, 1, 2 ... */
236
271
  int literalstring_count; /* in this among */
237
- int command_count; /* in this among (includes "no command" entries) */
272
+ int command_count; /* in this among (excludes "no command" entries) */
238
273
  int nocommand_count; /* number of "no command" entries in this among */
239
- int function_count; /* in this among */
240
- int amongvar_needed; /* do we need to set among_var? */
241
- int always_matches; /* will this among always match? */
274
+ int function_count; /* number of different functions in this among */
275
+ bool amongvar_needed; /* do we need to set among_var? */
276
+ bool always_matches; /* will this among always match? */
277
+ bool used; /* is this among in reachable code? */
278
+ int same_action; /* type code if same for all actions; <0 otherwise */
242
279
  int shortest_size; /* smallest non-zero string length in this among */
280
+ int longest_size; /* longest string length in this among */
243
281
  struct node * substring; /* i.e. substring ... among ( ... ) */
244
282
  struct node ** commands; /* array with command_count entries */
245
283
  struct node * node; /* pointer to the node for this among */
284
+ struct name * in_routine; /* pointer to name for routine this among is in */
246
285
  };
247
286
 
248
287
  struct grouping {
@@ -266,14 +305,17 @@ struct node {
266
305
  // (e.g. 42, 2+2, lenof '{U+0246}') from constant AEs which can have a
267
306
  // different value depending on platform and/or target language and/or
268
307
  // Unicode mode (e.g. maxint, sizeof '{U+0246}') - some warnings which
269
- // depend on a constant AEs value should only fire for the first set.
270
- byte fixed_constant;
308
+ // depend on a constant AE's value should only fire for the first set.
309
+ bool fixed_constant;
310
+ // Return 0 for always f.
311
+ // Return 1 for always t.
312
+ // Return -1 for don't know (or can raise t or f).
313
+ signed char possible_signals;
271
314
  struct node * AE;
272
315
  struct name * name;
273
316
  symbol * literalstring;
274
317
  int number;
275
318
  int line_number;
276
- int amongvar_needed; /* used in routine definitions */
277
319
  };
278
320
 
279
321
  enum name_types {
@@ -285,37 +327,32 @@ enum name_types {
285
327
  /* If this list is extended, adjust write_varname in generator.c */
286
328
  };
287
329
 
288
- /* In name_count[i] below, remember that
289
- type is
290
- ----+----
291
- 0 | string
292
- 1 | boolean
293
- 2 | integer
294
- 3 | routine
295
- 4 | external
296
- 5 | grouping
297
- */
298
-
299
330
  struct analyser {
300
331
  struct tokeniser * tokeniser;
301
332
  struct node * nodes;
302
333
  struct name * names;
303
334
  struct literalstring * literalstrings;
304
335
  byte mode;
305
- byte modifyable; /* false inside reverse(...) */
336
+ bool modifyable; /* false inside reverse(...) */
306
337
  struct node * program;
307
338
  struct node * program_end;
308
- int name_count[t_size]; /* name_count[i] counts the number of names of type i */
339
+ /* name_count[i] counts the number of names of type i, where i is an enum
340
+ * name_types value. These counts *EXCLUDE* localised variables and
341
+ * variables which optimised away (e.g. declared but never used).
342
+ */
343
+ int name_count[t_size];
344
+ /* name_count[t_string] + name_count[t_boolean] + name_count[t_integer] */
345
+ int variable_count;
309
346
  struct among * amongs;
310
347
  struct among * amongs_end;
311
- int among_count;
312
- int amongvar_needed; /* used in reading routine definitions */
313
348
  int among_with_function_count; /* number of amongs with functions */
314
349
  struct grouping * groupings;
315
350
  struct grouping * groupings_end;
316
351
  struct node * substring; /* pending 'substring' in current routine definition */
352
+ struct name * current_routine; /* routine/external we're currently on. */
317
353
  enc encoding;
318
- byte int_limits_used; /* are maxint or minint used? */
354
+ bool int_limits_used; /* are maxint or minint used? */
355
+ bool debug_used; /* is the '?' command used? */
319
356
  };
320
357
 
321
358
  enum analyser_modes {
@@ -330,20 +367,22 @@ extern void print_program(struct analyser * a);
330
367
  extern struct analyser * create_analyser(struct tokeniser * t);
331
368
  extern void close_analyser(struct analyser * a);
332
369
 
333
- extern void read_program(struct analyser * a);
370
+ /** Read and analyse the program.
371
+ *
372
+ * @param localise_mask bitmask of variable types the generator can localise
373
+ */
374
+ extern void read_program(struct analyser * a, unsigned localise_mask);
334
375
 
335
376
  struct generator {
336
377
  struct analyser * analyser;
337
378
  struct options * options;
338
- int unreachable; /* 0 if code can be reached, 1 if current code
339
- * is unreachable. */
379
+ bool unreachable; /* false if code can be reached, true if current
380
+ * code is unreachable. */
340
381
  int var_number; /* Number of next variable to use. */
341
382
  struct str * outbuf; /* temporary str to store output */
342
383
  struct str * declarations; /* str storing variable declarations */
343
384
  int next_label;
344
- #ifndef DISABLE_PYTHON
345
- int max_label;
346
- #endif
385
+ int max_label; /* Only used by Python */
347
386
  int margin;
348
387
 
349
388
  /* Target language code to execute in case of failure. */
@@ -357,15 +396,19 @@ struct generator {
357
396
  const char * S[10]; /* strings */
358
397
  byte * B[10]; /* byte blocks */
359
398
  int I[10]; /* integers */
360
- struct name * V[5]; /* variables */
361
- symbol * L[5]; /* literals, used in formatted write */
362
399
 
363
400
  int line_count; /* counts number of lines output */
364
401
  int line_labelled; /* in ISO C, will need extra ';' if it is a block end */
365
402
  int literalstring_count;
366
403
  int keep_count; /* used to number keep/restore pairs to avoid compiler warnings
367
404
  about shadowed variables */
368
- int temporary_used; /* track if temporary variable used (Ada and Pascal) */
405
+ bool temporary_used; /* track if temporary variable used (Ada and Pascal) */
406
+ char java_import_arrays; /* need `import java.util.Arrays;` */
407
+ char java_import_chararraysequence; /* need `import org.tartarus.snowball.CharArraySequence;` */
408
+ // Prefix for generated variable names (`v_` by default).
409
+ const char * varname_prefix;
410
+ // String to indent by for each margin level (four spaces by default).
411
+ const char * margin_indent;
369
412
  };
370
413
 
371
414
  /* Special values for failure_label in struct generator. */
@@ -375,17 +418,37 @@ enum special_labels {
375
418
 
376
419
  struct options {
377
420
  /* for the command line: */
378
- const char * output_file;
379
- char * name;
421
+ byte * output_file;
422
+ // output_file but without any path.
423
+ byte * output_leaf;
424
+ // Extension specified in -o option (or NULL if none).
425
+ byte * extension;
426
+ byte * name;
380
427
  FILE * output_src;
381
428
  FILE * output_h;
382
- byte syntax_tree;
383
- byte comments;
384
- byte js_esm;
429
+ bool syntax_tree;
430
+ bool comments;
431
+ bool coverage;
385
432
  enc encoding;
386
- enum { LANG_JAVA, LANG_C, LANG_CPLUSPLUS, LANG_CSHARP, LANG_PASCAL, LANG_PYTHON, LANG_JAVASCRIPT, LANG_RUST, LANG_GO, LANG_ADA } make_lang;
433
+ enum {
434
+ LANG_C = 0, // We generate C by default.
435
+ LANG_ADA,
436
+ LANG_CPLUSPLUS,
437
+ LANG_CSHARP,
438
+ LANG_DART,
439
+ LANG_GO,
440
+ LANG_JAVA,
441
+ LANG_JAVASCRIPT,
442
+ LANG_PASCAL,
443
+ LANG_PHP,
444
+ LANG_PYTHON,
445
+ LANG_RUST,
446
+ LANG_ZIG
447
+ } target_lang;
387
448
  const char * externals_prefix;
388
449
  const char * variables_prefix;
450
+ const char * cheader;
451
+ const char * hheader;
389
452
  const char * runtime_path;
390
453
  const char * parent_class_name;
391
454
  const char * package;
@@ -401,64 +464,68 @@ struct options {
401
464
  extern struct generator * create_generator(struct analyser * a, struct options * o);
402
465
  extern void close_generator(struct generator * g);
403
466
 
467
+ static inline int new_label(struct generator * g) {
468
+ return g->next_label++;
469
+ }
470
+
471
+ extern struct str * vars_newname(struct generator * g);
472
+
473
+ extern void write_margin(struct generator * g);
474
+
404
475
  extern void write_char(struct generator * g, int ch);
405
476
  extern void write_newline(struct generator * g);
406
477
  extern void write_string(struct generator * g, const char * s);
407
478
  extern void write_wchar_as_utf8(struct generator * g, symbol ch);
408
479
  extern void write_int(struct generator * g, int i);
409
- extern void write_hex4(struct generator * g, int ch);
480
+ extern void wi3(struct generator * g, int i);
481
+ extern void write_hex4(struct generator * g, unsigned ch);
482
+ extern void write_hex(struct generator * g, unsigned i);
410
483
  extern void write_symbol(struct generator * g, symbol s);
411
484
  extern void write_s(struct generator * g, const byte * b);
412
485
  extern void write_str(struct generator * g, struct str * str);
413
486
  extern void write_c_relop(struct generator * g, int relop);
414
487
 
415
- extern void write_comment_content(struct generator * g, struct node * p);
488
+ extern void write_comment_content(struct generator * g, struct node * p,
489
+ const char * end);
416
490
  extern void write_generated_comment_content(struct generator * g);
417
491
  extern void write_start_comment(struct generator * g,
418
492
  const char * comment_start,
419
493
  const char * comment_end);
420
494
 
421
- extern int K_needed(struct generator * g, struct node * p);
422
- extern int repeat_restore(struct generator * g, struct node * p);
423
- extern int check_possible_signals_list(struct generator * g,
424
- struct node * p,
425
- int type,
426
- int call_depth);
495
+ extern int K_needed(struct node * p);
496
+ extern int K_needed_node_on_f(struct node * p);
497
+ extern int K_needed_for_and(struct node * p);
498
+ extern int K_needed_for_or(struct node * p);
499
+ extern int repeat_restore(struct node * p);
500
+
501
+ extern int just_return_on_fail(struct generator * g);
502
+ extern int tailcallable(struct generator * g, struct node * p);
427
503
 
428
504
  /* Generator for C code. */
429
505
  extern void generate_program_c(struct generator * g);
430
506
 
431
- #ifndef DISABLE_JAVA
432
507
  /* Generator for Java code. */
433
508
  extern void generate_program_java(struct generator * g);
434
- #endif
435
509
 
436
- #ifndef DISABLE_CSHARP
510
+ /* Generator for Dart code. */
511
+ extern void generate_program_dart(struct generator * g);
512
+
437
513
  /* Generator for C# code. */
438
514
  extern void generate_program_csharp(struct generator * g);
439
- #endif
440
515
 
441
- #ifndef DISABLE_PASCAL
442
516
  extern void generate_program_pascal(struct generator * g);
443
- #endif
444
517
 
445
- #ifndef DISABLE_PYTHON
518
+ extern void generate_program_php(struct generator * g);
519
+
446
520
  /* Generator for Python code. */
447
521
  extern void generate_program_python(struct generator * g);
448
- #endif
449
522
 
450
- #ifndef DISABLE_JS
451
523
  extern void generate_program_js(struct generator * g);
452
- #endif
453
524
 
454
- #ifndef DISABLE_RUST
455
525
  extern void generate_program_rust(struct generator * g);
456
- #endif
457
526
 
458
- #ifndef DISABLE_GO
459
527
  extern void generate_program_go(struct generator * g);
460
- #endif
461
528
 
462
- #ifndef DISABLE_ADA
463
529
  extern void generate_program_ada(struct generator * g);
464
- #endif
530
+
531
+ extern void generate_program_zig(struct generator * g);