version_sorter 1.1.0 → 1.1.1

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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 0b1041937013eee0cb93a83330c30e3f6c8b84c5
4
+ data.tar.gz: d3f4d2a6834e1e0d79f6ef71cd58da5941c372ae
5
+ SHA512:
6
+ metadata.gz: e2d9d09fc0cdc43726e65d197ab5f768e46d2581706fd738c460ab0d90ae9ad893e0241ebc8eeb452691c92f2072412133050026144c92738a19b5df3f62acd6
7
+ data.tar.gz: d60d1df2d3bec7574541036ee0cd486aa448a82e8cd74d176a85d288d78b0f53debcf3d82f0dfa5b00e3368042331df58f164cc8a03c14b34cebc977a1035fef
@@ -1,4 +1,5 @@
1
1
  require 'mkmf'
2
2
 
3
+ $defs.push("-DBUILD_FOR_RUBY")
3
4
  have_library('pcre', 'pcre_compile')
4
5
  create_makefile("version_sorter")
@@ -26,19 +26,21 @@ rb_sort(VALUE obj, VALUE list)
26
26
  long len = RARRAY_LEN(list);
27
27
  long i;
28
28
  char **c_list = calloc(len, sizeof(char *));
29
+ int *ordering;
29
30
  VALUE rb_str, dest;
30
-
31
+
31
32
  for (i = 0; i < len; i++) {
32
33
  rb_str = rb_ary_entry(list, i);
33
34
  c_list[i] = StringValuePtr(rb_str);
34
35
  }
35
- version_sorter_sort(c_list, len);
36
-
36
+ ordering = version_sorter_sort(c_list, len);
37
+
37
38
  dest = rb_ary_new2(len);
38
39
  for (i = 0; i < len; i++) {
39
- rb_ary_store(dest, i, rb_str_new2(c_list[i]));
40
+ rb_ary_store(dest, i, rb_ary_entry(list, ordering[i]));
40
41
  }
41
-
42
+ free(ordering);
43
+
42
44
  return dest;
43
45
  }
44
46
 
@@ -56,4 +58,4 @@ Init_version_sorter(void)
56
58
  rb_version_sorter_module = rb_define_module("VersionSorter");
57
59
  rb_define_module_function(rb_version_sorter_module, "sort", rb_sort, 1);
58
60
  rb_define_module_function(rb_version_sorter_module, "rsort", rb_rsort, 1);
59
- }
61
+ }
@@ -14,7 +14,7 @@
14
14
  #include "version_sorter.h"
15
15
 
16
16
 
17
- static VersionSortingItem * version_sorting_item_init(const char *);
17
+ static VersionSortingItem * version_sorting_item_init(const char *, int);
18
18
  static void version_sorting_item_free(VersionSortingItem *);
19
19
  static void version_sorting_item_add_piece(VersionSortingItem *, char *);
20
20
  static void parse_version_word(VersionSortingItem *);
@@ -24,7 +24,7 @@ static enum scan_state scan_state_get(const char);
24
24
 
25
25
 
26
26
  VersionSortingItem *
27
- version_sorting_item_init(const char *original)
27
+ version_sorting_item_init(const char *original, int idx)
28
28
  {
29
29
  VersionSortingItem *vsi = malloc(sizeof(VersionSortingItem));
30
30
  if (vsi == NULL) {
@@ -36,9 +36,10 @@ version_sorting_item_init(const char *original)
36
36
  vsi->widest_len = 0;
37
37
  vsi->original = original;
38
38
  vsi->original_len = strlen(original);
39
- vsi->normalized = NULL;
39
+ vsi->original_idx = idx;
40
+ vsi->normalized = NULL;
40
41
  parse_version_word(vsi);
41
-
42
+
42
43
  return vsi;
43
44
  }
44
45
 
@@ -48,12 +49,12 @@ version_sorting_item_free(VersionSortingItem *vsi)
48
49
  VersionPiece *cur;
49
50
  while (cur = vsi->head) {
50
51
  vsi->head = cur->next;
51
- free(cur->str);
52
+ free(cur->str);
52
53
  free(cur);
53
54
  }
54
- if (vsi->normalized != NULL) {
55
- free(vsi->normalized);
56
- }
55
+ if (vsi->normalized != NULL) {
56
+ free(vsi->normalized);
57
+ }
57
58
  free(vsi);
58
59
  }
59
60
 
@@ -67,7 +68,7 @@ version_sorting_item_add_piece(VersionSortingItem *vsi, char *str)
67
68
  piece->str = str;
68
69
  piece->len = strlen(str);
69
70
  piece->next = NULL;
