#include <stdarg.h>
#include "dynamic-string.h"
#include "json.h"
+#include "packets.h"
#include "util.h"
\f
/* Returns a string that represents 'format'. */
break;
case LEX_F_IPV6:
- print_ipv6_addr(s, &value->ipv6);
+ ipv6_format_addr(&value->ipv6, s);
break;
case LEX_F_ETHERNET:
case LEX_T_EQUALS:
ds_put_cstr(s, "=");
break;
+ case LEX_T_EXCHANGE:
+ ds_put_cstr(s, "<->");
+ break;
+ case LEX_T_DECREMENT:
+ ds_put_cstr(s, "--");
+ break;
default:
OVS_NOT_REACHED();
}
memcpy(copy, p, len);
copy[len] = '\0';
- struct in_addr ipv4;
- struct in6_addr ipv6;
- if (inet_pton(AF_INET, copy, &ipv4) == 1) {
- token->value.ipv4 = ipv4.s_addr;
+ if (ip_parse(copy, &token->value.ipv4)) {
token->format = LEX_F_IPV4;
- } else if (inet_pton(AF_INET6, copy, &ipv6) == 1) {
- token->value.ipv6 = ipv6;
+ } else if (ipv6_parse(copy, &token->value.ipv6)) {
token->format = LEX_F_IPV6;
} else {
lex_error(token, "Invalid numeric constant.");
if (*p == '=') {
token->type = LEX_T_LE;
p++;
+ } else if (*p == '-' && p[1] == '>') {
+ token->type = LEX_T_EXCHANGE;
+ p += 2;
} else {
token->type = LEX_T_LT;
}
token->type = LEX_T_SEMICOLON;
break;
+ case '-':
+ p++;
+ if (*p == '-') {
+ token->type = LEX_T_DECREMENT;
+ p++;
+ } else {
+ lex_error(token, "`-' is only valid as part of `--'.");
+ }
+ break;
+
case '0': case '1': case '2': case '3': case '4':
case '5': case '6': case '7': case '8': case '9':
case ':':
return false;
}
}
+
+bool
+lexer_is_int(const struct lexer *lexer)
+{
+ return (lexer->token.type == LEX_T_INTEGER
+ && lexer->token.format == LEX_F_DECIMAL
+ && ntohll(lexer->token.value.integer) <= INT_MAX);
+}
+
+bool
+lexer_get_int(struct lexer *lexer, int *value)
+{
+ if (lexer_is_int(lexer)) {
+ *value = ntohll(lexer->token.value.integer);
+ lexer_get(lexer);
+ return true;
+ } else {
+ *value = 0;
+ return false;
+ }
+}