Changeset 163 for trunk/src/xmldecl.c


Ignore:
Timestamp:
Jun 22, 2008, 1:45:20 PM (11 years ago)
Author:
cameron
Message:

Restructuring: Document/Externalt? Entity Info into xmldecl.h

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/xmldecl.c

    r162 r163  
    1717#include "bytelex.h"
    1818#include "xmlmodel.h"
     19
     20
     21Entity_Info::Entity_Info() {
     22}
     23Entity_Info::~Entity_Info() {
     24        free(encoding);
     25}
     26
     27/* Signature-based character set family detection in accord with
     28   Appendix F of the XML 1.0 and 1.1 specifications. */
     29
     30/* These definitions use b2int16 to determine appropriate doublebyte
     31   values based on endianness of the underlying architecture. */
     32static const int x0000 = b2int16<0x00, 0x00>::value;
     33static const int xFEFF = b2int16<0xFE, 0xFF>::value;
     34static const int xFFFE = b2int16<0xFF, 0xFE>::value;
     35static const int x003C = b2int16<0x00, 0x3C>::value;
     36static const int x3C00 = b2int16<0x3C, 0x00>::value;
     37static const int x4C6F = b2int16<0x4C, 0x6F>::value;
     38static const int xA794 = b2int16<0xA7, 0x94>::value;
     39static const int xEFBE = b2int16<0xEF, 0xBE>::value;
     40
     41void Entity_Info::AnalyzeSignature(unsigned char * signature) {
     42        uint16_t * XML_dbl_byte = (uint16_t *) signature;
     43        switch (XML_dbl_byte[0]) {
     44                case x0000:
     45                        switch (XML_dbl_byte[1]) {
     46                                case xFEFF: set_charset_family(ASCII, QuadByte, BigEndian, 1);break;
     47                                case xFFFE: set_charset_family(ASCII, QuadByte, Unusual_2143, 1);break;
     48                                case x3C00: set_charset_family(ASCII, QuadByte, Unusual_2143, 0);break;
     49                                default: set_charset_family(ASCII, QuadByte, BigEndian, 0);
     50                        }
     51                        break;
     52                case xFEFF:
     53                        if (XML_dbl_byte[1] == x0000)
     54                                set_charset_family(ASCII, QuadByte, Unusual_3412, 1);
     55                        else set_charset_family(ASCII, DoubleByte, BigEndian, 1);
     56                        break;
     57                case xFFFE:
     58                        if (XML_dbl_byte[1] == x0000)
     59                                set_charset_family(ASCII, QuadByte, LittleEndian, 1);
     60                        else set_charset_family(ASCII, DoubleByte, LittleEndian, 1);
     61                        break;
     62                case x003C:
     63                        if (XML_dbl_byte[1] == x0000)
     64                                set_charset_family(ASCII, QuadByte, Unusual_3412, 0);
     65                        else set_charset_family(ASCII, DoubleByte, BigEndian, 0);
     66                        break;
     67                case x3C00:
     68                        if (XML_dbl_byte[1] == x0000)
     69                                set_charset_family(ASCII, QuadByte, LittleEndian, 0);
     70                        else set_charset_family(ASCII, DoubleByte, LittleEndian, 0);
     71                        break;
     72                case x4C6F:
     73                        if (XML_dbl_byte[1] == xA794)
     74                                set_charset_family(EBCDIC, SingleByte, BigEndian, 0);
     75                        else set_charset_family(ASCII, SingleByte, BigEndian, 0);
     76                        break;
     77                case xEFBE:
     78                        if (signature[2] == 0xBF)
     79                                set_charset_family(ASCII, SingleByte, BigEndian, 3);
     80                        else set_charset_family(ASCII, SingleByte, BigEndian, 0);
     81                        break;
     82                default:
     83                        set_charset_family(ASCII, SingleByte, BigEndian, 0);
     84        }
     85}
     86void Entity_Info::set_charset_family(CodeUnit_Base C, CodeUnit_Size S, CodeUnit_ByteOrder O, int B){
     87                code_unit_base = C;
     88                code_unit_size = S;
     89                byte_order = O;
     90                BOM_units = B;
     91 }
     92
    1993
    2094template <CodeUnit_Base C>
Note: See TracChangeset for help on using the changeset viewer.