cmultibyte 0.0.4 → 0.0.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.
- data/ext/cmultibyte.c +31 -4
- data/lib/cmultibyte/version.rb +1 -1
- metadata +2 -2
data/ext/cmultibyte.c
CHANGED
@@ -9,6 +9,7 @@ int *cp1252;
|
|
9
9
|
|
10
10
|
static ID idUnpack;
|
11
11
|
static ID idPack;
|
12
|
+
static ID idForceEncoding;
|
12
13
|
|
13
14
|
static int inline is_cont(uint8_t byte) { return (byte > 127 && byte < 192); }
|
14
15
|
static int inline is_lead(uint8_t byte) { return (byte > 191 && byte < 245); }
|
@@ -87,12 +88,20 @@ static void cp1252_hash_to_array(VALUE cp1252_hash) {
|
|
87
88
|
}
|
88
89
|
}
|
89
90
|
|
90
|
-
|
91
|
+
struct protected_tidy_bytes_arg {
|
92
|
+
VALUE string;
|
93
|
+
uint8_t *arr;
|
94
|
+
};
|
95
|
+
|
96
|
+
static VALUE protected_tidy_bytes(VALUE arg) {
|
97
|
+
struct protected_tidy_bytes_arg* args = (struct protected_tidy_bytes_arg *)arg;
|
98
|
+
VALUE string = args->string;
|
99
|
+
uint8_t *arr = args->arr;
|
100
|
+
|
91
101
|
int conts_expected = 0;
|
92
102
|
int i, j;
|
93
103
|
uint8_t byte;
|
94
104
|
|
95
|
-
uint8_t *arr = ALLOC_N(uint8_t, 4 * RSTRING_LEN(string));
|
96
105
|
uint8_t *curr = arr;
|
97
106
|
uint8_t *prev = curr;
|
98
107
|
uint8_t *last_lead = curr;
|
@@ -131,7 +140,6 @@ static VALUE tidy_bytes(VALUE string) {
|
|
131
140
|
curr = tidy_byte2(temp[j], curr);
|
132
141
|
}
|
133
142
|
|
134
|
-
//last_lead += (curr-prev);
|
135
143
|
conts_expected = 0;
|
136
144
|
}
|
137
145
|
if (is_lead(byte)) {
|
@@ -155,10 +163,28 @@ static VALUE tidy_bytes(VALUE string) {
|
|
155
163
|
}
|
156
164
|
}
|
157
165
|
VALUE str = rb_str_new((const char *)arr, curr-arr);
|
166
|
+
return rb_funcall(str, idForceEncoding, 1, rb_str_new2("UTF-8"));
|
167
|
+
}
|
168
|
+
|
169
|
+
static VALUE tidy_bytes(VALUE string) {
|
170
|
+
uint8_t *arr = ALLOC_N(uint8_t, 4 * RSTRING_LEN(string));
|
171
|
+
VALUE ret;
|
172
|
+
int exception = 0;
|
173
|
+
struct protected_tidy_bytes_arg args;
|
174
|
+
|
175
|
+
args.string = string;
|
176
|
+
args.arr = arr;
|
177
|
+
|
178
|
+
ret = rb_protect(protected_tidy_bytes, (VALUE)&args, &exception);
|
179
|
+
|
158
180
|
xfree(arr);
|
159
|
-
|
181
|
+
if (exception) {
|
182
|
+
rb_jump_tag(exception);
|
183
|
+
}
|
184
|
+
return ret;
|
160
185
|
}
|
161
186
|
|
187
|
+
|
162
188
|
static VALUE force_tidy_bytes(VALUE string) {
|
163
189
|
uint8_t *arr = malloc(4 * sizeof(uint8_t) * RSTRING_LEN(string));
|
164
190
|
uint8_t *curr = arr;
|
@@ -184,6 +210,7 @@ VALUE rb_tidy_bytes(int argc, VALUE *argv, VALUE self) {
|
|
184
210
|
void Init_cmultibyte() {
|
185
211
|
idUnpack = rb_intern("unpack");
|
186
212
|
idPack = rb_intern("pack");
|
213
|
+
idForceEncoding = rb_intern("force_encoding");
|
187
214
|
|
188
215
|
rb_funcall(rb_cObject, rb_intern("require"), 1, rb_str_new2("active_support/all"));
|
189
216
|
|
data/lib/cmultibyte/version.rb
CHANGED
metadata
CHANGED
@@ -2,14 +2,14 @@
|
|
2
2
|
name: cmultibyte
|
3
3
|
version: !ruby/object:Gem::Version
|
4
4
|
prerelease:
|
5
|
-
version: 0.0.
|
5
|
+
version: 0.0.5
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
8
|
- Burke Libbey
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-04-
|
12
|
+
date: 2013-04-17 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
version_requirements: !ruby/object:Gem::Requirement
|