70
-
71
+
71
72
  if (vsi->head == NULL) {
72
73
  vsi->head = piece;
73
74
  vsi->tail = piece;
@@ -101,16 +102,16 @@ parse_version_word(VersionSortingItem *vsi)
101
102
  char current_char, next_char;
102
103
  char *part;
103
104
  enum scan_state current_state, next_state;
104
-
105
+
105
106
  while ((current_char = vsi->original[start]) != '\0') {
106
107
  current_state = scan_state_get(current_char);
107
-
108
+
108
109
  if (current_state == other) {
109
110
  start++;
110
111
  end = start;
111
112
  continue;
112
113
  }
113
-
114
+
114
115
  do {
115
116
  end++;
116
117
  next_char = vsi->original[end];
@@ -118,17 +119,17 @@ parse_version_word(VersionSortingItem *vsi)
118
119
  } while (next_char != '\0' && current_state == next_state);
119
120
 
120
121
  size = end - start;
121
-
122
+
122
123
  part = malloc((size+1) * sizeof(char));
123
124
  if (part == NULL) {
124
125
  DIE("ERROR: Not enough memory to allocate word")
125
126
  }
126
-
127
+
127
128
  memcpy(part, vsi->original+start, size);
128
129
  part[size] = '\0';
129
-
130
+
130
131
  version_sorting_item_add_piece(vsi, part);
131
-
132
+
132
133
  start = end;
133
134
  }
134
135
  }
@@ -136,18 +137,18 @@ parse_version_word(VersionSortingItem *vsi)
136
137
  void
137
138
  create_normalized_version(VersionSortingItem *vsi, const int widest_len)
