/xmlbench/trunk

To get this branch, use:
bzr branch http://darksoft.org/webbzr/xmlbench/trunk

« back to all changes in this revision

Viewing changes to parse/parabix.20090922/src/byteplex.h

  • Committer: Suren A. Chilingaryan
  • Date: 2009-09-23 17:13:04 UTC
  • Revision ID: csa@dside.dyndns.org-20090923171304-osvtr4zqb29h11kd
Intel, Tango, Phobos, and RapidXML parsers; Memory benchmark scripts

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/*  byteplex.h - Parallel byte stream module.
 
2
    Copyright (c) 2008,  Robert D. Cameron.
 
3
    Licensed to the public under the Open Software License 3.0.
 
4
    Licensed to International Characters, Inc., under the Academic
 
5
    Free License 3.0.
 
6
 
 
7
    This module has as its goal the buffering of XML byte data and
 
8
    transformation of 16-bit and 32-bit code unit data so that the
 
9
    parsing engine is provided a uniform representation based on
 
10
    the concept of an 8-bit pseudo-ASCII representation (x8data).
 
11
 
 
12
    A Byteplex object provides buffers for one to six parallel data
 
13
    streams based for an XML input entity, depending on the size of
 
14
    character code units.  
 
15
       1.  In the case of 8-bit code units, a single byte stream
 
16
           consisting of unmodified input data is maintained.
 
17
           x8data = src_buffer
 
18
       2.  In the case of 16-bit code units (UTF-16 and UCS-2 families),
 
19
             (a) the original code unit stream is maintained unmodified,
 
20
             (b) the x16hi byte stream is established for the high byte
 
21
                 of each code unit,
 
22
             (c) the x16lo byte stream is established for the low byte
 
23
                 of each code unit, and
 
24
             (d) x8data is established as the pseudo-ASCII byte stream,
 
25
                 with ASCII code units having their proper 8-bit values,
 
26
                 and all others having bit 0 set to 1.
 
27
       3.  In the case of 32-bit code units (UTF-32 family),
 
28
             (a) the original code unit stream is maintained unmodified,
 
29
             (b) the x32hh byte stream has high bytes of each code unit
 
30
             (c) the x32hl byte stream has second bytes of each code unit
 
31
             (d) the x32lh byte stream has third bytes of each code unit
 
32
             (e) the x32hh byte stream has low bytes of each code unit, and
 
33
             (f) x8data is established as the pseudo-ASCII byte stream,
 
34
                 with ASCII code units having their proper 8-bit values,
 
35
                 and all others having bit 0 set to 1.
 
36
 
 
37
    The pseudo-ASCII representation is defined for both ASCII-based
 
38
    and EBCDIC-based character sets such that all characters in
 
39
    the ASCII repertoire (i.e., having Unicode code points from 0x00
 
40
    to 0x7F), are represented as themselves and no non-ASCII character
 
41
    is represented as a character in the ASCII repertoire.
 
42
 
 
43
*/
 
44
 
 
45
#ifndef BYTEPLEX_H
 
46
#define BYTEPLEX_H
 
47
 
 
48
#include "xmldecl.h"
 
49
#include "../lib/lib_simd.h"
 
50
 
 
51
/* The BytePack and the BitBlock are the two fundamental
 
52
   types used by the parabix program for data held in 
 
53
   SIMD registers, representing, respectively, the byte-oriented
 
54
   and bit-oriented views of character data.*/
 
55
 
 
56
typedef SIMD_type BytePack;
 
57
typedef SIMD_type BitBlock;
 
58
const int PACKSIZE = sizeof(SIMD_type);
 
59
const int BLOCKSIZE = sizeof(SIMD_type) * 8;
 
60
 
 
61
/* Define the size of buffer used for lexical analysis/parsing. */
 
62
const int BUFFER_BLOCKS = 781;
 
63
const int BUFFER_SIZE = BUFFER_BLOCKS * BLOCKSIZE;
 
