diff --git a/src/assembler/tokenizer.c b/src/assembler/tokenizer.c index 71a7a49..677ff13 100644 --- a/src/assembler/tokenizer.c +++ b/src/assembler/tokenizer.c @@ -150,20 +150,43 @@ static ErrorInfo* handle_block_directive( static ErrorInfo* parse_data( const ASMLine *line, ASMData **data_ptr, size_t offset) { - // TODO - DEBUG("parse_data(): %.*s", (int) line->length, line->data) +#define PARSER_ARGS uint8_t**, size_t*, const char*, ssize_t + bool (*parser)(PARSER_ARGS) = (bool (*)(PARSER_ARGS)) parse_string; +#undef PARSER_ARGS + + const char *directive; + if (IS_DIRECTIVE(line, DIR_BYTE)) { + directive = DIR_BYTE; + parser = parse_bytes; + } else if (IS_DIRECTIVE(line, DIR_ASCII)) { + directive = DIR_ASCII; + } else if (IS_DIRECTIVE(line, DIR_ASCIZ)) { + directive = DIR_ASCIZ; + } else if (IS_DIRECTIVE(line, DIR_ASCIIZ)) { + directive = DIR_ASCIIZ; + } else { + return error_info_create(line, ET_PREPROC, ED_PP_UNKNOWN); + } - // return error_info_create(line, ET_PARSER, ED_PARSE_SYNTAX); + if (!DIRECTIVE_HAS_ARG(line, directive)) + return error_info_create(line, ET_PREPROC, ED_PP_NO_ARG); + + size_t dir_offset = DIRECTIVE_OFFSET(line, directive) + 1; + const char *arg = line->data + dir_offset; + size_t arglen = line->length - dir_offset; ASMData *data = malloc(sizeof(ASMData)); if (!data) OUT_OF_MEMORY() data->loc.offset = offset; - data->loc.length = 6; - data->bytes = (uint8_t*) strdup("foobar"); data->next = NULL; + if (!parser(&data->bytes, &data->loc.length, arg, arglen)) { + free(data); + return error_info_create(line, ET_PREPROC, ED_PP_BAD_ARG); + } + *data_ptr = data; return NULL; }