uint16_t label_lookup_write( label_table_t * from, label_table_t * to, char * label, uint16_t address ) { uint16_t found_address; if ((found_address = label_lookup(from, label))) return found_address; label_write(to, label, address); return 0; }
static int cbranch_op(struct code_rom *rom, uint8_t invert, uint8_t zero, const char *label) { struct label *l; uint16_t insn; invert = !!invert; zero = !!zero; l = label_lookup(rom, label); if ( NULL == l ) { fprintf(stderr, "%s:%u: label not found: %s\n", rom->fn, rom->line, label); return 0; } insn = (1 << 8) | (invert << 7) | (zero << 6) | l->addr; return emit_insn(rom, insn); }
static int add_label(struct code_rom *rom, char *ptr) { struct label *l; if ( !label_is_valid(ptr) ) { fprintf(stderr, "%s:%u: invalid label name: %s\n", rom->fn, rom->line, ptr); return 0; } if ( label_lookup(rom, ptr) ) { fprintf(stderr, "%s:%u: duplicate label: %s\n", rom->fn, rom->line, ptr); return 0; } l = calloc(1, sizeof(*l)); if ( NULL == l ) { fprintf(stderr, "%s:%u: %s\n", rom->fn, rom->line, strerror(errno)); return 0; } l->name = strdup(ptr); if ( NULL == l->name ) { fprintf(stderr, "%s:%u: %s\n", rom->fn, rom->line, strerror(errno)); free(l); return 0; } l->addr = rom->addr; l->next = rom->labels; rom->labels = l; return 1; }