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

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

Add support headers.

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