return ret;
};
-string segmentDNSLabel(const string& input )
-{
-%%{
- machine dnslabel;
- write data;
-}%%
- (void)dnslabel_error; // silence warnings
- (void)dnslabel_en_main;
- const char *p = input.c_str(), *pe = input.c_str() + input.length();
- //const char* eof = pe;
- int cs;
- char val = 0;
-
- string ret;
- string segment;
-
- %%{
- action segmentEnd {
- printf("Segment end, segment = '%s'\n", segment.c_str());
- ret.append(1, (unsigned char)segment.size());
- ret.append(segment);
- segment.clear();
- }
-
- action reportEscaped {
- printf("'\\%c' ", *fpc);
- segment.append(1, *fpc);
- }
- action reportEscapedNumber {
- char c = *fpc;
- val *= 10;
- val += c-'0';
-
- }
- action doneEscapedNumber {
- printf("_%c_ ", val);
- segment.append(1, val);
- val=0;
- }
-
- action reportPlain {
- printf("'%c' ", *fpc);
- segment.append(1, *fpc);
- }
-
- escaped = '\\' (([\\.]@reportEscaped) | ([0-9]{3}$reportEscapedNumber%doneEscapedNumber));
- plain = (print-'\\'-'.') $ reportPlain;
- labelElement = escaped | plain;
-
-
- main := ((labelElement)* %segmentEnd '.')+;
-
- # Initialize and execute.
- write init;
- write exec;
- }%%
- if ( cs < dnslabel_first_final ) {
- throw runtime_error("Unable to parse DNS Label '"+input+"'");
- }
-
- if(ret.empty() || ret[0] != 0)
- ret.append(1, 0);
- return ret;
-};
#if 0
int main()
{