byk 0.3.0 → 0.4.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 +4 -4
- data/CHANGELOG.md +19 -0
- data/README.md +19 -19
- data/ext/byk/byk.c +108 -111
- data/lib/byk/version.rb +1 -1
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2fb4e839b91bf3348e5c59e0e52b97bbbaec43de
|
4
|
+
data.tar.gz: 1a5d496e1fe684cba330eed517c3b8de5ad573a0
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9fc2e29e20dad1e0c517afd3c35d60340f256ce44bcda71a9e2fb344be4b685c2fa3b85350dd347e890143c6f9a84a94896eec9df0bfb8ec9b7be8811907053f
|
7
|
+
data.tar.gz: c81f02b4075cdc5b82b3f17f47fb4ea74dbcfa29bbe466731c685ec5a7b3d1c54b329075eb8c2d1731b76f03b9bf9b24646ea3aeff88f8ab17577297d0bae960
|
data/CHANGELOG.md
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
# Changelog
|
2
|
+
|
3
|
+
### Byk 0.4.0 (2015-04-17)
|
4
|
+
|
5
|
+
* Performance tuning and refactoring, ~10% speedup
|
6
|
+
* Updated benchmark
|
7
|
+
* Introduced changelog
|
8
|
+
|
9
|
+
### Byk 0.3.0 (2015-04-16)
|
10
|
+
|
11
|
+
* MRI 1.9.2 support
|
12
|
+
|
13
|
+
### Byk 0.2.0 (2015-04-15)
|
14
|
+
|
15
|
+
* MRI 1.9.3 support
|
16
|
+
|
17
|
+
### Byk 0.1.0 (2015-04-15)
|
18
|
+
|
19
|
+
* First release
|
data/README.md
CHANGED
@@ -1,13 +1,16 @@
|
|
1
1
|
Byk
|
2
2
|
===
|
3
3
|
|
4
|
-
|
5
|
-
|
6
|
-

