source: proto/SymbolTable/xmlwf_common_functions.h @ 1927

Last change on this file since 1927 was 1721, checked in by vla24, 8 years ago

SymbolTable?: completed dictionary implementation and refactored templates

File size: 4.3 KB
Line 
1#ifndef XMLWF_COMMON_FUNCTIONS_H
2#define XMLWF_COMMON_FUNCTIONS_H
3#include "src/parser_common_functions_generated.h"
4
5char * source;
6
7inline void getFilenames(const int argc, char** argv,
8                         char *& infilename, char *& outfilename);
9inline void openInputOutputFiles(const char * infilename, const char * outfilename,
10                                 FILE *& infile, FILE *& outfile);
11static inline int NameStrt_check(int pos);
12static inline int Name_check(int pos);
13static inline int PIName_check(int pos);
14static inline int CD_check(int pos);
15static inline int GenRef_check(int pos);
16static inline int HexRef_check(int pos);
17static inline int DecRef_check(int pos);
18static inline int AttRef_check(int pos);
19
20inline void getFilenames(const int argc, char** argv,
21                         char *& infilename, char *& outfilename)
22{
23    if (argc < 2) {
24        printf("Usage: %s <textfile> [<outputfile>]\n", argv[0]);
25        exit(-1);
26    }
27
28    infilename = argv[1];
29    if (argc < 3) outfilename = NULL;
30    else {
31        outfilename = argv[2];
32    }
33}
34
35inline void openInputOutputFiles(const char * infilename, const char * outfilename,
36                                 FILE *& infile, FILE *& outfile)
37{
38    struct stat fileinfo;
39
40    stat(infilename, &fileinfo);
41    infile = fopen(infilename, "rb");
42    if (!infile) {
43            fprintf(stderr, "Error: cannot open %s for input.\n", infilename);
44            exit(-1);
45    }
46
47    if (!outfilename) outfile = stdout;
48    else {
49            outfile = fopen(outfilename, "wb");
50            if (!outfile) {
51                    fprintf(stderr, "Error: cannot open %s for writing.\n", outfilename);
52                    exit(-1);
53            }
54    }
55}
56
57static inline int NameStrt_check(int pos) {
58        if(XML_10_UTF8_NameStrt_bytes((unsigned char*)&source[pos]) == 0){
59              return XMLTestSuiteError::NAME_START;
60        }
61        return 0;
62}
63
64static inline int Name_check(int pos) {
65        if(XML_10_UTF8_NameChar_bytes((unsigned char*)&source[pos]) == 0){
66                  return XMLTestSuiteError::NAME;
67        }
68        return 0;
69}
70
71static inline int PIName_check(int pos, int file_pos) {
72        if (at_XxMmLll<ASCII>((unsigned char*)&source[pos]) && (source[pos+3]=='?' || source[pos+3]<= ' ')) {
73              // "<?xml" legal at start of file.
74              if (!((file_pos == 2) && at_XmlDecl_start<ASCII>((unsigned char*)&source[0]))) {
75                  return XMLTestSuiteError::XMLPINAME;
76              }
77        }
78        return 0;
79}
80
81static inline int CD_check(int pos) {
82        if (!at_CDATA1<ASCII>((unsigned char*)&source[pos])){
83                  return XMLTestSuiteError::CDATA;
84        }
85        return 0;
86}
87
88static inline int GenRef_check(int pos) {
89        unsigned char* s = (unsigned char*)&source[pos];
90        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))){
91              return XMLTestSuiteError::UNDEFREF;
92        }
93        return 0;
94}
95
96static inline int HexRef_check(int pos) {
97        unsigned char* s = (unsigned char*)&source[pos];
98        int ch_val = 0;
99        while(at_HexDigit<ASCII>(s)){
100          ch_val = HexVal<ASCII>(s[0]) + (ch_val<<4);
101          if (ch_val> 0x10FFFF ){
102                return XMLTestSuiteError::CHARREF;
103          }
104          s++;
105        }
106        if ((ch_val == 0x0) || ((ch_val | 0x7FF) == 0xDFFF)|| ((ch_val | 0x1) == 0xFFFF)){
107          return XMLTestSuiteError::CHARREF;
108        }
109        else if (((ch_val < 0x20) && (ch_val != 0x9) && (ch_val != 0xD) && (ch_val != 0xA))){
110          return XMLTestSuiteError::XML10CHARREF;
111        }
112        return 0;
113}
114
115static inline int DecRef_check(int pos) {
116        unsigned char* s = (unsigned char*)&source[pos];
117        int ch_val = 0;
118        while(at_HexDigit<ASCII>(s)){
119          ch_val = DigitVal<ASCII>(s[0]) + ch_val*10;
120          if (ch_val> 0x10FFFF ){
121                        return XMLTestSuiteError::CHARREF;
122          }
123          s++;
124        }
125        if ((ch_val == 0x0) || ((ch_val | 0x7FF) == 0xDFFF)|| ((ch_val | 0x1) == 0xFFFF)){
126                  return XMLTestSuiteError::CHARREF;
127        }
128        else if (((ch_val < 0x20) && (ch_val != 0x9) && (ch_val != 0xD) && (ch_val != 0xA))){
129                  return XMLTestSuiteError::XML10CHARREF;
130        }
131        return 0;
132}
133
134static inline int AttRef_check(int pos) {
135        unsigned char* s = (unsigned char*)&source[pos];
136        int ch_val = 0;
137        if(s[0]=='#'){
138          s++;
139          if(s[0]=='x' || s[0]=='X'){
140            s++;
141            while(at_HexDigit<ASCII>(s)){
142              ch_val = HexVal<ASCII>(s[0]) + (ch_val<<4);
143              s++;
144            }
145          }
146          else{
147            while(at_HexDigit<ASCII>(s)){
148              ch_val = DigitVal<ASCII>(s[0]) + ch_val*10;
149              s++;
150            }
151          }
152          if (ch_val==60){
153            return XMLTestSuiteError::ATTREF;
154          }
155        }
156        else if(at_Ref_lt<ASCII>(s)){
157          return XMLTestSuiteError::ATTREF;
158        }
159        return 0;
160}
161
162#endif // XMLWF_COMMON_FUNCTIONS_H
Note: See TracBrowser for help on using the repository browser.