/* opc2c.c --- generate C opcode decoder code from from .opc file
- Copyright (C) 2005, 2007, 2008, 2009 Free Software Foundation, Inc.
+ Copyright (C) 2005-2020 Free Software Foundation, Inc.
Contributed by Red Hat, Inc.
This file is part of the GNU opcode library.
#include <string.h>
#include <ctype.h>
#include <stdlib.h>
+#include <errno.h>
+#include "libiberty.h"
static char * line_buf = NULL;
static int line_buf_size = 0;
unsigned char cur_bits[MAX_BYTES + 1];
-char * orig_filename;
+const char * orig_filename;
FILE * sim_log = NULL;
#define lprintf if (sim_log) fprintf
}
*np = 0;
varnames[vn++] = strdup (name);
- printf ("#line %d \"%s\"\n", op->lineno, orig_filename);
+ printf ("#line %d \"%s\"\n", op->lineno + 1, orig_filename);
if (mask & ~0xff)
{
fprintf (stderr, "Error: variable %s spans bytes: %s\n",
printf ("#line %d \"%s\"\n", op->lineno + 1, orig_filename);
for (i = 0; i < op->nlines; i++)
- printf ("%*s%s", level, "", op->lines[i]);
+ if (op->lines[i][0] == '\n')
+ printf ("%s", op->lines[i]);
+ else
+ printf ("%*s%s", level, "", op->lines[i]);
if (op->comment)
printf ("%*s}\n", level, "");
VaryRef * vlist;
int skipping_section = 0;
- if (argc > 2 && strcmp (argv[1], "-l") == 0)
- {
- sim_log = fopen (argv[2], "w");
- fprintf (stderr, "sim_log: %s\n", argv[2]);
- argc -= 2;
- argv += 2;
- }
-
if (argc < 2)
{
fprintf (stderr, "usage: opc2c infile.opc > outfile.opc\n");
exit (1);
}
- orig_filename = argv[1];
+ orig_filename = lbasename (argv[1]);
in = fopen (argv[1], "r");
if (!in)
{
- fprintf (stderr, "Unable to open file %s for reading\n", argv[1]);
- perror ("The error was");
+ fprintf (stderr, "Unable to open file %s for reading: %s\n", argv[1],
+ xstrerror (errno));
exit (1);
}
n_opcodes = 0;
opcodes = (opcode **) malloc (sizeof (opcode *));
op = &prefix_text;
- op->lineno = 1;
+ op->lineno = 0;
while ((line = safe_fgets (in)) != 0)
{
lineno++;
store_opcode_bits (opcodes[i], 0, indirect);
}
+ printf ("/* DO NOT EDIT! -*- buffer-read-only: t -*- vi:set ro: */\n");
+
dump_lines (&prefix_text, 0, 0);
emit_indirect (indirect, 0);