version_sorter 2.2.3 → 2.2.4
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/ext/version_sorter/version_sorter.c +79 -24
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f4549572e0353ea5da5a91719cb77444249dbd5e30f199f4d50faa7a8c1b585d
|
4
|
+
data.tar.gz: c4744eb78ce03c4a654a56814d368c2d6f4fd0aa4345eca818cc659acd9991f3
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4309c00a5b4b5cb3eca9cfcec32a75fe918ca58954d80a10b489d834e1d8ea82f9348ae14ee92f4baba038ef0804f467fdf4fa7acd3e6e147c7762dcc89fa12c
|
7
|
+
data.tar.gz: a9cf4f8d1f3d57585ff4b22e5b91daa07d725927f56f7394bd70f7ecd57f891ef264ce245d50a0b286154c88c968b8ef628875a7bfcaa4abd5d51dabaea0269c
|
@@ -171,43 +171,75 @@ parse_version_number(const char *string)
|
|
171
171
|
return version;
|
172
172
|
}
|
173
173
|
|
174
|
+
struct sort_context {
|
175
|
+
VALUE rb_self;
|
176
|
+
VALUE rb_version_array;
|
177
|
+
compare_callback_t *cmp;
|
178
|
+
struct version_number **versions;
|
179
|
+
};
|
180
|
+
|
174
181
|
static VALUE
|
175
|
-
|
182
|
+
rb_version_sort_1_cb(VALUE arg)
|
176
183
|
{
|
177
|
-
struct
|
184
|
+
struct sort_context *context = (struct sort_context *)arg;
|
178
185
|
long length, i;
|
179
186
|
VALUE *rb_version_ptr;
|
180
187
|
|
181
|
-
|
182
|
-
|
183
|
-
length = RARRAY_LEN(rb_version_array);
|
184
|
-
if (!length)
|
185
|
-
return rb_ary_new();
|
186
|
-
|
187
|
-
versions = xcalloc(length, sizeof(struct version_number *));
|
188
|
-
|
188
|
+
length = RARRAY_LEN(context->rb_version_array);
|
189
189
|
for (i = 0; i < length; ++i) {
|
190
190
|
VALUE rb_version, rb_version_string;
|
191
191
|
|
192
|
-
rb_version = rb_ary_entry(rb_version_array, i);
|
192
|
+
rb_version = rb_ary_entry(context->rb_version_array, i);
|
193
193
|
if (rb_block_given_p())
|
194
194
|
rb_version_string = rb_yield(rb_version);
|
195
195
|
else
|
196
196
|
rb_version_string = rb_version;
|
197
197
|
|
198
|
-
versions[i] = parse_version_number(StringValueCStr(rb_version_string));
|
199
|
-
versions[i]->rb_version = rb_version;
|
198
|
+
context->versions[i] = parse_version_number(StringValueCStr(rb_version_string));
|
199
|
+
context->versions[i]->rb_version = rb_version;
|
200
|
+
}
|
201
|
+
|
202
|
+
qsort(context->versions, length, sizeof(struct version_number *), context->cmp);
|
203
|
+
rb_version_ptr = RARRAY_PTR(context->rb_version_array);
|
204
|
+
|
205
|
+
for (i = 0; i < length; ++i) {
|
206
|
+
rb_version_ptr[i] = context->versions[i]->rb_version;
|
200
207
|
}
|
201
208
|
|
202
|
-
|
203
|
-
|
209
|
+
return context->rb_version_array;
|
210
|
+
}
|
211
|
+
|
212
|
+
static VALUE
|
213
|
+
rb_version_sort_1(VALUE rb_self, VALUE rb_version_array, compare_callback_t cmp)
|
214
|
+
{
|
215
|
+
long length, i;
|
216
|
+
int exception;
|
217
|
+
|
218
|
+
Check_Type(rb_version_array, T_ARRAY);
|
219
|
+
|
220
|
+
length = RARRAY_LEN(rb_version_array);
|
221
|
+
if (!length)
|
222
|
+
return rb_ary_new();
|
223
|
+
|
224
|
+
struct sort_context context = {
|
225
|
+
rb_self,
|
226
|
+
rb_version_array,
|
227
|
+
cmp,
|
228
|
+
xcalloc(length, sizeof(struct version_number *)),
|
229
|
+
};
|
230
|
+
|
231
|
+
VALUE result = rb_protect(rb_version_sort_1_cb, (VALUE)&context, &exception);
|
204
232
|
|
205
233
|
for (i = 0; i < length; ++i) {
|
206
|
-
|
207
|
-
xfree(versions[i]);
|
234
|
+
xfree(context.versions[i]);
|
208
235
|
}
|
209
|
-
xfree(versions);
|
210
|
-
|
236
|
+
xfree(context.versions);
|
237
|
+
|
238
|
+
if (exception) {
|
239
|
+
rb_jump_tag(exception);
|
240
|
+
}
|
241
|
+
|
242
|
+
return result;
|
211
243
|
}
|
212
244
|
|
213
245
|
static VALUE
|
@@ -234,16 +266,39 @@ rb_version_sort_r_bang(VALUE rb_self, VALUE rb_versions)
|
|
234
266
|
return rb_version_sort_1(rb_self, rb_versions, version_compare_cb_r);
|
235
267
|
}
|
236
268
|
|
269
|
+
struct compare_context {
|
270
|
+
VALUE rb_version_a, rb_version_b;
|
271
|
+
struct version_number *version_a, *version_b;
|
272
|
+
};
|
273
|
+
|
274
|
+
static VALUE
|
275
|
+
rb_version_compare_cb(VALUE arg)
|
276
|
+
{
|
277
|
+
struct compare_context *context = (struct compare_context *)arg;
|
278
|
+
|
279
|
+
context->version_a = parse_version_number(StringValueCStr(context->rb_version_a));
|
280
|
+
context->version_b = parse_version_number(StringValueCStr(context->rb_version_b));
|
281
|
+
|
282
|
+
return INT2NUM(version_compare_cb(&context->version_a, &context->version_b));
|
283
|
+
}
|
284
|
+
|
237
285
|
static VALUE
|
238
286
|
rb_version_compare(VALUE rb_self, VALUE rb_version_a, VALUE rb_version_b)
|
239
287
|
{
|
240
|
-
|
241
|
-
struct
|
288
|
+
int exception;
|
289
|
+
struct compare_context context = {
|
290
|
+
rb_version_a, rb_version_b,
|
291
|
+
NULL, NULL,
|
292
|
+
};
|
242
293
|
|
243
|
-
VALUE result =
|
294
|
+
VALUE result = rb_protect(rb_version_compare_cb, (VALUE)&context, &exception);
|
244
295
|
|
245
|
-
xfree(version_a);
|
246
|
-
xfree(version_b);
|
296
|
+
xfree(context.version_a);
|
297
|
+
xfree(context.version_b);
|
298
|
+
|
299
|
+
if (exception) {
|
300
|
+
rb_jump_tag(exception);
|
301
|
+
}
|
247
302
|
|
248
303
|
return result;
|
249
304
|
}
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: version_sorter
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.2.
|
4
|
+
version: 2.2.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Chris Wanstrath
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2018-02-
|
12
|
+
date: 2018-02-12 00:00:00.000000000 Z
|
13
13
|
dependencies: []
|
14
14
|
description: VersionSorter is a C extension that does fast sorting of large sets of
|
15
15
|
version strings.
|