mittens 0.1.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.
- checksums.yaml +7 -0
- data/CHANGELOG.md +3 -0
- data/Gemfile +7 -0
- data/LICENSE.txt +30 -0
- data/README.md +62 -0
- data/Rakefile +21 -0
- data/ext/mittens/ext.c +96 -0
- data/ext/mittens/extconf.rb +12 -0
- data/lib/mittens/version.rb +3 -0
- data/lib/mittens.rb +7 -0
- data/mittens.gemspec +22 -0
- data/vendor/snowball/.gitignore +26 -0
- data/vendor/snowball/.travis.yml +112 -0
- data/vendor/snowball/AUTHORS +27 -0
- data/vendor/snowball/CONTRIBUTING.rst +216 -0
- data/vendor/snowball/COPYING +29 -0
- data/vendor/snowball/GNUmakefile +742 -0
- data/vendor/snowball/NEWS +754 -0
- data/vendor/snowball/README.rst +37 -0
- data/vendor/snowball/ada/README.md +74 -0
- data/vendor/snowball/ada/generate/generate.adb +83 -0
- data/vendor/snowball/ada/generate.gpr +21 -0
- data/vendor/snowball/ada/src/stemmer.adb +620 -0
- data/vendor/snowball/ada/src/stemmer.ads +219 -0
- data/vendor/snowball/ada/src/stemwords.adb +70 -0
- data/vendor/snowball/ada/stemmer_config.gpr +83 -0
- data/vendor/snowball/ada/stemwords.gpr +21 -0
- data/vendor/snowball/algorithms/arabic.sbl +558 -0
- data/vendor/snowball/algorithms/armenian.sbl +301 -0
- data/vendor/snowball/algorithms/basque.sbl +149 -0
- data/vendor/snowball/algorithms/catalan.sbl +202 -0
- data/vendor/snowball/algorithms/danish.sbl +93 -0
- data/vendor/snowball/algorithms/dutch.sbl +164 -0
- data/vendor/snowball/algorithms/english.sbl +229 -0
- data/vendor/snowball/algorithms/finnish.sbl +197 -0
- data/vendor/snowball/algorithms/french.sbl +254 -0
- data/vendor/snowball/algorithms/german.sbl +139 -0
- data/vendor/snowball/algorithms/german2.sbl +145 -0
- data/vendor/snowball/algorithms/greek.sbl +701 -0
- data/vendor/snowball/algorithms/hindi.sbl +323 -0
- data/vendor/snowball/algorithms/hungarian.sbl +241 -0
- data/vendor/snowball/algorithms/indonesian.sbl +192 -0
- data/vendor/snowball/algorithms/irish.sbl +149 -0
- data/vendor/snowball/algorithms/italian.sbl +202 -0
- data/vendor/snowball/algorithms/kraaij_pohlmann.sbl +240 -0
- data/vendor/snowball/algorithms/lithuanian.sbl +373 -0
- data/vendor/snowball/algorithms/lovins.sbl +208 -0
- data/vendor/snowball/algorithms/nepali.sbl +92 -0
- data/vendor/snowball/algorithms/norwegian.sbl +80 -0
- data/vendor/snowball/algorithms/porter.sbl +139 -0
- data/vendor/snowball/algorithms/portuguese.sbl +218 -0
- data/vendor/snowball/algorithms/romanian.sbl +236 -0
- data/vendor/snowball/algorithms/russian.sbl +221 -0
- data/vendor/snowball/algorithms/serbian.sbl +2379 -0
- data/vendor/snowball/algorithms/spanish.sbl +230 -0
- data/vendor/snowball/algorithms/swedish.sbl +72 -0
- data/vendor/snowball/algorithms/tamil.sbl +405 -0
- data/vendor/snowball/algorithms/turkish.sbl +470 -0
- data/vendor/snowball/algorithms/yiddish.sbl +460 -0
- data/vendor/snowball/charsets/ISO-8859-2.sbl +98 -0
- data/vendor/snowball/charsets/KOI8-R.sbl +74 -0
- data/vendor/snowball/charsets/cp850.sbl +130 -0
- data/vendor/snowball/compiler/analyser.c +1547 -0
- data/vendor/snowball/compiler/driver.c +615 -0
- data/vendor/snowball/compiler/generator.c +1748 -0
- data/vendor/snowball/compiler/generator_ada.c +1702 -0
- data/vendor/snowball/compiler/generator_csharp.c +1322 -0
- data/vendor/snowball/compiler/generator_go.c +1278 -0
- data/vendor/snowball/compiler/generator_java.c +1313 -0
- data/vendor/snowball/compiler/generator_js.c +1316 -0
- data/vendor/snowball/compiler/generator_pascal.c +1387 -0
- data/vendor/snowball/compiler/generator_python.c +1337 -0
- data/vendor/snowball/compiler/generator_rust.c +1295 -0
- data/vendor/snowball/compiler/header.h +418 -0
- data/vendor/snowball/compiler/space.c +286 -0
- data/vendor/snowball/compiler/syswords.h +86 -0
- data/vendor/snowball/compiler/syswords2.h +13 -0
- data/vendor/snowball/compiler/tokeniser.c +567 -0
- data/vendor/snowball/csharp/.gitignore +8 -0
- data/vendor/snowball/csharp/Snowball/Algorithms/.gitignore +1 -0
- data/vendor/snowball/csharp/Snowball/Among.cs +108 -0
- data/vendor/snowball/csharp/Snowball/AssemblyInfo.cs +36 -0
- data/vendor/snowball/csharp/Snowball/Stemmer.cs +660 -0
- data/vendor/snowball/csharp/Stemwords/App.config +6 -0
- data/vendor/snowball/csharp/Stemwords/Program.cs +114 -0
- data/vendor/snowball/doc/TODO +12 -0
- data/vendor/snowball/doc/libstemmer_c_README +148 -0
- data/vendor/snowball/doc/libstemmer_csharp_README +53 -0
- data/vendor/snowball/doc/libstemmer_java_README +67 -0
- data/vendor/snowball/doc/libstemmer_js_README +48 -0
- data/vendor/snowball/doc/libstemmer_python_README +113 -0
- data/vendor/snowball/examples/stemwords.c +204 -0
- data/vendor/snowball/go/README.md +55 -0
- data/vendor/snowball/go/among.go +16 -0
- data/vendor/snowball/go/env.go +403 -0
- data/vendor/snowball/go/stemwords/generate.go +68 -0
- data/vendor/snowball/go/stemwords/main.go +68 -0
- data/vendor/snowball/go/util.go +34 -0
- data/vendor/snowball/iconv.py +50 -0
- data/vendor/snowball/include/libstemmer.h +78 -0
- data/vendor/snowball/java/org/tartarus/snowball/Among.java +29 -0
- data/vendor/snowball/java/org/tartarus/snowball/SnowballProgram.java +381 -0
- data/vendor/snowball/java/org/tartarus/snowball/SnowballStemmer.java +8 -0
- data/vendor/snowball/java/org/tartarus/snowball/TestApp.java +75 -0
- data/vendor/snowball/javascript/base-stemmer.js +294 -0
- data/vendor/snowball/javascript/stemwords.js +106 -0
- data/vendor/snowball/libstemmer/libstemmer_c.in +96 -0
- data/vendor/snowball/libstemmer/mkalgorithms.pl +90 -0
- data/vendor/snowball/libstemmer/mkmodules.pl +267 -0
- data/vendor/snowball/libstemmer/modules.txt +63 -0
- data/vendor/snowball/libstemmer/test.c +34 -0
- data/vendor/snowball/pascal/.gitignore +4 -0
- data/vendor/snowball/pascal/SnowballProgram.pas +430 -0
- data/vendor/snowball/pascal/generate.pl +23 -0
- data/vendor/snowball/pascal/stemwords-template.dpr +78 -0
- data/vendor/snowball/python/MANIFEST.in +7 -0
- data/vendor/snowball/python/create_init.py +54 -0
- data/vendor/snowball/python/setup.cfg +6 -0
- data/vendor/snowball/python/setup.py +81 -0
- data/vendor/snowball/python/snowballstemmer/among.py +13 -0
- data/vendor/snowball/python/snowballstemmer/basestemmer.py +323 -0
- data/vendor/snowball/python/stemwords.py +101 -0
- data/vendor/snowball/python/testapp.py +28 -0
- data/vendor/snowball/runtime/api.c +58 -0
- data/vendor/snowball/runtime/api.h +32 -0
- data/vendor/snowball/runtime/header.h +61 -0
- data/vendor/snowball/runtime/utilities.c +513 -0
- data/vendor/snowball/rust/Cargo.toml +7 -0
- data/vendor/snowball/rust/build.rs +55 -0
- data/vendor/snowball/rust/rust-pre-1.27-compat.patch +30 -0
- data/vendor/snowball/rust/src/main.rs +102 -0
- data/vendor/snowball/rust/src/snowball/algorithms/mod.rs +2 -0
- data/vendor/snowball/rust/src/snowball/among.rs +6 -0
- data/vendor/snowball/rust/src/snowball/mod.rs +6 -0
- data/vendor/snowball/rust/src/snowball/snowball_env.rs +421 -0
- data/vendor/snowball/tests/stemtest.c +95 -0
- metadata +178 -0
|
@@ -0,0 +1,615 @@
|
|
|
1
|
+
#include <ctype.h> /* for toupper etc */
|
|
2
|
+
#include <stdio.h> /* for fprintf etc */
|
|
3
|
+
#include <stdlib.h> /* for free etc */
|
|
4
|
+
#include <string.h> /* for strcmp */
|
|
5
|
+
#include "header.h"
|
|
6
|
+
|
|
7
|
+
#define DEFAULT_JAVA_PACKAGE "org.tartarus.snowball.ext"
|
|
8
|
+
#define DEFAULT_JAVA_BASE_CLASS "org.tartarus.snowball.SnowballProgram"
|
|
9
|
+
#define DEFAULT_JAVA_AMONG_CLASS "org.tartarus.snowball.Among"
|
|
10
|
+
#define DEFAULT_JAVA_STRING_CLASS "java.lang.StringBuilder"
|
|
11
|
+
|
|
12
|
+
#define DEFAULT_GO_PACKAGE "snowball"
|
|
13
|
+
#define DEFAULT_GO_SNOWBALL_RUNTIME "github.com/snowballstem/snowball/go"
|
|
14
|
+
|
|
15
|
+
#define DEFAULT_ADA_PACKAGE "Snowball"
|
|
16
|
+
#define DEFAULT_ADA_SNOWBALL_RUNTIME "github.com/snowballstem/snowball/ada"
|
|
17
|
+
|
|
18
|
+
#define DEFAULT_CS_NAMESPACE "Snowball"
|
|
19
|
+
#define DEFAULT_CS_BASE_CLASS "Stemmer"
|
|
20
|
+
#define DEFAULT_CS_AMONG_CLASS "Among"
|
|
21
|
+
#define DEFAULT_CS_STRING_CLASS "StringBuilder"
|
|
22
|
+
|
|
23
|
+
#define DEFAULT_JS_BASE_CLASS "BaseStemmer"
|
|
24
|
+
|
|
25
|
+
#define DEFAULT_PYTHON_BASE_CLASS "BaseStemmer"
|
|
26
|
+
|
|
27
|
+
static int eq(const char * s1, const char * s2) {
|
|
28
|
+
return strcmp(s1, s2) == 0;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
static void print_arglist(int exit_code) {
|
|
32
|
+
FILE * f = exit_code ? stderr : stdout;
|
|
33
|
+
fprintf(f, "Usage: snowball SOURCE_FILE... [OPTIONS]\n\n"
|
|
34
|
+
"Supported options:\n"
|
|
35
|
+
" -o[utput] file\n"
|
|
36
|
+
" -s[yntax]\n"
|
|
37
|
+
" -comments\n"
|
|
38
|
+
#ifndef DISABLE_JAVA
|
|
39
|
+
" -j[ava]\n"
|
|
40
|
+
#endif
|
|
41
|
+
#ifndef DISABLE_CSHARP
|
|
42
|
+
" -cs[harp]\n"
|
|
43
|
+
#endif
|
|
44
|
+
" -c++\n"
|
|
45
|
+
#ifndef DISABLE_PASCAL
|
|
46
|
+
" -pascal\n"
|
|
47
|
+
#endif
|
|
48
|
+
#ifndef DISABLE_PYTHON
|
|
49
|
+
" -py[thon]\n"
|
|
50
|
+
#endif
|
|
51
|
+
#ifndef DISABLE_JS
|
|
52
|
+
" -js\n"
|
|
53
|
+
#endif
|
|
54
|
+
#ifndef DISABLE_RUST
|
|
55
|
+
" -rust\n"
|
|
56
|
+
#endif
|
|
57
|
+
#ifndef DISABLE_GO
|
|
58
|
+
" -go\n"
|
|
59
|
+
#endif
|
|
60
|
+
#ifndef DISABLE_ADA
|
|
61
|
+
" -ada\n"
|
|
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"
|
|
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"
|
|
75
|
+
#endif
|
|
76
|
+
#ifndef DISABLE_GO
|
|
77
|
+
" -gop[ackage] Go package name for stemmers\n"
|
|
78
|
+
" -gor[untime] Go snowball runtime package\n"
|
|
79
|
+
#endif
|
|
80
|
+
" --help display this help and exit\n"
|
|
81
|
+
" --version output version information and exit\n"
|
|
82
|
+
);
|
|
83
|
+
exit(exit_code);
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
static void check_lim(int i, int argc) {
|
|
87
|
+
if (i >= argc) {
|
|
88
|
+
fprintf(stderr, "argument list is one short\n");
|
|
89
|
+
print_arglist(1);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
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);
|
|
98
|
+
exit(1);
|
|
99
|
+
}
|
|
100
|
+
free(s);
|
|
101
|
+
return output;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
static int read_options(struct options * o, int argc, char * argv[]) {
|
|
105
|
+
char * s;
|
|
106
|
+
int i = 1;
|
|
107
|
+
int new_argc = 1;
|
|
108
|
+
/* Note down the last option used to specify an explicit encoding so
|
|
109
|
+
* we can warn we ignored it for languages with a fixed encoding.
|
|
110
|
+
*/
|
|
111
|
+
const char * encoding_opt = NULL;
|
|
112
|
+
|
|
113
|
+
/* set defaults: */
|
|
114
|
+
|
|
115
|
+
o->output_file = 0;
|
|
116
|
+
o->syntax_tree = false;
|
|
117
|
+
o->comments = false;
|
|
118
|
+
o->externals_prefix = NULL;
|
|
119
|
+
o->variables_prefix = 0;
|
|
120
|
+
o->runtime_path = 0;
|
|
121
|
+
o->parent_class_name = NULL;
|
|
122
|
+
o->string_class = NULL;
|
|
123
|
+
o->among_class = NULL;
|
|
124
|
+
o->package = NULL;
|
|
125
|
+
o->go_snowball_runtime = DEFAULT_GO_SNOWBALL_RUNTIME;
|
|
126
|
+
o->name = NULL;
|
|
127
|
+
o->make_lang = LANG_C;
|
|
128
|
+
o->includes = 0;
|
|
129
|
+
o->includes_end = 0;
|
|
130
|
+
o->encoding = ENC_SINGLEBYTE;
|
|
131
|
+
|
|
132
|
+
/* read options: */
|
|
133
|
+
|
|
134
|
+
while (i < argc) {
|
|
135
|
+
s = argv[i++];
|
|
136
|
+
if (s[0] != '-') {
|
|
137
|
+
/* Non-option argument - shuffle down. */
|
|
138
|
+
argv[new_argc++] = s;
|
|
139
|
+
continue;
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
{
|
|
143
|
+
if (eq(s, "-o") || eq(s, "-output")) {
|
|
144
|
+
check_lim(i, argc);
|
|
145
|
+
o->output_file = argv[i++];
|
|
146
|
+
continue;
|
|
147
|
+
}
|
|
148
|
+
if (eq(s, "-n") || eq(s, "-name")) {
|
|
149
|
+
char * new_name;
|
|
150
|
+
size_t len;
|
|
151
|
+
|
|
152
|
+
check_lim(i, argc);
|
|
153
|
+
/* Take a copy of the argument here, because
|
|
154
|
+
* later we will free o->name */
|
|
155
|
+
len = strlen(argv[i]);
|
|
156
|
+
new_name = malloc(len + 1);
|
|
157
|
+
memcpy(new_name, argv[i++], len);
|
|
158
|
+
new_name[len] = '\0';
|
|
159
|
+
o->name = new_name;
|
|
160
|
+
continue;
|
|
161
|
+
}
|
|
162
|
+
#ifndef DISABLE_JS
|
|
163
|
+
if (eq(s, "-js")) {
|
|
164
|
+
o->make_lang = LANG_JAVASCRIPT;
|
|
165
|
+
continue;
|
|
166
|
+
}
|
|
167
|
+
#endif
|
|
168
|
+
#ifndef DISABLE_RUST
|
|
169
|
+
if (eq(s, "-rust")) {
|
|
170
|
+
o->make_lang = LANG_RUST;
|
|
171
|
+
continue;
|
|
172
|
+
}
|
|
173
|
+
#endif
|
|
174
|
+
#ifndef DISABLE_GO
|
|
175
|
+
if (eq(s, "-go")) {
|
|
176
|
+
o->make_lang = LANG_GO;
|
|
177
|
+
continue;
|
|
178
|
+
}
|
|
179
|
+
#endif
|
|
180
|
+
#ifndef DISABLE_JAVA
|
|
181
|
+
if (eq(s, "-j") || eq(s, "-java")) {
|
|
182
|
+
o->make_lang = LANG_JAVA;
|
|
183
|
+
continue;
|
|
184
|
+
}
|
|
185
|
+
#endif
|
|
186
|
+
#ifndef DISABLE_CSHARP
|
|
187
|
+
if (eq(s, "-cs") || eq(s, "-csharp")) {
|
|
188
|
+
o->make_lang = LANG_CSHARP;
|
|
189
|
+
continue;
|
|
190
|
+
}
|
|
191
|
+
#endif
|
|
192
|
+
if (eq(s, "-c++")) {
|
|
193
|
+
o->make_lang = LANG_CPLUSPLUS;
|
|
194
|
+
continue;
|
|
195
|
+
}
|
|
196
|
+
#ifndef DISABLE_PASCAL
|
|
197
|
+
if (eq(s, "-pascal")) {
|
|
198
|
+
o->make_lang = LANG_PASCAL;
|
|
199
|
+
continue;
|
|
200
|
+
}
|
|
201
|
+
#endif
|
|
202
|
+
#ifndef DISABLE_PYTHON
|
|
203
|
+
if (eq(s, "-py") || eq(s, "-python")) {
|
|
204
|
+
o->make_lang = LANG_PYTHON;
|
|
205
|
+
continue;
|
|
206
|
+
}
|
|
207
|
+
#endif
|
|
208
|
+
#ifndef DISABLE_ADA
|
|
209
|
+
if (eq(s, "-ada")) {
|
|
210
|
+
o->make_lang = LANG_ADA;
|
|
211
|
+
continue;
|
|
212
|
+
}
|
|
213
|
+
#endif
|
|
214
|
+
if (eq(s, "-w") || eq(s, "-widechars")) {
|
|
215
|
+
encoding_opt = s;
|
|
216
|
+
o->encoding = ENC_WIDECHARS;
|
|
217
|
+
continue;
|
|
218
|
+
}
|
|
219
|
+
if (eq(s, "-s") || eq(s, "-syntax")) {
|
|
220
|
+
o->syntax_tree = true;
|
|
221
|
+
continue;
|
|
222
|
+
}
|
|
223
|
+
if (eq(s, "-comments")) {
|
|
224
|
+
o->comments = true;
|
|
225
|
+
continue;
|
|
226
|
+
}
|
|
227
|
+
if (eq(s, "-ep") || eq(s, "-eprefix")) {
|
|
228
|
+
check_lim(i, argc);
|
|
229
|
+
o->externals_prefix = argv[i++];
|
|
230
|
+
continue;
|
|
231
|
+
}
|
|
232
|
+
if (eq(s, "-vp") || eq(s, "-vprefix")) {
|
|
233
|
+
check_lim(i, argc);
|
|
234
|
+
o->variables_prefix = argv[i++];
|
|
235
|
+
continue;
|
|
236
|
+
}
|
|
237
|
+
if (eq(s, "-i") || eq(s, "-include")) {
|
|
238
|
+
check_lim(i, argc);
|
|
239
|
+
|
|
240
|
+
{
|
|
241
|
+
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;
|
|
248
|
+
o->includes_end = p;
|
|
249
|
+
}
|
|
250
|
+
continue;
|
|
251
|
+
}
|
|
252
|
+
if (eq(s, "-r") || eq(s, "-runtime")) {
|
|
253
|
+
check_lim(i, argc);
|
|
254
|
+
o->runtime_path = argv[i++];
|
|
255
|
+
continue;
|
|
256
|
+
}
|
|
257
|
+
if (eq(s, "-u") || eq(s, "-utf8")) {
|
|
258
|
+
encoding_opt = s;
|
|
259
|
+
o->encoding = ENC_UTF8;
|
|
260
|
+
continue;
|
|
261
|
+
}
|
|
262
|
+
if (eq(s, "-p") || eq(s, "-parentclassname")) {
|
|
263
|
+
check_lim(i, argc);
|
|
264
|
+
o->parent_class_name = argv[i++];
|
|
265
|
+
continue;
|
|
266
|
+
}
|
|
267
|
+
#if !defined(DISABLE_JAVA) || !defined(DISABLE_CSHARP)
|
|
268
|
+
if (eq(s, "-P") || eq(s, "-Package")) {
|
|
269
|
+
check_lim(i, argc);
|
|
270
|
+
o->package = argv[i++];
|
|
271
|
+
continue;
|
|
272
|
+
}
|
|
273
|
+
if (eq(s, "-S") || eq(s, "-stringclass")) {
|
|
274
|
+
check_lim(i, argc);
|
|
275
|
+
o->string_class = argv[i++];
|
|
276
|
+
continue;
|
|
277
|
+
}
|
|
278
|
+
if (eq(s, "-a") || eq(s, "-amongclass")) {
|
|
279
|
+
check_lim(i, argc);
|
|
280
|
+
o->among_class = argv[i++];
|
|
281
|
+
continue;
|
|
282
|
+
}
|
|
283
|
+
#endif
|
|
284
|
+
#ifndef DISABLE_GO
|
|
285
|
+
if (eq(s, "-gop") || eq(s, "-gopackage")) {
|
|
286
|
+
check_lim(i, argc);
|
|
287
|
+
o->package = argv[i++];
|
|
288
|
+
continue;
|
|
289
|
+
}
|
|
290
|
+
if (eq(s, "-gor") || eq(s, "-goruntime")) {
|
|
291
|
+
check_lim(i, argc);
|
|
292
|
+
o->go_snowball_runtime = argv[i++];
|
|
293
|
+
continue;
|
|
294
|
+
}
|
|
295
|
+
#endif
|
|
296
|
+
if (eq(s, "--help")) {
|
|
297
|
+
print_arglist(0);
|
|
298
|
+
}
|
|
299
|
+
|
|
300
|
+
if (eq(s, "--version")) {
|
|
301
|
+
printf("Snowball compiler version " SNOWBALL_VERSION "\n");
|
|
302
|
+
exit(0);
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
fprintf(stderr, "'%s' misplaced\n", s);
|
|
306
|
+
print_arglist(1);
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
if (new_argc == 1) {
|
|
310
|
+
fprintf(stderr, "no source files specified\n");
|
|
311
|
+
print_arglist(1);
|
|
312
|
+
}
|
|
313
|
+
argv[new_argc] = NULL;
|
|
314
|
+
|
|
315
|
+
/* Set language-dependent defaults. */
|
|
316
|
+
switch (o->make_lang) {
|
|
317
|
+
case LANG_C:
|
|
318
|
+
case LANG_CPLUSPLUS:
|
|
319
|
+
encoding_opt = NULL;
|
|
320
|
+
break;
|
|
321
|
+
case LANG_CSHARP:
|
|
322
|
+
o->encoding = ENC_WIDECHARS;
|
|
323
|
+
if (!o->parent_class_name)
|
|
324
|
+
o->parent_class_name = DEFAULT_CS_BASE_CLASS;
|
|
325
|
+
if (!o->string_class)
|
|
326
|
+
o->string_class = DEFAULT_CS_STRING_CLASS;
|
|
327
|
+
if (!o->among_class)
|
|
328
|
+
o->among_class = DEFAULT_CS_AMONG_CLASS;
|
|
329
|
+
if (!o->package)
|
|
330
|
+
o->package = DEFAULT_CS_NAMESPACE;
|
|
331
|
+
break;
|
|
332
|
+
case LANG_GO:
|
|
333
|
+
o->encoding = ENC_UTF8;
|
|
334
|
+
if (!o->package)
|
|
335
|
+
o->package = DEFAULT_GO_PACKAGE;
|
|
336
|
+
break;
|
|
337
|
+
case LANG_ADA:
|
|
338
|
+
o->encoding = ENC_UTF8;
|
|
339
|
+
if (!o->package)
|
|
340
|
+
o->package = DEFAULT_ADA_PACKAGE;
|
|
341
|
+
break;
|
|
342
|
+
case LANG_JAVA:
|
|
343
|
+
o->encoding = ENC_WIDECHARS;
|
|
344
|
+
if (!o->parent_class_name)
|
|
345
|
+
o->parent_class_name = DEFAULT_JAVA_BASE_CLASS;
|
|
346
|
+
if (!o->string_class)
|
|
347
|
+
o->string_class = DEFAULT_JAVA_STRING_CLASS;
|
|
348
|
+
if (!o->among_class)
|
|
349
|
+
o->among_class = DEFAULT_JAVA_AMONG_CLASS;
|
|
350
|
+
if (!o->package)
|
|
351
|
+
o->package = DEFAULT_JAVA_PACKAGE;
|
|
352
|
+
break;
|
|
353
|
+
case LANG_JAVASCRIPT:
|
|
354
|
+
o->encoding = ENC_WIDECHARS;
|
|
355
|
+
if (!o->parent_class_name)
|
|
356
|
+
o->parent_class_name = DEFAULT_JS_BASE_CLASS;
|
|
357
|
+
break;
|
|
358
|
+
case LANG_PYTHON:
|
|
359
|
+
o->encoding = ENC_WIDECHARS;
|
|
360
|
+
if (!o->parent_class_name)
|
|
361
|
+
o->parent_class_name = DEFAULT_PYTHON_BASE_CLASS;
|
|
362
|
+
break;
|
|
363
|
+
case LANG_RUST:
|
|
364
|
+
o->encoding = ENC_UTF8;
|
|
365
|
+
break;
|
|
366
|
+
default:
|
|
367
|
+
break;
|
|
368
|
+
}
|
|
369
|
+
|
|
370
|
+
if (encoding_opt) {
|
|
371
|
+
fprintf(stderr, "warning: %s only meaningful for C and C++\n",
|
|
372
|
+
encoding_opt);
|
|
373
|
+
}
|
|
374
|
+
|
|
375
|
+
if (o->make_lang != LANG_C && o->make_lang != LANG_CPLUSPLUS) {
|
|
376
|
+
if (o->runtime_path) {
|
|
377
|
+
fprintf(stderr, "warning: -r/-runtime only meaningful for C and C++\n");
|
|
378
|
+
}
|
|
379
|
+
if (o->externals_prefix) {
|
|
380
|
+
fprintf(stderr, "warning: -ep/-eprefix only meaningful for C and C++\n");
|
|
381
|
+
}
|
|
382
|
+
}
|
|
383
|
+
if (!o->externals_prefix) o->externals_prefix = "";
|
|
384
|
+
|
|
385
|
+
if (!o->name && o->output_file) {
|
|
386
|
+
/* Default class name to basename of output_file - this is the standard
|
|
387
|
+
* convention for at least Java and C#.
|
|
388
|
+
*/
|
|
389
|
+
const char * slash = strrchr(o->output_file, '/');
|
|
390
|
+
size_t len;
|
|
391
|
+
const char * leaf = (slash == NULL) ? o->output_file : slash + 1;
|
|
392
|
+
|
|
393
|
+
slash = strrchr(leaf, '\\');
|
|
394
|
+
if (slash != NULL) leaf = slash + 1;
|
|
395
|
+
|
|
396
|
+
{
|
|
397
|
+
const char * dot = strchr(leaf, '.');
|
|
398
|
+
len = (dot == NULL) ? strlen(leaf) : (size_t)(dot - leaf);
|
|
399
|
+
}
|
|
400
|
+
|
|
401
|
+
{
|
|
402
|
+
char * new_name = malloc(len + 1);
|
|
403
|
+
switch (o->make_lang) {
|
|
404
|
+
case LANG_CSHARP:
|
|
405
|
+
case LANG_PASCAL:
|
|
406
|
+
/* Upper case initial letter. */
|
|
407
|
+
memcpy(new_name, leaf, len);
|
|
408
|
+
new_name[0] = toupper(new_name[0]);
|
|
409
|
+
break;
|
|
410
|
+
case LANG_JAVASCRIPT:
|
|
411
|
+
case LANG_PYTHON: {
|
|
412
|
+
/* Upper case initial letter and change each
|
|
413
|
+
* underscore+letter or hyphen+letter to an upper case
|
|
414
|
+
* letter.
|
|
415
|
+
*/
|
|
416
|
+
size_t i, j = 0;
|
|
417
|
+
int uc_next = true;
|
|
418
|
+
for (i = 0; i != len; ++i) {
|
|
419
|
+
unsigned char ch = leaf[i];
|
|
420
|
+
if (ch == '_' || ch == '-') {
|
|
421
|
+
uc_next = true;
|
|
422
|
+
} else {
|
|
423
|
+
if (uc_next) {
|
|
424
|
+
new_name[j] = toupper(ch);
|
|
425
|
+
uc_next = false;
|
|
426
|
+
} else {
|
|
427
|
+
new_name[j] = ch;
|
|
428
|
+
}
|
|
429
|
+
++j;
|
|
430
|
+
}
|
|
431
|
+
}
|
|
432
|
+
len = j;
|
|
433
|
+
break;
|
|
434
|
+
}
|
|
435
|
+
default:
|
|
436
|
+
/* Just copy. */
|
|
437
|
+
memcpy(new_name, leaf, len);
|
|
438
|
+
break;
|
|
439
|
+
}
|
|
440
|
+
new_name[len] = '\0';
|
|
441
|
+
o->name = new_name;
|
|
442
|
+
}
|
|
443
|
+
}
|
|
444
|
+
|
|
445
|
+
return new_argc;
|
|
446
|
+
}
|
|
447
|
+
|
|
448
|
+
extern int main(int argc, char * argv[]) {
|
|
449
|
+
|
|
450
|
+
int i;
|
|
451
|
+
NEW(options, o);
|
|
452
|
+
argc = read_options(o, argc, argv);
|
|
453
|
+
{
|
|
454
|
+
char * file = argv[1];
|
|
455
|
+
symbol * u = get_input(file);
|
|
456
|
+
if (u == 0) {
|
|
457
|
+
fprintf(stderr, "Can't open input %s\n", file);
|
|
458
|
+
exit(1);
|
|
459
|
+
}
|
|
460
|
+
{
|
|
461
|
+
struct tokeniser * t = create_tokeniser(u, file);
|
|
462
|
+
struct analyser * a = create_analyser(t);
|
|
463
|
+
struct input ** next_input_ptr = &(t->next);
|
|
464
|
+
a->encoding = t->encoding = o->encoding;
|
|
465
|
+
t->includes = o->includes;
|
|
466
|
+
/* If multiple source files are specified, set up the others to be
|
|
467
|
+
* read after the first in order, using the same mechanism as
|
|
468
|
+
* 'get' uses. */
|
|
469
|
+
for (i = 2; i != argc; ++i) {
|
|
470
|
+
NEW(input, q);
|
|
471
|
+
file = argv[i];
|
|
472
|
+
u = get_input(file);
|
|
473
|
+
if (u == 0) {
|
|
474
|
+
fprintf(stderr, "Can't open input %s\n", file);
|
|
475
|
+
exit(1);
|
|
476
|
+
}
|
|
477
|
+
q->p = u;
|
|
478
|
+
q->c = 0;
|
|
479
|
+
q->file = file;
|
|
480
|
+
q->file_needs_freeing = false;
|
|
481
|
+
q->line_number = 1;
|
|
482
|
+
*next_input_ptr = q;
|
|
483
|
+
next_input_ptr = &(q->next);
|
|
484
|
+
}
|
|
485
|
+
*next_input_ptr = NULL;
|
|
486
|
+
read_program(a);
|
|
487
|
+
if (t->error_count > 0) exit(1);
|
|
488
|
+
if (o->syntax_tree) print_program(a);
|
|
489
|
+
close_tokeniser(t);
|
|
490
|
+
if (!o->syntax_tree) {
|
|
491
|
+
struct generator * g;
|
|
492
|
+
|
|
493
|
+
const char * s = o->output_file;
|
|
494
|
+
if (!s) {
|
|
495
|
+
fprintf(stderr, "Please include the -o option\n");
|
|
496
|
+
print_arglist(1);
|
|
497
|
+
}
|
|
498
|
+
g = create_generator(a, o);
|
|
499
|
+
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';
|
|
504
|
+
if (o->make_lang == LANG_CPLUSPLUS) {
|
|
505
|
+
b = add_s_to_b(b, "c");
|
|
506
|
+
}
|
|
507
|
+
o->output_src = get_output(b);
|
|
508
|
+
lose_b(b);
|
|
509
|
+
|
|
510
|
+
generate_program_c(g);
|
|
511
|
+
fclose(o->output_src);
|
|
512
|
+
fclose(o->output_h);
|
|
513
|
+
}
|
|
514
|
+
#ifndef DISABLE_JAVA
|
|
515
|
+
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);
|
|
520
|
+
generate_program_java(g);
|
|
521
|
+
fclose(o->output_src);
|
|
522
|
+
}
|
|
523
|
+
#endif
|
|
524
|
+
#ifndef DISABLE_PASCAL
|
|
525
|
+
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);
|
|
530
|
+
generate_program_pascal(g);
|
|
531
|
+
fclose(o->output_src);
|
|
532
|
+
}
|
|
533
|
+
#endif
|
|
534
|
+
#ifndef DISABLE_PYTHON
|
|
535
|
+
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);
|
|
540
|
+
generate_program_python(g);
|
|
541
|
+
fclose(o->output_src);
|
|
542
|
+
}
|
|
543
|
+
#endif
|
|
544
|
+
#ifndef DISABLE_JS
|
|
545
|
+
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);
|
|
550
|
+
generate_program_js(g);
|
|
551
|
+
fclose(o->output_src);
|
|
552
|
+
}
|
|
553
|
+
#endif
|
|
554
|
+
#ifndef DISABLE_CSHARP
|
|
555
|
+
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);
|
|
560
|
+
generate_program_csharp(g);
|
|
561
|
+
fclose(o->output_src);
|
|
562
|
+
}
|
|
563
|
+
#endif
|
|
564
|
+
#ifndef DISABLE_RUST
|
|
565
|
+
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);
|
|
570
|
+
generate_program_rust(g);
|
|
571
|
+
fclose(o->output_src);
|
|
572
|
+
}
|
|
573
|
+
#endif
|
|
574
|
+
#ifndef DISABLE_GO
|
|
575
|
+
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);
|
|
580
|
+
generate_program_go(g);
|
|
581
|
+
fclose(o->output_src);
|
|
582
|
+
}
|
|
583
|
+
#endif
|
|
584
|
+
#ifndef DISABLE_ADA
|
|
585
|
+
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
|
+
|
|
593
|
+
generate_program_ada(g);
|
|
594
|
+
fclose(o->output_src);
|
|
595
|
+
fclose(o->output_h);
|
|
596
|
+
|
|
597
|
+
}
|
|
598
|
+
#endif
|
|
599
|
+
close_generator(g);
|
|
600
|
+
}
|
|
601
|
+
close_analyser(a);
|
|
602
|
+
}
|
|
603
|
+
lose_b(u);
|
|
604
|
+
}
|
|
605
|
+
{ struct include * p = o->includes;
|
|
606
|
+
while (p) {
|
|
607
|
+
struct include * q = p->next;
|
|
608
|
+
lose_b(p->b); FREE(p); p = q;
|
|
609
|
+
}
|
|
610
|
+
}
|
|
611
|
+
FREE(o->name);
|
|
612
|
+
FREE(o);
|
|
613
|
+
if (space_count) fprintf(stderr, "%d blocks unfreed\n", space_count);
|
|
614
|
+
return 0;
|
|
615
|
+
}
|