From 9c329eaaaa456f3f6aa73f91d94dc137ffeb621d Mon Sep 17 00:00:00 2001 From: Ivar Fatland Date: Tue, 16 Dec 2025 21:41:49 +0100 Subject: [PATCH] failing scanner --- cig.h | 2 ++ scanner.c | 18 ++++++++++++++++++ test_arena_allocator.c | 1 - test_scanner.c | 40 ++++++++++++++++++++++++++++++++++++++++ 4 files changed, 60 insertions(+), 1 deletion(-) create mode 100644 test_scanner.c diff --git a/cig.h b/cig.h index bf92097..8673b39 100644 --- a/cig.h +++ b/cig.h @@ -324,6 +324,8 @@ bool scan_f32(scanner_t *s); bool scan_identifier(scanner_t *s); bool scan_string_literal(scanner_t *s); bool scanner_print_errors(scanner_t *s, FILE *fp); +bool looks_like_float(scanner_t *s); +bool looks_like_int(scanner_t *s); // string builder ////////////////////////////////////////////////////////////// typedef struct string_builder_node { diff --git a/scanner.c b/scanner.c index e0dd991..e3efe45 100644 --- a/scanner.c +++ b/scanner.c @@ -332,3 +332,21 @@ bool scanner_print_errors(scanner_t *s, FILE *fp) { } return s->errors != NULL; } + +bool looks_like_float(scanner_t *s) { + const char *cur = s->cur; + if (*cur == '+' || *cur == '-') cur++; + if (!isdigit((unsigned char)*(cur++))) return false; + while (isdigit((unsigned char)*(cur++))); + if (*cur != '.') return false; + cur++; + return isdigit((unsigned char)*cur); +} + +bool looks_like_int(scanner_t *s) { + const char *cur = s->cur; + if (*cur == '+' || *cur == '-') { + cur++; + } + return isdigit(*cur); +} diff --git a/test_arena_allocator.c b/test_arena_allocator.c index 478c1f7..edcf2fc 100644 --- a/test_arena_allocator.c +++ b/test_arena_allocator.c @@ -1,5 +1,4 @@ #include -#include #include #include "cig.h" diff --git a/test_scanner.c b/test_scanner.c new file mode 100644 index 0000000..7f3582c --- /dev/null +++ b/test_scanner.c @@ -0,0 +1,40 @@ +#include +#include +#include "cig.h" + +Test(scanner, looks_like_float) { + const char *buffer = + "1.0 true\n" + "12.34 true\n" + "0.5 true\n" + "9.99 true\n" + "+1.2 true\n" + "-3.14 true\n" + "1 false\n" + "42 false\n" + "+7 false\n" + "1. false\n" + ".5 false\n" + "+. false\n" + "abc false\n" + "+x false\n"; + with_borrow(allocator) { + scanner_t scanner = make_scanner("test", buffer, allocator); + while (!scan_eof(&scanner)) { + bool actual = looks_like_float(&scanner); + while (*scanner.cur++ != ' '); + bool expect; + if (scan_literal(&scanner, "true")) { + expect = true; + } else if (scan_literal(&scanner, "false")) { + expect = false; + } else { + assert(false && "invalid expectation"); + } + scan_whitespace(&scanner); + cr_assert_eq(actual, expect); + + } + } + +}