toastyapps-excelsior 0.0.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.
data/Rakefile ADDED
@@ -0,0 +1,26 @@
1
+ require 'rake'
2
+ require 'rake/testtask'
3
+
4
+ PKG_FILES = %w(Rakefile) +
5
+ Dir.glob("{lib}/**/*") +
6
+ Dir.glob("ext/**/*.{c,rb,rl}") +
7
+ %w[ext/excelsior_reader/excelsior_reader.c] # needed because they are generated later
8
+
9
+ gem_spec = Gem::Specification.new do |gem_spec|
10
+ gem_spec.name = 'excelsior'
11
+ gem_spec.version = '0.0.1'
12
+ gem_spec.summary = 'A Ruby gem that uses C bindings to read CSV files superfast. I\'m totally serial!'
13
+ gem_spec.description = 'A Ruby gem that uses C bindings to read CSV files superfast. I\'m totally serial!'
14
+ gem_spec.email = 'matt@toastyapps.com'
15
+ gem_spec.homepage = 'http://github.com/toastyapps/excelsior'
16
+ gem_spec.authors = ["Matthew Mongeau"]
17
+ gem_spec.files = PKG_FILES
18
+ gem_spec.extensions = FileList["ext/**/extconf.rb"].to_a
19
+ end
20
+
21
+ desc "Generate a gemspec file"
22
+ task :gemspec do
23
+ File.open("#{gem_spec.name}.gemspec", "w") do |f|
24
+ f.write gem_spec.to_yaml
25
+ end
26
+ end
@@ -0,0 +1,261 @@
1
+
2
+ #line 1 "excelsior_reader.rl"
3
+ #include "ruby.h"
4
+
5
+ VALUE e_parse(VALUE self, VALUE data) {
6
+ int cs, act, curline = 1, len = 0;
7
+ char *ts = 0, *te = 0, *buf = NULL, *eof = NULL;
8
+ char *p, *pe;
9
+ VALUE rows;
10
+ VALUE arr;
11
+ rows = rb_ary_new();
12
+ arr = rb_ary_new();
13
+ len = RSTRING(data)->len;
14
+ p = RSTRING(data)->ptr;
15
+ pe = p + len;
16
+ eof = pe;
17
+ int has_found = 0;
18
+
19
+
20
+ #line 34 "excelsior_reader.rl"
21
+
22
+
23
+
24
+ #line 25 "excelsior_reader.c"
25
+ static const char _excelsior_scan_actions[] = {
26
+ 0, 1, 0, 1, 1, 1, 2, 1,
27
+ 3, 1, 4, 1, 5, 1, 6, 1,
28
+ 7, 1, 8, 1, 9
29
+ };
30
+
31
+ static const char _excelsior_scan_key_offsets[] = {
32
+ 0, 6, 7, 8, 16, 22
33
+ };
34
+
35
+ static const char _excelsior_scan_trans_keys[] = {
36
+ 32, 34, 39, 44, 9, 13, 34, 39,
37
+ 10, 13, 32, 34, 39, 44, 9, 12,
38
+ 32, 34, 39, 44, 9, 13, 10, 0
39
+ };
40
+
41
+ static const char _excelsior_scan_single_lengths[] = {
42
+ 4, 1, 1, 6, 4, 1
43
+ };
44
+
45
+ static const char _excelsior_scan_range_lengths[] = {
46
+ 1, 0, 0, 1, 1, 0
47
+ };
48
+
49
+ static const char _excelsior_scan_index_offsets[] = {
50
+ 0, 6, 8, 10, 18, 24
51
+ };
52
+
53
+ static const char _excelsior_scan_indicies[] = {
54
+ 0, 0, 0, 0, 0, 1, 3, 2,
55
+ 3, 4, 6, 7, 5, 2, 4, 8,
56
+ 5, 1, 10, 9, 9, 9, 9, 1,
57
+ 6, 11, 0
58
+ };
59
+
60
+ static const char _excelsior_scan_trans_targs[] = {
61
+ 3, 4, 1, 3, 2, 3, 3, 5,
62
+ 3, 3, 0, 3
63
+ };
64
+
65
+ static const char _excelsior_scan_trans_actions[] = {
66
+ 19, 5, 0, 11, 0, 9, 7, 0,
67
+ 13, 17, 0, 15
68
+ };
69
+
70
+ static const char _excelsior_scan_to_state_actions[] = {
71
+ 0, 0, 0, 1, 0, 0
72
+ };
73
+
74
+ static const char _excelsior_scan_from_state_actions[] = {
75
+ 0, 0, 0, 3, 0, 0
76
+ };
77
+
78
+ static const char _excelsior_scan_eof_trans[] = {
79
+ 1, 0, 0, 0, 10, 12
80
+ };
81
+
82
+ static const int excelsior_scan_start = 3;
83
+ static const int excelsior_scan_error = -1;
84
+
85
+ static const int excelsior_scan_en_main = 3;
86
+
87
+
88
+ #line 37 "excelsior_reader.rl"
89
+
90
+ #line 91 "excelsior_reader.c"
91
+ {
92
+ cs = excelsior_scan_start;
93
+ ts = 0;
94
+ te = 0;
95
+ act = 0;
96
+ }
97
+
98
+ #line 38 "excelsior_reader.rl"
99
+
100
+ #line 101 "excelsior_reader.c"
101
+ {
102
+ int _klen;
103
+ unsigned int _trans;
104
+ const char *_acts;
105
+ unsigned int _nacts;
106
+ const char *_keys;
107
+
108
+ if ( p == pe )
109
+ goto _test_eof;
110
+ _resume:
111
+ _acts = _excelsior_scan_actions + _excelsior_scan_from_state_actions[cs];
112
+ _nacts = (unsigned int) *_acts++;
113
+ while ( _nacts-- > 0 ) {
114
+ switch ( *_acts++ ) {
115
+ case 1:
116
+ #line 1 "excelsior_reader.rl"
117
+ {ts = p;}
118
+ break;
119
+ #line 120 "excelsior_reader.c"
120
+ }
121
+ }
122
+
123
+ _keys = _excelsior_scan_trans_keys + _excelsior_scan_key_offsets[cs];
124
+ _trans = _excelsior_scan_index_offsets[cs];
125
+
126
+ _klen = _excelsior_scan_single_lengths[cs];
127
+ if ( _klen > 0 ) {
128
+ const char *_lower = _keys;
129
+ const char *_mid;
130
+ const char *_upper = _keys + _klen - 1;
131
+ while (1) {
132
+ if ( _upper < _lower )
133
+ break;
134
+
135
+ _mid = _lower + ((_upper-_lower) >> 1);
136
+ if ( (*p) < *_mid )
137
+ _upper = _mid - 1;
138
+ else if ( (*p) > *_mid )
139
+ _lower = _mid + 1;
140
+ else {
141
+ _trans += (_mid - _keys);
142
+ goto _match;
143
+ }
144
+ }
145
+ _keys += _klen;
146
+ _trans += _klen;
147
+ }
148
+
149
+ _klen = _excelsior_scan_range_lengths[cs];
150
+ if ( _klen > 0 ) {
151
+ const char *_lower = _keys;
152
+ const char *_mid;
153
+ const char *_upper = _keys + (_klen<<1) - 2;
154
+ while (1) {
155
+ if ( _upper < _lower )
156
+ break;
157
+
158
+ _mid = _lower + (((_upper-_lower) >> 1) & ~1);
159
+ if ( (*p) < _mid[0] )
160
+ _upper = _mid - 2;
161
+ else if ( (*p) > _mid[1] )
162
+ _lower = _mid + 2;
163
+ else {
164
+ _trans += ((_mid - _keys)>>1);
165
+ goto _match;
166
+ }
167
+ }
168
+ _trans += _klen;
169
+ }
170
+
171
+ _match:
172
+ _trans = _excelsior_scan_indicies[_trans];
173
+ _eof_trans:
174
+ cs = _excelsior_scan_trans_targs[_trans];
175
+
176
+ if ( _excelsior_scan_trans_actions[_trans] == 0 )
177
+ goto _again;
178
+
179
+ _acts = _excelsior_scan_actions + _excelsior_scan_trans_actions[_trans];
180
+ _nacts = (unsigned int) *_acts++;
181
+ while ( _nacts-- > 0 )
182
+ {
183
+ switch ( *_acts++ )
184
+ {
185
+ case 2:
186
+ #line 1 "excelsior_reader.rl"
187
+ {te = p+1;}
188
+ break;
189
+ case 3:
190
+ #line 28 "excelsior_reader.rl"
191
+ {te = p+1;{ rb_ary_push(rows, arr); arr = rb_ary_new(); }}
192
+ break;
193
+ case 4:
194
+ #line 29 "excelsior_reader.rl"
195
+ {te = p+1;}
196
+ break;
197
+ case 5:
198
+ #line 31 "excelsior_reader.rl"
199
+ {te = p+1;{ rb_ary_push(arr, rb_str_new(ts + 1, te - ts - 2)); has_found = 1;}}
200
+ break;
201
+ case 6:
202
+ #line 32 "excelsior_reader.rl"
203
+ {te = p+1;{ if(has_found == 0) rb_ary_push(arr, Qnil); has_found = 0;}}
204
+ break;
205
+ case 7:
206
+ #line 28 "excelsior_reader.rl"
207
+ {te = p;p--;{ rb_ary_push(rows, arr); arr = rb_ary_new(); }}
208
+ break;
209
+ case 8:
210
+ #line 30 "excelsior_reader.rl"
211
+ {te = p;p--;{ rb_ary_push(arr, rb_str_new(ts, te - ts)); has_found = 1;}}
212
+ break;
213
+ case 9:
214
+ #line 30 "excelsior_reader.rl"
215
+ {{p = ((te))-1;}{ rb_ary_push(arr, rb_str_new(ts, te - ts)); has_found = 1;}}
216
+ break;
217
+ #line 218 "excelsior_reader.c"
218
+ }
219
+ }
220
+
221
+ _again:
222
+ _acts = _excelsior_scan_actions + _excelsior_scan_to_state_actions[cs];
223
+ _nacts = (unsigned int) *_acts++;
224
+ while ( _nacts-- > 0 ) {
225
+ switch ( *_acts++ ) {
226
+ case 0:
227
+ #line 1 "excelsior_reader.rl"
228
+ {ts = 0;}
229
+ break;
230
+ #line 231 "excelsior_reader.c"
231
+ }
232
+ }
233
+
234
+ if ( ++p != pe )
235
+ goto _resume;
236
+ _test_eof: {}
237
+ if ( p == eof )
238
+ {
239
+ if ( _excelsior_scan_eof_trans[cs] > 0 ) {
240
+ _trans = _excelsior_scan_eof_trans[cs] - 1;
241
+ goto _eof_trans;
242
+ }
243
+ }
244
+
245
+ }
246
+
247
+ #line 39 "excelsior_reader.rl"
248
+ if(RARRAY_LEN(arr) > 0) {
249
+ rb_ary_push(rows, arr);
250
+ }
251
+ return rows;
252
+ }
253
+
254
+ VALUE mExcelsior;
255
+ VALUE cReader;
256
+
257
+ void Init_excelsior_reader() {
258
+ mExcelsior = rb_define_module("Excelsior");
259
+ cReader = rb_define_class_under(mExcelsior, "Reader", rb_cObject);
260
+ rb_define_singleton_method(cReader, "parse", e_parse, 1);
261
+ }
@@ -0,0 +1,52 @@
1
+ #include "ruby.h"
2
+
3
+ VALUE e_parse(VALUE self, VALUE data) {
4
+ int cs, act, curline = 1, len = 0;
5
+ char *ts = 0, *te = 0, *buf = NULL, *eof = NULL;
6
+ char *p, *pe;
7
+ VALUE rows;
8
+ VALUE arr;
9
+ rows = rb_ary_new();
10
+ arr = rb_ary_new();
11
+ len = RSTRING(data)->len;
12
+ p = RSTRING(data)->ptr;
13
+ pe = p + len;
14
+ eof = pe;
15
+ int has_found = 0;
16
+
17
+ %%{
18
+ machine excelsior_scan;
19
+ delimeter = ",";
20
+ newline = "\r"? "\n" | "\r" | "\n";
21
+ schar1 = any - '"';
22
+ schar2 = any - "'";
23
+ letter = any - delimeter - space - '"' - "'";
24
+ string = '"' schar1* '"' | "'" schar2* "'";
25
+ word = letter+;
26
+ value = word (" " word)*;
27
+ main := |*
28
+ newline { rb_ary_push(rows, arr); arr = rb_ary_new(); };
29
+ space;
30
+ value { rb_ary_push(arr, rb_str_new(ts, te - ts)); has_found = 1;};
31
+ string { rb_ary_push(arr, rb_str_new(ts + 1, te - ts - 2)); has_found = 1;};
32
+ delimeter { if(has_found == 0) rb_ary_push(arr, Qnil); has_found = 0;};
33
+ *|;
34
+ }%%
35
+
36
+ %% write data nofinal;
37
+ %% write init;
38
+ %% write exec;
39
+ if(RARRAY_LEN(arr) > 0) {
40
+ rb_ary_push(rows, arr);
41
+ }
42
+ return rows;
43
+ }
44
+
45
+ VALUE mExcelsior;
46
+ VALUE cReader;
47
+
48
+ void Init_excelsior_reader() {
49
+ mExcelsior = rb_define_module("Excelsior");
50
+ cReader = rb_define_class_under(mExcelsior, "Reader", rb_cObject);
51
+ rb_define_singleton_method(cReader, "parse", e_parse, 1);
52
+ }
@@ -0,0 +1,5 @@
1
+ require 'mkmf'
2
+
3
+ dir_config('excelsior')
4
+ have_library("c", "main")
5
+ create_makefile('excelsior_reader')
data/lib/excelsior.rb ADDED
@@ -0,0 +1,7 @@
1
+ require 'excelsior_reader'
2
+
3
+ module Excelsior
4
+ def self.version
5
+ "0.0.1"
6
+ end
7
+ end
metadata ADDED
@@ -0,0 +1,60 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: toastyapps-excelsior
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Matthew Mongeau
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+
12
+ date: 2009-08-16 21:00:00 -07:00
13
+ default_executable:
14
+ dependencies: []
15
+
16
+ description: A Ruby gem that uses C bindings to read CSV files superfast. I'm totally serial!
17
+ email: matt@toastyapps.com
18
+ executables: []
19
+
20
+ extensions:
21
+ - ext/excelsior_reader/extconf.rb
22
+ extra_rdoc_files: []
23
+
24
+ files:
25
+ - Rakefile
26
+ - lib/excelsior.rb
27
+ - ext/excelsior_reader/excelsior_reader.c
28
+ - ext/excelsior_reader/extconf.rb
29
+ - ext/excelsior_reader/excelsior_reader.rl
30
+ - ext/excelsior_reader/excelsior_reader.c
31
+ has_rdoc: true
32
+ homepage: http://github.com/toastyapps/excelsior
33
+ licenses: []
34
+
35
+ post_install_message:
36
+ rdoc_options: []
37
+
38
+ require_paths:
39
+ - lib
40
+ required_ruby_version: !ruby/object:Gem::Requirement
41
+ requirements:
42
+ - - ">="
43
+ - !ruby/object:Gem::Version
44
+ version: "0"
45
+ version:
46
+ required_rubygems_version: !ruby/object:Gem::Requirement
47
+ requirements:
48
+ - - ">="
49
+ - !ruby/object:Gem::Version
50
+ version: "0"
51
+ version:
52
+ requirements: []
53
+
54
+ rubyforge_project:
55
+ rubygems_version: 1.3.5
56
+ signing_key:
57
+ specification_version: 3
58
+ summary: A Ruby gem that uses C bindings to read CSV files superfast. I'm totally serial!
59
+ test_files: []
60
+