summaryrefslogtreecommitdiff
path: root/core/lexer.c
diff options
context:
space:
mode:
Diffstat (limited to 'core/lexer.c')
-rw-r--r--core/lexer.c57
1 files changed, 57 insertions, 0 deletions
diff --git a/core/lexer.c b/core/lexer.c
index ac5194f..59aaa13 100644
--- a/core/lexer.c
+++ b/core/lexer.c
@@ -13,6 +13,7 @@
/* Constants */
#define MAX_KW_LEN 32
+#define MAX_NUM_LEN 20
/*
* Returns true if the given character is a whitespace character
@@ -126,6 +127,51 @@ lexer_scan_ident(struct defconf_state *state, int lc)
}
/*
+ * Scan a number
+ *
+ * @state: Defconf state
+ * @lc: Last character provided
+ * @result: Result is written here
+ */
+static int
+lexer_scan_num(struct defconf_state *state, int lc, struct token *result)
+{
+ char c, buf[MAX_NUM_LEN + 1];
+ size_t bufind = 0;
+
+ if (state == NULL || result == NULL) {
+ return -1;
+ }
+
+ if (!isdigit(lc)) {
+ return -1;
+ }
+
+ buf[bufind++] = lc;
+ for (;;) {
+ if (bufind >= sizeof(buf) - 1) {
+ trace_fatal(state, "digits exceed maximum length\n");
+ return -1;
+ }
+
+ c = lexer_nom(state, false);
+ if (!isdigit(c)) {
+ lexer_putback(state, c);
+ buf[bufind] = '\0';
+
+ /* Set the token */
+ result->type = TT_INTLIT;
+ result->v = atoi(buf);
+ return 0;
+ }
+
+ buf[bufind++] = c;
+ }
+
+ return -1;
+}
+
+/*
* Check if a keyword matches against known keywords
*
* @kw: Keyword to check
@@ -172,6 +218,7 @@ lexer_scan(struct defconf_state *state, struct token *result)
{
int c;
char *ident;
+ int error;
if (state == NULL || result == NULL) {
return -1;
@@ -192,6 +239,16 @@ lexer_scan(struct defconf_state *state, struct token *result)
return 0;
}
+ /* Is this a digit? */
+ if (isdigit(c)) {
+ error = lexer_scan_num(state, c, result);
+ if (error < 0) {
+ return -1;
+ }
+
+ return 0;
+ }
+
trace_fatal(state, "unexpected token '%c'\n", c);
return -1;
}