#include "bfd.h"
#include "symcat.h"
#include "@arch@-opc.h"
+#include "opintl.h"
/* ??? The layout of this stuff is still work in progress.
For speed in assembly/disassembly, we use inline functions. That of course
compiled with GCC), or switch to macros, or use something else.
*/
+static const char * insert_normal
+ PARAMS ((long, unsigned int, int, int, int, char *));
static const char * parse_insn_normal
PARAMS ((const CGEN_INSN *, const char **, CGEN_FIELDS *));
static const char * insert_insn_normal
PARAMS ((const CGEN_INSN *, CGEN_FIELDS *, cgen_insn_t *));
\f
+/* -- assembler routines inserted here */
+\f
/* Default insertion routine.
ATTRS is a mask of the boolean attributes.
store insn in `field' struct and add registers, etc. while parsing? */
static const char *
-insert_normal (value, attrs, start, length, shift, total_length, buffer)
+insert_normal (value, attrs, start, length, total_length, buffer)
long value;
unsigned int attrs;
int start;
int length;
- int shift;
int total_length;
char * buffer;
{
bfd_vma x;
static char buf[100];
- if (shift < 0)
- value <<= -shift;
- else
- value >>= shift;
-
/* Ensure VALUE will fit. */
if ((attrs & (1 << CGEN_OPERAND_UNSIGNED)) != 0)
{
unsigned long max = (1 << length) - 1;
if ((unsigned long) value > max)
{
- const char *err = "operand out of range (%lu not between 0 and %lu)";
-
- sprintf (buf, err, value, max);
+ sprintf (buf, _("operand out of range (%lu not between 0 and %lu)"),
+ value, max);
return buf;
}
}
long min = - (1 << (length - 1));
long max = (1 << (length - 1)) - 1;
if (value < min || value > max)
- {
- const char *err = "operand out of range (%ld not between %ld and %ld)";
-
- sprintf (buf, err, value, min, max);
- return buf;
- }
+ return sprintf
+ (buf, _("operand out of range (%ld not between %ld and %ld)"),
+ value, min, max);
}
#if 0 /*def CGEN_INT_INSN*/
return NULL;
}
\f
-/* -- assembler routines inserted here */
-\f
/* Default insn parser.
The syntax string is scanned and operands are parsed and stored in FIELDS.
p = CGEN_INSN_MNEMONIC (insn);
while (* p && * p == * str)
++ p, ++ str;
+
if (* p || (* str && !isspace (* str)))
- return "unrecognized instruction";
+ return _("unrecognized instruction");
CGEN_INIT_PARSE ();
cgen_init_parse_operand ();
/* Syntax char didn't match. Can't be this insn. */
/* FIXME: would like to return something like
"expected char `c'" */
- return "syntax error";
+ return _("syntax error");
}
continue;
}
++ str;
if (* str != '\0')
- return "junk at end of line"; /* FIXME: would like to include `str' */
+ return _("junk at end of line"); /* FIXME: would like to include `str' */
return NULL;
}
This routine is called for each instruction to be assembled.
STR points to the insn to be assembled.
We assume all necessary tables have been initialized.
+ The assembled instruction, less any fixups, is stored in buf.
+ [??? What byte order?]
The result is a pointer to the insn's entry in the opcode table,
or NULL if an error occured (an error message will have already been
- printed). */
+ printed).
+
+ Note that when processing (non-alias) macro-insns,
+ this function recurses. */
const CGEN_INSN *
@arch@_cgen_assemble_insn (str, fields, buf, errmsg)
Need to track why it failed and pick the right one. */
{
static char errbuf[100];
- sprintf (errbuf, "bad instruction `%.50s%s'",
- start, strlen (start) > 50 ? "..." : "");
+ /* xgettext:c-format */
+ if (strlen (start) > 50)
+ sprintf (errbuf, _("bad instruction `%.50s...'"), start);
+ else
+ sprintf (errbuf, _("bad instruction `%.50s'"), start);
+
*errmsg = errbuf;
return NULL;
}