mittens 0.1.1 → 0.3.0

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 (100) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +8 -0
  3. data/LICENSE.txt +1 -1
  4. data/README.md +4 -4
  5. data/lib/mittens/version.rb +1 -1
  6. data/mittens.gemspec +1 -1
  7. data/vendor/snowball/.github/workflows/ci.yml +216 -0
  8. data/vendor/snowball/CONTRIBUTING.rst +111 -62
  9. data/vendor/snowball/GNUmakefile +194 -136
  10. data/vendor/snowball/NEWS +798 -3
  11. data/vendor/snowball/README.rst +50 -1
  12. data/vendor/snowball/ada/src/stemmer.adb +25 -13
  13. data/vendor/snowball/ada/src/stemmer.ads +9 -9
  14. data/vendor/snowball/ada/stemmer_config.gpr +7 -7
  15. data/vendor/snowball/algorithms/basque.sbl +4 -19
  16. data/vendor/snowball/algorithms/catalan.sbl +2 -9
  17. data/vendor/snowball/algorithms/danish.sbl +1 -1
  18. data/vendor/snowball/algorithms/dutch.sbl +284 -122
  19. data/vendor/snowball/algorithms/dutch_porter.sbl +178 -0
  20. data/vendor/snowball/algorithms/english.sbl +52 -37
  21. data/vendor/snowball/algorithms/esperanto.sbl +157 -0
  22. data/vendor/snowball/algorithms/estonian.sbl +269 -0
  23. data/vendor/snowball/algorithms/finnish.sbl +2 -3
  24. data/vendor/snowball/algorithms/french.sbl +42 -16
  25. data/vendor/snowball/algorithms/german.sbl +35 -14
  26. data/vendor/snowball/algorithms/greek.sbl +76 -76
  27. data/vendor/snowball/algorithms/hungarian.sbl +8 -6
  28. data/vendor/snowball/algorithms/indonesian.sbl +14 -8
  29. data/vendor/snowball/algorithms/italian.sbl +11 -21
  30. data/vendor/snowball/algorithms/lithuanian.sbl +36 -37
  31. data/vendor/snowball/algorithms/lovins.sbl +0 -1
  32. data/vendor/snowball/algorithms/nepali.sbl +138 -37
  33. data/vendor/snowball/algorithms/norwegian.sbl +19 -5
  34. data/vendor/snowball/algorithms/porter.sbl +2 -2
  35. data/vendor/snowball/algorithms/portuguese.sbl +9 -13
  36. data/vendor/snowball/algorithms/romanian.sbl +17 -4
  37. data/vendor/snowball/algorithms/serbian.sbl +467 -468
  38. data/vendor/snowball/algorithms/spanish.sbl +5 -7
  39. data/vendor/snowball/algorithms/swedish.sbl +60 -6
  40. data/vendor/snowball/algorithms/tamil.sbl +207 -176
  41. data/vendor/snowball/algorithms/turkish.sbl +461 -445
  42. data/vendor/snowball/algorithms/yiddish.sbl +36 -38
  43. data/vendor/snowball/compiler/analyser.c +445 -192
  44. data/vendor/snowball/compiler/driver.c +109 -101
  45. data/vendor/snowball/compiler/generator.c +853 -464
  46. data/vendor/snowball/compiler/generator_ada.c +404 -366
  47. data/vendor/snowball/compiler/generator_csharp.c +297 -260
  48. data/vendor/snowball/compiler/generator_go.c +323 -254
  49. data/vendor/snowball/compiler/generator_java.c +326 -252
  50. data/vendor/snowball/compiler/generator_js.c +362 -252
  51. data/vendor/snowball/compiler/generator_pascal.c +349 -197
  52. data/vendor/snowball/compiler/generator_python.c +257 -240
  53. data/vendor/snowball/compiler/generator_rust.c +423 -251
  54. data/vendor/snowball/compiler/header.h +117 -71
  55. data/vendor/snowball/compiler/space.c +137 -68
  56. data/vendor/snowball/compiler/syswords.h +2 -2
  57. data/vendor/snowball/compiler/tokeniser.c +125 -107
  58. data/vendor/snowball/csharp/Snowball/Among.cs +14 -14
  59. data/vendor/snowball/csharp/Snowball/AssemblyInfo.cs +7 -7
  60. data/vendor/snowball/csharp/Snowball/Stemmer.cs +57 -37
  61. data/vendor/snowball/csharp/Stemwords/App.config +2 -2
  62. data/vendor/snowball/csharp/Stemwords/Program.cs +16 -12
  63. data/vendor/snowball/doc/libstemmer_c_README +7 -4
  64. data/vendor/snowball/doc/libstemmer_csharp_README +4 -1
  65. data/vendor/snowball/doc/libstemmer_java_README +12 -1
  66. data/vendor/snowball/doc/libstemmer_js_README +6 -4
  67. data/vendor/snowball/doc/libstemmer_python_README +9 -4
  68. data/vendor/snowball/examples/stemwords.c +12 -12
  69. data/vendor/snowball/go/env.go +107 -31
  70. data/vendor/snowball/go/util.go +0 -4
  71. data/vendor/snowball/include/libstemmer.h +4 -0
  72. data/vendor/snowball/java/org/tartarus/snowball/Among.java +32 -15
  73. data/vendor/snowball/java/org/tartarus/snowball/SnowballProgram.java +347 -261
  74. data/vendor/snowball/java/org/tartarus/snowball/SnowballStemmer.java +3 -0
  75. data/vendor/snowball/java/org/tartarus/snowball/TestApp.java +52 -37
  76. data/vendor/snowball/javascript/base-stemmer.js +186 -2
  77. data/vendor/snowball/javascript/stemwords.js +3 -6
  78. data/vendor/snowball/libstemmer/libstemmer_c.in +1 -1
  79. data/vendor/snowball/libstemmer/mkalgorithms.pl +6 -6
  80. data/vendor/snowball/libstemmer/mkmodules.pl +2 -2
  81. data/vendor/snowball/libstemmer/modules.txt +13 -10
  82. data/vendor/snowball/libstemmer/test.c +1 -1
  83. data/vendor/snowball/pascal/SnowballProgram.pas +84 -2
  84. data/vendor/snowball/pascal/generate.pl +13 -13
  85. data/vendor/snowball/python/create_init.py +4 -1
  86. data/vendor/snowball/python/setup.cfg +0 -3
  87. data/vendor/snowball/python/setup.py +8 -3
  88. data/vendor/snowball/python/snowballstemmer/basestemmer.py +20 -54
  89. data/vendor/snowball/python/stemwords.py +8 -12
  90. data/vendor/snowball/runtime/api.c +10 -5
  91. data/vendor/snowball/runtime/header.h +10 -9
  92. data/vendor/snowball/runtime/utilities.c +9 -9
  93. data/vendor/snowball/rust/build.rs +1 -1
  94. data/vendor/snowball/rust/src/snowball/snowball_env.rs +83 -5
  95. data/vendor/snowball/tests/stemtest.c +7 -4
  96. metadata +8 -12
  97. data/vendor/snowball/.travis.yml +0 -112
  98. data/vendor/snowball/algorithms/german2.sbl +0 -145
  99. data/vendor/snowball/algorithms/kraaij_pohlmann.sbl +0 -240
  100. data/vendor/snowball/compiler/syswords2.h +0 -13
