version_sorter 2.0.2 → 2.0.3
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 +5 -5
- data/ext/version_sorter/version_sorter.c +49 -15
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: ca2c813ab2e3b07a3c6ba8c7cbac756613b61e7b514b0c06deac6d43b01d819e
|
4
|
+
data.tar.gz: caacf05c4444ed24ce2ec866af9bdc2b9455af2eba50afde6010a3d440088389
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7cb7c84a4213cb66509f06809422892d9f14b0d95a955c5124764fa5fdb9881e8f0df86dec159d02fc585d3ee5b0816e39ac451135b675f1e3272ac512b8b93a
|
7
|
+
data.tar.gz: 493b92cb2e19a9e2d3b7cb2078c1965860fa299f35b3a07bc6342438903d2b379eb221ca6e32e074045f03ebb51bbc4740ec6beaa11d7f1678c8f325919dc027
|
@@ -15,6 +15,7 @@
|
|
15
15
|
#include <ruby.h>
|
16
16
|
|
17
17
|
#define min(a, b) ((a) < (b) ? (a) : (b))
|
18
|
+
#define max(a, b) ((a) > (b) ? (a) : (b))
|
18
19
|
typedef int compare_callback_t(const void *, const void *);
|
19
20
|
|
20
21
|
struct version_number {
|
@@ -56,7 +57,8 @@ compare_version_number(const struct version_number *a,
|
|
56
57
|
int cmp = 0;
|
57
58
|
|
58
59
|
if (num_a) {
|
59
|
-
|
60
|
+
int64_t cmp64 = (int64_t)ca->number - (int64_t)cb->number;
|
61
|
+
cmp = (int)max(-1, min(1, cmp64));
|
60
62
|
} else {
|
61
63
|
cmp = strchunk_cmp(
|
62
64
|
a->original, &ca->string,
|
@@ -169,36 +171,68 @@ parse_version_number(const char *string)
|
|
169
171
|
return version;
|
170
172
|
}
|
171
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
|
+
|
172
181
|
static VALUE
|
173
|
-
|
182
|
+
rb_version_sort_1_cb(VALUE arg)
|
174
183
|
{
|
175
|
-
struct
|
184
|
+
struct sort_context *context = (struct sort_context *)arg;
|
176
185
|
long length, i;
|
177
186
|
VALUE *rb_version_ptr;
|
178
187
|
|
188
|
+
length = RARRAY_LEN(context->rb_version_array);
|
189
|
+
for (i = 0; i < length; ++i) {
|
190
|
+
VALUE rb_version = rb_ary_entry(context->rb_version_array, i);
|
191
|
+
context->versions[i] = parse_version_number(StringValueCStr(rb_version));
|
192
|
+
context->versions[i]->rb_version = rb_version;
|
193
|
+
}
|
194
|
+
|
195
|
+
qsort(context->versions, length, sizeof(struct version_number *), context->cmp);
|
196
|
+
rb_version_ptr = RARRAY_PTR(context->rb_version_array);
|
197
|
+
|
198
|
+
for (i = 0; i < length; ++i) {
|
199
|
+
rb_version_ptr[i] = context->versions[i]->rb_version;
|
200
|
+
}
|
201
|
+
|
202
|
+
return context->rb_version_array;
|
203
|
+
}
|
204
|
+
|
205
|
+
static VALUE
|
206
|
+
rb_version_sort_1(VALUE rb_self, VALUE rb_version_array, compare_callback_t cmp)
|
207
|
+
{
|
208
|
+
long length, i;
|
209
|
+
int exception;
|
210
|
+
|
179
211
|
Check_Type(rb_version_array, T_ARRAY);
|
180
212
|
|
181
213
|
length = RARRAY_LEN(rb_version_array);
|
182
214
|
if (!length)
|
183
215
|
return rb_ary_new();
|
184
216
|
|
185
|
-
|
217
|
+
struct sort_context context = {
|
218
|
+
rb_self,
|
219
|
+
rb_version_array,
|
220
|
+
cmp,
|
221
|
+
xcalloc(length, sizeof(struct version_number *)),
|
222
|
+
};
|
223
|
+
|
224
|
+
VALUE result = rb_protect(rb_version_sort_1_cb, (VALUE)&context, &exception);
|
186
225
|
|
187
226
|
for (i = 0; i < length; ++i) {
|
188
|
-
|
189
|
-
versions[i] = parse_version_number(StringValueCStr(rb_version));
|
190
|
-
versions[i]->rb_version = rb_version;
|
227
|
+
xfree(context.versions[i]);
|
191
228
|
}
|
229
|
+
xfree(context.versions);
|
192
230
|
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
for (i = 0; i < length; ++i) {
|
197
|
-
rb_version_ptr[i] = versions[i]->rb_version;
|
198
|
-
xfree(versions[i]);
|
231
|
+
if (exception) {
|
232
|
+
rb_jump_tag(exception);
|
199
233
|
}
|
200
|
-
|
201
|
-
return
|
234
|
+
|
235
|
+
return result;
|
202
236
|
}
|
203
237
|
|
204
238
|
static VALUE
|
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.0.
|
4
|
+
version: 2.0.3
|
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-
|
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.
|
@@ -42,7 +42,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
42
42
|
version: '0'
|
43
43
|
requirements: []
|
44
44
|
rubyforge_project:
|
45
|
-
rubygems_version: 2.
|
45
|
+
rubygems_version: 2.7.3
|
46
46
|
signing_key:
|
47
47
|
specification_version: 4
|
48
48
|
summary: Fast sorting of version strings
|