source: proto/parabix2/src/post_process.hpp @ 2161

Last change on this file since 2161 was 2161, checked in by ksherdy, 7 years ago

Added post_process.hpp

File size: 7.6 KB
Line 
1#ifndef POST_PROCESS_HPP
2#define POST_PROCESS_HPP
3
4#include "namechars.h"
5#include "XMLTestSuiteError.h"
6#include "ErrorUtil.h"
7#include "ErrorTracker.h"
8
9static inline int NameStrt_check(char * source, int pos);
10static inline int Name_check(char * source, int pos);
11static inline int PIName_check(char * source, int pos);
12static inline int CD_check(char * source, int pos);
13static inline int GenRef_check(char * source, int pos);
14static inline int HexRef_check(char * source, int pos);
15static inline int DecRef_check(char * source, int pos);
16static inline int AttRef_check(char * source, int pos);
17
18static inline void validate_block(BitBlockForwardIterator & start, char * source, int block_base, int is_valid(char*, int), LineColTracker & tracker);
19static inline void validate_block(BitBlockForwardIterator & start, char * source, int block_base, int is_valid(char*, int,int), LineColTracker & tracker);
20
21static inline void postprocess_do_block(Lex & lex, CtCDPI_Callouts & ctCDPI_Callouts, Ref_Callouts & ref_Callouts, Check_streams & check_streams,
22                                        char * source, int buffer_base, int block_base, int chars_avail, LineColTracker & tracker);
23
24static inline int NameStrt_check(char * source, int pos) {
25    if(XML_10_UTF8_NameStrt_bytes((unsigned char*)&source[pos]) == 0){
26          return XMLTestSuiteError::NAME_START;
27    }
28    return 0;
29}
30
31static inline int Name_check(char * source, int pos) {
32    if(XML_10_UTF8_NameChar_bytes((unsigned char*)&source[pos]) == 0){
33          return XMLTestSuiteError::NAME;
34    }
35    return 0;
36}
37
38static inline int PIName_check(char * source, int pos, int file_pos) {
39    if (at_XxMmLll<ASCII>((unsigned char*)&source[pos]) && (source[pos+3]=='?' || source[pos+3]<= ' ')) {
40          // "<?xml" legal at start of file.
41          if (!((file_pos == 2) && at_XmlDecl_start<ASCII>((unsigned char*)&source[0]))) {
42              return XMLTestSuiteError::XMLPINAME;
43          }
44    }
45    return 0;
46}
47
48static inline int CD_check(char * source, int pos) {
49    if (!at_CDATA1<ASCII>((unsigned char*)&source[pos])){
50          return XMLTestSuiteError::CDATA;
51    }
52    return 0;
53}
54
55static inline int GenRef_check(char * source, int pos) {
56    unsigned char* s = (unsigned char*)&source[pos];
57    if (!(at_Ref_gt<ASCII>(s)||at_Ref_lt<ASCII>(s)||at_Ref_amp<ASCII>(s)||at_Ref_quot<ASCII>(s)||at_Ref_apos<ASCII>(s))){
58          return XMLTestSuiteError::UNDEFREF;
59    }
60    return 0;
61}
62
63static inline int HexRef_check(char * source, int pos) {
64    unsigned char* s = (unsigned char*)&source[pos];
65    int ch_val = 0;
66    while(at_HexDigit<ASCII>(s)){
67      ch_val = HexVal<ASCII>(s[0]) + (ch_val<<4);
68      if (ch_val> 0x10FFFF ){
69        return XMLTestSuiteError::CHARREF;
70      }
71      s++;
72    }
73    if ((ch_val == 0x0) || ((ch_val | 0x7FF) == 0xDFFF)|| ((ch_val | 0x1) == 0xFFFF)){
74      return XMLTestSuiteError::CHARREF;
75    }
76    else if (((ch_val < 0x20) && (ch_val != 0x9) && (ch_val != 0xD) && (ch_val != 0xA))){
77      return XMLTestSuiteError::XML10CHARREF;
78    }
79    return 0;
80}
81
82static inline int DecRef_check(char * source, int pos) {
83    unsigned char* s = (unsigned char*)&source[pos];
84    int ch_val = 0;
85    while(at_HexDigit<ASCII>(s)){
86      ch_val = DigitVal<ASCII>(s[0]) + ch_val*10;
87      if (ch_val> 0x10FFFF ){
88            return XMLTestSuiteError::CHARREF;
89      }
90      s++;
91    }
92    if ((ch_val == 0x0) || ((ch_val | 0x7FF) == 0xDFFF)|| ((ch_val | 0x1) == 0xFFFF)){
93          return XMLTestSuiteError::CHARREF;
94    }
95    else if (((ch_val < 0x20) && (ch_val != 0x9) && (ch_val != 0xD) && (ch_val != 0xA))){
96          return XMLTestSuiteError::XML10CHARREF;
97    }
98    return 0;
99}
100
101static inline int AttRef_check(char * source, int pos) {
102    unsigned char* s = (unsigned char*)&source[pos];
103    int ch_val = 0;
104    if(s[0]=='#'){
105      s++;
106      if(s[0]=='x' || s[0]=='X'){
107        s++;
108        while(at_HexDigit<ASCII>(s)){
109          ch_val = HexVal<ASCII>(s[0]) + (ch_val<<4);
110          s++;
111        }
112      }
113      else{
114        while(at_HexDigit<ASCII>(s)){
115          ch_val = DigitVal<ASCII>(s[0]) + ch_val*10;
116          s++;
117        }
118      }
119      if (ch_val==60){
120        return XMLTestSuiteError::ATTREF;
121      }
122    }
123    else if(at_Ref_lt<ASCII>(s)){
124      return XMLTestSuiteError::ATTREF;
125    }
126    return 0;
127}
128
129static inline void validate_block(BitBlockForwardIterator & start, char * source, int block_base, int is_valid(char *, int), LineColTracker & tracker) {
130
131    int pos, block_pos;
132    BitBlockForwardIterator end;
133    while(start != end) {
134
135        block_pos = block_base + *start;
136        int rv = is_valid(source, block_pos);
137
138        if (rv) {
139            int error_line, error_column;
140            tracker.get_Line_and_Column(block_pos, error_line, error_column);
141            ReportError(XMLTestSuiteError::get_msg(rv), error_line, error_column);
142            exit(-1);
143        }
144        start++;
145    }
146}
147
148static inline void validate_block(BitBlockForwardIterator & start, char * source, int block_base, int buffer_base, int is_valid(char *, int, int), LineColTracker & tracker) {
149
150    int pos, block_pos, file_pos;
151    BitBlockForwardIterator end;
152    while(start != end) {
153
154        block_pos = block_base + *start;
155        file_pos = block_pos+buffer_base;
156
157
158        int rv = is_valid(source, block_pos, file_pos);
159
160        if (rv) {
161            int error_line, error_column;
162            tracker.get_Line_and_Column(block_pos, error_line, error_column);
163            ReportError(XMLTestSuiteError::get_msg(rv), error_line, error_column);
164            exit(-1);
165        }
166        start++;
167    }
168}
169
170
171static inline void postprocess_do_block(Lex & lex, CtCDPI_Callouts & ctCDPI_Callouts, Ref_Callouts & ref_Callouts, Check_streams & check_streams,
172                                        char * source, int buffer_base, int block_base, int chars_avail,
173                                        LineColTracker & tracker ) {
174    BitBlockForwardIterator iter;
175
176    if (bitblock::any(simd_or(check_streams.non_ascii_name_starts, check_streams.non_ascii_names))) {
177            iter.init(&check_streams.non_ascii_name_starts);
178        validate_block(iter, source, block_base, NameStrt_check, tracker);
179        iter.init(&check_streams.non_ascii_names);
180        validate_block(iter, source, block_base, Name_check, tracker);
181    }
182    if (bitblock::any(ctCDPI_Callouts.PI_name_starts)){
183        iter.init(&(ctCDPI_Callouts.PI_name_starts));
184        validate_block(iter, source, block_base, buffer_base, PIName_check, tracker);
185    }
186    if (bitblock::any(ctCDPI_Callouts.CD_starts)){
187        iter.init(&ctCDPI_Callouts.CD_starts);
188        validate_block(iter, source, block_base, CD_check, tracker);
189    }
190    if(bitblock::any(ref_Callouts.GenRef_starts)){
191        iter.init(&ref_Callouts.GenRef_starts);
192        validate_block(iter, source, block_base, GenRef_check, tracker);
193    }
194    if(bitblock::any(ref_Callouts.DecRef_starts)){
195        iter.init(&ref_Callouts.DecRef_starts);
196        validate_block(iter, source ,block_base, DecRef_check, tracker);
197    }
198    if(bitblock::any(ref_Callouts.HexRef_starts)){
199        iter.init(&ref_Callouts.HexRef_starts);
200        validate_block(iter, source, block_base, HexRef_check, tracker);
201    }
202    if(bitblock::any(check_streams.att_refs)){
203        iter.init(&check_streams.att_refs);
204        validate_block(iter, source, block_base, AttRef_check, tracker);
205    }
206
207    if(error_tracker.Has_Noted_Error()){
208        int error_line, error_column;
209        tracker.get_Line_and_Column(error_tracker.Noted_Pos_In_Block(), error_line, error_column);
210        ReportError(error_tracker.Noted_Error_Msg(), error_line, error_column);
211        exit(-1);
212    }
213}
214
215#endif // POST_PROCESS_HPP
Note: See TracBrowser for help on using the repository browser.