hammer/src/parsers/token.c

40 lines
1,007 B
C
Raw Normal View History

2012-05-26 16:00:43 +02:00
#include "parser_internal.h"
typedef struct {
uint8_t *str;
uint8_t len;
} HToken;
static HParseResult* parse_token(void *env, HParseState *state) {
HToken *t = (HToken*)env;
for (int i=0; i<t->len; ++i) {
uint8_t chr = (uint8_t)h_read_bits(&state->input_stream, 8, false);
if (t->str[i] != chr) {
return NULL;
}
}
HParsedToken *tok = a_new(HParsedToken, 1);
tok->token_type = TT_BYTES; tok->bytes.token = t->str; tok->bytes.len = t->len;
return make_result(state, tok);
}
const HParserVtable token_vt = {
2012-05-26 16:00:43 +02:00
.parse = parse_token,
.isValidRegular = h_true,
.isValidCF = h_true,
2012-05-26 16:00:43 +02:00
};
2012-10-10 15:58:03 +02:00
const HParser* h_token(const uint8_t *str, const size_t len) {
return h_token__m(&system_allocator, str, len);
}
const HParser* h_token__m(HAllocator* mm__, const uint8_t *str, const size_t len) {
HToken *t = h_new(HToken, 1);
2012-05-26 16:00:43 +02:00
t->str = (uint8_t*)str, t->len = len;
2012-10-10 15:58:03 +02:00
HParser *ret = h_new(HParser, 1);
2012-05-26 16:00:43 +02:00
ret->vtable = &token_vt;
ret->env = t;
return (const HParser*)ret;
}