fjson 0.0.2 → 0.0.3

Sign up to get free protection for your applications and to get access to all the features.
data/CHANGES CHANGED
@@ -1,3 +1,6 @@
1
+ 2006-10-17 (0.0.3)
2
+ * Enabled UTF8 support.
3
+
1
4
  2006-10-16 (0.0.2)
2
5
  * Gem now compiles the extension rather than just distribute the binary.
3
6
 
data/README CHANGED
@@ -21,6 +21,11 @@ Author
21
21
  Brian Takita <brian.takita@gmail.com>
22
22
  Florian Frank <flori@ping.de>
23
23
 
24
+ Special Thanks to
25
+ =================
26
+ Max Lapshin
27
+ Marcus Rueckert
28
+
24
29
  License
25
30
  =======
26
31
 
data/Rakefile CHANGED
@@ -54,7 +54,8 @@ end
54
54
  task :install do
55
55
  dir = File.dirname(__FILE__)
56
56
  fjson_extensions.each do |extension_path|
57
- cp extension_binary_path(extension_path), "#{dir}/lib/#{extension_path}"
57
+ binary_path = extension_binary_path(extension_path)
58
+ cp binary_path, "#{dir}/lib/#{extension_path}.so"
58
59
  end
59
60
  end
60
61
 
@@ -77,7 +78,7 @@ def extension_directory_path(relative_extension_path)
77
78
  end
78
79
 
79
80
  PKG_NAME = "fjson"
80
- PKG_VERSION = "0.0.2"
81
+ PKG_VERSION = "0.0.3"
81
82
  PKG_FILE_NAME = "#{PKG_NAME}-#{PKG_VERSION}"
