/* * add label to symbol table, error if symbol already exists */ void put_label(void) { struct sym *get_sym(char *); if (get_sym(label) == NULL) { if (put_sym(label, pc)) fatal(F_OUTMEM, "symbols"); } else asmerr(E_MULSYM); }
/* * DEFL */ int op_dl(void) { if (!gencode) return(0); sd_flag = 1; sd_val = eval(operand); if (put_sym(label, sd_val)) fatal(F_OUTMEM, "symbols"); return(0); }
void ne_insert(const char *name, int val) { struct symbol_table *sym; sym = get_sym(&ne, name); if (!sym) sym = put_sym(&ne, name, SYM_INPUT); sym->type = SYM_INPUT; sym->ret.type = WEAK_INT; sym->ret.val.i = val; sym->dirty = true; }
struct ast* reach(struct ast* a, struct ast* block) { if (a->node_type == N_ARRAY) { if (block != NULL) { struct ast* arr = (struct ast*) a->left; struct opt_block_node* b = (struct opt_block_node*) block; // obtengo arreglo a partir de Array int arr_size = array_tree_size(arr); struct ast* result[arr_size]; struct ast* ptr = arr; int i; for (i = (arr_size - 1); i > -1; i--) { result[i] = ptr->left; ptr = ptr->right; }; // itero sobre array for (i = 0; i < arr_size; i++) { push_scope(); // put first arg to scope if (b->opt_ids != NULL) { put_sym(SYM_VAR, string_value(b->opt_ids->arg), result[i], NULL); }; // eval block stmts eval_ast(b->stmts); pop_scope(); }; return a; } else { block_is_required_error(EACH_ITERATOR); }; } else { no_method_error(EACH_ITERATOR, a); }; };
/* * EQU */ int op_equ(void) { if (!gencode) return(0); if (pass == 1) { /* Pass 1 */ if (get_sym(label) == NULL) { sd_val = eval(operand); if (put_sym(label, sd_val)) fatal(F_OUTMEM, "symbols"); } else asmerr(E_MULSYM); } else { /* Pass 2 */ sd_flag = 1; sd_val = eval(operand); } return(0); }
/* * process options */ void options(int argc, char *argv[]) { register char *s, *t; register int i; while (--argc > 0 && (*++argv)[0] == '-') for (s = argv[0] + 1; *s != '\0'; s++) switch (*s) { case 'o': if (*++s == '\0') { puts("name missing in option -o"); usage(); } if (out_form == OUTHEX) get_fn(objfn, s, OBJEXTHEX); else get_fn(objfn, s, OBJEXTBIN); s += (strlen(s) - 1); break; case 'l': if (*(s + 1) != '\0') { get_fn(lstfn, ++s, LSTEXT); s += (strlen(s) - 1); } list_flag = 1; break; case 's': if (*(s + 1) == '\0') sym_flag = 1; else if (*(s + 1) == 'n') sym_flag = 2; else if (*(s + 1) == 'a') sym_flag = 3; else { printf("unknown option -%s\n", s); usage(); } s += (strlen(s) - 1); break; case 'x': dump_flag = 1; break; case 'f': if (*(s + 1) == 'b') out_form = OUTBIN; else if (*(s + 1) == 'm') out_form = OUTMOS; else if (*(s + 1) == 'h') out_form = OUTHEX; else { printf("unknown option -%s\n", s); usage(); } s += (strlen(s) - 1); break; case 'd': if (*++s == '\0') { puts("name missing in option -d"); usage(); } t = tmp; while (*s) *t++ = islower((int)*s) ? toupper((int)*s++) : *s++; s--; *t = '\0'; if (put_sym(tmp, 0)) fatal(F_OUTMEM, "symbols"); break; case 'v': ver_flag = 1; break; case 'e': if (*++s == '\0') { puts("symbol length missing in option -e"); usage(); } symlen = atoi(s); s += (strlen(s) - 1); break; default : printf("unknown option %c\n", *s); usage(); } i = 0; while ((argc--) && (i < MAXFN)) { if ((infiles[i] = malloc(LENFN + 1)) == NULL) fatal(F_OUTMEM, "filenames"); get_fn(infiles[i], *argv++, SRCEXT); i++; } if (i == 0) { printf("no input file\n"); usage(); } }