Skip to content
Snippets Groups Projects
Commit c0b76e86 authored by Sven M. Hallberg's avatar Sven M. Hallberg
Browse files

add TT_DOUBLE and TT_FLOAT as user-accessible token types

parent 1e7f32f5
No related branches found
No related tags found
No related merge requests found
......@@ -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)
{
......
......@@ -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
......
......@@ -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,
......
......@@ -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;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment