Skip to content

Commit

Permalink
Use the canonical version of the encoding name for any of our support…
Browse files Browse the repository at this point in the history
…ed encodings.

For any unexpected encodings, default to ascii.
  • Loading branch information
nkriege committed May 19, 2011
1 parent fbdd29a commit b667680
Show file tree
Hide file tree
Showing 4 changed files with 26 additions and 47 deletions.
5 changes: 3 additions & 2 deletions ext/libxml/libxml.c
Expand Up @@ -25,8 +25,9 @@ VALUE rxml_str_new2(const char* xstr, const char* xencoding)
{
#ifdef HAVE_RUBY_ENCODING_H
if (xencoding)
{
rb_encoding* xencodingPtr = rb_enc_find(xencoding);
{
xmlCharEncoding xmlEncoding = xmlParseCharEncoding(xencoding);
rb_encoding* xencodingPtr = rxml_xml_encoding_to_rb_encoding_ptr(xmlEncoding);
return rb_external_str_new_with_enc(xstr, strlen(xstr), xencodingPtr);
}
#endif
Expand Down
5 changes: 1 addition & 4 deletions ext/libxml/ruby_xml_document.c
Expand Up @@ -330,13 +330,10 @@ static VALUE rxml_document_rb_encoding_get(VALUE self)
{
xmlDocPtr xdoc;
const char *xencoding;
rb_encoding* xencodingPtr;
Data_Get_Struct(self, xmlDoc, xdoc);

xencoding = (const char*)xdoc->encoding;
xencodingPtr = rb_enc_find(xencoding);

return rb_enc_from_encoding(xencodingPtr);
return rxml_xml_encoding_to_rb_encoding(mXMLEncoding, xmlParseCharEncoding(xencoding));
}
#endif

Expand Down
62 changes: 21 additions & 41 deletions ext/libxml/ruby_xml_encoding.c
Expand Up @@ -75,74 +75,54 @@ static VALUE rxml_encoding_to_s(VALUE klass, VALUE encoding)
}

#ifdef HAVE_RUBY_ENCODING_H
VALUE rxml_xml_encoding_to_rb_encoding(VALUE klass, xmlCharEncoding xmlEncoding)
/*
* Converts an xmlCharEncoding enum value into an rb_encoding object (available
* on Ruby 1.9.* and higher).
*/
rb_encoding* rxml_xml_encoding_to_rb_encoding_ptr(xmlCharEncoding xmlEncoding)
{
ID encoding_name;
const char* encodingName;

switch (xmlEncoding)
{
case XML_CHAR_ENCODING_UTF8:
encoding_name = rb_intern("UTF_8");
break;
case XML_CHAR_ENCODING_UTF16LE:
encoding_name = rb_intern("UTF_16LE");
break;
case XML_CHAR_ENCODING_UTF16BE:
encoding_name = rb_intern("UTF_16BE");
break;
case XML_CHAR_ENCODING_UCS4LE:
encoding_name = rb_intern("UCS_4LE");
break;
case XML_CHAR_ENCODING_UCS4BE:
encoding_name = rb_intern("UCS_4BE");
break;
case XML_CHAR_ENCODING_UCS2:
encoding_name = rb_intern("UCS_2");
break;
case XML_CHAR_ENCODING_8859_1:
encoding_name = rb_intern("ISO8859_1");
break;
case XML_CHAR_ENCODING_8859_2:
encoding_name = rb_intern("ISO8859_2");
break;
case XML_CHAR_ENCODING_8859_3:
encoding_name = rb_intern("ISO8859_3");
break;
case XML_CHAR_ENCODING_8859_4:
encoding_name = rb_intern("ISO8859_4");
break;
case XML_CHAR_ENCODING_8859_5:
encoding_name = rb_intern("ISO8859_5");
break;
case XML_CHAR_ENCODING_8859_6:
encoding_name = rb_intern("ISO8859_6");
break;
case XML_CHAR_ENCODING_8859_7:
encoding_name = rb_intern("ISO8859_7");
break;
case XML_CHAR_ENCODING_8859_8:
encoding_name = rb_intern("ISO8859_8");
break;
case XML_CHAR_ENCODING_8859_9:
encoding_name = rb_intern("ISO8859_9");
break;
case XML_CHAR_ENCODING_2022_JP:
encoding_name = rb_intern("ISO_2022_JP");
break;
case XML_CHAR_ENCODING_SHIFT_JIS:
encoding_name = rb_intern("SHIFT_JIS");
break;
case XML_CHAR_ENCODING_EUC_JP:
encoding_name = rb_intern("EUC_JP");
break;
case XML_CHAR_ENCODING_ASCII:
encoding_name = rb_intern("US-ASCII");
/* Get the canonical version of the name */
encodingName = xmlGetCharEncodingName(xmlEncoding);
break;
default:
/* Covers XML_CHAR_ENCODING_ERROR, XML_CHAR_ENCODING_NONE, XML_CHAR_ENCODING_EBCDIC */
encoding_name = rb_intern("ASCII_8BIT");
encodingName = xmlGetCharEncodingName(XML_CHAR_ENCODING_ASCII);
break;
}
return rb_const_get(rb_cEncoding, encoding_name);

return rb_enc_find(encodingName);
}

/*
* Converts an xmlCharEncoding enum value into a Ruby Encoding object (available
* on Ruby 1.9.* and higher).
*/
VALUE rxml_xml_encoding_to_rb_encoding(VALUE klass, xmlCharEncoding xmlEncoding)
{
return rb_enc_from_encoding(rxml_xml_encoding_to_rb_encoding_ptr(xmlEncoding));
}

/*
Expand Down
1 change: 1 addition & 0 deletions ext/libxml/ruby_xml_encoding.h
Expand Up @@ -9,6 +9,7 @@ void rxml_init_encoding();

#ifdef HAVE_RUBY_ENCODING_H
VALUE rxml_xml_encoding_to_rb_encoding(VALUE klass, xmlCharEncoding xmlEncoding);
rb_encoding* rxml_xml_encoding_to_rb_encoding_ptr(xmlCharEncoding xmlEncoding);
#endif

#endif

0 comments on commit b667680

Please sign in to comment.