fast_xs 0.6 → 0.7
Sign up to get free protection for your applications and to get access to all the features.
- 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
|
|