diff options
Diffstat (limited to 'orc/orcparse.c')
-rw-r--r-- | orc/orcparse.c | 161 |
1 files changed, 92 insertions, 69 deletions
diff --git a/orc/orcparse.c b/orc/orcparse.c index 16fdaf4..86fee89 100644 --- a/orc/orcparse.c +++ b/orc/orcparse.c @@ -18,7 +18,8 @@ typedef struct _OrcParser OrcParser; -struct _OrcParser { +struct _OrcParser +{ const char *code; int code_length; @@ -41,34 +42,34 @@ struct _OrcParser { int log_alloc; }; -static void orc_parse_get_line (OrcParser *parser); -static OrcStaticOpcode * get_opcode (OrcParser *parser, const char *opcode); -static void orc_parse_log (OrcParser *parser, const char *format, ...); -static int opcode_n_args (OrcStaticOpcode *opcode); -static void orc_parse_sanity_check (OrcParser *parser, OrcProgram *program); +static void orc_parse_get_line (OrcParser * parser); +static OrcStaticOpcode *get_opcode (OrcParser * parser, const char *opcode); +static void orc_parse_log (OrcParser * parser, const char *format, ...); +static int opcode_n_args (OrcStaticOpcode * opcode); +static void orc_parse_sanity_check (OrcParser * parser, OrcProgram * program); int -orc_parse (const char *code, OrcProgram ***programs) +orc_parse (const char *code, OrcProgram *** programs) { return orc_parse_full (code, programs, NULL); } int -orc_parse_full (const char *code, OrcProgram ***programs, char **log) +orc_parse_full (const char *code, OrcProgram *** programs, char **log) { OrcParser _parser; OrcParser *parser = &_parser; char *init_function = NULL; - memset (parser, 0, sizeof(*parser)); + memset (parser, 0, sizeof (*parser)); parser->code = code; parser->code_length = strlen (code); parser->line_number = 0; parser->p = code; parser->opcode_set = orc_opcode_set_get ("sys"); - parser->log = malloc(100); + parser->log = malloc (100); parser->log_alloc = 100; parser->log_size = 0; parser->log[0] = 0; @@ -80,13 +81,15 @@ orc_parse_full (const char *code, OrcProgram ***programs, char **log) int n_tokens; orc_parse_get_line (parser); - if (parser->program) orc_program_set_line (parser->program, parser->line_number); + if (parser->program) + orc_program_set_line (parser->program, parser->line_number); p = parser->line; end = p + strlen (p); //printf("%d: %s\n", parser->line_number, parser->line); - while (p[0] == ' ' || p[0] == '\t') p++; + while (p[0] == ' ' || p[0] == '\t') + p++; if (p[0] == 0) { continue; @@ -100,11 +103,14 @@ orc_parse_full (const char *code, OrcProgram ***programs, char **log) n_tokens = 0; while (p < end) { - while (p[0] != 0 && (p[0] == ' ' || p[0] == '\t')) p++; - if (p[0] == 0 || p[0] == '#') break; + while (p[0] != 0 && (p[0] == ' ' || p[0] == '\t')) + p++; + if (p[0] == 0 || p[0] == '#') + break; token[n_tokens] = p; - while (p[0] != 0 && p[0] != ' ' && p[0] != '\t' && p[0] != ',') p++; + while (p[0] != 0 && p[0] != ' ' && p[0] != '\t' && p[0] != ',') + p++; n_tokens++; p[0] = 0; @@ -117,7 +123,7 @@ orc_parse_full (const char *code, OrcProgram ***programs, char **log) { int i; - for(i=0;i<n_tokens;i++){ + for (i = 0; i < n_tokens; i++) { //printf("'%s' ", token[i]); } //printf("\n"); @@ -133,7 +139,7 @@ orc_parse_full (const char *code, OrcProgram ***programs, char **log) if (parser->n_programs == parser->n_programs_alloc) { parser->n_programs_alloc += 32; parser->programs = realloc (parser->programs, - sizeof(OrcProgram *)*parser->n_programs_alloc); + sizeof (OrcProgram *) * parser->n_programs_alloc); } parser->programs[parser->n_programs] = parser->program; parser->n_programs++; @@ -142,24 +148,26 @@ orc_parse_full (const char *code, OrcProgram ***programs, char **log) free (init_function); init_function = NULL; if (n_tokens < 2) { - orc_parse_log (parser, "error: line %d: .init without function name\n", + orc_parse_log (parser, + "error: line %d: .init without function name\n", parser->line_number); } else { init_function = strdup (token[1]); } } else if (strcmp (token[0], ".flags") == 0) { int i; - for(i=1;i<n_tokens;i++){ + for (i = 1; i < n_tokens; i++) { if (!strcmp (token[i], "2d")) { orc_program_set_2d (parser->program); } } } else if (strcmp (token[0], ".n") == 0) { int i; - for(i=1;i<n_tokens;i++){ + for (i = 1; i < n_tokens; i++) { if (strcmp (token[i], "mult") == 0) { if (i == n_tokens - 1) { - orc_parse_log (parser, "error: line %d: .n mult requires multiple value\n", + orc_parse_log (parser, + "error: line %d: .n mult requires multiple value\n", parser->line_number); } else { orc_program_set_n_multiple (parser->program, @@ -168,7 +176,8 @@ orc_parse_full (const char *code, OrcProgram ***programs, char **log) } } else if (strcmp (token[i], "min") == 0) { if (i == n_tokens - 1) { - orc_parse_log (parser, "error: line %d: .n mult requires multiple value\n", + orc_parse_log (parser, + "error: line %d: .n mult requires multiple value\n", parser->line_number); } else { orc_program_set_n_minimum (parser->program, @@ -177,7 +186,8 @@ orc_parse_full (const char *code, OrcProgram ***programs, char **log) } } else if (strcmp (token[i], "max") == 0) { if (i == n_tokens - 1) { - orc_parse_log (parser, "error: line %d: .n mult requires multiple value\n", + orc_parse_log (parser, + "error: line %d: .n mult requires multiple value\n", parser->line_number); } else { orc_program_set_n_maximum (parser->program, @@ -197,13 +207,14 @@ orc_parse_full (const char *code, OrcProgram ***programs, char **log) int var; int i; var = orc_program_add_source (parser->program, size, token[2]); - for(i=3;i<n_tokens;i++){ + for (i = 3; i < n_tokens; i++) { if (strcmp (token[i], "align") == 0) { if (i == n_tokens - 1) { - orc_parse_log (parser, "error: line %d: .source align requires alignment value\n", + orc_parse_log (parser, + "error: line %d: .source align requires alignment value\n", parser->line_number); } else { - int alignment = strtol (token[i+1], NULL, 0); + int alignment = strtol (token[i + 1], NULL, 0); orc_program_set_var_alignment (parser->program, var, alignment); i++; } @@ -216,13 +227,14 @@ orc_parse_full (const char *code, OrcProgram ***programs, char **log) int var; int i; var = orc_program_add_destination (parser->program, size, token[2]); - for(i=3;i<n_tokens;i++){ + for (i = 3; i < n_tokens; i++) { if (strcmp (token[i], "align") == 0) { if (i == n_tokens - 1) { - orc_parse_log (parser, "error: line %d: .source align requires alignment value\n", + orc_parse_log (parser, + "error: line %d: .source align requires alignment value\n", parser->line_number); } else { - int alignment = strtol (token[i+1], NULL, 0); + int alignment = strtol (token[i + 1], NULL, 0); orc_program_set_var_alignment (parser->program, var, alignment); i++; } @@ -249,7 +261,8 @@ orc_parse_full (const char *code, OrcProgram ***programs, char **log) } else if (strcmp (token[0], ".const") == 0) { int size = strtol (token[1], NULL, 0); - orc_program_add_constant_str (parser->program, size, token[3], token[2]); + orc_program_add_constant_str (parser->program, size, token[3], + token[2]); } else if (strcmp (token[0], ".floatparam") == 0) { int size = strtol (token[1], NULL, 0); orc_program_add_parameter_float (parser->program, size, token[2]); @@ -280,12 +293,14 @@ orc_parse_full (const char *code, OrcProgram ***programs, char **log) int i; if (n_tokens != 1 + offset + n_args) { - orc_parse_log (parser, "error: line %d: too %s arguments for %s (expected %d)\n", - parser->line_number, (n_tokens < 1+offset+n_args) ? "few" : "many", - token[offset], n_args); + orc_parse_log (parser, + "error: line %d: too %s arguments for %s (expected %d)\n", + parser->line_number, + (n_tokens < 1 + offset + n_args) ? "few" : "many", token[offset], + n_args); } - for(i=offset+1;i<n_tokens;i++){ + for (i = offset + 1; i < n_tokens; i++) { char *end; double unused ORC_GNUC_UNUSED; @@ -298,18 +313,18 @@ orc_parse_full (const char *code, OrcProgram ***programs, char **log) if (n_tokens - offset == 5) { orc_program_append_str_2 (parser->program, token[offset], flags, - token[offset+1], token[offset+2], token[offset+3], token[offset+4]); + token[offset + 1], token[offset + 2], token[offset + 3], + token[offset + 4]); } else if (n_tokens - offset == 4) { orc_program_append_str_2 (parser->program, token[offset], flags, - token[offset+1], token[offset+2], token[offset+3], NULL); + token[offset + 1], token[offset + 2], token[offset + 3], NULL); } else { orc_program_append_str_2 (parser->program, token[offset], flags, - token[offset+1], token[offset+2], NULL, NULL); + token[offset + 1], token[offset + 2], NULL, NULL); } } else { orc_parse_log (parser, "error: line %d: unknown opcode: %s\n", - parser->line_number, - token[offset]); + parser->line_number, token[offset]); } } } @@ -318,7 +333,8 @@ orc_parse_full (const char *code, OrcProgram ***programs, char **log) orc_parse_sanity_check (parser, parser->program); } - if (parser->line) free (parser->line); + if (parser->line) + free (parser->line); if (log) { *log = parser->log; @@ -335,11 +351,11 @@ orc_parse_full (const char *code, OrcProgram ***programs, char **log) } static OrcStaticOpcode * -get_opcode (OrcParser *parser, const char *opcode) +get_opcode (OrcParser * parser, const char *opcode) { int i; - for(i=0;i<parser->opcode_set->n_opcodes;i++){ + for (i = 0; i < parser->opcode_set->n_opcodes; i++) { if (strcmp (opcode, parser->opcode_set->opcodes[i].name) == 0) { return parser->opcode_set->opcodes + i; } @@ -349,28 +365,30 @@ get_opcode (OrcParser *parser, const char *opcode) } static int -opcode_n_args (OrcStaticOpcode *opcode) +opcode_n_args (OrcStaticOpcode * opcode) { int i; int n = 0; - for(i=0;i<ORC_STATIC_OPCODE_N_DEST;i++){ - if (opcode->dest_size[i] != 0) n++; + for (i = 0; i < ORC_STATIC_OPCODE_N_DEST; i++) { + if (opcode->dest_size[i] != 0) + n++; } - for(i=0;i<ORC_STATIC_OPCODE_N_SRC;i++){ - if (opcode->src_size[i] != 0) n++; + for (i = 0; i < ORC_STATIC_OPCODE_N_SRC; i++) { + if (opcode->src_size[i] != 0) + n++; } return n; } static void -orc_parse_log_valist (OrcParser *parser, const char *format, va_list args) +orc_parse_log_valist (OrcParser * parser, const char *format, va_list args) { char s[100]; int len; - + if (parser->error_program != parser->program) { - sprintf(s, "In function %s:\n", parser->program->name); - len = strlen(s); + sprintf (s, "In function %s:\n", parser->program->name); + len = strlen (s); if (parser->log_size + len + 1 >= parser->log_alloc) { parser->log_alloc += 100; @@ -382,8 +400,8 @@ orc_parse_log_valist (OrcParser *parser, const char *format, va_list args) parser->error_program = parser->program; } - vsprintf(s, format, args); - len = strlen(s); + vsprintf (s, format, args); + len = strlen (s); if (parser->log_size + len + 1 >= parser->log_alloc) { parser->log_alloc += 100; @@ -395,7 +413,7 @@ orc_parse_log_valist (OrcParser *parser, const char *format, va_list args) } static void -orc_parse_log (OrcParser *parser, const char *format, ...) +orc_parse_log (OrcParser * parser, const char *format, ...) { va_list var_args; @@ -405,7 +423,7 @@ orc_parse_log (OrcParser *parser, const char *format, ...) } static void -orc_parse_get_line (OrcParser *parser) +orc_parse_get_line (OrcParser * parser) { const char *end; int n; @@ -434,15 +452,17 @@ orc_parse_get_line (OrcParser *parser) static void -orc_parse_sanity_check (OrcParser *parser, OrcProgram *program) +orc_parse_sanity_check (OrcParser * parser, OrcProgram * program) { int i; int j; - for(i=0;i<=ORC_VAR_T15;i++) { - if (program->vars[i].size == 0) continue; - for(j=i+1;j<=ORC_VAR_T15;j++) { - if (program->vars[j].size == 0) continue; + for (i = 0; i <= ORC_VAR_T15; i++) { + if (program->vars[i].size == 0) + continue; + for (j = i + 1; j <= ORC_VAR_T15; j++) { + if (program->vars[j].size == 0) + continue; if (strcmp (program->vars[i].name, program->vars[j].name) == 0) { orc_parse_log (parser, "error: duplicate variable name: %s\n", @@ -451,22 +471,25 @@ orc_parse_sanity_check (OrcParser *parser, OrcProgram *program) } } - for(i=0;i<program->n_insns;i++){ + for (i = 0; i < program->n_insns; i++) { OrcInstruction *insn = program->insns + i; OrcStaticOpcode *opcode = insn->opcode; - for(j=0;j<ORC_STATIC_OPCODE_N_DEST;j++){ - if (opcode->dest_size[j] == 0) continue; + for (j = 0; j < ORC_STATIC_OPCODE_N_DEST; j++) { + if (opcode->dest_size[j] == 0) + continue; if (program->vars[insn->dest_args[j]].used && program->vars[insn->dest_args[j]].vartype == ORC_VAR_TYPE_DEST) { - orc_parse_log (parser, "error: destination \"%s\" written multiple times\n", + orc_parse_log (parser, + "error: destination \"%s\" written multiple times\n", program->vars[insn->dest_args[j]].name); } program->vars[insn->dest_args[j]].used = TRUE; } - for(j=0;j<ORC_STATIC_OPCODE_N_SRC;j++){ - if (opcode->src_size[j] == 0) continue; + for (j = 0; j < ORC_STATIC_OPCODE_N_SRC; j++) { + if (opcode->src_size[j] == 0) + continue; if (program->vars[insn->src_args[j]].used && program->vars[insn->src_args[j]].vartype == ORC_VAR_TYPE_SRC) { orc_parse_log (parser, "error: source \"%s\" read multiple times\n", @@ -474,7 +497,8 @@ orc_parse_sanity_check (OrcParser *parser, OrcProgram *program) } if (!program->vars[insn->src_args[j]].used && program->vars[insn->src_args[j]].vartype == ORC_VAR_TYPE_TEMP) { - orc_parse_log (parser, "error: variable \"%s\" used before being written\n", + orc_parse_log (parser, + "error: variable \"%s\" used before being written\n", program->vars[insn->src_args[j]].name); } } @@ -484,8 +508,7 @@ orc_parse_sanity_check (OrcParser *parser, OrcProgram *program) } const char * -orc_parse_get_init_function (OrcProgram *program) +orc_parse_get_init_function (OrcProgram * program) { return program->init_function; } - |