X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=src%2Fliboconfig%2Fscanner.l;h=7efa78a3fd85dff042cba40824d095d7fcf5bd0a;hb=071568a48ad7b4fff84e40cb0c3c25ef17ab61ae;hp=b6d757eb39721fabf2c99752f8fba721fa16000a;hpb=446a764be3e33b6fa48b93049751c051724ee650;p=collectd.git diff --git a/src/liboconfig/scanner.l b/src/liboconfig/scanner.l index b6d757eb..7efa78a3 100644 --- a/src/liboconfig/scanner.l +++ b/src/liboconfig/scanner.l @@ -27,15 +27,27 @@ */ %{ +#ifdef WIN32 +#include "gnulib_config.h" +#include "config.h" +#endif + #include +#include #include "oconfig.h" #include "aux_types.h" #include "parser.h" +#ifdef __clang__ +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wmissing-noreturn" +#endif + + /* multiline string buffer */ -static char *ml_buffer = NULL; -static int ml_pos = 0; -static int ml_len = 0; +static char *ml_buffer; +static size_t ml_pos; +static size_t ml_len; #define ml_free (ml_len - ml_pos) @@ -50,6 +62,8 @@ static void ml_append (char *); %} %option yylineno %option noyywrap +%option noinput +%option nounput %x ML WHITE_SPACE [\ \t\b] NON_WHITE_SPACE [^\ \t\b] @@ -65,9 +79,20 @@ BOOL_TRUE (true|yes|on) 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: or ::FFFF:) 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 */} @@ -82,6 +107,7 @@ IPV4_ADDR {IP_BYTE}\.{IP_BYTE}\.{IP_BYTE}\.{IP_BYTE}(:{PORT})? {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);} @@ -89,12 +115,12 @@ IPV4_ADDR {IP_BYTE}\.{IP_BYTE}\.{IP_BYTE}\.{IP_BYTE}(:{PORT})? {UNQUOTED_STRING} {yylval.string = yytext; return (UNQUOTED_STRING);} \"{QUOTED_STRING}\\{EOL} { - int len = strlen (yytext); + size_t len = strlen (yytext); ml_pos = 0; /* remove "\\" */ - if ('\r' == yytext[len - 2]) + if (yytext[len - 2] == '\r') len -= 3; else len -= 2; @@ -105,10 +131,10 @@ IPV4_ADDR {IP_BYTE}\.{IP_BYTE}\.{IP_BYTE}\.{IP_BYTE}(:{PORT})? } ^{WHITE_SPACE}+ {/* remove leading white-space */} {NON_WHITE_SPACE}{QUOTED_STRING}\\{EOL} { - int len = strlen (yytext); + size_t len = strlen (yytext); /* remove "\\" */ - if ('\r' == yytext[len - 2]) + if (yytext[len - 2] == '\r') len -= 3; else len -= 2; @@ -126,21 +152,23 @@ IPV4_ADDR {IP_BYTE}\.{IP_BYTE}\.{IP_BYTE}\.{IP_BYTE}(:{PORT})? %% static void ml_append (char *string) { - int len = strlen (string); - int s; + size_t len = strlen (string); if (ml_free <= len) { ml_len += len - ml_free + 1; - ml_buffer = (char *)realloc (ml_buffer, ml_len); - if (NULL == ml_buffer) + ml_buffer = realloc (ml_buffer, ml_len); + if (ml_buffer == NULL) YY_FATAL_ERROR ("out of dynamic memory in ml_append"); } - s = snprintf (ml_buffer + ml_pos, ml_free, "%s", string); - if ((0 > s) || (ml_free <= s)) + int s = snprintf(ml_buffer + ml_pos, ml_free, "%s", string); + if (s < 0 || (size_t)s >= ml_free) YY_FATAL_ERROR ("failed to write to multiline buffer"); ml_pos += s; return; } /* ml_append */ +#ifdef __clang__ +#pragma clang diagnostic pop +#endif