version_sorter 2.0.3 → 2.1.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 +5 -5
- data/ext/version_sorter/version_sorter.c +23 -50
- metadata +4 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: a8c82692288ea72e0ad0c5318293c8129299a147
|
4
|
+
data.tar.gz: a03518ac5700f0ff074cd02cbff312088686e1b7
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b31e76a36fd9d14ecdbc396802d0c52bd99ade19c60b18fe29ca08a4519e586d90bc34d8847da0dfaf73eae87d58990d642c5aec3e6704a6e6a986a2c88f93dd
|
7
|
+
data.tar.gz: 39467bac6e670ab4d6e47a10a1122d0b8fe4113764dc68889b0d0a18f840729c29e5e94a94b5c4ba6a433472cf59f2a0c34dd01cc8057c7458dbce5b3efbe159
|
@@ -15,7 +15,6 @@
|
|
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))
|
19
18
|
typedef int compare_callback_t(const void *, const void *);
|
20
19
|
|
21
20
|
struct version_number {
|
@@ -57,8 +56,7 @@ compare_version_number(const struct version_number *a,
|
|
57
56
|
int cmp = 0;
|
58
57
|
|
59
58
|
if (num_a) {
|
60
|
-
|
61
|
-
cmp = (int)max(-1, min(1, cmp64));
|
59
|
+
cmp = (int)ca->number - (int)cb->number;
|
62
60
|
} else {
|
63
61
|
cmp = strchunk_cmp(
|
64
62
|
a->original, &ca->string,
|
@@ -140,7 +138,7 @@ parse_version_number(const char *string)
|
|
140
138
|
version->comp[comp_n].string.len = offset - start;
|
141
139
|
} else {
|
142
140
|
version->comp[comp_n].number = number;
|
143
|
-
num_flags |= (
|
141
|
+
num_flags |= (1 << comp_n);
|
144
142
|
}
|
145
143
|
comp_n++;
|
146
144
|
continue;
|
@@ -171,42 +169,12 @@ parse_version_number(const char *string)
|
|
171
169
|
return version;
|
172
170
|
}
|
173
171
|
|
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
|
-
|
181
|
-
static VALUE
|
182
|
-
rb_version_sort_1_cb(VALUE arg)
|
183
|
-
{
|
184
|
-
struct sort_context *context = (struct sort_context *)arg;
|
185
|
-
long length, i;
|
186
|
-
VALUE *rb_version_ptr;
|
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
172
|
static VALUE
|
206
173
|
rb_version_sort_1(VALUE rb_self, VALUE rb_version_array, compare_callback_t cmp)
|
207
174
|
{
|
175
|
+
struct version_number **versions;
|
208
176
|
long length, i;
|
209
|
-
|
177
|
+
VALUE *rb_version_ptr;
|
210
178
|
|
211
179
|
Check_Type(rb_version_array, T_ARRAY);
|
212
180
|
|
@@ -214,25 +182,30 @@ rb_version_sort_1(VALUE rb_self, VALUE rb_version_array, compare_callback_t cmp)
|
|
214
182
|
if (!length)
|
215
183
|
return rb_ary_new();
|
216
184
|
|
217
|
-
|
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);
|
185
|
+
versions = xcalloc(length, sizeof(struct version_number *));
|
225
186
|
|
226
187
|
for (i = 0; i < length; ++i) {
|
227
|
-
|
228
|
-
|
229
|
-
|
188
|
+
VALUE rb_version, rb_version_string;
|
189
|
+
|
190
|
+
rb_version = rb_ary_entry(rb_version_array, i);
|
191
|
+
if (rb_block_given_p())
|
192
|
+
rb_version_string = rb_yield(rb_version);
|
193
|
+
else
|
194
|
+
rb_version_string = rb_version;
|
230
195
|
|
231
|
-
|
232
|
-
|
196
|
+
versions[i] = parse_version_number(StringValuePtr(rb_version_string));
|
197
|
+
versions[i]->rb_version = rb_version;
|
233
198
|
}
|
234
199
|
|
235
|
-
|
200
|
+
qsort(versions, length, sizeof(struct version_number *), cmp);
|
201
|
+
rb_version_ptr = RARRAY_PTR(rb_version_array);
|
202
|
+
|
203
|
+
for (i = 0; i < length; ++i) {
|
204
|
+
rb_version_ptr[i] = versions[i]->rb_version;
|
205
|
+
xfree(versions[i]);
|
206
|
+
}
|
207
|
+
xfree(versions);
|
208
|
+
return rb_version_array;
|
236
209
|
}
|
237
210
|
|
238
211
|
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.1.0
|
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:
|
12
|
+
date: 2016-08-07 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.
|
@@ -22,7 +22,7 @@ files:
|
|
22
22
|
- LICENSE
|
23
23
|
- ext/version_sorter/extconf.rb
|
24
24
|
- ext/version_sorter/version_sorter.c
|
25
|
-
homepage: https://github.com/
|
25
|
+
homepage: https://github.com/github/version_sorter#readme
|
26
26
|
licenses:
|
27
27
|
- MIT
|
28
28
|
metadata: {}
|
@@ -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.4.5.1
|
46
46
|
signing_key:
|
47
47
|
specification_version: 4
|
48
48
|
summary: Fast sorting of version strings
|