82
83
  PKG_FILES = FileList[
83
84
  '[A-Z]*',
@@ -1,4 +1,4 @@
1
1
  #include "ruby.h"
2
2
  #include <string.h>
3
3
 
4
- static VALUE to_json(int, VALUE*, VALUE);
4
+ static VALUE to_json(int, VALUE*, VALUE);
@@ -1,4 +1,4 @@
1
1
  #include "ruby.h"
2
2
  #include <string.h>
3
3
 
4
- static VALUE to_json(int, VALUE*, VALUE);
4
+ static VALUE to_json(int, VALUE*, VALUE);
@@ -1,4 +1,4 @@
1
1
  #include "ruby.h"
2
2
  #include <string.h>
3
3
 
4
- static VALUE to_json(int, VALUE*, VALUE);
4
+ static VALUE to_json(int, VALUE*, VALUE);
@@ -1,4 +1,4 @@
1
1
  #include "ruby.h"
2
2
  #include <string.h>
3
3
 
4
- static VALUE to_json(int, VALUE*, VALUE);
4
+ static VALUE to_json(int, VALUE*, VALUE);
@@ -61,8 +61,17 @@ static VALUE utf8_to_json(self, input)
61
61
 
62
62
  int c_increment_length;
63
63
  size_t i = 0;
64
+
65
+ VALUE supports_utf8 = Qfalse;
66
+ if(
67
+ rb_funcall(mJSON, rb_intern("support_unicode?"), 0) == Qtrue &&
68
+ rb_equal(rb_gv_get("KCODE"), rb_str_new2("UTF8"))
69
+ ) {
70
+ supports_utf8 = Qtrue;
71
+ }
72
+
64
73
  while(i < c_length) {
65
- c_increment_length = _convert_utf8_char(input, i, result);
74
+ c_increment_length = _convert_utf8_char(input, i, result, supports_utf8);
66
75
  i += c_increment_length;
67
76
  }
68
77
 
@@ -92,10 +101,11 @@ static void _begin_setup_iconv() {
92
101
  rb_funcall(mUTF16toUTF8, rb_intern("iconv"), 1, rb_str_new2("no bom"));
93
102
  }
94
103
 
95
- static long _convert_utf8_char(input, i, result)
104
+ static long _convert_utf8_char(input, i, result, supports_utf8)
96
105
  VALUE input;
97
106
  long i;
98
107
  VALUE result;
108
+ VALUE supports_utf8;
99
109
  {
100
110
  long c_increment_length = 1;
101
111
  if (i < 0 || RSTRING(input)->len <= i) {
@@ -124,6 +134,9 @@ static long _convert_utf8_char(input, i, result)
124
134
  else if(c_current == '\\') {
125
135
  rb_str_cat2(result, "\\\\");
126
136
  }
137
+ else if(c_current == '\/') {
138
+ rb_str_cat2(result, "\\\/");
139
+ }
127
140
  else if(0x00 <= c_current && c_current <= 0x1f) {
128
141
  VALUE format_string = rb_str_new2("\\u%04x");
129
142
  rb_str_append(result, rb_funcall(format_string, rb_intern("%"), 1, LONG2NUM(c_current)));
@@ -131,38 +144,35 @@ static long _convert_utf8_char(input, i, result)
131
144
  else if(0x20 <= c_current && c_current <= 0x7f) {
132
145
  rb_str_concat(result, LONG2NUM(c_current));
133
146
  }
134
- else if(
135
- !(
136
- rb_funcall(mJSON, rb_intern("support_unicode?"), 0) == Qtrue &&
137
- rb_equal(rb_gv_get("KCODE"), rb_str_new2("UTF8"))
138
- )) {
147
+ else if(supports_utf8 == Qfalse) {
139
148
  VALUE current = rb_funcall(input, rb_intern("[]"), 1, LONG2NUM(i));
140
149
  rb_str_concat(result, current);
141
150
  }
142
- // else if((c_current & 0xe0) == 0xc0) {
143
- // c_increment_length = 2;
144
- // _convert_utf_8_string_part(result, input, i, c_increment_length);
145
- // }
146
- // else if((c_current & 0xf0) == 0xe0) {
147
- // c_increment_length = 3;
148
- // _convert_utf_8_string_part(result, input, i, c_increment_length);
149
- // }
150
- // else if((c_current & 0xf8) == 0xf0) {
151
- // c_increment_length = 4;
152
- // _convert_utf_8_string_part(result, input, i, c_increment_length);
153
- // }
154
- // // TODO: See if these next two steps are valid unicode.
155
- // else if((c_current & 0xf8) == 0xf8) {
156
- // c_increment_length = 5;
157
- // _convert_utf_8_string_part(result, input, i, c_increment_length);
158
- // }
159
- // else if((c_current & 0xf8) == 0xfc) {
160
- // c_increment_length = 6;
161
- // _convert_utf_8_string_part(result, input, i, c_increment_length);
162
- // }
151
+ else if((c_current & 0xe0) == 0xc0) {
152
+ c_increment_length = 2;
153
+ _convert_utf_8_string_part(result, input, i, c_increment_length);
154
+ }
155
+ else if((c_current & 0xf0) == 0xe0) {
156
+ c_increment_length = 3;
157
+ _convert_utf_8_string_part(result, input, i, c_increment_length);
158
+ }
159
+ else if((c_current & 0xf8) == 0xf0) {
160
+ c_increment_length = 4;
161
+ _convert_utf_8_string_part(result, input, i, c_increment_length);
162
+ }
163
+ else if((c_current & 0xfc) == 0xf8) {
164
+ c_increment_length = 5;
165
+ _convert_utf_8_string_part(result, input, i, c_increment_length);
166
+ }
167
+ else if((c_current & 0xfe) == 0xfc) {
168
+ c_increment_length = 6;
169
+ _convert_utf_8_string_part(result, input, i, c_increment_length);
170
+ }
163
171
  else {
164
- VALUE current = rb_funcall(input, rb_intern("[]"), 1, LONG2NUM(i));
165
- rb_str_concat(result, current);
172
+ char* error_message = "Encountered unknown UTF-8 byte: ";
173
+ error_message += c_current;
174
+ strcat(error_message, "!");
175
+ rb_raise(rb_eRuntimeError, error_message);
166
176
  }
167
177
 
168
178
  return c_increment_length;
@@ -3,7 +3,7 @@
3
3
 
4
4
  static VALUE utf8_to_utf16(VALUE, VALUE);
5
5
  static VALUE _convert_utf_8_string_part(VALUE, VALUE, long, long);
6
- static long _convert_utf8_char(VALUE, long, VALUE);
6
+ static long _convert_utf8_char(VALUE, long, VALUE, VALUE);
7
7
  static VALUE utf8_to_json(VALUE, VALUE);
8
8
  static void _begin_setup_iconv();
9
9
  void Init_json_ext();
@@ -56,8 +56,9 @@ module JSON
56
56
  def parse_string
57
57
  if scan(STRING)
58
58
  return '' if self[1].empty?
59
- self[1].gsub(/\\(?:[\\bfnrt"]|u([A-Fa-f\d]{4}))/) do
59
+ self[1].gsub(%r(\\(?:[\\bfnrt"/]|u([A-Fa-f\d]{4})))) do
60
60
  case $~[0]
61
+ when '\/' then '/'
61
62
  when '\\\\' then '\\'
62
63
  when '\\b' then "\b"
63
64
  when '\\f' then "\f"
@@ -51,4 +51,17 @@ context "String with latin1 character set Json" do
51
51
  JSON.utf8_to_json("test").should_equal "test"
52
52
  JSON.utf8_to_json('1').should_equal '1'
53
53
  end
54
+
55
+ specify "should support backslashes" do
56
+ json = '"\\\\.(?i:gif|jpe?g|png)$"'
57
+ data = JSON.parse(json)
58
+ JSON.unparse(data).should_equal json
59
+ json = '"\\""'
60
+ data = JSON.parse(json)
61
+ JSON.unparse(data).should_equal json
62
+ json = '"\/"'
63
+ data = JSON.parse(json)
64
+ data.should_equal '/'
65
+ JSON.unparse(data).should_equal json
66
+ end
54
67
  end
@@ -4,33 +4,50 @@ dir = File.dirname(__FILE__)
4
4
  require File.expand_path("#{dir}/spec_helper")
5
5
  require File.expand_path("#{dir}/../lib/fjson")
6
6
 
7
- #context "String with UTF8 values when supporting unicode Json" do
8
- # setup do
9
- # JSON.support_unicode = true
10
- # $KCODE = "UTF8"
11
- # end
12
- #
13
- # specify "should format values between 0x00000080 and 0x000007ff" do
14
- # val = [0x0080].pack("U")
15
- # JSON.utf8_to_json(val).should_equal "\\u0080"
16
- #
17
- # val = [0x07ff].pack("U")
18
- # JSON.utf8_to_json(val).should_equal "\\u07ff"
19
- # end
20
- #
21
- # specify "should format values between 0x00001000 and 0x0000ffff" do
22
- # val = [0x1000].pack("U")
23
- # JSON.utf8_to_json(val).should_equal "\\u1000"
24
- #
25
- # val = [0xffff].pack("U")
26
- # JSON.utf8_to_json(val).should_equal "\\uffff"
27
- # end
28
- #
29
- # specify "should format values between 0x00010000 and 0x0010ffff" do
30
- # val = [0x010000].pack("U")
31
- # JSON.utf8_to_json(val).should_equal "\\ud800dc00"
32
- #
33
- # val = [0x10ffff].pack("U")
34
- # JSON.utf8_to_json(val).should_equal "\\udbffdfff"
35
- # end
36
- #end
7
+ context "String with UTF8 values when supporting unicode Json" do
8
+ setup do
9
+ JSON.support_unicode = true
10
+ $KCODE = "UTF8"
11
+ end
12
+
13
+ specify "should format values between 0x00000080 and 0x000007ff" do
14
+ val = [0x0080].pack("U")
15
+ JSON.utf8_to_json(val).should_equal "\\u0080"
16
+
17
+ val = [0x07ff].pack("U")
18
+ JSON.utf8_to_json(val).should_equal "\\u07ff"
19
+ end
20
+
21
+ specify "should format values between 0x00001000 and 0x0000ffff" do
22
+ val = [0x1000].pack("U")
23
+ JSON.utf8_to_json(val).should_equal "\\u1000"
24
+
25
+ val = [0xffff].pack("U")
26
+ JSON.utf8_to_json(val).should_equal "\\uffff"
27
+ end
28
+
29
+ specify "should format values between 0x00010000 and 0x0010ffff" do
30
+ val = [0x010000].pack("U")
31
+ JSON.utf8_to_json(val).should_equal "\\ud800dc00"
32
+
33
+ val = [0x10ffff].pack("U")
34
+ JSON.utf8_to_json(val).should_equal "\\udbffdfff"
35
+ end
36
+
37
+ specify "should parse unicode values" do
38
+ utf8 = '© ≠ €!'
39
+ json = '"\u00a9 \u2260 \u20ac!"'
40
+ utf8.to_json.should_equal json
41
+ JSON.parse(json).should_equal utf8
42
+
43
+ utf8 = "\343\201\202\343\201\204\343\201\206\343\201\210\343\201\212"
44
+ json = '"\u3042\u3044\u3046\u3048\u304a"'
45
+ utf8.to_json.should_equal json
46
+ JSON.parse(json).should_equal utf8
47
+
48
+ utf8 = 'საქართველო'
49
+ json = '"\u10e1\u10d0\u10e5\u10d0\u10e0\u10d7\u10d5\u10d4\u10da\u10dd"'
50
+ utf8.to_json.should_equal json
51
+ JSON.parse(json).should_equal utf8
52
+ end
53
+ end
metadata CHANGED
@@ -3,8 +3,8 @@ rubygems_version: 0.9.0
3
3
  specification_version: 1
4
4
  name: fjson
5
5
  version: !ruby/object:Gem::Version
6
- version: 0.0.2
7
- date: 2006-10-16 00:00:00 -07:00
6
+ version: 0.0.3
7
+ date: 2006-10-17 00:00:00 -07:00
8
8
  summary: This library is for parsing JSON strings and unparsing ruby data structures. This library is a fork of Florian Frank's JSON library with key parts implemented in C for performance improvements.
9
9
  require_paths:
10
10
  - lib