From 88a029df7250d95f0e5caccd537a7f991736f9a3 Mon Sep 17 00:00:00 2001 From: Francesco Romani Date: Sun, 6 Jul 2014 15:56:56 +0200 Subject: [PATCH] parser: extract function to handle .source Part-of: --- orc/orcparse.c | 68 ++++++++++++++++++++++++++++++++++------------------------ 1 file changed, 40 insertions(+), 28 deletions(-) diff --git a/orc/orcparse.c b/orc/orcparse.c index d001ec1..cca91c3 100644 --- a/orc/orcparse.c +++ b/orc/orcparse.c @@ -96,6 +96,7 @@ static int orc_parse_handle_init (OrcParser *parser, const OrcLine *line); static int orc_parse_handle_flags (OrcParser *parser, const OrcLine *line); static int orc_parse_handle_dotn (OrcParser *parser, const OrcLine *line); static int orc_parse_handle_dotm (OrcParser *parser, const OrcLine *line); +static int orc_parse_handle_source (OrcParser *parser, const OrcLine *line); static int orc_parse_handle_directive (OrcParser *parser, const OrcLine *line); static int orc_parse_handle_opcode (OrcParser *parser, const OrcLine *line); @@ -435,34 +436,7 @@ orc_parse_handle_legacy (OrcParser *parser, const OrcLine *line) const char **token = (const char **)(line->tokens); int n_tokens = line->n_tokens; - if (strcmp (token[0], ".source") == 0) { - if (n_tokens < 3) { - orc_parse_add_error (parser, "line %d: .source without size or identifier\n", - parser->line_number); - } else { - int size = strtol (token[1], NULL, 0); - int var; - int i; - var = orc_program_add_source (parser->program, size, token[2]); - for(i=3;iline_number); - } else { - int alignment = strtol (token[i+1], NULL, 0); - orc_program_set_var_alignment (parser->program, var, alignment); - i++; - } - } else if (i == n_tokens - 1) { - orc_program_set_type_name (parser->program, var, token[i]); - } else { - orc_parse_add_error (parser, "line %d: unknown .source token '%s'\n", - parser->line_number, token[i]); - } - } - } - } else if (strcmp (token[0], ".dest") == 0) { + if (strcmp (token[0], ".dest") == 0) { if (n_tokens < 3) { orc_parse_add_error (parser, "line %d: .dest without size or identifier\n", parser->line_number); @@ -683,6 +657,43 @@ orc_parse_handle_dotm (OrcParser *parser, const OrcLine *line) } static int +orc_parse_handle_source (OrcParser *parser, const OrcLine *line) +{ + int size; + int var; + int i; + + if (line->n_tokens < 3) { + orc_parse_add_error (parser, "line %d: .source without size or identifier\n", + parser->line_number); + return 0; + } + + size = strtol (line->tokens[1], NULL, 0); + var = orc_program_add_source (parser->program, size, line->tokens[2]); + for(i=3;in_tokens;i++){ + if (strcmp (line->tokens[i], "align") == 0) { + if (i == line->n_tokens - 1) { + orc_parse_add_error (parser, "line %d: .source align requires alignment value\n", + parser->line_number); + } else { + int alignment = strtol (line->tokens[i+1], NULL, 0); + orc_program_set_var_alignment (parser->program, var, alignment); + i++; + } + } else if (i == line->n_tokens - 1) { + orc_program_set_type_name (parser->program, var, line->tokens[i]); + } else { + orc_parse_add_error (parser, "line %d: unknown .source token '%s'\n", + parser->line_number, line->tokens[i]); + } + } + + return 1; +} + + +static int orc_parse_handle_directive (OrcParser *parser, const OrcLine *line) { static const OrcDirective dirs[] = { @@ -692,6 +703,7 @@ orc_parse_handle_directive (OrcParser *parser, const OrcLine *line) { ".flags", orc_parse_handle_flags }, { ".n", orc_parse_handle_dotn }, { ".m", orc_parse_handle_dotm }, + { ".source", orc_parse_handle_source }, { NULL, NULL } }; int i; -- 2.7.4