From c0b76e862002d685969e913efa376f8bdb5adc44 Mon Sep 17 00:00:00 2001 From: "Sven M. Hallberg" <pesco@khjk.org> Date: Sun, 9 Feb 2020 20:45:20 +0100 Subject: [PATCH] add TT_DOUBLE and TT_FLOAT as user-accessible token types --- src/glue.c | 14 ++++++++++++++ src/glue.h | 12 ++++++++++++ src/hammer.h | 2 ++ src/pprint.c | 12 ++++++++++++ 4 files changed, 40 insertions(+) diff --git a/src/glue.c b/src/glue.c index da2f3af3..9bca467a 100644 --- a/src/glue.c +++ b/src/glue.c @@ -129,6 +129,20 @@ HParsedToken *h_make_uint(HArena *arena, uint64_t val) return ret; } +HParsedToken *h_make_double(HArena *arena, double val) +{ + HParsedToken *ret = h_make_(arena, TT_DOUBLE); + ret->dbl = val; + return ret; +} + +HParsedToken *h_make_float(HArena *arena, float val) +{ + HParsedToken *ret = h_make_(arena, TT_FLOAT); + ret->flt = val; + return ret; +} + // XXX -> internal HParsedToken *h_carray_index(const HCountedArray *a, size_t i) { diff --git a/src/glue.h b/src/glue.h index 31597cd2..38cafa28 100644 --- a/src/glue.h +++ b/src/glue.h @@ -198,6 +198,8 @@ HParsedToken *h_make_seqn(HArena *arena, size_t n); // Makes empty sequence of HParsedToken *h_make_bytes(HArena *arena, const uint8_t *array, size_t len); HParsedToken *h_make_sint(HArena *arena, int64_t val); HParsedToken *h_make_uint(HArena *arena, uint64_t val); +HParsedToken *h_make_double(HArena *arena, double val); +HParsedToken *h_make_float(HArena *arena, float val); // Standard short-hands to make tokens in an action. #define H_MAKE(TYP, VAL) h_make(p->arena, (HTokenType)TT_ ## TYP, VAL) @@ -206,6 +208,8 @@ HParsedToken *h_make_uint(HArena *arena, uint64_t val); #define H_MAKE_BYTES(VAL, LEN) h_make_bytes(p->arena, VAL, LEN) #define H_MAKE_SINT(VAL) h_make_sint(p->arena, VAL) #define H_MAKE_UINT(VAL) h_make_uint(p->arena, VAL) +#define H_MAKE_DOUBLE(VAL) h_make_double(p->arena, VAL) +#define H_MAKE_FLOAT(VAL) h_make_float(p->arena, VAL) // Extract (cast) type-specific value back from HParsedTokens... @@ -218,6 +222,8 @@ HParsedToken *h_make_uint(HArena *arena, uint64_t val); #define H_ASSERT_BYTES(TOK) h_assert_type(TT_BYTES, TOK) #define H_ASSERT_SINT(TOK) h_assert_type(TT_SINT, TOK) #define H_ASSERT_UINT(TOK) h_assert_type(TT_UINT, TOK) +#define H_ASSERT_DOUBLE(TOK) h_assert_type(TT_DOUBLE, TOK) +#define H_ASSERT_FLOAT(TOK) h_assert_type(TT_FLOAT, TOK) // Assert expected type and return contained value. #define H_CAST(TYP, TOK) ((TYP *) H_ASSERT(TYP, TOK)->user) @@ -225,6 +231,8 @@ HParsedToken *h_make_uint(HArena *arena, uint64_t val); #define H_CAST_BYTES(TOK) (H_ASSERT_BYTES(TOK)->bytes) #define H_CAST_SINT(TOK) (H_ASSERT_SINT(TOK)->sint) #define H_CAST_UINT(TOK) (H_ASSERT_UINT(TOK)->uint) +#define H_CAST_DOUBLE(TOK) (H_ASSERT_DOUBLE(TOK)->dbl) +#define H_CAST_FLOAT(TOK) (H_ASSERT_FLOAT(TOK)->flt) // Sequence access... @@ -247,6 +255,8 @@ HParsedToken *h_seq_index_vpath(const HParsedToken *p, size_t i, va_list va); #define H_INDEX_BYTES(SEQ, ...) H_CAST_BYTES(H_INDEX_TOKEN(SEQ, __VA_ARGS__)) #define H_INDEX_SINT(SEQ, ...) H_CAST_SINT(H_INDEX_TOKEN(SEQ, __VA_ARGS__)) #define H_INDEX_UINT(SEQ, ...) H_CAST_UINT(H_INDEX_TOKEN(SEQ, __VA_ARGS__)) +#define H_INDEX_DOUBLE(SEQ, ...) H_CAST_DOUBLE(H_INDEX_TOKEN(SEQ, __VA_ARGS__)) +#define H_INDEX_FLOAT(SEQ, ...) H_CAST_FLOAT(H_INDEX_TOKEN(SEQ, __VA_ARGS__)) #define H_INDEX_TOKEN(SEQ, ...) h_seq_index_path(SEQ, __VA_ARGS__, -1) // Standard short-hand to access and cast elements on a sequence token. @@ -255,6 +265,8 @@ HParsedToken *h_seq_index_vpath(const HParsedToken *p, size_t i, va_list va); #define H_FIELD_BYTES(...) H_INDEX_BYTES(p->ast, __VA_ARGS__) #define H_FIELD_SINT(...) H_INDEX_SINT(p->ast, __VA_ARGS__) #define H_FIELD_UINT(...) H_INDEX_UINT(p->ast, __VA_ARGS__) +#define H_FIELD_DOUBLE(...) H_INDEX_DOUBLE(p->ast, __VA_ARGS__) +#define H_FIELD_FLOAT(...) H_INDEX_FLOAT(p->ast, __VA_ARGS__) // Lower-level helper for h_seq_index. HParsedToken *h_carray_index(const HCountedArray *a, size_t i); // XXX -> internal diff --git a/src/hammer.h b/src/hammer.h index c8a1074c..f425d00d 100644 --- a/src/hammer.h +++ b/src/hammer.h @@ -56,6 +56,8 @@ typedef enum HTokenType_ { TT_BYTES = 2, TT_SINT = 4, TT_UINT = 8, + TT_DOUBLE = 12, + TT_FLOAT = 13, TT_SEQUENCE = 16, TT_RESERVED_1, // reserved for backend-specific internal use TT_ERR = 32, diff --git a/src/pprint.c b/src/pprint.c index 145bf523..5f6e1e2c 100644 --- a/src/pprint.c +++ b/src/pprint.c @@ -63,6 +63,12 @@ void h_pprint(FILE* stream, const HParsedToken* tok, int indent, int delta) { case TT_UINT: fprintf(stream, "%" PRIu64, tok->uint); break; + case TT_DOUBLE: + fprintf(stream, "%f", tok->dbl); + break; + case TT_FLOAT: + fprintf(stream, "%f", (double)tok->flt); + break; case TT_SEQUENCE: if (tok->seq->used == 0) fprintf(stream, "[ ]"); @@ -183,6 +189,12 @@ static void unamb_sub(const HParsedToken* tok, struct result_buf *buf) { case TT_UINT: h_append_buf_formatted(buf, "u%#" PRIx64, tok->uint); break; + case TT_DOUBLE: + h_append_buf_formatted(buf, "d%a", tok->dbl); + break; + case TT_FLOAT: + h_append_buf_formatted(buf, "f%a", (double)tok->flt); + break; case TT_ERR: h_append_buf(buf, "ERR", 3); break; -- GitLab