@@ -32,24 +32,24 @@ static void print_arglist(int exit_code) {
32
32
  FILE * f = exit_code ? stderr : stdout;
33
33
  fprintf(f, "Usage: snowball SOURCE_FILE... [OPTIONS]\n\n"
34
34
  "Supported options:\n"
35
- " -o[utput] file\n"
36
- " -s[yntax]\n"
35
+ " -o, -output OUTPUT_BASE\n"
36
+ " -s, -syntax\n"
37
37
  " -comments\n"
38
38
  #ifndef DISABLE_JAVA
39
- " -j[ava]\n"
39
+ " -j, -java\n"
40
40
  #endif
41
41
  #ifndef DISABLE_CSHARP
42
- " -cs[harp]\n"
42
+ " -cs, -csharp\n"
43
43
  #endif
44
44
  " -c++\n"
45
45
  #ifndef DISABLE_PASCAL
46
46
  " -pascal\n"
47
47
  #endif
48
48
  #ifndef DISABLE_PYTHON
49
- " -py[thon]\n"
49
+ " -py, -python\n"
50
50
  #endif
51
51
  #ifndef DISABLE_JS
52
- " -js\n"
52
+ " -js generate Javascript\n"
53
53
  #endif
54
54
  #ifndef DISABLE_RUST
55
55
  " -rust\n"
@@ -60,25 +60,25 @@ static void print_arglist(int exit_code) {
60
60
  #ifndef DISABLE_ADA
61
61
  " -ada\n"
62
62
  #endif
63
- " -w[idechars]\n"
64
- " -u[tf8]\n"
65
- " -n[ame] class name\n"
66
- " -ep[refix] string\n"
67
- " -vp[refix] string\n"
68
- " -i[nclude] directory\n"
69
- " -r[untime] path to runtime headers\n"
70
- " -p[arentclassname] fully qualified parent class name\n"
63
+ " -w, -widechars\n"
64
+ " -u, -utf8\n"
65
+ " -n, -name CLASS_NAME\n"
66
+ " -ep, -eprefix EXTERNAL_PREFIX\n"
67
+ " -vp, -vprefix VARIABLE_PREFIX\n"
68
+ " -i, -include DIRECTORY\n"
69
+ " -r, -runtime DIRECTORY\n"
70
+ " -p, -parentclassname CLASS_NAME fully qualified parent class name\n"
71
71
  #if !defined(DISABLE_JAVA) || !defined(DISABLE_CSHARP)
72
- " -P[ackage] package name for stemmers\n"
73
- " -S[tringclass] StringBuffer-compatible class\n"
74
- " -a[mongclass] fully qualified name of the Among class\n"
72
+ " -P, -Package PACKAGE_NAME package name for stemmers\n"
73
+ " -S, -Stringclass STRING_CLASS StringBuffer-compatible class\n"
74
+ " -a, -amongclass AMONG_CLASS fully qualified name of the Among class\n"
75
75
  #endif
76
76
  #ifndef DISABLE_GO
77
- " -gop[ackage] Go package name for stemmers\n"
78
- " -gor[untime] Go snowball runtime package\n"
77
+ " -gop, -gopackage PACKAGE_NAME Go package name for stemmers\n"
78
+ " -gor, -goruntime PACKAGE_NAME Go snowball runtime package\n"
79
79
  #endif
80
- " --help display this help and exit\n"
81
- " --version output version information and exit\n"
80
+ " --help display this help and exit\n"
81
+ " --version output version information and exit\n"
82
82
  );
83
83
  exit(exit_code);
84
84
  }
@@ -90,19 +90,18 @@ static void check_lim(int i, int argc) {
90
90
  }
91
91
  }
