Пример #1
0
/*
 *	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);
}
Пример #2
0
/*
 *	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);
}
Пример #3
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);
  };  

};
Пример #5
0
/*
 *	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);
}
Пример #6
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();
	}
}