byk 0.3.0 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (6) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +19 -0
  3. data/README.md +19 -19
  4. data/ext/byk/byk.c +108 -111
  5. data/lib/byk/version.rb +1 -1
  6. metadata +3 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 3ba019cfc4eecb9208d5c6aaac397820ab8cf78d
4
- data.tar.gz: 7b49cc79f1385c443b3120bbc9e92a3ade338736
3
+ metadata.gz: 2fb4e839b91bf3348e5c59e0e52b97bbbaec43de
4
+ data.tar.gz: 1a5d496e1fe684cba330eed517c3b8de5ad573a0
5
5
  SHA512:
6
- metadata.gz: 5f62f7e005890c0a39538aaa955d00362793539e8f499a8ea1c3922171209e75afd2ebe496162e28635858c47b77a8ad15fb82a7b5e693c5e2a7b357c578157b
7
- data.tar.gz: 1e8ff0ee9b3897780e02a226d3df650f5be408242d6df8919bef0ff75c15bf513605726bdf3f543e3d179e4ff47e70d37466860b338c6ad14367dbb061bf5c4d
6
+ metadata.gz: 9fc2e29e20dad1e0c517afd3c35d60340f256ce44bcda71a9e2fb344be4b685c2fa3b85350dd347e890143c6f9a84a94896eec9df0bfb8ec9b7be8811907053f
7
+ data.tar.gz: c81f02b4075cdc5b82b3f17f47fb4ea74dbcfa29bbe466731c685ec5a7b3d1c54b329075eb8c2d1731b76f03b9bf9b24646ea3aeff88f8ab17577297d0bae960
@@ -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
- Fast transliteration of Serbian Cyrillic into Latin.
5
-
6
- ![byk](https://cloud.githubusercontent.com/assets/626128/7155207/07545960-e35d-11e4-804e-5fdee70a3e30.png)
4
+ [![Gem Version](https://badge.fury.io/rb/byk.svg)](https://rubygems.org/gems/byk)
5
+ [![Build Status](https://travis-ci.org/topalovic/byk.svg?branch=master)](https://travis-ci.org/topalovic/byk)
7
6
 
8
- Inspired by @dejan's
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
+ ![byk](https://cloud.githubusercontent.com/assets/626128/7155207/07545960-e35d-11e4-804e-5fdee70a3e30.png)
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 # => "LJILJA Ljiljanović"
65
- "ĐORĐE Đorđević".to_ascii_latin # => "DJORDJE Djordjevic"
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 prove worthwhile for massive
78
- transliteration projects (e.g. sites supporting dual script
79
- l10n). Remember, `Benchmark` is your friend.
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 it to be a straightforward little problem, fit for this kind
82
- of tight optimization&hellip; which also gave me an excuse to play
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 1.9.2, 1.9.3, 2.0, 2.1 and 2.2.
89
- Earlier versions of MRI are untested (yet).
90
-
91
-
92
- ## Status
93
-
94
- [![Build Status](https://travis-ci.org/topalovic/byk.svg?branch=master)](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
@@ -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(force_ascii, dest, chr, ascii_chr, len, enc) \
21
- force_ascii ? rb_enc_str_buf_cat(dest, chr, len, enc) \
22
- : str_cat_char(dest, ascii_chr, enc)
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; /* TODO len + margin */
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
- while (pos < end) {
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
- force_upper = prev_codepoint && is_upper_case(prev_codepoint);
150
-
151
- if (!force_upper && (pos + len < end)) {
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
- /* Latin -> "ASCII latin" conversion */
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
- /* Short-circuit for non-cyrillic codepoints */
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 -> latin conversion */
189
- switch (codepoint) {
190
- case CYR_CAP_J: rb_enc_str_buf_cat(dest, "J", 1, enc); break;
191
- case CYR_CAP_A: rb_enc_str_buf_cat(dest, "A", 1, enc); break;
192
- case CYR_CAP_B: rb_enc_str_buf_cat(dest, "B", 1, enc); break;
193
- case CYR_CAP_V: rb_enc_str_buf_cat(dest, "V", 1, enc); break;
194
- case CYR_CAP_G: rb_enc_str_buf_cat(dest, "G", 1, enc); break;
195
- case CYR_CAP_D: rb_enc_str_buf_cat(dest, "D", 1, enc); break;
196
- case CYR_CAP_E: rb_enc_str_buf_cat(dest, "E", 1, enc); break;
197
- case CYR_CAP_Z: rb_enc_str_buf_cat(dest, "Z", 1, enc); break;
198
- case CYR_CAP_I: rb_enc_str_buf_cat(dest, "I", 1, enc); break;
199
- case CYR_CAP_K: rb_enc_str_buf_cat(dest, "K", 1, enc); break;
200
- case CYR_CAP_L: rb_enc_str_buf_cat(dest, "L", 1, enc); break;
201
- case CYR_CAP_M: rb_enc_str_buf_cat(dest, "M", 1, enc); break;
202
- case CYR_CAP_N: rb_enc_str_buf_cat(dest, "N", 1, enc); break;
203
- case CYR_CAP_O: rb_enc_str_buf_cat(dest, "O", 1, enc); break;
204
- case CYR_CAP_P: rb_enc_str_buf_cat(dest, "P", 1, enc); break;
205
- case CYR_CAP_R: rb_enc_str_buf_cat(dest, "R", 1, enc); break;
206
- case CYR_CAP_S: rb_enc_str_buf_cat(dest, "S", 1, enc); break;
207
- case CYR_CAP_T: rb_enc_str_buf_cat(dest, "T", 1, enc); break;
208
- case CYR_CAP_U: rb_enc_str_buf_cat(dest, "U", 1, enc); break;
209
- case CYR_CAP_F: rb_enc_str_buf_cat(dest, "F", 1, enc); break;
210
- case CYR_CAP_H: rb_enc_str_buf_cat(dest, "H", 1, enc); break;
211
- case CYR_CAP_C: rb_enc_str_buf_cat(dest, "C", 1, enc); break;
212
- case CYR_A: rb_enc_str_buf_cat(dest, "a", 1, enc); break;
213
- case CYR_B: rb_enc_str_buf_cat(dest, "b", 1, enc); break;
214
- case CYR_V: rb_enc_str_buf_cat(dest, "v", 1, enc); break;
215
- case CYR_G: rb_enc_str_buf_cat(dest, "g", 1, enc); break;
216
- case CYR_D: rb_enc_str_buf_cat(dest, "d", 1, enc); break;
217
- case CYR_E: rb_enc_str_buf_cat(dest, "e", 1, enc); break;
218
- case CYR_Z: rb_enc_str_buf_cat(dest, "z", 1, enc); break;
219
- case CYR_I: rb_enc_str_buf_cat(dest, "i", 1, enc); break;
220
- case CYR_K: rb_enc_str_buf_cat(dest, "k", 1, enc); break;
221
- case CYR_L: rb_enc_str_buf_cat(dest, "l", 1, enc); break;
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
- break;
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
- default:
275
- rb_enc_str_buf_cat(dest, pos, len, enc);
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) {
@@ -1,3 +1,3 @@
1
1
  module Byk
2
- VERSION = "0.3.0"
2
+ VERSION = "0.4.0"
3
3
  end
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.3.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-16 00:00:00.000000000 Z
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