64
 
 
65
/* When working near the end of a buffer, a bytespace test may involve
 
66
   a multibyte literal.  The bytespace buffer must always make available
 
67
   a number of lookahead bytes at least equal to the maximum length of any
 
68
   such literal. */
 
69
 
 
70
const int LOOKAHEAD_POSITIONS = 16;
 
71
const int BYTEPLEX_SIZE = BUFFER_SIZE + LOOKAHEAD_POSITIONS;
 
72
 
 
73
class Byteplex {
 
74
public:
 
75
        virtual ~Byteplex();
 
76
        static Byteplex * ByteplexFactory(Entity_Info * e);
 
77
        static Byteplex * ByteplexFactory(Entity_Info * e, FILE * inputfile);
 
78
        static Byteplex * ByteplexFactory(Entity_Info * e, unsigned char * buffer_bytes, int buffer_size);
 
79
        virtual void DoByteplex() = 0;
 
80
        virtual void PreparePseudoASCII_Stream() = 0;
 
81
        virtual void InitializeBuffer(unsigned char * src, int lgth) = 0;
 
82
        virtual void AdvanceInputBuffer(int advance_amt) = 0;
 
83
        virtual int UTF8_Length(int name_pos, int lgth)=0;
 
84
        virtual void to_UTF8(int name_pos, int lgth, char * u8_ptr)=0;
 
85
        /* Source code unit buffer. */
 
86
        BytePack * src_buffer;
 
87
        int units_in_buffer;
 
88
 
 
89
        /* Pseudo-ASCII stream. */
 
90
        BytePack * x8data;
 
91
 
 
92
protected:
 
93
        FILE * infile;
 
94
        int packs_in_buffer;
 
95
        int CopyAndFill(unsigned char * bytes_to_copy, int lgth, int bytes_to_read);
 
96
        void Set_limits(int units_in_buffer);
 
97
 
 
98
};
 
99
 
 
100
 
 
101
/*  The X8_Buffer template class is used for either ASCII- or EBCDIC-
 
102
    based 8-bit code units.
 
103
    The X8_Buffer<ASCII> class includes 7-bit ASCII 
 
104
    (with high-order bit 0), the ISO-8859 character sets and UTF-8.
 
105
 
 
106
    The family of 8-bit EBCDIC based character sets are processed using
 
107
    the X8_Buffer<EBCDIC> class.
 
108
*/
 
109
 
 
110
template <CodeUnit_Base C>
 
111
class X8_Buffer : public Byteplex {
 
112
public:
 
113
        static const CodeUnit_Base Base = C;
 
114
        static const CodeUnit_Size Size = SingleByte;
 
115
        X8_Buffer();
 
116
        virtual ~X8_Buffer();
 
117
 
 
118
        void DoByteplex();
 
119
        void PreparePseudoASCII_Stream();
 
120
        void AdvanceInputBuffer(int advance_amt);
 
121
        void InitializeBuffer(unsigned char * src, int lgth);
 
122
        int UTF8_Length(int name_pos, int lgth);
 
123
        void to_UTF8(int name_pos, int lgth, char * u8_ptr);
 
124
};
 
125
 
 
126
class UTF8_Buffer : public Byteplex {
 
127
public:
 
128
        static const CodeUnit_Base Base = ASCII;
 
129
        static const CodeUnit_Size Size = SingleByte;
 
130
        UTF8_Buffer();
 
131
        virtual ~UTF8_Buffer();
 
132
 
 
133
        void DoByteplex();
 
134
        void PreparePseudoASCII_Stream();
 
135
        void AdvanceInputBuffer(int advance_amt);
 
136
        void InitializeBuffer(unsigned char * src, int lgth);
 
137
        int UTF8_Length(int name_pos, int lgth);
 
138
        void to_UTF8(int name_pos, int lgth, char * u8_ptr);
 
139
};
 
