7 #include "namespaces.hh"
10 void appendSplit(vector<string>& ret, string& segment, char c)
12 if(segment.size()>254) {
13 ret.push_back(segment);
21 vector<string> segmentDNSText(const string& input )
23 // cerr<<"segmentDNSText("<<input<<")"<<endl;
27 alphtype unsigned char;
29 (void)dnstext_error; // silence warnings
30 (void)dnstext_en_main;
31 const char *p = input.c_str(), *pe = input.c_str() + input.length();
41 ret.push_back(segment);
48 action reportEscaped {
50 appendSplit(ret, segment, c);
52 action reportEscapedNumber {
58 action doneEscapedNumber {
59 appendSplit(ret, segment, val);
64 appendSplit(ret, segment, *(fpc));
67 escaped = '\\' (([^0-9]@reportEscaped) | ([0-9]{3}$reportEscapedNumber%doneEscapedNumber));
68 plain = ((extend-'\\'-'"')|'\n'|'\t') $ reportPlain;
69 txtElement = escaped | plain;
71 main := (('"' txtElement* '"' space?) >segmentBegin %segmentEnd)+;
73 # Initialize and execute.
78 if ( cs < dnstext_first_final ) {
79 throw runtime_error("Unable to parse DNS TXT '"+input+"'");
86 DNSName::string_t segmentDNSNameRaw(const char* realinput)
91 alphtype unsigned char;
93 (void)dnsnameraw_error; // silence warnings
94 (void)dnsnameraw_en_main;
96 DNSName::string_t ret;
98 if(!*realinput || *realinput == '.') {
99 ret.append(1, (char)0);
103 unsigned int inputlen=strlen(realinput);
104 ret.reserve(inputlen+1);
106 const char *p = realinput, *pe = realinput + inputlen;
107 const char* eof = pe;
111 unsigned int lenpos=0;
114 if (labellen < 0 || labellen > 63) {
115 throw runtime_error("Unable to parse DNS name '"+string(realinput)+"': invalid label length "+std::to_string(labellen));
117 ret[lenpos]=labellen;
122 ret.append(1, (char)0);
126 action reportEscaped {
131 action reportEscapedNumber {
136 action doneEscapedNumber {
143 ret.append(1, *(fpc));
147 escaped = '\\' (([^0-9]@reportEscaped) | ([0-9]{3}$reportEscapedNumber%doneEscapedNumber));
148 plain = (extend-'\\'-'.') $ reportPlain;
149 labelElement = escaped | plain;
151 label = labelElement+ >labelBegin %labelEnd;
153 main:= label ('.' label )* '.'?;
155 #main := labelElement((labelElement+ '.') >labelBegin %labelEnd)+;
157 # label = (plain | escaped | escdecb)+ >label_init %label_fin;
158 # dnsname := '.'? label ('.' label >label_sep)* '.'?;
160 # Initialize and execute.
165 if ( cs < dnsnameraw_first_final ) {
166 throw runtime_error("Unable to parse DNS name '"+string(realinput)+"': cs="+std::to_string(cs));
168 ret.append(1, (char)0);
177 //char blah[]="\"blah\" \"bleh\" \"bloeh\\\"bleh\" \"\\97enzo\"";
178 char blah[]="\"v=spf1 ip4:67.106.74.128/25 ip4:63.138.42.224/28 ip4:65.204.46.224/27 \\013\\010ip4:66.104.217.176/28 \\013\\010ip4:209.48.147.0/27 ~all\"";
179 //char blah[]="\"abc \\097\\098 def\"";
180 printf("Input: '%s'\n", blah);
181 vector<string> res=dnstext(blah);
182 cerr<<res.size()<<" segments"<<endl;