mittens 0.3.3 → 0.3.5

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 (83) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +8 -0
  3. data/LICENSE.txt +1 -1
  4. data/README.md +1 -1
  5. data/ext/mittens/ext.c +68 -30
  6. data/ext/mittens/extconf.rb +2 -0
  7. data/lib/mittens/version.rb +1 -1
  8. data/vendor/snowball/.github/workflows/ci.yml +43 -3
  9. data/vendor/snowball/.github/workflows/coverage.yml +8 -5
  10. data/vendor/snowball/GNUmakefile +46 -16
  11. data/vendor/snowball/NEWS +437 -13
  12. data/vendor/snowball/README.rst +4 -4
  13. data/vendor/snowball/algorithms/earlymodernenglish.sbl +301 -0
  14. data/vendor/snowball/algorithms/french.sbl +1 -1
  15. data/vendor/snowball/algorithms/ukrainian.sbl +1251 -0
  16. data/vendor/snowball/compiler/analyser.c +460 -156
  17. data/vendor/snowball/compiler/driver.c +41 -36
  18. data/vendor/snowball/compiler/generator.c +24 -1
  19. data/vendor/snowball/compiler/generator_ada.c +46 -45
  20. data/vendor/snowball/compiler/generator_c.c +1094 -187
  21. data/vendor/snowball/compiler/generator_csharp.c +34 -11
  22. data/vendor/snowball/compiler/generator_dart.c +39 -11
  23. data/vendor/snowball/compiler/generator_go.c +6 -6
  24. data/vendor/snowball/compiler/generator_java.c +29 -8
  25. data/vendor/snowball/compiler/generator_js.c +65 -38
  26. data/vendor/snowball/compiler/generator_pascal.c +69 -26
  27. data/vendor/snowball/compiler/generator_php.c +33 -12
  28. data/vendor/snowball/compiler/generator_python.c +23 -4
  29. data/vendor/snowball/compiler/generator_rust.c +37 -13
  30. data/vendor/snowball/compiler/generator_zig.c +6 -6
  31. data/vendor/snowball/compiler/header.h +85 -14
  32. data/vendor/snowball/compiler/space.c +67 -38
  33. data/vendor/snowball/compiler/tokeniser.c +28 -16
  34. data/vendor/snowball/csharp/Snowball/AssemblyInfo.cs +2 -2
  35. data/vendor/snowball/csharp/Snowball/Stemmer.cs +1 -4
  36. data/vendor/snowball/cxx/generate_algorithms.pl +5 -4
  37. data/vendor/snowball/cxx/{utilities.cxx → snowball_runtime.cxx} +1 -1
  38. data/vendor/snowball/cxx/stemmer.h +4 -0
  39. data/vendor/snowball/cxx/stemwords.cxx +36 -6
  40. data/vendor/snowball/dart/lib/src/snowball.dart +2 -2
  41. data/vendor/snowball/dart/pubspec.yaml +1 -1
  42. data/vendor/snowball/doc/libstemmer_c_README +3 -0
  43. data/vendor/snowball/doc/libstemmer_php_README +1 -1
  44. data/vendor/snowball/doc/libstemmer_python_README +8 -6
  45. data/vendor/snowball/examples/stemwords.c +4 -14
  46. data/vendor/snowball/go/env.go +16 -4
  47. data/vendor/snowball/include/libstemmer.h +0 -3
  48. data/vendor/snowball/java/org/tartarus/snowball/SnowballProgram.java +4 -4
  49. data/vendor/snowball/javascript/base-stemmer.js +27 -40
  50. data/vendor/snowball/javascript/stemwords.js +34 -10
  51. data/vendor/snowball/libstemmer/libstemmer_c.in +5 -5
  52. data/vendor/snowball/libstemmer/mkmodules.pl +5 -3
  53. data/vendor/snowball/libstemmer/modules.txt +4 -2
  54. data/vendor/snowball/pascal/SnowballProgram.pas +2 -2
  55. data/vendor/snowball/php/base-stemmer.php +2 -2
  56. data/vendor/snowball/python/setup.py +5 -1
  57. data/vendor/snowball/python/snowballstemmer/basestemmer.py +1 -2
  58. data/vendor/snowball/runtime/api.c +14 -3
  59. data/vendor/snowball/runtime/api.h +13 -9
  60. data/vendor/snowball/runtime/{utilities.c → snowball_runtime.c} +115 -181
  61. data/vendor/snowball/runtime/snowball_runtime.h +35 -24
  62. data/vendor/snowball/rust/src/snowball/snowball_env.rs +1 -1
  63. data/vendor/snowball/tests/compilertest +3 -3
  64. data/vendor/snowball/tests/runtime/among.sbl +96 -2
  65. data/vendor/snowball/tests/runtime/attachinsert.sbl +4 -0
  66. data/vendor/snowball/tests/runtime/debug.out +7 -0
  67. data/vendor/snowball/tests/runtime/debug.sbl +9 -0
  68. data/vendor/snowball/tests/runtime/integertests.sbl +22 -0
  69. data/vendor/snowball/tests/runtime/marklimit.sbl +30 -0
  70. data/vendor/snowball/tests/runtime/naming.sbl +20 -0
  71. data/vendor/snowball/tests/runtime/reverse.sbl +11 -0
  72. data/vendor/snowball/tests/stemtest.c +2 -5
  73. data/vendor/snowball/tests/syntax/aeslicefrom.sbl +7 -0
  74. data/vendor/snowball/tests/syntax/canon.sbl +14 -0
  75. data/vendor/snowball/tests/syntax/canon.syntax +36 -0
  76. data/vendor/snowball/tests/syntax/inline.syntax +4 -4
  77. data/vendor/snowball/tests/syntax/localvar.sbl +38 -0
  78. data/vendor/snowball/tests/syntax/localvar.stderr +3 -0
  79. data/vendor/snowball/tests/syntax/localvar.syntax +76 -0
  80. data/vendor/snowball/tests/syntax/unused.sbl +5 -1
  81. data/vendor/snowball/tests/syntax/unused.stderr +3 -1
  82. data/vendor/snowball/zig/env.zig +24 -4
  83. metadata +14 -4
