source: proto/parabix2/util/post_process.hpp @ 4183

Last change on this file since 4183 was 3190, checked in by cameron, 6 years ago

Update to use new BitBlockScanner?

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