summary | shortlog | log | commit | commitdiff | tree
raw | patch | inline | side by side (parent: 9fa9f94)
raw | patch | inline | side by side (parent: 9fa9f94)
author | Sebastian Harl <sh@tokkee.org> | |
Sat, 21 Dec 2013 21:37:58 +0000 (22:37 +0100) | ||
committer | Sebastian Harl <sh@tokkee.org> | |
Sat, 21 Dec 2013 21:37:58 +0000 (22:37 +0100) |
The parser supports raw IPv6 addresses, optional address and port (as
[<addr>]:<port>), and embedded IPv4 addresses.
Based on "Common Patterns" found in the flex manual.
[<addr>]:<port>), and embedded IPv4 addresses.
Based on "Common Patterns" found in the flex manual.
src/liboconfig/scanner.l | patch | blob | history |
index 9f0cd8e3cc51da8838661ab62904b20975017337..e557a6fd22d360de07d871ea85d369edf5d0063b 100644 (file)
--- a/src/liboconfig/scanner.l
+++ b/src/liboconfig/scanner.l
BOOL_FALSE (false|no|off)
COMMENT #.*
PORT (6(5(5(3[0-5]|[0-2][0-9])|[0-4][0-9][0-9])|[0-4][0-9][0-9][0-9])|[1-5][0-9][0-9][0-9][0-9]|[1-9][0-9]?[0-9]?[0-9]?)
+
IP_BYTE (2(5[0-5]|[0-4][0-9])|1[0-9][0-9]|[1-9]?[0-9])
IPV4_ADDR {IP_BYTE}\.{IP_BYTE}\.{IP_BYTE}\.{IP_BYTE}(:{PORT})?
+/* IPv6 address according to http://www.ietf.org/rfc/rfc2373.txt
+ * This supports embedded IPv4 addresses as well but does not strictly check
+ * for the right prefix (::0:<v4> or ::FFFF:<v4>) because there are too many
+ * ways to correctly represent the zero bytes. It's up to the user to check
+ * for valid addresses. */
+HEX16 ([0-9A-Fa-f]{1,4})
+V6_PART ({HEX16}:{HEX16}|{IPV4_ADDR})
+IPV6_BASE ({HEX16}:){6}{V6_PART}|::({HEX16}:){5}{V6_PART}|({HEX16})?::({HEX16}:){4}{V6_PART}|(({HEX16}:){0,1}{HEX16})?::({HEX16}:){3}{V6_PART}|(({HEX16}:){0,2}{HEX16})?::({HEX16}:){2}{V6_PART}|(({HEX16}:){0,3}{HEX16})?::{HEX16}:{V6_PART}|(({HEX16}:){0,4}{HEX16})?::{V6_PART}|(({HEX16}:){0,5}{HEX16})?::{HEX16}|(({HEX16}:){0,6}{HEX16})?::
+IPV6_ADDR ({IPV6_BASE})|(\[{IPV6_BASE}\](:{PORT})?)
+
%%
{WHITE_SPACE} |
{COMMENT} {/* ignore */}
{BOOL_FALSE} {yylval.boolean = 0; return (BFALSE);}
{IPV4_ADDR} {yylval.string = yytext; return (UNQUOTED_STRING);}
+{IPV6_ADDR} {yylval.string = yytext; return (UNQUOTED_STRING);}
{NUMBER} {yylval.number = strtod (yytext, NULL); return (NUMBER);}