@@ -80,9 +80,9 @@ static void check_lim(int i, int argc) {
80
80
  }
81
81
  }
82
82
 
83
- static FILE * get_output(byte * s) {
84
- s[SIZE(s)] = 0;
85
- const char * filename = (const char *)s;
83
+ static FILE * get_output(byte ** s_ptr) {
84
+ *s_ptr = ensure_nul_s(*s_ptr);
85
+ const char * filename = (const char *)*s_ptr;
86
86
  FILE * output = fopen(filename, "w");
87
87
  if (output == NULL) {
88
88
  fprintf(stderr, "Can't open output %s\n", filename);
@@ -396,7 +396,7 @@ static struct options * read_options(int * argc_ptr, char * argv[]) {
396
396
 
397
397
  const char * dot = strrchr(leaf, '.');
398
398
  if (dot) {
399
- o->output_file = create_s_from_data(leaf, dot - leaf);
399
+ o->output_file = create_s_from_data(leaf, (int)(dot - leaf));
400
400
  } else {
401
401
  o->output_file = create_s_from_sz(leaf);
402
402
  }
@@ -404,21 +404,26 @@ static struct options * read_options(int * argc_ptr, char * argv[]) {
404
404
  } else {
405
405
  // Remove any extension from o->output_file so `-o path/to/english.c`
406
406
  // works.
407
- o->output_file[SIZE(o->output_file)] = '\0';
408
407
  const char * output_file = (const char *)o->output_file;
409
- const char * slash = strrchr(output_file, '/');
410
- const char * leaf = (slash == NULL) ? output_file : slash + 1;
411
-
412
- slash = strrchr(leaf, '\\');
413
- if (slash != NULL) leaf = slash + 1;
414
-
415
- const char * dot = strrchr(leaf, '.');
416
- if (dot) {
417
- o->extension = create_s_from_sz(dot);
418
- SET_SIZE(o->output_file, dot - output_file);
419
- o->output_leaf = create_s_from_data(leaf, dot - leaf);
420
- } else {
421
- o->output_leaf = create_s_from_sz(leaf);
408
+ int size = SIZE(output_file);
409
+ int leaf = size;
410
+ while (leaf > 0) {
411
+ int ch = output_file[leaf - 1];
412
+ if (ch == '/' || ch == '\\') break;
413
+ --leaf;
414
+ }
415
+ int ext = size;
416
+ while (ext > leaf) {
417
+ int ch = output_file[--ext];
418
+ if (ch == '.') {
419
+ o->extension = create_s_from_data(output_file + ext, (int)(size - ext));
420
+ SET_SIZE(o->output_file, ext);
421
+ o->output_leaf = create_s_from_data(output_file + leaf, (int)(ext - leaf));
422
+ break;
423
+ }
424
+ }
425
+ if (ext == leaf) {
426
+ o->output_leaf = create_s_from_data(output_file + leaf, (int)(size - leaf));
422
427
  }
423
428
  }
424
429
 
@@ -428,7 +433,7 @@ static struct options * read_options(int * argc_ptr, char * argv[]) {
428
433
  if (dot) {
429
434
  // Trim off any extension (we only remove the last of multiple
430
435
  // extensions above).
431
- SET_SIZE(o->name, dot - o->name);
436
+ SET_SIZE(o->name, (int)(dot - o->name));
432
437
  }
433
438
  switch (o->target_lang) {
434
439
  case LANG_CSHARP:
@@ -443,10 +448,10 @@ static struct options * read_options(int * argc_ptr, char * argv[]) {
443
448
  * underscore+letter or hyphen+letter to an upper case
444
449
  * letter.
445
450
  */
446
- size_t len = SIZE(o->name);
447
- size_t new_len = 0;
451
+ int len = SIZE(o->name);
452
+ int new_len = 0;
448
453
  bool uc_next = true;
449
- for (size_t j = 0; j != len; ++j) {
454
+ for (int j = 0; j != len; ++j) {
450
455
  byte ch = o->name[j];
451
456
  if (ch == '_' || ch == '-') {
452
457
  uc_next = true;
@@ -586,7 +591,7 @@ extern int main(int argc, char * argv[]) {
586
591
  case LANG_CPLUSPLUS: {
587
592
  byte * s = copy_s(o->output_file);
588
593
  s = add_literal_to_s(s, ".h");
589
- o->output_h = get_output(s);
594
+ o->output_h = get_output(&s);
590
595
  SET_SIZE(s, SIZE(o->output_file));
591
596
  if (o->extension &&
592
597
  !(SIZE(o->extension) == 2 && memcmp(o->extension, ".h", 2) == 0)) {
@@ -596,7 +601,7 @@ extern int main(int argc, char * argv[]) {
596
601
  } else {
597
602
  s = add_literal_to_s(s, ".c");
598
603
  }
599
- o->output_src = get_output(s);
604
+ o->output_src = get_output(&s);
600
605
  lose_s(s);
601
606
 
602
607
  generate_program_c(g);
@@ -608,7 +613,7 @@ extern int main(int argc, char * argv[]) {
608
613
  case LANG_ADA: {
609
614
  byte * s = copy_s(o->output_file);
610
615
  s = add_literal_to_s(s, ".ads");
611
- o->output_h = get_output(s);
616
+ o->output_h = get_output(&s);
612
617
  SET_SIZE(s, SIZE(o->output_file));
613
618
  if (o->extension &&
614
619
  !(SIZE(o->extension) == 4 && memcmp(o->extension, ".ads", 2) == 0)) {
@@ -617,7 +622,7 @@ extern int main(int argc, char * argv[]) {
617
622
  } else {
618
623
  s = add_literal_to_s(s, ".adb");
619
624
  }
620
- o->output_src = get_output(s);
625
+ o->output_src = get_output(&s);
621
626
  lose_s(s);
622
627
 
623
628
  generate_program_ada(g);
@@ -632,7 +637,7 @@ extern int main(int argc, char * argv[]) {
632
637
  } else {
633
638
  s = add_literal_to_s(s, ".cs");
634
639
  }
635
- o->output_src = get_output(s);
640
+ o->output_src = get_output(&s);
636
641
  lose_s(s);
637
642
  generate_program_csharp(g);
638
643
  fclose(o->output_src);
@@ -645,7 +650,7 @@ extern int main(int argc, char * argv[]) {
645
650
  } else {
646
651
  s = add_literal_to_s(s, ".dart");
647
652
  }
648
- o->output_src = get_output(s);
653
+ o->output_src = get_output(&s);
649
654
  lose_s(s);
650
655
  generate_program_dart(g);
651
656
  fclose(o->output_src);
@@ -658,7 +663,7 @@ extern int main(int argc, char * argv[]) {
658
663
  } else {
659
664
  s = add_literal_to_s(s, ".go");
660
665
  }
661
- o->output_src = get_output(s);
666
+ o->output_src = get_output(&s);
662
667
  lose_s(s);
663
668
  generate_program_go(g);
664
669
  fclose(o->output_src);
@@ -671,7 +676,7 @@ extern int main(int argc, char * argv[]) {
671
676
  } else {
672
677
  s = add_literal_to_s(s, ".java");
673
678
  }
674
- o->output_src = get_output(s);
679
+ o->output_src = get_output(&s);
675
680
  lose_s(s);
676
681
  generate_program_java(g);
677
682
  fclose(o->output_src);
@@ -684,7 +689,7 @@ extern int main(int argc, char * argv[]) {
684
689
  } else {
685
690
  s = add_literal_to_s(s, ".js");
686
691
  }
687
- o->output_src = get_output(s);
692
+ o->output_src = get_output(&s);
688
693
  lose_s(s);
689
694
  generate_program_js(g);
690
695
  fclose(o->output_src);
@@ -697,7 +702,7 @@ extern int main(int argc, char * argv[]) {
697
702
  } else {
698
703
  s = add_literal_to_s(s, ".pas");
699
704
  }
700
- o->output_src = get_output(s);
705
+ o->output_src = get_output(&s);
701
706
  lose_s(s);
702
707
  generate_program_pascal(g);
703
708
  fclose(o->output_src);
@@ -710,7 +715,7 @@ extern int main(int argc, char * argv[]) {
710
715
  } else {
711
716
  s = add_literal_to_s(s, ".php");
712
717
  }
713
- o->output_src = get_output(s);
718
+ o->output_src = get_output(&s);
714
719
  lose_s(s);
715
720
  generate_program_php(g);
716
721
  fclose(o->output_src);
@@ -723,7 +728,7 @@ extern int main(int argc, char * argv[]) {
723
728
  } else {
724
729
  s = add_literal_to_s(s, ".py");
725
730
  }
726
- o->output_src = get_output(s);
731
+ o->output_src = get_output(&s);
727
732
  lose_s(s);
728
733
  generate_program_python(g);
729
734
  fclose(o->output_src);
@@ -736,7 +741,7 @@ extern int main(int argc, char * argv[]) {
736
741
  } else {
737
742
  s = add_literal_to_s(s, ".rs");
738
743
  }
739
- o->output_src = get_output(s);
744
+ o->output_src = get_output(&s);
740
745
  lose_s(s);
741
746
  generate_program_rust(g);
742
747
  fclose(o->output_src);
@@ -749,7 +754,7 @@ extern int main(int argc, char * argv[]) {
749
754
  } else {
750
755
  s = add_literal_to_s(s, ".zig");
751
756
  }
752
- o->output_src = get_output(s);
757
+ o->output_src = get_output(&s);
753
758
  lose_s(s);
754
759
  generate_program_zig(g);
755
760
  fclose(o->output_src);
@@ -51,7 +51,7 @@ static void write_comment_literalstring(struct generator * g, const symbol *s,
51
51
  // Check if the literal string contains the target language end comment
52
52
  // string. Don't try to be clever here as real-world literal strings
53
53
  // are unlikely to contain even partial matches.
54
- int end_len = strlen(end);
54
+ int end_len = (int)strlen(end);
55
55
  if (end_len <= SIZE(s)) {
56
56
  for (int i = 0; i <= SIZE(s) - end_len; ++i) {
57
57
  for (int j = 0; j < end_len; ++j) {
@@ -205,6 +205,12 @@ void write_comment_content(struct generator * g, struct node * p,
205
205
  case c_name:
206
206
  write_s(g, p->name->s);
207
207
  break;
208
+ case c_slicefrom:
209
+ if (p->literalstring && SIZE(p->literalstring) == 0) {
210
+ write_string(g, "delete");
211
+ break;
212
+ }
213
+ /* FALLTHRU */
208
214
  default:
209
215
  write_string(g, name_of_token(p->type));
210
216
  if (p->name) {
@@ -553,6 +559,16 @@ extern int repeat_restore(struct node * p) {
553
559
  return repeat_score(p, 0) >= 2;
554
560
  }
555
561
 
562
+ extern bool
563
+ amongvar_needed(struct node * p)
564
+ {
565
+ if (!p) return false;
566
+ if (p->among && p->among->amongvar_needed) return true;
567
+ return amongvar_needed(p->left) ||
568
+ amongvar_needed(p->right) ||
569
+ amongvar_needed(p->aux);
570
+ }
571
+
556
572
  /* Language-independent write routines for simple entities */
557
573
 
558
574
  static void write_hexdigit(struct generator * g, unsigned i) {
@@ -568,6 +584,13 @@ extern void write_hex(struct generator * g, unsigned i) {
568
584
  write_hexdigit(g, i); /* hex integer */
569
585
  }
570
586
 
587
+ extern void write_octal3(struct generator * g, unsigned n) {
588
+ assert(n < 256);
589
+ write_char(g, '0' + ((n >> 6) & 0x03));
590
+ write_char(g, '0' + ((n >> 3) & 0x07));
591
+ write_char(g, '0' + (n & 0x07));
592
+ }
593
+
571
594
  extern void write_char(struct generator * g, int ch) {
572
595
  str_append_ch(g->outbuf, ch); /* character */
573
596
  }
@@ -65,6 +65,17 @@ static void write_varname(struct generator * g, struct name * p) {
65
65
  write_char(g, '_');
66
66
  }
67
67
 
68
+ for (int i = SIZE(p->s) - 1; i > 0; --i) {
69
+ if (p->s[i] == '_' && p->s[i - 1] == '_') {
70
+ // Ada doesn't allow identifiers containing a double underscore
71
+ // so generate an identifier based on the number instead.
72
+ // A Snowball name must start with a letter so this can't
73
+ // collide.
74
+ write_int(g, p->count);
75
+ return;
76
+ }
77
+ }
78
+
68
79
  {
69
80
  char save_initial = p->s[0];
70
81
  p->s[0] = toupper(save_initial);
@@ -83,7 +94,7 @@ static void write_varref(struct generator * g, struct name * p) {
83
94
  write_varname(g, p);
84
95
  }
85
96
 
86
- static void write_literal_string(struct generator * g, symbol * p) {
97
+ static void write_literal_string(struct generator * g, const symbol * p) {
87
98
  if (SIZE(p) == 0) {
88
99
  write_string(g, "\"\"");
89
100
  return;
@@ -296,22 +307,6 @@ static void w(struct generator * g, const char * s) {
296
307
  writef(g, s, NULL);
297
308
  }
298
309
 
299
- static int need_among_var(struct node *p) {
300
- while (p) {
301
- if (p->type == c_among) {
302
- return 1;
303
- }
304
- if (p->left && need_among_var(p->left)) {
305
- return 1;
306
- }
307
- if (p->aux && need_among_var(p->aux)) {
308
- return 1;
309
- }
310
- p = p->right;
311
- }
312
- return 0;
313
- }
314
-
315
310
  static void generate_AE(struct generator * g, struct node * p) {
316
311
  const char * s;
317
312
  switch (p->type) {
@@ -835,8 +830,8 @@ static void generate_rightslice(struct generator * g, struct node * p) {
835
830
 
836
831
  static void generate_assignto(struct generator * g, struct node * p) {
837
832
  write_comment(g, p);
838
- writef(g, "~M~V := Assign_To (Z, ~V);~N", p);
839
- write_failure_if(g, "~V == 0", p);
833
+ writef(g, "~MZ.L~W := Z.L;~N", p);
834
+ writef(g, "~M~V (1 .. Z.L~W) := Z.P (1 .. Z.L);~N", p);
840
835
  }
841
836
 
842
837
  static void generate_sliceto(struct generator * g, struct node * p) {
@@ -1186,7 +1181,7 @@ static void generate_define(struct generator * g, struct node * p) {
1186
1181
  writef(g, "~Mprocedure ~W (Z : in out Context_Type; Result : out Boolean) is~N", p);
1187
1182
 
1188
1183
  /* Save output. */
1189
- struct str * saved_output = g->outbuf;
1184
+ struct str * saved_outbuf = g->outbuf;
1190
1185
  struct str * saved_declarations = g->declarations;
1191
1186
  g->outbuf = str_new();
1192
1187
  g->declarations = str_new();
@@ -1220,17 +1215,20 @@ static void generate_define(struct generator * g, struct node * p) {
1220
1215
 
1221
1216
  writef(g, "~-~Mend ~W;~N", p);
1222
1217
 
1223
- if (need_among_var(p->left)) {
1224
- str_append_string(saved_output, " A : Integer;\n");
1218
+ struct str * temp = g->outbuf;
1219
+ g->outbuf = saved_outbuf;
1220
+
1221
+ g->margin++;
1222
+
1223
+ if (p->name->has_among) {
1224
+ w(g, "~MA : Integer;~N");
1225
1225
  }
1226
1226
 
1227
1227
  if (g->temporary_used) {
1228
- str_append_string(saved_output, " C : Result_Index;\n");
1228
+ w(g, "~MC : Result_Index;~N");
1229
1229
  }
1230
1230
 
1231
1231
  /* Declare localised variables. */
1232
- struct str * temp = g->outbuf;
1233
- g->outbuf = saved_output;
1234
1232
  for (struct name * name = g->analyser->names; name; name = name->next) {
1235
1233
  if (name->local_to == p->name) {
1236
1234
  switch (name->type) {
@@ -1238,29 +1236,32 @@ static void generate_define(struct generator * g, struct node * p) {
1238
1236
  assert(0);
1239
1237
  break;
1240
1238
  case t_integer:
1241
- w(g, " ");
1239
+ write_margin(g);
1242
1240
  write_varname(g, name);
1243
- w(g, " : Integer;\n");
1241
+ w(g, " : Integer;~N");
1244
1242
  break;
1245
1243
  case t_boolean:
1246
- w(g, " ");
1244
+ write_margin(g);
1247
1245
  write_varname(g, name);
1248
- w(g, " : Boolean;\n");
1246
+ w(g, " : Boolean;~N");
1249
1247
  break;
1250
1248
  }
1251
1249
  }
1252
1250
  }
1251
+
1252
+ g->margin--;
1253
+
1253
1254
  g->outbuf = temp;
1254
1255
 
1255
1256
  if (g->var_number) {
1256
- str_append(saved_output, g->declarations);
1257
+ str_append(saved_outbuf, g->declarations);
1257
1258
  }
1258
1259
 
1259
- str_append(saved_output, g->outbuf);
1260
+ str_append(saved_outbuf, g->outbuf);
1260
1261
  str_delete(g->declarations);
1261
1262
  str_delete(g->outbuf);
1262
1263
  g->declarations = saved_declarations;
1263
- g->outbuf = saved_output;
1264
+ g->outbuf = saved_outbuf;
1264
1265
  }
1265
1266
 
1266
1267
  static void generate_functionend(struct generator * g, struct node * p) {
@@ -1274,7 +1275,7 @@ static void generate_substring(struct generator * g, struct node * p) {
1274
1275
  struct among * x = p->among;
1275
1276
  int block = -1;
1276
1277
  unsigned int bitmap = 0;
1277
- struct amongvec * among_cases = x->b;
1278
+ struct amongvec * among_cases = x->v;
1278
1279
  int empty_case = -1;
1279
1280
  int n_cases = 0;
1280
1281
  symbol cases[2];
@@ -1484,7 +1485,7 @@ static void generate_debug(struct generator * g, struct node * p) {
1484
1485
  write_comment(g, p);
1485
1486
  g->I[0] = g->debug_count++;
1486
1487
  g->I[1] = p->line_number;
1487
- writef(g, "~Mdebug(Z, ~I0, ~I1);~N", p);
1488
+ writef(g, "~MDebug(Z, ~I0, ~I1);~N", p);
1488
1489
  }
1489
1490
 
1490
1491
  static void generate(struct generator * g, struct node * p) {
@@ -1621,7 +1622,7 @@ static void generate_member_decls(struct generator * g) {
1621
1622
  }
1622
1623
 
1623
1624
  static int generate_among_string(struct generator * g, struct among * x, int count) {
1624
- struct amongvec * v = x->b;
1625
+ struct amongvec * v = x->v;
1625
1626
  int limit = count == 0 ? 38 : 80;
1626
1627
 
1627
1628
  g->I[0] = x->number;
@@ -1645,14 +1646,14 @@ static int generate_among_string(struct generator * g, struct among * x, int cou
1645
1646
  static int generate_among_table(struct generator * g, struct among * x, int start_pos, int *operation) {
1646
1647
  write_comment(g, x->node);
1647
1648
 
1648
- struct amongvec * v = x->b;
1649
+ struct amongvec * v = x->v;
1649
1650
 
1650
1651
  g->I[0] = x->number;
1651
1652
 
1652
1653
  g->I[1] = x->literalstring_count - 1;
1653
1654
  w(g, "~N~MA_~I0 : constant Among_Array_Type (0 .. ~I1) := ~+(~N");
1654
1655
 
1655
- v = x->b;
1656
+ v = x->v;
1656
1657
  for (int i = 0; i < x->literalstring_count; i++) {
1657
1658
  g->I[1] = start_pos;
1658
1659
 
@@ -1691,13 +1692,13 @@ static int generate_among_table(struct generator * g, struct among * x, int star
1691
1692
  static void generate_amongs(struct generator * g) {
1692
1693
  if (!g->analyser->amongs) return;
1693
1694
 
1694
- struct str * s = g->outbuf;
1695
+ struct str * saved_outbuf = g->outbuf;
1695
1696
  g->outbuf = g->declarations;
1696
1697
 
1697
1698
  w(g, "~N~MAmong_String : constant String := ~+");
1698
1699
  int count = 0;
1699
1700
  for (struct among * x = g->analyser->amongs; x != NULL; x = x->next) {
1700
- if (x->used) {
1701
+ if (x->used && !x->duplicate) {
1701
1702
  count = generate_among_string(g, x, count);
1702
1703
  }
1703
1704
  }
@@ -1706,11 +1707,11 @@ static void generate_amongs(struct generator * g) {
1706
1707
  int operation = 0;
1707
1708
  int start_pos = 1;
1708
1709
  for (struct among * x = g->analyser->amongs; x != NULL; x = x->next) {
1709
- if (x->used) {
1710
+ if (x->used && !x->duplicate) {
1710
1711
  start_pos = generate_among_table(g, x, start_pos, &operation);
1711
1712
  }
1712
1713
  }
1713
- g->outbuf = s;
1714
+ g->outbuf = saved_outbuf;
1714
1715
 
1715
1716
  if (operation == 0) return;
1716
1717
 
@@ -1720,7 +1721,7 @@ static void generate_amongs(struct generator * g) {
1720
1721
  w(g, "~Mbegin~+~N~M");
1721
1722
  w(g, "case Operation is~+~N~M");
1722
1723
  for (struct among * x = g->analyser->amongs; x; x = x->next) {
1723
- struct amongvec * v = x->b;
1724
+ struct amongvec * v = x->v;
1724
1725
  for (int i = 0; i < x->literalstring_count; i++) {
1725
1726
  if (v[i].function != NULL) {
1726
1727
  operation++;
@@ -1760,7 +1761,7 @@ static void generate_grouping_table(struct generator * g, struct grouping * q) {
1760
1761
  write_varname(g, q->name);
1761
1762
  w(g, " : constant Grouping_Array (0 .. ~I0) := (~N~+~M");
1762
1763
  for (int i = 0; i < size; i++) {
1763
- unsigned char m = map[i];
1764
+ symbol m = map[i];
1764
1765
  if (i) w(g, ",~N~M");
1765
1766
  for (int j = 0; j < 8; j++) {
1766
1767
  if (j) w(g, ", ");
@@ -1778,12 +1779,12 @@ static void generate_grouping_table(struct generator * g, struct grouping * q) {
1778
1779
  }
1779
1780
 
1780
1781
  static void generate_groupings(struct generator * g) {
1781
- struct str * s = g->outbuf;
1782
+ struct str * saved_outbuf = g->outbuf;
1782
1783
  g->outbuf = g->declarations;
1783
1784
  for (struct grouping * q = g->analyser->groupings; q; q = q->next) {
1784
1785
  generate_grouping_table(g, q);
1785
1786
  }
1786
- g->outbuf = s;
1787
+ g->outbuf = saved_outbuf;
1787
1788
  }
1788
1789
 
1789
1790
  extern void generate_program_ada(struct generator * g) {