static bfd_boolean other_register_name (expressionS *expressionP) { int reg_number; char *name; char *start; char c; /* Find the spelling of the operand. */ start = input_line_pointer; c = get_symbol_name (&name); reg_number = reg_name_search (other_registers, OTHER_REG_NAME_CNT, name); /* Put back the delimiting char. */ (void) restore_line_pointer (c); /* Look to see if it's in the register table. */ if (reg_number >= 0) { expressionP->X_op = O_register; expressionP->X_add_number = reg_number; /* Make the rest nice. */ expressionP->X_add_symbol = NULL; expressionP->X_op_symbol = NULL; return TRUE; } /* Reset the line as if we had not done anything. */ input_line_pointer = start; return FALSE; }
operatorT i386_operator (const char *name, unsigned int operands, char *pc) { unsigned int j; if (!intel_syntax) return O_absent; if (!name) { if (operands != 2) return O_illegal; switch (*input_line_pointer) { case ':': ++input_line_pointer; return O_full_ptr; case '[': ++input_line_pointer; return O_index; case '@': if (this_operand >= 0 && i.reloc[this_operand] == NO_RELOC) { int adjust = 0; char *gotfree_input_line = lex_got (&i.reloc[this_operand], &adjust, &intel_state.reloc_types); if (!gotfree_input_line) break; free (gotfree_input_line); *input_line_pointer++ = '+'; memset (input_line_pointer, '0', adjust - 1); input_line_pointer[adjust - 1] = ' '; return O_add; } break; } return O_illegal; } for (j = 0; i386_operators[j].name; ++j) if (strcasecmp (i386_operators[j].name, name) == 0) { if (i386_operators[j].operands && i386_operators[j].operands != operands) return O_illegal; return i386_operators[j].op; } for (j = 0; i386_types[j].name; ++j) if (strcasecmp (i386_types[j].name, name) == 0) break; if (i386_types[j].name && *pc == ' ') { char *pname; char c; ++input_line_pointer; c = get_symbol_name (&pname); if (strcasecmp (pname, "ptr") == 0) { /* FIXME: What if c == '"' ? */ pname[-1] = *pc; *pc = c; if (intel_syntax > 0 || operands != 1) return O_illegal; return i386_types[j].op; } (void) restore_line_pointer (c); input_line_pointer = pname - 1; } return O_absent; }