140
 
 
141
 
 
142
/*  UTF-16 and UCS-2 character set families in BE and LE byte orders. 
 
143
    The U16LE and U16BE subclasses each provide a distinct byteplexer to 
 
144
    produce 2 parallel byte streams for the high and low bytes of each
 
145
    16-bit code unit.  Once byteplexing is complete, a generic pseudoASCII 
 
146
    conversion routine can be applied at the U16_Buffer level. */
 
147
 
 
148
class U16_Buffer : public Byteplex {
 
149
public:
 
150
        static const CodeUnit_Base Base = ASCII;
 
151
        static const CodeUnit_Size Size = DoubleByte;
 
152
        U16_Buffer();
 
153
        virtual ~U16_Buffer();
 
154
        virtual void DoByteplex() = 0;
 
155
        void PreparePseudoASCII_Stream();
 
156
        void AdvanceInputBuffer(int advance_amt);
 
157
        void Validate_UTF16();
 
158
        void Validate_UCS2();
 
159
        void InitializeBuffer(unsigned char * src, int lgth);
 
160
        int UTF8_Length(int name_pos, int lgth);
 
161
        void to_UTF8(int name_pos, int lgth, char * u8_ptr);
 
162
protected:
 
163
        BytePack * x16hi;
 
164
        BytePack * x16lo;
 
165
};
 
166
 
 
167
class U16LE_Buffer : public U16_Buffer {
 
168
public:
 
169
        U16LE_Buffer();
 
170
        void DoByteplex();
 
171
};
 
172
 
 
173
class U16BE_Buffer : public U16_Buffer {
 
174
public:
 
175
        U16BE_Buffer();
 
176
        void DoByteplex();
 
177
};
 
178
 
 
179
 
 
180
/*  UTF-32/UCS-4 character sets in BE, LE, 2143 and 3412 byte orders. 
 
181
    Each subclass of U32_Buffer provide a distinct byteplexer to 
 
182
    produce the 4 parallel byte streams of Unicode data.  Once
 
183
    byteplexing is complete, a generic pseudoASCII routine can
 
184
    be applied. */
 
185
class U32_Buffer : public Byteplex {
 
186
public:
 
187
        static const CodeUnit_Base Base = ASCII;
 
188
        static const CodeUnit_Size Size = QuadByte;
 
189
        U32_Buffer();
 
190
        virtual ~U32_Buffer();
 
191
        virtual void DoByteplex() = 0;
 
192
        void PreparePseudoASCII_Stream();
 
193
        void AdvanceInputBuffer(int advance_amt);
 
194
        void Validate_UTF32();
 
195
        void InitializeBuffer(unsigned char * src, int lgth);
 
196
        int UTF8_Length(int name_pos, int lgth);
 
197
        void to_UTF8(int name_pos, int lgth, char * u8_ptr);
 
198
protected:
 
199
        BytePack * x32hh;
 
200
        BytePack * x32hl;
 
201
        BytePack * x32lh;
 
202
        BytePack * x32ll;
 
203
};
 
204
 
 
205
class U32LE_Buffer : public U32_Buffer {
 
206
public:
 
207
        U32LE_Buffer();
 
208
        void DoByteplex();
 
209
};
 
210
 
 
211
class U32BE_Buffer : public U32_Buffer {
 
212
public:
 
213
        U32BE_Buffer();
 
214
        void DoByteplex();
 
215
};
 
216
 
 
217
class U32_2143_Buffer : public U32_Buffer {
 
218
public:
 
219
        U32_2143_Buffer();
 
220
        void DoByteplex();
 
221
};
 
222
 
 
223
class U32_3412_Buffer : public U32_Buffer {
 
224
public:
 
225
        U32_3412_Buffer();
 
226
        void DoByteplex();
 
227
};
 
228
 
 
229
 
 
230
inline char * copy_name (char * s, int lgth){           
 
231
        char * d = new char[lgth+1];
 
232
        memcpy(d, s,lgth); 
 
233
        d[lgth] = '\0'; 
 
234
        return d;
 
235
}
 
236
 
 
237
#endif
 
238
 
 
239