fast_xs 0.6 → 0.7
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/README +4 -6
- data/Rakefile +11 -11
- data/ext/fast_xs/fast_xs.c +4 -158
- data/ext/fast_xs_extra/extconf.rb +5 -0
- data/ext/fast_xs_extra/fast_xs_extra.c +165 -0
- data/lib/fast_xs_monkey_patcher.rb +1 -0
- data/test/test_xml_escaping.rb +1 -0
- metadata +45 -44
- data/CHANGELOG +0 -8
data/README
CHANGED
@@ -7,12 +7,10 @@
|
|
7
7
|
http://intertwingly.net/stories/2005/09/28/xchar.rb
|
8
8
|
http://intertwingly.net/blog/2005/09/28/XML-Cleansing
|
9
9
|
|
10
|
-
_why also packages
|
11
|
-
|
12
|
-
is optional).
|
10
|
+
_why also packages an older version with Hpricot (patch in progress).
|
11
|
+
It should be compatible with the latest version of this code.
|
13
12
|
|
14
|
-
This is an exact translation (to the best of my knowledge :) of
|
15
|
-
original implementation,
|
16
|
-
of XML::Builder packaged with Rails also uses Sam's version, and
|
13
|
+
This is an almost exact translation (to the best of my knowledge :) of
|
14
|
+
Sam's original implementation, but it does escape """.
|
17
15
|
XML::Builder as packaged in Rails 2.0 will be automatically use
|
18
16
|
fast_xs if available.
|
data/Rakefile
CHANGED
@@ -13,16 +13,16 @@ begin
|
|
13
13
|
rev = Time.at(rev.split("\n")[1].to_i).strftime('%Y%m%d.%H%M%S')
|
14
14
|
rescue
|
15
15
|
end
|
16
|
-
version ||= ENV['VERSION'] || '0.
|
16
|
+
version ||= ENV['VERSION'] || '0.7' + (rev && rev.length > 0 ? ".#{rev}" : '')
|
17
17
|
pkg = "#{name}-#{version}"
|
18
18
|
bin = "*.{so,o}"
|
19
19
|
archlib = "lib/#{::Config::CONFIG['arch']}"
|
20
|
-
CLEAN.include ["ext
|
21
|
-
'ext
|
20
|
+
CLEAN.include ["ext/**/#{bin}", "lib/**/#{bin}",
|
21
|
+
'ext/**/Makefile', '**/.*.sw?', '*.gem', '.config',
|
22
22
|
'pkg']
|
23
23
|
rdoc_opts = ['--quiet', '--title', 'fast_xs notes', '--main', 'README',
|
24
24
|
'--inline-source']
|
25
|
-
pkg_files = %w(
|
25
|
+
pkg_files = %w(COPYING README Rakefile) +
|
26
26
|
Dir.glob("{test,lib}/**/*.rb") +
|
27
27
|
Dir.glob("ext/**/*.{c,rb,h}")
|
28
28
|
|
@@ -33,12 +33,12 @@ spec = Gem::Specification.new do |s|
|
|
33
33
|
s.platform = Gem::Platform::RUBY
|
34
34
|
s.has_rdoc = true
|
35
35
|
s.rdoc_options += rdoc_opts
|
36
|
-
s.extra_rdoc_files = ["README", "
|
36
|
+
s.extra_rdoc_files = ["README", "COPYING"]
|
37
37
|
s.summary = "excessively fast escaping"
|
38
38
|
s.description = s.summary
|
39
39
|
s.author = "Eric Wong"
|
40
40
|
s.email = 'normalperson@yhbt.net'
|
41
|
-
s.homepage = 'http://
|
41
|
+
s.homepage = 'http://bogomips.org/fast_xs/'
|
42
42
|
s.files = pkg_files
|
43
43
|
s.require_paths = [archlib, "lib"]
|
44
44
|
s.extensions = FileList["ext/**/extconf.rb"].to_a
|
@@ -74,7 +74,7 @@ Rake::RDocTask.new do |rdoc|
|
|
74
74
|
rdoc.rdoc_dir = 'doc/rdoc'
|
75
75
|
rdoc.options += rdoc_opts
|
76
76
|
rdoc.main = "README"
|
77
|
-
rdoc.rdoc_files.add ['README', '
|
77
|
+
rdoc.rdoc_files.add ['README', 'COPYING' ]
|
78
78
|
end
|
79
79
|
|
80
80
|
Rake::GemPackageTask.new(spec) do |p|
|
@@ -82,7 +82,7 @@ Rake::GemPackageTask.new(spec) do |p|
|
|
82
82
|
p.gem_spec = spec
|
83
83
|
end
|
84
84
|
|
85
|
-
|
85
|
+
%w(fast_xs fast_xs_extra).each do |extension|
|
86
86
|
ext = "ext/#{extension}"
|
87
87
|
ext_so = "#{ext}/#{extension}.#{Config::CONFIG['DLEXT']}"
|
88
88
|
ext_files = FileList[
|
@@ -114,7 +114,7 @@ task "lib" do
|
|
114
114
|
end
|
115
115
|
|
116
116
|
desc "Compiles the Ruby extension"
|
117
|
-
task :compile =>
|
117
|
+
task :compile => %w(fast_xs fast_xs_extra) do
|
118
118
|
if Dir.glob(File.join(archlib,"fast_xs.*")).empty?
|
119
119
|
STDERR.puts 'Gem failed to build'
|
120
120
|
exit(1)
|
@@ -123,9 +123,9 @@ end
|
|
123
123
|
|
124
124
|
task :install do
|
125
125
|
sh %{rake package}
|
126
|
-
sh %{
|
126
|
+
sh %{gem install pkg/#{name}-#{version}}
|
127
127
|
end
|
128
128
|
|
129
129
|
task :uninstall => [:clean] do
|
130
|
-
sh %{
|
130
|
+
sh %{gem uninstall #{name}}
|
131
131
|
end
|
data/ext/fast_xs/fast_xs.c
CHANGED
@@ -1,7 +1,5 @@
|
|
1
1
|
#include <ruby.h>
|
2
2
|
#include <assert.h>
|
3
|
-
#include <sys/time.h>
|
4
|
-
#include <sys/resource.h>
|
5
3
|
#include "ruby_1_9_compat.h"
|
6
4
|
#include "fast_xs_type.h"
|
7
5
|
#include "gcc.h"
|
@@ -82,6 +80,8 @@ static size_t escape(char *buf, int n)
|
|
82
80
|
/* handle ASCII first */
|
83
81
|
if (likely(n < 128)) {
|
84
82
|
if (likely(n >= 0x20 || n == '\t' || n == '\n' || n == '\r')) {
|
83
|
+
if (unlikely(n == '"'))
|
84
|
+
return_const_len(""");
|
85
85
|
if (unlikely(n == '&'))
|
86
86
|
return_const_len("&");
|
87
87
|
if (unlikely(n == '<'))
|
@@ -144,6 +144,8 @@ static VALUE fast_xs(VALUE self)
|
|
144
144
|
tmp++) {
|
145
145
|
int n = NUM2INT(*tmp);
|
146
146
|
if (likely(n < 128)) {
|
147
|
+
if (unlikely(n == '"'))
|
148
|
+
s_len += (sizeof(""") - 2);
|
147
149
|
if (unlikely(n == '&'))
|
148
150
|
s_len += (sizeof("&") - 2);
|
149
151
|
if (unlikely(n == '>' || n == '<'))
|
@@ -166,158 +168,6 @@ static VALUE fast_xs(VALUE self)
|
|
166
168
|
return rv;
|
167
169
|
}
|
168
170
|
|
169
|
-
/*
|
170
|
-
* This is coding agnostic, and works on each byte, so some multibyte
|
171
|
-
* character sets may not be fully supported (but UTF-8 should be).
|
172
|
-
* This is meant to be 100% compatible with the
|
173
|
-
* ERB::Util::escape_html and CGI::escapeHTML methods
|
174
|
-
*/
|
175
|
-
static VALUE fast_xs_html(VALUE self)
|
176
|
-
{
|
177
|
-
long i;
|
178
|
-
char *s;
|
179
|
-
size_t new_len = RSTRING_LEN(self);
|
180
|
-
char *new_str;
|
181
|
-
VALUE rv;
|
182
|
-
|
183
|
-
for (s = RSTRING_PTR(self), i = RSTRING_LEN(self); --i >= 0; ++s) {
|
184
|
-
if (unlikely(*s == '&'))
|
185
|
-
new_len += (sizeof("&") - 2);
|
186
|
-
else if (unlikely(*s == '<' || *s == '>'))
|
187
|
-
new_len += (sizeof(">") - 2);
|
188
|
-
else if (unlikely(*s == '"'))
|
189
|
-
new_len += (sizeof(""") - 2);
|
190
|
-
}
|
191
|
-
|
192
|
-
rv = rb_str_new(NULL, new_len);
|
193
|
-
new_str = RSTRING_PTR(rv);
|
194
|
-
|
195
|
-
#define append_const(buf, x) do { \
|
196
|
-
buf = memcpy(buf, x, sizeof(x) - 1) + sizeof(x) - 1; \
|
197
|
-
} while (0)
|
198
|
-
|
199
|
-
for (s = RSTRING_PTR(self), i = RSTRING_LEN(self); --i >= 0; ++s) {
|
200
|
-
if (unlikely(*s == '&'))
|
201
|
-
append_const(new_str, "&");
|
202
|
-
else if (unlikely(*s == '<'))
|
203
|
-
append_const(new_str, "<");
|
204
|
-
else if (unlikely(*s == '>'))
|
205
|
-
append_const(new_str, ">");
|
206
|
-
else if (unlikely(*s == '"'))
|
207
|
-
append_const(new_str, """);
|
208
|
-
else
|
209
|
-
*new_str++ = *s;
|
210
|
-
}
|
211
|
-
|
212
|
-
#undef append_const
|
213
|
-
|
214
|
-
return rv;
|
215
|
-
}
|
216
|
-
|
217
|
-
#define CGI_URI_OK(x) \
|
218
|
-
((x >= 'a' && x <= 'z') || \
|
219
|
-
(x >= 'A' && x <= 'Z') || \
|
220
|
-
(x >= '0' && x <= '9') || \
|
221
|
-
(x == '.' || x == '-' || x == '_'))
|
222
|
-
|
223
|
-
static inline VALUE _xs_uri_encode(VALUE self, const unsigned int space_to_plus)
|
224
|
-
{
|
225
|
-
long i;
|
226
|
-
char *s;
|
227
|
-
size_t new_len = RSTRING_LEN(self);
|
228
|
-
char *new_str;
|
229
|
-
VALUE rv;
|
230
|
-
|
231
|
-
for (s = RSTRING_PTR(self), i = RSTRING_LEN(self); --i >= 0; ++s) {
|
232
|
-
if (likely(CGI_URI_OK(*s)) || (space_to_plus && *s == ' '))
|
233
|
-
continue;
|
234
|
-
new_len += 2;
|
235
|
-
}
|
236
|
-
|
237
|
-
rv = rb_str_new(NULL, new_len);
|
238
|
-
new_str = RSTRING_PTR(rv);
|
239
|
-
|
240
|
-
for (s = RSTRING_PTR(self), i = RSTRING_LEN(self); --i >= 0; ++s) {
|
241
|
-
if (likely(CGI_URI_OK(*s)))
|
242
|
-
*new_str++ = *s;
|
243
|
-
else if (space_to_plus && *s == ' ')
|
244
|
-
*new_str++ = '+';
|
245
|
-
else {
|
246
|
-
static const char cgi_digitmap[] = "0123456789ABCDEF";
|
247
|
-
new_str[2] = cgi_digitmap[(*s % 16)];
|
248
|
-
new_str[1] = cgi_digitmap[((*s/16) % 16)];
|
249
|
-
new_str[0] = '%';
|
250
|
-
new_str += 3;
|
251
|
-
}
|
252
|
-
}
|
253
|
-
|
254
|
-
return rv;
|
255
|
-
}
|
256
|
-
|
257
|
-
/*
|
258
|
-
* Compatible with ERB::Util::url_encode / ERB::Util::u, this iterates
|
259
|
-
* through each byte, so multibyte character sets may not supported (but
|
260
|
-
* UTF-8 should be).
|
261
|
-
*/
|
262
|
-
static VALUE fast_xs_url(VALUE self)
|
263
|
-
{
|
264
|
-
return _xs_uri_encode(self, 0);
|
265
|
-
}
|
266
|
-
|
267
|
-
/*
|
268
|
-
* Compatible with CGI::escape(), this iterates through each byte, so
|
269
|
-
* multibyte character sets may not supported (but UTF-8 should be).
|
270
|
-
*/
|
271
|
-
static VALUE fast_xs_cgi(VALUE self)
|
272
|
-
{
|
273
|
-
return _xs_uri_encode(self, 1);
|
274
|
-
}
|
275
|
-
|
276
|
-
static VALUE _uxs_uri(VALUE self, const unsigned int plus_to_space)
|
277
|
-
{
|
278
|
-
char *s, *new_str;
|
279
|
-
long i;
|
280
|
-
size_t new_len = RSTRING_LEN(self);
|
281
|
-
VALUE rv;
|
282
|
-
|
283
|
-
for (s = RSTRING_PTR(self), i = RSTRING_LEN(self);
|
284
|
-
--i >= 0;
|
285
|
-
++s) {
|
286
|
-
if (unlikely(*s == '%') &&
|
287
|
-
likely(is_hex(s[1])) &&
|
288
|
-
likely(is_hex(s[2]))) {
|
289
|
-
new_len -= 2;
|
290
|
-
s += 2;
|
291
|
-
i -= 2;
|
292
|
-
}
|
293
|
-
}
|
294
|
-
|
295
|
-
rv = rb_str_new(NULL, new_len);
|
296
|
-
new_str = RSTRING_PTR(rv);
|
297
|
-
|
298
|
-
for (s = RSTRING_PTR(self), i = RSTRING_LEN(self);
|
299
|
-
--i >= 0;
|
300
|
-
++s, ++new_str) {
|
301
|
-
if (plus_to_space && unlikely(*s == '+'))
|
302
|
-
*new_str = ' ';
|
303
|
-
else if (unlikely(*s == '%') &&
|
304
|
-
likely(is_hex(s[1])) &&
|
305
|
-
likely(is_hex(s[2]))) {
|
306
|
-
*new_str = hexpair_to_int(s[1], s[2]);
|
307
|
-
s += 2;
|
308
|
-
i -= 2;
|
309
|
-
} else
|
310
|
-
*new_str = *s;
|
311
|
-
}
|
312
|
-
|
313
|
-
return rv;
|
314
|
-
}
|
315
|
-
|
316
|
-
static VALUE fast_uxs_cgi(VALUE self)
|
317
|
-
{
|
318
|
-
return _uxs_uri(self, 1);
|
319
|
-
}
|
320
|
-
|
321
171
|
void Init_fast_xs(void)
|
322
172
|
{
|
323
173
|
assert(cp_1252[159 - 128] == 376); /* just in case I skipped a line */
|
@@ -329,8 +179,4 @@ void Init_fast_xs(void)
|
|
329
179
|
rb_global_variable(&C_fmt);
|
330
180
|
|
331
181
|
rb_define_method(rb_cString, "fast_xs", fast_xs, 0);
|
332
|
-
rb_define_method(rb_cString, "fast_xs_html", fast_xs_html, 0);
|
333
|
-
rb_define_method(rb_cString, "fast_xs_cgi", fast_xs_cgi, 0);
|
334
|
-
rb_define_method(rb_cString, "fast_uxs_cgi", fast_uxs_cgi, 0);
|
335
|
-
rb_define_method(rb_cString, "fast_xs_url", fast_xs_url, 0);
|
336
182
|
}
|
@@ -0,0 +1,165 @@
|
|
1
|
+
#include <ruby.h>
|
2
|
+
#include <assert.h>
|
3
|
+
#include "ruby_1_9_compat.h"
|
4
|
+
#include "fast_xs_type.h"
|
5
|
+
#include "gcc.h"
|
6
|
+
|
7
|
+
/*
|
8
|
+
* This is coding agnostic, and works on each byte, so some multibyte
|
9
|
+
* character sets may not be fully supported (but UTF-8 should be).
|
10
|
+
* This is meant to be 100% compatible with the
|
11
|
+
* ERB::Util::escape_html and CGI::escapeHTML methods
|
12
|
+
*/
|
13
|
+
static VALUE fast_xs_html(VALUE self)
|
14
|
+
{
|
15
|
+
long i;
|
16
|
+
char *s;
|
17
|
+
size_t new_len = RSTRING_LEN(self);
|
18
|
+
char *new_str;
|
19
|
+
VALUE rv;
|
20
|
+
|
21
|
+
for (s = RSTRING_PTR(self), i = RSTRING_LEN(self); --i >= 0; ++s) {
|
22
|
+
if (unlikely(*s == '&'))
|
23
|
+
new_len += (sizeof("&") - 2);
|
24
|
+
else if (unlikely(*s == '<' || *s == '>'))
|
25
|
+
new_len += (sizeof(">") - 2);
|
26
|
+
else if (unlikely(*s == '"'))
|
27
|
+
new_len += (sizeof(""") - 2);
|
28
|
+
}
|
29
|
+
|
30
|
+
rv = rb_str_new(NULL, new_len);
|
31
|
+
new_str = RSTRING_PTR(rv);
|
32
|
+
|
33
|
+
#define append_const(buf, x) do { \
|
34
|
+
buf = memcpy(buf, x, sizeof(x) - 1) + sizeof(x) - 1; \
|
35
|
+
} while (0)
|
36
|
+
|
37
|
+
for (s = RSTRING_PTR(self), i = RSTRING_LEN(self); --i >= 0; ++s) {
|
38
|
+
if (unlikely(*s == '&'))
|
39
|
+
append_const(new_str, "&");
|
40
|
+
else if (unlikely(*s == '<'))
|
41
|
+
append_const(new_str, "<");
|
42
|
+
else if (unlikely(*s == '>'))
|
43
|
+
append_const(new_str, ">");
|
44
|
+
else if (unlikely(*s == '"'))
|
45
|
+
append_const(new_str, """);
|
46
|
+
else
|
47
|
+
*new_str++ = *s;
|
48
|
+
}
|
49
|
+
|
50
|
+
#undef append_const
|
51
|
+
|
52
|
+
return rv;
|
53
|
+
}
|
54
|
+
|
55
|
+
#define CGI_URI_OK(x) \
|
56
|
+
((x >= 'a' && x <= 'z') || \
|
57
|
+
(x >= 'A' && x <= 'Z') || \
|
58
|
+
(x >= '0' && x <= '9') || \
|
59
|
+
(x == '.' || x == '-' || x == '_'))
|
60
|
+
|
61
|
+
static inline VALUE _xs_uri_encode(VALUE self, const unsigned int space_to_plus)
|
62
|
+
{
|
63
|
+
long i;
|
64
|
+
char *s;
|
65
|
+
size_t new_len = RSTRING_LEN(self);
|
66
|
+
char *new_str;
|
67
|
+
VALUE rv;
|
68
|
+
|
69
|
+
for (s = RSTRING_PTR(self), i = RSTRING_LEN(self); --i >= 0; ++s) {
|
70
|
+
if (likely(CGI_URI_OK(*s)) || (space_to_plus && *s == ' '))
|
71
|
+
continue;
|
72
|
+
new_len += 2;
|
73
|
+
}
|
74
|
+
|
75
|
+
rv = rb_str_new(NULL, new_len);
|
76
|
+
new_str = RSTRING_PTR(rv);
|
77
|
+
|
78
|
+
for (s = RSTRING_PTR(self), i = RSTRING_LEN(self); --i >= 0; ++s) {
|
79
|
+
if (likely(CGI_URI_OK(*s)))
|
80
|
+
*new_str++ = *s;
|
81
|
+
else if (space_to_plus && *s == ' ')
|
82
|
+
*new_str++ = '+';
|
83
|
+
else {
|
84
|
+
static const char cgi_digitmap[] = "0123456789ABCDEF";
|
85
|
+
new_str[2] = cgi_digitmap[(*s % 16)];
|
86
|
+
new_str[1] = cgi_digitmap[((*s/16) % 16)];
|
87
|
+
new_str[0] = '%';
|
88
|
+
new_str += 3;
|
89
|
+
}
|
90
|
+
}
|
91
|
+
|
92
|
+
return rv;
|
93
|
+
}
|
94
|
+
|
95
|
+
/*
|
96
|
+
* Compatible with ERB::Util::url_encode / ERB::Util::u, this iterates
|
97
|
+
* through each byte, so multibyte character sets may not supported (but
|
98
|
+
* UTF-8 should be).
|
99
|
+
*/
|
100
|
+
static VALUE fast_xs_url(VALUE self)
|
101
|
+
{
|
102
|
+
return _xs_uri_encode(self, 0);
|
103
|
+
}
|
104
|
+
|
105
|
+
/*
|
106
|
+
* Compatible with CGI::escape(), this iterates through each byte, so
|
107
|
+
* multibyte character sets may not supported (but UTF-8 should be).
|
108
|
+
*/
|
109
|
+
static VALUE fast_xs_cgi(VALUE self)
|
110
|
+
{
|
111
|
+
return _xs_uri_encode(self, 1);
|
112
|
+
}
|
113
|
+
|
114
|
+
static VALUE _uxs_uri(VALUE self, const unsigned int plus_to_space)
|
115
|
+
{
|
116
|
+
char *s, *new_str;
|
117
|
+
long i;
|
118
|
+
size_t new_len = RSTRING_LEN(self);
|
119
|
+
VALUE rv;
|
120
|
+
|
121
|
+
for (s = RSTRING_PTR(self), i = RSTRING_LEN(self);
|
122
|
+
--i >= 0;
|
123
|
+
++s) {
|
124
|
+
if (unlikely(*s == '%') &&
|
125
|
+
likely(is_hex(s[1])) &&
|
126
|
+
likely(is_hex(s[2]))) {
|
127
|
+
new_len -= 2;
|
128
|
+
s += 2;
|
129
|
+
i -= 2;
|
130
|
+
}
|
131
|
+
}
|
132
|
+
|
133
|
+
rv = rb_str_new(NULL, new_len);
|
134
|
+
new_str = RSTRING_PTR(rv);
|
135
|
+
|
136
|
+
for (s = RSTRING_PTR(self), i = RSTRING_LEN(self);
|
137
|
+
--i >= 0;
|
138
|
+
++s, ++new_str) {
|
139
|
+
if (plus_to_space && unlikely(*s == '+'))
|
140
|
+
*new_str = ' ';
|
141
|
+
else if (unlikely(*s == '%') &&
|
142
|
+
likely(is_hex(s[1])) &&
|
143
|
+
likely(is_hex(s[2]))) {
|
144
|
+
*new_str = hexpair_to_int(s[1], s[2]);
|
145
|
+
s += 2;
|
146
|
+
i -= 2;
|
147
|
+
} else
|
148
|
+
*new_str = *s;
|
149
|
+
}
|
150
|
+
|
151
|
+
return rv;
|
152
|
+
}
|
153
|
+
|
154
|
+
static VALUE fast_uxs_cgi(VALUE self)
|
155
|
+
{
|
156
|
+
return _uxs_uri(self, 1);
|
157
|
+
}
|
158
|
+
|
159
|
+
void Init_fast_xs_extra(void)
|
160
|
+
{
|
161
|
+
rb_define_method(rb_cString, "fast_xs_html", fast_xs_html, 0);
|
162
|
+
rb_define_method(rb_cString, "fast_xs_cgi", fast_xs_cgi, 0);
|
163
|
+
rb_define_method(rb_cString, "fast_uxs_cgi", fast_uxs_cgi, 0);
|
164
|
+
rb_define_method(rb_cString, "fast_xs_url", fast_xs_url, 0);
|
165
|
+
}
|
data/test/test_xml_escaping.rb
CHANGED
@@ -13,6 +13,7 @@ class TestXmlEscaping < Test::Unit::TestCase
|
|
13
13
|
assert_equal '&', '&'.fast_xs # ampersand
|
14
14
|
assert_equal '<', '<'.fast_xs # left angle bracket
|
15
15
|
assert_equal '>', '>'.fast_xs # right angle bracket
|
16
|
+
assert_equal '"', '"'.fast_xs # double quote
|
16
17
|
end
|
17
18
|
|
18
19
|
def test_invalid
|
metadata
CHANGED
@@ -1,43 +1,29 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
|
-
rubygems_version: 0.9.4.7
|
3
|
-
specification_version: 2
|
4
2
|
name: fast_xs
|
5
3
|
version: !ruby/object:Gem::Version
|
6
|
-
version: "0.
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
- lib/i486-linux
|
11
|
-
- lib
|
12
|
-
email: normalperson@yhbt.net
|
13
|
-
homepage: http://bogonips.org/fast_xs/
|
14
|
-
rubyforge_project:
|
15
|
-
description: excessively fast escaping
|
4
|
+
version: "0.7"
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Eric Wong
|
16
8
|
autorequire:
|
17
|
-
default_executable:
|
18
9
|
bindir: bin
|
19
|
-
has_rdoc: true
|
20
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
21
|
-
requirements:
|
22
|
-
- - ">="
|
23
|
-
- !ruby/object:Gem::Version
|
24
|
-
version: "0"
|
25
|
-
version:
|
26
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
27
|
-
requirements:
|
28
|
-
- - ">="
|
29
|
-
- !ruby/object:Gem::Version
|
30
|
-
version: "0"
|
31
|
-
version:
|
32
|
-
platform: ruby
|
33
|
-
signing_key:
|
34
10
|
cert_chain: []
|
35
11
|
|
36
|
-
|
37
|
-
|
38
|
-
|
12
|
+
date: 2009-02-07 00:00:00 -08:00
|
13
|
+
default_executable:
|
14
|
+
dependencies: []
|
15
|
+
|
16
|
+
description: excessively fast escaping
|
17
|
+
email: normalperson@yhbt.net
|
18
|
+
executables: []
|
19
|
+
|
20
|
+
extensions:
|
21
|
+
- ext/fast_xs/extconf.rb
|
22
|
+
- ext/fast_xs_extra/extconf.rb
|
23
|
+
extra_rdoc_files:
|
24
|
+
- README
|
25
|
+
- COPYING
|
39
26
|
files:
|
40
|
-
- CHANGELOG
|
41
27
|
- COPYING
|
42
28
|
- README
|
43
29
|
- Rakefile
|
@@ -46,12 +32,15 @@ files:
|
|
46
32
|
- test/test_erb_util_module_overrides.rb
|
47
33
|
- lib/fast_xs_monkey_patcher.rb
|
48
34
|
- ext/fast_xs/fast_xs.c
|
35
|
+
- ext/fast_xs_extra/fast_xs_extra.c
|
49
36
|
- ext/fast_xs/extconf.rb
|
37
|
+
- ext/fast_xs_extra/extconf.rb
|
38
|
+
- ext/fast_xs/gcc.h
|
50
39
|
- ext/fast_xs/ruby_1_9_compat.h
|
51
40
|
- ext/fast_xs/fast_xs_type.h
|
52
|
-
|
53
|
-
|
54
|
-
|
41
|
+
has_rdoc: true
|
42
|
+
homepage: http://bogomips.org/fast_xs/
|
43
|
+
post_install_message:
|
55
44
|
rdoc_options:
|
56
45
|
- --quiet
|
57
46
|
- --title
|
@@ -59,15 +48,27 @@ rdoc_options:
|
|
59
48
|
- --main
|
60
49
|
- README
|
61
50
|
- --inline-source
|
62
|
-
|
63
|
-
-
|
64
|
-
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
51
|
+
require_paths:
|
52
|
+
- lib/x86_64-linux
|
53
|
+
- lib
|
54
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
55
|
+
requirements:
|
56
|
+
- - ">="
|
57
|
+
- !ruby/object:Gem::Version
|
58
|
+
version: "0"
|
59
|
+
version:
|
60
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
61
|
+
requirements:
|
62
|
+
- - ">="
|
63
|
+
- !ruby/object:Gem::Version
|
64
|
+
version: "0"
|
65
|
+
version:
|
70
66
|
requirements: []
|
71
67
|
|
72
|
-
|
68
|
+
rubyforge_project:
|
69
|
+
rubygems_version: 1.3.1
|
70
|
+
signing_key:
|
71
|
+
specification_version: 2
|
72
|
+
summary: excessively fast escaping
|
73
|
+
test_files: []
|
73
74
|
|