|
4
|
+
[](https://rubygems.org/gems/byk)
|
5
|
+
[](https://travis-ci.org/topalovic/byk)
|
7
6
|
|
8
|
-
|
7
|
+
Ruby gem for fast transliteration of Serbian Cyrillic into Latin
|
8
|
+
<br />
|
9
|
+
<sub>Inspired by @dejan's
|
9
10
|
[nice little gem](https://github.com/dejan/srbovanje),
|
10
|
-
this one comes with a C-optimized twist
|
11
|
+
this one comes with a C-optimized twist</sub>
|
12
|
+
|
13
|
+

|
11
14
|
|
12
15
|
|
13
16
|
## Installation
|
@@ -61,8 +64,8 @@ Note that these methods take into account the
|
|
61
64
|
[two-letter capitalization rules](http://sr.wikipedia.org/wiki/Gajica#Abeceda):
|
62
65
|
|
63
66
|
```ruby
|
64
|
-
"ЉИЉА Љиљановић".to_latin
|
65
|
-
"ĐORĐE Đorđević".to_ascii_latin
|
67
|
+
"ЉИЉА Љиљановић".to_latin # => "LJILJA Ljiljanović"
|
68
|
+
"ĐORĐE Đorđević".to_ascii_latin # => "DJORDJE Djordjevic"
|
66
69
|
```
|
67
70
|
|
68
71
|
|
@@ -74,24 +77,21 @@ my hardware. YMMV of course.
|
|
74
77
|
|
75
78
|
## Raison d'être
|
76
79
|
|
77
|
-
This kind of speed-up might
|
78
|
-
|
79
|
-
|
80
|
+
This kind of speed-up might be worthwhile for massive localization
|
81
|
+
projects, e.g. sites supporting dual script content. Remember,
|
82
|
+
`Benchmark` is your friend.
|
80
83
|
|
81
|
-
I found
|
82
|
-
|
84
|
+
I found transliteration to be a straightforward little problem that
|
85
|
+
lends itself well to optimization. It also gave me an excuse to play
|
83
86
|
with Ruby extensions, so there :smile_cat:
|
84
87
|
|
85
88
|
|
86
89
|
## Compatibility
|
87
90
|
|
88
|
-
Byk is supported under MRI Ruby
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
## Status
|
93
|
-
|
94
|
-
[](https://travis-ci.org/topalovic/byk)
|
91
|
+
Byk is supported under MRI Ruby >= 1.9.2. I don't plan to support
|
92
|
+
1.8.7 or older due to substantial C API changes between 1.8 and
|
93
|
+
1.9. It doesn't build under Rubinius currently, but I intend to
|
94
|
+
support it in future releases.
|
95
95
|
|
96
96
|
|
97
97
|
## License
|
data/ext/byk/byk.c
CHANGED
@@ -17,9 +17,9 @@ rb_check_arity(int argc, int min, int max)
|
|
17
17
|
|
18
18
|
#define STR_ENC_GET(str) rb_enc_from_index(ENCODING_GET(str))
|
19
19
|
|
20
|
-
#define STR_CAT_COND_ASCII(
|
21
|
-
|
22
|
-
|
20
|
+
#define STR_CAT_COND_ASCII(ascii, dest, chr, ascii_chr, len, enc) \
|
21
|
+
ascii ? rb_enc_str_buf_cat(dest, chr, len, enc) \
|
22
|
+
: str_cat_char(dest, ascii_chr, enc)
|
23
23
|
|
24
24
|
enum {
|
25
25
|
LAT_CAP_TJ=262,
|
@@ -106,7 +106,6 @@ is_upper_case(unsigned int c)
|
|
106
106
|
|| c == LAT_CAP_ZH);
|
107
107
|
}
|
108
108
|
|
109
|
-
|
110
109
|
static void
|
111
110
|
str_cat_char(VALUE str, unsigned int c, rb_encoding *enc)
|
112
111
|
{
|
@@ -123,8 +122,10 @@ str_to_latin(int argc, VALUE *argv, VALUE str, int ascii, int bang)
|
|
123
122
|
long dest_len;
|
124
123
|
char *pos, *end;
|
125
124
|
rb_encoding *enc;
|
125
|
+
int len, next_len;
|
126
|
+
int seen_upper = 0;
|
127
|
+
int force_upper = 0;
|
126
128
|
unsigned int codepoint = 0;
|
127
|
-
unsigned int prev_codepoint = 0;
|
128
129
|
unsigned int next_codepoint = 0;
|
129
130
|
|
130
131
|
rb_check_arity(argc, 0, 1);
|
@@ -134,27 +135,21 @@ str_to_latin(int argc, VALUE *argv, VALUE str, int ascii, int bang)
|
|
134
135
|
|
135
136
|
end = RSTRING_END(str);
|
136
137
|
enc = STR_ENC_GET(str);
|
137
|
-
dest_len = RSTRING_LEN(str) + 30;
|
138
|
+
dest_len = RSTRING_LEN(str) + 30;
|
138
139
|
dest = rb_str_buf_new(dest_len);
|
139
140
|
rb_enc_associate(dest, enc);
|
140
141
|
|
141
|
-
|
142
|
-
int len;
|
143
|
-
int force_upper = 0;
|
144
|
-
|
145
|
-
prev_codepoint = codepoint;
|
146
|
-
codepoint = rb_enc_codepoint_len(pos, end, &len, enc);
|
147
|
-
next_codepoint = 0;
|
142
|
+
codepoint = rb_enc_codepoint_len(pos, end, &len, enc);
|
148
143
|
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
/* TODO Trim down to one rb_enc_codepoint call per iter. */
|
153
|
-
next_codepoint = rb_enc_codepoint(pos + len, end, enc);
|
154
|
-
force_upper = is_upper_case(next_codepoint);
|
144
|
+
while (pos < end) {
|
145
|
+
if (pos + len < end) {
|
146
|
+
next_codepoint = rb_enc_codepoint_len(pos + len, end, &next_len, enc);
|
155
147
|
}
|
156
148
|
|
157
|
-
|
149
|
+
force_upper = seen_upper || is_upper_case(next_codepoint);
|
150
|
+
seen_upper = is_upper_case(codepoint);
|
151
|
+
|
152
|
+
/* Latin -> "ASCII Latin" conversion */
|
158
153
|
if (ascii && codepoint >= LAT_CAP_TJ && codepoint <= LAT_ZH) {
|
159
154
|
switch (codepoint) {
|
160
155
|
case LAT_TJ:
|
@@ -174,107 +169,109 @@ str_to_latin(int argc, VALUE *argv, VALUE str, int ascii, int bang)
|
|
174
169
|
default:
|
175
170
|
rb_enc_str_buf_cat(dest, pos, len, enc);
|
176
171
|
}
|
177
|
-
pos += len;
|
178
|
-
continue;
|
179
172
|
}
|
180
173
|
|
181
|
-
/*
|
182
|
-
if (codepoint < CYR_CAP_DJ || codepoint > CYR_DZ) {
|
174
|
+
/* Non-Cyrillic codepoints */
|
175
|
+
else if (codepoint < CYR_CAP_DJ || codepoint > CYR_DZ) {
|
183
176
|
rb_enc_str_buf_cat(dest, pos, len, enc);
|
184
|
-
pos += len;
|
185
|
-
continue;
|
186
177
|
}
|
187
178
|
|
188
|
-
/* Cyrillic ->
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
|
202
|
-
|
203
|
-
|
204
|
-
|
205
|
-
|
206
|
-
|
207
|
-
|
208
|
-
|
209
|
-
|
210
|
-
|
211
|
-
|
212
|
-
|
213
|
-
|
214
|
-
|
215
|
-
|
216
|
-
|
217
|
-
|
218
|
-
|
219
|
-
|
220
|
-
|
221
|
-
|
222
|
-
case CYR_M: rb_enc_str_buf_cat(dest, "m", 1, enc); break;
|
223
|
-
case CYR_N: rb_enc_str_buf_cat(dest, "n", 1, enc); break;
|
224
|
-
case CYR_O: rb_enc_str_buf_cat(dest, "o", 1, enc); break;
|
225
|
-
case CYR_P: rb_enc_str_buf_cat(dest, "p", 1, enc); break;
|
226
|
-
case CYR_R: rb_enc_str_buf_cat(dest, "r", 1, enc); break;
|
227
|
-
case CYR_S: rb_enc_str_buf_cat(dest, "s", 1, enc); break;
|
228
|
-
case CYR_T: rb_enc_str_buf_cat(dest, "t", 1, enc); break;
|
229
|
-
case CYR_U: rb_enc_str_buf_cat(dest, "u", 1, enc); break;
|
230
|
-
case CYR_F: rb_enc_str_buf_cat(dest, "f", 1, enc); break;
|
231
|
-
case CYR_H: rb_enc_str_buf_cat(dest, "h", 1, enc); break;
|
232
|
-
case CYR_C: rb_enc_str_buf_cat(dest, "c", 1, enc); break;
|
233
|
-
case CYR_J: rb_enc_str_buf_cat(dest, "j", 1, enc); break;
|
234
|
-
case CYR_LJ: rb_enc_str_buf_cat(dest, "lj", 2, enc); break;
|
235
|
-
case CYR_NJ: rb_enc_str_buf_cat(dest, "nj", 2, enc); break;
|
236
|
-
case CYR_DJ: STR_CAT_COND_ASCII(ascii, dest, "dj", LAT_DJ, 2, enc); break;
|
237
|
-
case CYR_TJ: STR_CAT_COND_ASCII(ascii, dest, "c", LAT_TJ, 1, enc); break;
|
238
|
-
case CYR_CH: STR_CAT_COND_ASCII(ascii, dest, "c", LAT_CH, 1, enc); break;
|
239
|
-
case CYR_ZH: STR_CAT_COND_ASCII(ascii, dest, "z", LAT_ZH, 1, enc); break;
|
240
|
-
case CYR_SH: STR_CAT_COND_ASCII(ascii, dest, "s", LAT_SH, 1, enc); break;
|
241
|
-
case CYR_CAP_TJ: STR_CAT_COND_ASCII(ascii, dest, "C", LAT_CAP_TJ, 1, enc); break;
|
242
|
-
case CYR_CAP_CH: STR_CAT_COND_ASCII(ascii, dest, "C", LAT_CAP_CH, 1, enc); break;
|
243
|
-
case CYR_CAP_ZH: STR_CAT_COND_ASCII(ascii, dest, "Z", LAT_CAP_ZH, 1, enc); break;
|
244
|
-
case CYR_CAP_SH: STR_CAT_COND_ASCII(ascii, dest, "S", LAT_CAP_SH, 1, enc); break;
|
245
|
-
|
246
|
-
/* Several special cases */
|
247
|
-
case CYR_CAP_LJ:
|
248
|
-
rb_enc_str_buf_cat(dest, (force_upper ? "LJ" : "Lj"), 2, enc);
|
249
|
-
break;
|
250
|
-
|
251
|
-
case CYR_CAP_NJ:
|
252
|
-
rb_enc_str_buf_cat(dest, (force_upper ? "NJ" : "Nj"), 2, enc);
|
253
|
-
break;
|
254
|
-
|
255
|
-
case CYR_CAP_DJ:
|
256
|
-
STR_CAT_COND_ASCII(ascii, dest, (force_upper ? "DJ" : "Dj"), LAT_CAP_DJ, 2, enc);
|
257
|
-
break;
|
258
|
-
|
259
|
-
case CYR_CAP_DZ:
|
260
|
-
rb_enc_str_buf_cat(dest, "D", 1, enc);
|
261
|
-
if (force_upper) {
|
262
|
-
STR_CAT_COND_ASCII(ascii, dest, "Z", LAT_CAP_ZH, 1, enc);
|
263
|
-
}
|
264
|
-
else {
|
179
|
+
/* Cyrillic -> Latin conversion */
|
180
|
+
else if (codepoint >= CYR_A) {
|
181
|
+
switch (codepoint) {
|
182
|
+
case CYR_A: rb_enc_str_buf_cat(dest, "a", 1, enc); break;
|
183
|
+
case CYR_B: rb_enc_str_buf_cat(dest, "b", 1, enc); break;
|
184
|
+
case CYR_V: rb_enc_str_buf_cat(dest, "v", 1, enc); break;
|
185
|
+
case CYR_G: rb_enc_str_buf_cat(dest, "g", 1, enc); break;
|
186
|
+
case CYR_D: rb_enc_str_buf_cat(dest, "d", 1, enc); break;
|
187
|
+
case CYR_E: rb_enc_str_buf_cat(dest, "e", 1, enc); break;
|
188
|
+
case CYR_Z: rb_enc_str_buf_cat(dest, "z", 1, enc); break;
|
189
|
+
case CYR_I: rb_enc_str_buf_cat(dest, "i", 1, enc); break;
|
190
|
+
case CYR_K: rb_enc_str_buf_cat(dest, "k", 1, enc); break;
|
191
|
+
case CYR_L: rb_enc_str_buf_cat(dest, "l", 1, enc); break;
|
192
|
+
case CYR_M: rb_enc_str_buf_cat(dest, "m", 1, enc); break;
|
193
|
+
case CYR_N: rb_enc_str_buf_cat(dest, "n", 1, enc); break;
|
194
|
+
case CYR_O: rb_enc_str_buf_cat(dest, "o", 1, enc); break;
|
195
|
+
case CYR_P: rb_enc_str_buf_cat(dest, "p", 1, enc); break;
|
196
|
+
case CYR_R: rb_enc_str_buf_cat(dest, "r", 1, enc); break;
|
197
|
+
case CYR_S: rb_enc_str_buf_cat(dest, "s", 1, enc); break;
|
198
|
+
case CYR_T: rb_enc_str_buf_cat(dest, "t", 1, enc); break;
|
199
|
+
case CYR_U: rb_enc_str_buf_cat(dest, "u", 1, enc); break;
|
200
|
+
case CYR_F: rb_enc_str_buf_cat(dest, "f", 1, enc); break;
|
201
|
+
case CYR_H: rb_enc_str_buf_cat(dest, "h", 1, enc); break;
|
202
|
+
case CYR_C: rb_enc_str_buf_cat(dest, "c", 1, enc); break;
|
203
|
+
case CYR_J: rb_enc_str_buf_cat(dest, "j", 1, enc); break;
|
204
|
+
case CYR_LJ: rb_enc_str_buf_cat(dest, "lj", 2, enc); break;
|
205
|
+
case CYR_NJ: rb_enc_str_buf_cat(dest, "nj", 2, enc); break;
|
206
|
+
case CYR_DJ: STR_CAT_COND_ASCII(ascii, dest, "dj", LAT_DJ, 2, enc); break;
|
207
|
+
case CYR_TJ: STR_CAT_COND_ASCII(ascii, dest, "c", LAT_TJ, 1, enc); break;
|
208
|
+
case CYR_CH: STR_CAT_COND_ASCII(ascii, dest, "c", LAT_CH, 1, enc); break;
|
209
|
+
case CYR_ZH: STR_CAT_COND_ASCII(ascii, dest, "z", LAT_ZH, 1, enc); break;
|
210
|
+
case CYR_SH: STR_CAT_COND_ASCII(ascii, dest, "s", LAT_SH, 1, enc); break;
|
211
|
+
case CYR_DZ:
|
212
|
+
rb_enc_str_buf_cat(dest, "d", 1, enc);
|
265
213
|
STR_CAT_COND_ASCII(ascii, dest, "z", LAT_ZH, 1, enc);
|
214
|
+
break;
|
215
|
+
default:
|
216
|
+
rb_enc_str_buf_cat(dest, pos, len, enc);
|
266
217
|
}
|
267
|
-
|
268
|
-
|
269
|
-
case CYR_DZ:
|
270
|
-
rb_enc_str_buf_cat(dest, "d", 1, enc);
|
271
|
-
STR_CAT_COND_ASCII(ascii, dest, "z", LAT_ZH, 1, enc);
|
272
|
-
break;
|
218
|
+
}
|
273
219
|
|
274
|
-
|
275
|
-
|
220
|
+
/* Cyrillic -> Latin conversion, caps */
|
221
|
+
else {
|
222
|
+
switch (codepoint) {
|
223
|
+
case CYR_CAP_J: rb_enc_str_buf_cat(dest, "J", 1, enc); break;
|
224
|
+
case CYR_CAP_A: rb_enc_str_buf_cat(dest, "A", 1, enc); break;
|
225
|
+
case CYR_CAP_B: rb_enc_str_buf_cat(dest, "B", 1, enc); break;
|
226
|
+
case CYR_CAP_V: rb_enc_str_buf_cat(dest, "V", 1, enc); break;
|
227
|
+
case CYR_CAP_G: rb_enc_str_buf_cat(dest, "G", 1, enc); break;
|
228
|
+
case CYR_CAP_D: rb_enc_str_buf_cat(dest, "D", 1, enc); break;
|
229
|
+
case CYR_CAP_E: rb_enc_str_buf_cat(dest, "E", 1, enc); break;
|
230
|
+
case CYR_CAP_Z: rb_enc_str_buf_cat(dest, "Z", 1, enc); break;
|
231
|
+
case CYR_CAP_I: rb_enc_str_buf_cat(dest, "I", 1, enc); break;
|
232
|
+
case CYR_CAP_K: rb_enc_str_buf_cat(dest, "K", 1, enc); break;
|
233
|
+
case CYR_CAP_L: rb_enc_str_buf_cat(dest, "L", 1, enc); break;
|
234
|
+
case CYR_CAP_M: rb_enc_str_buf_cat(dest, "M", 1, enc); break;
|
235
|
+
case CYR_CAP_N: rb_enc_str_buf_cat(dest, "N", 1, enc); break;
|
236
|
+
case CYR_CAP_O: rb_enc_str_buf_cat(dest, "O", 1, enc); break;
|
237
|
+
case CYR_CAP_P: rb_enc_str_buf_cat(dest, "P", 1, enc); break;
|
238
|
+
case CYR_CAP_R: rb_enc_str_buf_cat(dest, "R", 1, enc); break;
|
239
|
+
case CYR_CAP_S: rb_enc_str_buf_cat(dest, "S", 1, enc); break;
|
240
|
+
case CYR_CAP_T: rb_enc_str_buf_cat(dest, "T", 1, enc); break;
|
241
|
+
case CYR_CAP_U: rb_enc_str_buf_cat(dest, "U", 1, enc); break;
|
242
|
+
case CYR_CAP_F: rb_enc_str_buf_cat(dest, "F", 1, enc); break;
|
243
|
+
case CYR_CAP_H: rb_enc_str_buf_cat(dest, "H", 1, enc); break;
|
244
|
+
case CYR_CAP_C: rb_enc_str_buf_cat(dest, "C", 1, enc); break;
|
245
|
+
case CYR_CAP_TJ: STR_CAT_COND_ASCII(ascii, dest, "C", LAT_CAP_TJ, 1, enc); break;
|
246
|
+
case CYR_CAP_CH: STR_CAT_COND_ASCII(ascii, dest, "C", LAT_CAP_CH, 1, enc); break;
|
247
|
+
case CYR_CAP_ZH: STR_CAT_COND_ASCII(ascii, dest, "Z", LAT_CAP_ZH, 1, enc); break;
|
248
|
+
case CYR_CAP_SH: STR_CAT_COND_ASCII(ascii, dest, "S", LAT_CAP_SH, 1, enc); break;
|
249
|
+
case CYR_CAP_LJ:
|
250
|
+
rb_enc_str_buf_cat(dest, (force_upper ? "LJ" : "Lj"), 2, enc);
|
251
|
+
break;
|
252
|
+
case CYR_CAP_NJ:
|
253
|
+
rb_enc_str_buf_cat(dest, (force_upper ? "NJ" : "Nj"), 2, enc);
|
254
|
+
break;
|
255
|
+
case CYR_CAP_DJ:
|
256
|
+
STR_CAT_COND_ASCII(ascii, dest, (force_upper ? "DJ" : "Dj"), LAT_CAP_DJ, 2, enc);
|
257
|
+
break;
|
258
|
+
case CYR_CAP_DZ:
|
259
|
+
rb_enc_str_buf_cat(dest, "D", 1, enc);
|
260
|
+
if (force_upper) {
|
261
|
+
STR_CAT_COND_ASCII(ascii, dest, "Z", LAT_CAP_ZH, 1, enc);
|
262
|
+
}
|
263
|
+
else {
|
264
|
+
STR_CAT_COND_ASCII(ascii, dest, "z", LAT_ZH, 1, enc);
|
265
|
+
}
|
266
|
+
break;
|
267
|
+
default:
|
268
|
+
rb_enc_str_buf_cat(dest, pos, len, enc);
|
269
|
+
}
|
276
270
|
}
|
277
271
|
pos += len;
|
272
|
+
len = next_len;
|
273
|
+
codepoint = next_codepoint;
|
274
|
+
next_codepoint = 0;
|
278
275
|
}
|
279
276
|
|
280
277
|
if (bang) {
|
data/lib/byk/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: byk
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.4.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Nikola Topalović
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-04-
|
11
|
+
date: 2015-04-17 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rake-compiler
|
@@ -46,6 +46,7 @@ extensions:
|
|
46
46
|
- ext/byk/extconf.rb
|
47
47
|
extra_rdoc_files: []
|
48
48
|
files:
|
49
|
+
- CHANGELOG.md
|
49
50
|
- LICENSE
|
50
51
|
- README.md
|
51
52
|
- ext/byk/byk.c
|