92
92
 
93
- static FILE * get_output(symbol * b) {
94
- char * s = b_to_s(b);
95
- FILE * output = fopen(s, "w");
96
- if (output == 0) {
97
- fprintf(stderr, "Can't open output %s\n", s);
93
+ static FILE * get_output(byte * s) {
94
+ s[SIZE(s)] = 0;
95
+ const char * filename = (const char *)s;
96
+ FILE * output = fopen(filename, "w");
97
+ if (output == NULL) {
98
+ fprintf(stderr, "Can't open output %s\n", filename);
98
99
  exit(1);
99
100
  }
100
- free(s);
101
101
  return output;
102
102
  }
103
103
 
104
104
  static int read_options(struct options * o, int argc, char * argv[]) {
105
- char * s;
106
105
  int i = 1;
107
106
  int new_argc = 1;
108
107
  /* Note down the last option used to specify an explicit encoding so
@@ -112,12 +111,13 @@ static int read_options(struct options * o, int argc, char * argv[]) {
112
111
 
113
112
  /* set defaults: */
114
113
 
115
- o->output_file = 0;
114
+ o->output_file = NULL;
116
115
  o->syntax_tree = false;
117
116
  o->comments = false;
117
+ o->js_esm = false;
118
118
  o->externals_prefix = NULL;
119
- o->variables_prefix = 0;
120
- o->runtime_path = 0;
119
+ o->variables_prefix = NULL;
120
+ o->runtime_path = NULL;
121
121
  o->parent_class_name = NULL;
122
122
  o->string_class = NULL;
123
123
  o->among_class = NULL;
@@ -125,14 +125,14 @@ static int read_options(struct options * o, int argc, char * argv[]) {
125
125
  o->go_snowball_runtime = DEFAULT_GO_SNOWBALL_RUNTIME;
126
126
  o->name = NULL;
127
127
  o->make_lang = LANG_C;
128
- o->includes = 0;
129
- o->includes_end = 0;
128
+ o->includes = NULL;
129
+ o->includes_end = NULL;
130
130
  o->encoding = ENC_SINGLEBYTE;
131
131
 
132
132
  /* read options: */
133
133
 
134
134
  while (i < argc) {
135
- s = argv[i++];
135
+ char * s = argv[i++];
136
136
  if (s[0] != '-') {
137
137
  /* Non-option argument - shuffle down. */
138
138
  argv[new_argc++] = s;
@@ -153,7 +153,7 @@ static int read_options(struct options * o, int argc, char * argv[]) {
153
153
  /* Take a copy of the argument here, because
154
154
  * later we will free o->name */
155
155
  len = strlen(argv[i]);
156
- new_name = malloc(len + 1);
156
+ new_name = MALLOC(len + 1);
157
157
  memcpy(new_name, argv[i++], len);
158
158
  new_name[len] = '\0';
159
159
  o->name = new_name;
@@ -162,6 +162,7 @@ static int read_options(struct options * o, int argc, char * argv[]) {
162
162
  #ifndef DISABLE_JS
163
163
  if (eq(s, "-js")) {
164
164
  o->make_lang = LANG_JAVASCRIPT;
165
+ o->js_esm = false;
165
166
  continue;
166
167
  }
167
168
  #endif
@@ -239,12 +240,15 @@ static int read_options(struct options * o, int argc, char * argv[]) {
239
240
 
240
241
  {
241
242
  NEW(include, p);
242
- symbol * b = add_s_to_b(0, argv[i++]);
243
- b = add_s_to_b(b, "/");
244
- p->next = 0; p->b = b;
245
-
246
- if (o->includes == 0) o->includes = p; else
247
- o->includes_end->next = p;
243
+ byte * include_dir = add_sz_to_s(NULL, argv[i++]);
244
+ include_dir = add_char_to_s(include_dir, '/');
245
+ p->next = NULL; p->s = include_dir;
246
+
247
+ if (o->includes == NULL) {
248
+ o->includes = p;
249
+ } else {
250
+ o->includes_end->next = p;
251
+ }
248
252
  o->includes_end = p;
249
253
  }
250
254
  continue;
@@ -399,7 +403,7 @@ static int read_options(struct options * o, int argc, char * argv[]) {
399
403
  }
400
404
 
401
405
  {
402
- char * new_name = malloc(len + 1);
406
+ char * new_name = MALLOC(len + 1);
403
407
  switch (o->make_lang) {
404
408
  case LANG_CSHARP:
405
409
  case LANG_PASCAL:
@@ -413,23 +417,23 @@ static int read_options(struct options * o, int argc, char * argv[]) {
413
417
  * underscore+letter or hyphen+letter to an upper case
414
418
  * letter.
415
419
  */
416
- size_t i, j = 0;
420
+ size_t new_len = 0;
417
421
  int uc_next = true;
418
- for (i = 0; i != len; ++i) {
419
- unsigned char ch = leaf[i];
422
+ for (size_t j = 0; j != len; ++j) {
423
+ unsigned char ch = leaf[j];
420
424
  if (ch == '_' || ch == '-') {
421
425
  uc_next = true;
422
426
  } else {
423
427
  if (uc_next) {
424
- new_name[j] = toupper(ch);
428
+ new_name[new_len] = toupper(ch);
425
429
  uc_next = false;
426
430
  } else {
427
- new_name[j] = ch;
431
+ new_name[new_len] = ch;
428
432
  }
429
- ++j;
433
+ ++new_len;
430
434
  }
431
435
  }
432
- len = j;
436
+ len = new_len;
433
437
  break;
434
438
  }
435
439
  default:
@@ -446,14 +450,13 @@ static int read_options(struct options * o, int argc, char * argv[]) {
446
450
  }
447
451
 
448
452
  extern int main(int argc, char * argv[]) {
449
-
450
453
  int i;
451
454
  NEW(options, o);
452
455
  argc = read_options(o, argc, argv);
453
456
  {
454
457
  char * file = argv[1];
455
- symbol * u = get_input(file);
456
- if (u == 0) {
458
+ byte * u = get_input(file);
459
+ if (u == NULL) {
457
460
  fprintf(stderr, "Can't open input %s\n", file);
458
461
  exit(1);
459
462
  }
@@ -470,14 +473,14 @@ extern int main(int argc, char * argv[]) {
470
473
  NEW(input, q);
471
474
  file = argv[i];
472
475
  u = get_input(file);
473
- if (u == 0) {
476
+ if (u == NULL) {
474
477
  fprintf(stderr, "Can't open input %s\n", file);
475
478
  exit(1);
476
479
  }
477
480
  q->p = u;
478
481
  q->c = 0;
479
482
  q->file = file;
480
- q->file_needs_freeing = false;
483
+ q->file_owned = 0;
481
484
  q->line_number = 1;
482
485
  *next_input_ptr = q;
483
486
  next_input_ptr = &(q->next);
@@ -486,26 +489,25 @@ extern int main(int argc, char * argv[]) {
486
489
  read_program(a);
487
490
  if (t->error_count > 0) exit(1);
488
491
  if (o->syntax_tree) print_program(a);
489
- close_tokeniser(t);
490
492
  if (!o->syntax_tree) {
491
493
  struct generator * g;
492
494
 
493
- const char * s = o->output_file;
494
- if (!s) {
495
+ const char * output_base = o->output_file;
496
+ if (!output_base) {
495
497
  fprintf(stderr, "Please include the -o option\n");
496
498
  print_arglist(1);
497
499
  }
498
500
  g = create_generator(a, o);
499
501
  if (o->make_lang == LANG_C || o->make_lang == LANG_CPLUSPLUS) {
500
- symbol * b = add_s_to_b(0, s);
501
- b = add_s_to_b(b, ".h");
502
- o->output_h = get_output(b);
503
- b[SIZE(b) - 1] = 'c';
502
+ byte * s = add_sz_to_s(NULL, output_base);
503
+ s = add_literal_to_s(s, ".h");
504
+ o->output_h = get_output(s);
505
+ s[SIZE(s) - 1] = 'c';
504
506
  if (o->make_lang == LANG_CPLUSPLUS) {
505
- b = add_s_to_b(b, "c");
507
+ s = add_char_to_s(s, 'c');
506
508
  }
507
- o->output_src = get_output(b);
508
- lose_b(b);
509
+ o->output_src = get_output(s);
510
+ lose_s(s);
509
511
 
510
512
  generate_program_c(g);
511
513
  fclose(o->output_src);
@@ -513,99 +515,105 @@ extern int main(int argc, char * argv[]) {
513
515
  }
514
516
  #ifndef DISABLE_JAVA
515
517
  if (o->make_lang == LANG_JAVA) {
516
- symbol * b = add_s_to_b(0, s);
517
- b = add_s_to_b(b, ".java");
518
- o->output_src = get_output(b);
519
- lose_b(b);
518
+ byte * s = add_sz_to_s(NULL, output_base);
519
+ s = add_literal_to_s(s, ".java");
520
+ o->output_src = get_output(s);
521
+ lose_s(s);
520
522
  generate_program_java(g);
521
523
  fclose(o->output_src);
522
524
  }
523
525
  #endif
524
526
  #ifndef DISABLE_PASCAL
525
527
  if (o->make_lang == LANG_PASCAL) {
526
- symbol *b = add_s_to_b(0, s);
527
- b = add_s_to_b(b, ".pas");
528
- o->output_src = get_output(b);
529
- lose_b(b);
528
+ byte * s = add_sz_to_s(NULL, output_base);
529
+ s = add_literal_to_s(s, ".pas");
530
+ o->output_src = get_output(s);
531
+ lose_s(s);
530
532
  generate_program_pascal(g);
531
533
  fclose(o->output_src);
532
534
  }
533
535
  #endif
534
536
  #ifndef DISABLE_PYTHON
535
537
  if (o->make_lang == LANG_PYTHON) {
536
- symbol * b = add_s_to_b(0, s);
537
- b = add_s_to_b(b, ".py");
538
- o->output_src = get_output(b);
539
- lose_b(b);
538
+ byte * s = add_sz_to_s(NULL, output_base);
539
+ s = add_literal_to_s(s, ".py");
540
+ o->output_src = get_output(s);
541
+ lose_s(s);
540
542
  generate_program_python(g);
541
543
  fclose(o->output_src);
542
544
  }
543
545
  #endif
544
546
  #ifndef DISABLE_JS
545
547
  if (o->make_lang == LANG_JAVASCRIPT) {
546
- symbol * b = add_s_to_b(0, s);
547
- b = add_s_to_b(b, ".js");
548
- o->output_src = get_output(b);
549
- lose_b(b);
548
+ byte * s = add_sz_to_s(NULL, output_base);
549
+ if (o->js_esm) {
550
+ s = add_literal_to_s(s, ".mjs");
551
+ } else {
552
+ s = add_literal_to_s(s, ".js");
553
+ }
554
+ o->output_src = get_output(s);
555
+ lose_s(s);
550
556
  generate_program_js(g);
551
557
  fclose(o->output_src);
552
558
  }
553
559
  #endif
554
560
  #ifndef DISABLE_CSHARP
555
561
  if (o->make_lang == LANG_CSHARP) {
556
- symbol * b = add_s_to_b(0, s);
557
- b = add_s_to_b(b, ".cs");
558
- o->output_src = get_output(b);
559
- lose_b(b);
562
+ byte * s = add_sz_to_s(NULL, output_base);
563
+ s = add_literal_to_s(s, ".cs");
564
+ o->output_src = get_output(s);
565
+ lose_s(s);
560
566
  generate_program_csharp(g);
561
567
  fclose(o->output_src);
562
568
  }
563
569
  #endif
564
570
  #ifndef DISABLE_RUST
565
571
  if (o->make_lang == LANG_RUST) {
566
- symbol * b = add_s_to_b(0, s);
567
- b = add_s_to_b(b, ".rs");
568
- o->output_src = get_output(b);
569
- lose_b(b);
572
+ byte * s = add_sz_to_s(NULL, output_base);
573
+ s = add_literal_to_s(s, ".rs");
574
+ o->output_src = get_output(s);
575
+ lose_s(s);
570
576
  generate_program_rust(g);
571
577
  fclose(o->output_src);
572
578
  }
573
579
  #endif
574
580
  #ifndef DISABLE_GO
575
581
  if (o->make_lang == LANG_GO) {
576
- symbol * b = add_s_to_b(0, s);
577
- b = add_s_to_b(b, ".go");
578
- o->output_src = get_output(b);
579
- lose_b(b);
582
+ byte * s = add_sz_to_s(NULL, output_base);
583
+ s = add_literal_to_s(s, ".go");
584
+ o->output_src = get_output(s);
585
+ lose_s(s);
580
586
  generate_program_go(g);
581
587
  fclose(o->output_src);
582
588
  }
583
589
  #endif
584
590
  #ifndef DISABLE_ADA
585
591
  if (o->make_lang == LANG_ADA) {
586
- symbol * b = add_s_to_b(0, s);
587
- b = add_s_to_b(b, ".ads");
588
- o->output_h = get_output(b);
589
- b[SIZE(b) - 1] = 'b';
590
- o->output_src = get_output(b);
591
- lose_b(b);
592
+ byte * s = add_sz_to_s(NULL, output_base);
593
+ s = add_literal_to_s(s, ".ads");
594
+ o->output_h = get_output(s);
595
+ s[SIZE(s) - 1] = 'b';
596
+ o->output_src = get_output(s);
597
+ lose_s(s);
592
598
 
593
599
  generate_program_ada(g);
594
600
  fclose(o->output_src);
595
601
  fclose(o->output_h);
596
-
597
602
  }
598
603
  #endif
599
604
  close_generator(g);
600
605
  }
606
+ close_tokeniser(t);
601
607
  close_analyser(a);
602
608
  }
603
- lose_b(u);
609
+ lose_s(u);
604
610
  }
605
611
  { struct include * p = o->includes;
606
612
  while (p) {
607
613
  struct include * q = p->next;
608
- lose_b(p->b); FREE(p); p = q;
614
+ lose_s(p->s);
615
+ FREE(p);
616
+ p = q;
609
617
  }
610
618
  }
611
619
  FREE(o->name);