xmlhash 1.2.2 → 1.2.4

Sign up to get free protection for your applications and to get access to all the features.
data/History.txt CHANGED
@@ -1,3 +1,11 @@
1
+ === 1.2.4 / 2012-09-27
2
+
3
+ * set the encoding of the result to the encoding of the input
4
+
5
+ === 1.2.3 / 2012-06-22
6
+
7
+ * (pulled)
8
+
1
9
  === 1.2.2 / 2012-06-20
2
10
 
3
11
  * use pkg-config for libxml
@@ -1,6 +1,16 @@
1
1
  #include <assert.h>
2
2
  #include <ruby.h>
3
- #include <st.h>
3
+ #ifdef HAVE_RUBY_ST_H
4
+ # include <ruby/st.h>
5
+ #else
6
+ # include <st.h>
7
+ #endif
8
+
9
+ /* API_VERSION_CODE is only defined in those we want */
10
+ #ifdef HAVE_RUBY_ENCODING_H
11
+ # include <ruby/encoding.h>
12
+ #endif
13
+
4
14
  #include <libxml/parser.h>
5
15
  #include <libxml/xmlreader.h>
6
16
 
@@ -8,6 +18,9 @@ static VALUE m_current = Qnil;
8
18
  static VALUE m_stack = Qnil;
9
19
  static VALUE m_cstring = Qnil;
10
20
  static VALUE m_result = Qnil;
21
+ #ifdef HAVE_RUBY_ENCODING_H
22
+ static rb_encoding *m_current_encoding = NULL;
23
+ #endif
11
24
 
12
25
  void init_XmlhashParserData()
13
26
  {
@@ -18,9 +31,10 @@ void init_XmlhashParserData()
18
31
 
19
32
  void xml_hash_start_element(const xmlChar *name)
20
33
  {
21
- // needed for further attributes
34
+ VALUE pair;
35
+ /* needed for further attributes */
22
36
  m_current = rb_hash_new();
23
- VALUE pair = rb_ary_new();
37
+ pair = rb_ary_new();
24
38
  rb_ary_push(pair, rb_str_new2((const char*)name));
25
39
  rb_ary_push(pair, m_current);
26
40
  rb_ary_push(m_stack, pair);
@@ -29,18 +43,24 @@ void xml_hash_start_element(const xmlChar *name)
29
43
 
30
44
  void xml_hash_end_element(const xmlChar *name)
31
45
  {
46
+ VALUE pair, cname, chash, phash, obj;
47
+
32
48
  assert(m_stack != Qnil);
33
- VALUE pair = rb_ary_pop(m_stack);
49
+ pair = rb_ary_pop(m_stack);
34
50
  assert(pair != Qnil);
35
- VALUE cname = rb_ary_entry(pair, 0);
36
- VALUE chash = rb_ary_entry(pair, 1);
51
+ cname = rb_ary_entry(pair, 0);
52
+ chash = rb_ary_entry(pair, 1);
37
53
  assert(!strcmp((const char*)name, RSTRING_PTR(cname)));
38
54
 
39
55
  if (rb_obj_is_kind_of(chash, rb_cHash) && RHASH_SIZE(chash) == 0) {
40
- // now check if the cstring array contains non-empty string
41
- VALUE string = rb_ary_join(m_cstring, Qnil);
42
- const char *string_ptr = RSTRING_PTR(string);
43
- long string_len = RSTRING_LEN(string);
56
+ VALUE string;
57
+ const char *string_ptr;
58
+ long string_len;
59
+
60
+ /* now check if the cstring array contains non-empty string */
61
+ string = rb_ary_join(m_cstring, Qnil);
62
+ string_ptr = RSTRING_PTR(string);
63
+ string_len = RSTRING_LEN(string);
44
64
  while (string_len > 0 && (string_ptr[0] == ' ' || string_ptr[0] == '\t' || string_ptr[0] == '\n')) {
45
65
  string_ptr++;
46
66
  string_len--;
@@ -48,7 +68,7 @@ void xml_hash_end_element(const xmlChar *name)
48
68
  while (string_len > 0 && (string_ptr[string_len-1] == ' ' || string_ptr[string_len-1] == '\t' || string_ptr[string_len-1] == '\n')) {
49
69
  string_len--;
50
70
  }
51
- // avoid overwriting empty hash with empty string
71
+ /* avoid overwriting empty hash with empty string */
52
72
  if (string_len > 0)
53
73
  chash = string;
54
74
  }
@@ -58,10 +78,9 @@ void xml_hash_end_element(const xmlChar *name)
58
78
  }
59
79
 
60
80
  pair = rb_ary_entry(m_stack, RARRAY_LEN(m_stack)-1);
61
- //VALUE pname = rb_ary_entry(pair, 0);
62
- VALUE phash = rb_ary_entry(pair, 1);
81
+ phash = rb_ary_entry(pair, 1);
63
82
 
64
- VALUE obj = rb_hash_aref(phash, cname);
83
+ obj = rb_hash_aref(phash, cname);
65
84
  if (obj != Qnil) {
66
85
  if (rb_obj_is_kind_of(obj, rb_cArray)) {
67
86
  rb_ary_push(obj, chash);
@@ -72,20 +91,36 @@ void xml_hash_end_element(const xmlChar *name)
72
91
  rb_hash_aset(phash, cname, nobj);
73
92
  }
74
93
  } else {
75
- // implement force_array
94
+ /* implement force_array */
76
95
  rb_hash_aset(phash, cname, chash);
77
96
  }
78
97
  }
79
98
 
80
99
  void xml_hash_add_attribute(const xmlChar *name, const xmlChar *value)
81
100
  {
101
+ #ifdef HAVE_RUBY_ENCODING_H
102
+ VALUE v_name, v_value;
103
+ #endif
104
+
82
105
  assert(m_current != Qnil);
106
+ #ifdef HAVE_RUBY_ENCODING_H
107
+ v_name = rb_external_str_new_with_enc((const char*)name, xmlStrlen(name), m_current_encoding);
108
+ v_value = rb_external_str_new_with_enc((const char*)value, xmlStrlen(value), m_current_encoding);
109
+ rb_hash_aset(m_current, v_name, v_value);
110
+ #else
83
111
  rb_hash_aset(m_current, rb_str_new2((const char*)name), rb_str_new2((const char*)value));
112
+ #endif
84
113
  }
85
114
 
86
115
  void xml_hash_add_text(const xmlChar *text)
87
116
  {
117
+ #ifdef HAVE_RUBY_ENCODING_H
118
+ VALUE str;
119
+ str = rb_external_str_new_with_enc((const char*)text, xmlStrlen(text), m_current_encoding);
120
+ rb_ary_push(m_cstring, str);
121
+ #else
88
122
  rb_ary_push(m_cstring, rb_str_new2((const char*)text));
123
+ #endif
89
124
  }
90
125
 
91
126
  void processAttribute(xmlTextReaderPtr reader)
@@ -153,7 +188,10 @@ static VALUE parse_xml_hash(VALUE self, VALUE rb_xml)
153
188
  int ret;
154
189
 
155
190
  Check_Type(rb_xml, T_STRING);
156
-
191
+ #ifdef HAVE_RUBY_ENCODING_H
192
+ m_current_encoding = rb_enc_get(rb_xml);
193
+ #endif
194
+
157
195
  data = (char*)calloc(RSTRING_LEN(rb_xml), sizeof(char));
158
196
  memcpy(data, StringValuePtr(rb_xml), RSTRING_LEN(rb_xml));
159
197
 
@@ -173,13 +211,18 @@ static VALUE parse_xml_hash(VALUE self, VALUE rb_xml)
173
211
  }
174
212
 
175
213
  free(data);
214
+ #ifdef HAVE_RUBY_ENCODING_H
215
+ m_current_encoding = 0;
216
+ #endif
176
217
  return m_result;
177
218
  }