138
139
  {
139
- VersionPiece *cur;
140
+ VersionPiece *cur;
140
141
  int pos, i;
141
-
142
+
142
143
  char *result = malloc(((vsi->node_len * widest_len) + 1) * sizeof(char));
143
144
  if (result == NULL) {
144
145
  DIE("ERROR: Unable to allocate memory")
145
146
  }
146
147
  result[0] = '\0';
147
148
  pos = 0;
148
-
149
+
149
150
  for (cur = vsi->head; cur; cur = cur->next) {
150
-
151
+
151
152
  /* Left-Pad digits with a space */
152
153
  if (cur->len < widest_len && isdigit(cur->str[0])) {
153
154
  for (i = 0; i < widest_len - cur->len; i++) {
@@ -178,32 +179,35 @@ compare_by_version(const void *a, const void *b)
178
179
  return strcmp((*(const VersionSortingItem **)a)->normalized, (*(const VersionSortingItem **)b)->normalized);
179
180
  }
180
181
 
181
- void
182
+ int*
182
183
  version_sorter_sort(char **list, size_t list_len)
183
184
  {
184
185
  int i, widest_len = 0;
185
186
  VersionSortingItem *vsi;
186
187
  VersionSortingItem **sorting_list = calloc(list_len, sizeof(VersionSortingItem *));
188
+ int *ordering = calloc(list_len, sizeof(int));
187
189
 
188
190
  for (i = 0; i < list_len; i++) {
189
- vsi = version_sorting_item_init(list[i]);
191
+ vsi = version_sorting_item_init(list[i], i);
190
192
  if (vsi->widest_len > widest_len) {
191
193
  widest_len = vsi->widest_len;
192
194
  }
193
195
  sorting_list[i] = vsi;
194
196
  }
195
-
197
+
196
198
  for (i = 0; i < list_len; i++) {
197
199
  create_normalized_version(sorting_list[i], widest_len);
198
200
  }
199
201
 
200
202
  qsort((void *) sorting_list, list_len, sizeof(VersionSortingItem *), &compare_by_version);
201
-
203
+
202
204
  for (i = 0; i < list_len; i++) {
203
205
  vsi = sorting_list[i];
204
206
  list[i] = (char *) vsi->original;
205
-
206
- version_sorting_item_free(vsi);
207
+ ordering[i] = vsi->original_idx;
208
+ version_sorting_item_free(vsi);
207
209
  }
208
210
  free(sorting_list);
209
- }
211
+
212
+ return ordering;
213
+ }
@@ -25,9 +25,15 @@
25
25
 
26
26
  #endif
27
27
 
28
+ #if defined(BUILD_FOR_RUBY)
29
+ #include <ruby.h>
30
+ #define DIE(msg) \
31
+ rb_raise(rb_eRuntimeError, "%s", msg);
32
+ #else
28
33
  #define DIE(msg) \
29
34
  fprintf(stderr, msg);\
30
- exit(EXIT_FAILURE);\
35
+ exit(EXIT_FAILURE);
36
+ #endif
31
37
 
32
38
  typedef struct _VersionSortingItem {
33
39
  struct _VersionPiece *head;
@@ -37,6 +43,7 @@ typedef struct _VersionSortingItem {
37
43
  char *normalized;
38
44
  const char *original;
39
45
  size_t original_len;
46
+ int original_idx;
40
47
  } VersionSortingItem;
41
48
 
42
49
  typedef struct _VersionPiece {
@@ -49,6 +56,6 @@ enum scan_state {
49
56
  digit, alpha, other
50
57
  };
51
58
 
52
- extern void version_sorter_sort(char **, size_t);
59
+ extern int* version_sorter_sort(char **, size_t);
53
60
 
54
- #endif /* _VERSION_SORTER_H */
61
+ #endif /* _VERSION_SORTER_H */
@@ -1,3 +1,3 @@
1
1
  module VersionSorter
2
- Version = '1.1.0'
2
+ Version = '1.1.1'
3
3
  end
@@ -12,6 +12,13 @@ class VersionSorterTest < Test::Unit::TestCase
12
12
  assert_equal sorted_versions, sort(versions)
13
13
  end
14
14
 
15
+ def test_returns_same_object
16
+ versions = %w( 2.0 1.0 0.5 )
17
+ sorted = sort(versions)
18
+
19
+ assert_equal versions[2].object_id, sorted[0].object_id
20
+ end
21
+
15
22
  def test_reverse_sorts_verisons_correctly
16
23
  versions = %w(1.0.9 1.0.10 2.0 3.1.4.2 1.0.9a)
17
24
  sorted_versions = %w( 3.1.4.2 2.0 1.0.10 1.0.9a 1.0.9 )
metadata CHANGED
@@ -1,30 +1,25 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: version_sorter
3
- version: !ruby/object:Gem::Version
4
- version: 1.1.0
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.1.1
5
5
  platform: ruby
6
- authors:
6
+ authors:
7
7
  - Chris Wanstrath
8
8
  - K. Adam Christensen
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
-
13
- date: 2009-10-14 00:00:00 -07:00
14
- default_executable:
12
+ date: 2015-02-18 00:00:00.000000000 Z
15
13
  dependencies: []
16
-
17
14
  description: Fast sorting of version strings
18
15
  email: chris@ozmm.org
19
16
  executables: []
20
-
21
- extensions:
17
+ extensions:
22
18
  - ext/version_sorter/extconf.rb
23
- extra_rdoc_files:
19
+ extra_rdoc_files:
24
20
  - README.markdown
25
- files:
26
- - .gitattributes
27
- - .gitignore
21
+ files:
22
+ - ".gitattributes"
28
23
  - README.markdown
29
24
  - Rakefile
30
25
  - ext/version_sorter/extconf.rb
@@ -42,35 +37,28 @@ files:
42
37
  - test/tags.rb
43
38
  - test/tags.txt
44
39
  - test/version_sorter_test.rb
45
- has_rdoc: true
46
40
  homepage: http://github.com/defunkt/version_sorter
47
41
  licenses: []
48
-
42
+ metadata: {}
49
43
  post_install_message:
50
- rdoc_options:
51
- - --charset=UTF-8
52
- require_paths:
44
+ rdoc_options: []
45
+ require_paths:
53
46
  - lib
54
47
  - ext
55
- required_ruby_version: !ruby/object:Gem::Requirement
56
- requirements:
48
+ required_ruby_version: !ruby/object:Gem::Requirement
49
+ requirements:
57
50
  - - ">="
58
- - !ruby/object:Gem::Version
59
- version: "0"
60
- version:
61
- required_rubygems_version: !ruby/object:Gem::Requirement
62
- requirements:
51
+ - !ruby/object:Gem::Version
52
+ version: '0'
53
+ required_rubygems_version: !ruby/object:Gem::Requirement
54
+ requirements:
63
55
  - - ">="
64
- - !ruby/object:Gem::Version
65
- version: "0"
66
- version:
56
+ - !ruby/object:Gem::Version
57
+ version: '0'
67
58
  requirements: []
68
-
69
59
  rubyforge_project:
70
- rubygems_version: 1.3.5
60
+ rubygems_version: 2.2.2
71
61
  signing_key:
72
- specification_version: 3
62
+ specification_version: 4
73
63
  summary: Fast sorting of version strings
74
- test_files:
75
- - test/tags.rb
76
- - test/version_sorter_test.rb
64
+ test_files: []
data/.gitignore DELETED
@@ -1,4 +0,0 @@
1
- # xcode noise
2
- ext/version_sorter/build/*
3
- *.pbxuser
4
- *.mode1v3