178
219
 
179
220
  void Init_xmlhash()
180
221
  {
222
+ VALUE mXmlhash;
223
+
181
224
  LIBXML_TEST_VERSION
182
- VALUE mXmlhash = rb_define_module("Xmlhash");
225
+ mXmlhash = rb_define_module("Xmlhash");
183
226
  rb_define_singleton_method(mXmlhash, "parse", &parse_xml_hash, 1);
184
227
  m_stack = rb_ary_new();
185
228
  rb_global_variable(&m_stack);
Binary file
data/lib/xmlhash.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  require 'xmlhash/xmlhash'
2
2
 
3
3
  module Xmlhash
4
- VERSION = '1.2.2'
4
+ VERSION = '1.2.4'
5
5
  end
data/test/test_xmlhash.rb CHANGED
@@ -1,3 +1,5 @@
1
+ # encoding: UTF-8
2
+
1
3
  require "test/unit"
2
4
  require "xmlhash"
3
5
  require 'json'
@@ -89,4 +91,15 @@ eos
89
91
  assert_equal ret, rubyoutput
90
92
  end
91
93
 
94
+ def test_encoding
95
+ xml = "<?xml version='1.0' encoding='UTF-8'?><name>Adrian Schröter</name>"
96
+
97
+ ret = Xmlhash.parse(xml)
98
+ assert_equal ret, "Adrian Schröter"
99
+
100
+ xml = "<?xml version='1.0' encoding='UTF-8'?><name value='Adrian Schröter'/>"
101
+ ret = Xmlhash.parse(xml)
102
+ assert_equal ret, {"value"=>"Adrian Schröter"}
103
+ end
104
+
92
105
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: xmlhash
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.2
4
+ version: 1.2.4
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-06-20 00:00:00.000000000 Z
12
+ date: 2012-09-27 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: pkg-config
@@ -66,7 +66,7 @@ dependencies:
66
66
  requirements:
67
67
  - - ~>
68
68
  - !ruby/object:Gem::Version
69
- version: '3.0'
69
+ version: '3.1'
70
70
  type: :development
71
71
  prerelease: false
72
72
  version_requirements: !ruby/object:Gem::Requirement
@@ -74,7 +74,7 @@ dependencies:
74
74
  requirements:
75
75
  - - ~>
76
76
  - !ruby/object:Gem::Version
77
- version: '3.0'
77
+ version: '3.1'
78
78
  description: ! 'A small C module that wraps libxml2''s xmlreader to parse a XML
79
79
 
80
80
  string into a ruby hash'