ack/util/misc/convert.c
George Koehler 88207db638 Use <stdarg.h> in util/misc/convert.c
I made a syntax error in some .e file, and em_encode dumped core
because a 64-bit pointer didn't fit in a 32-bit int.  Now use stdarg
to pass pointers to error() and fatal().

Stop using the number of errors as the exit status.  Many systems use
only the low 8 bits of the exit status, so 256 errors would become 0.

Also change modules/src/print to accept const char *buf
2017-12-06 17:09:12 -05:00

103 lines
2 KiB
C

/*
* (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands.
* See the copyright notice in the ACK home directory, in the file "Copyright".
*/
#ifndef NORCSID
static char rcsid[] = "$Id$";
#endif
/* This program converts either human-readable or compact EM
assembly code to calls of the procedure-interface.
It must be linked with two libraries:
- a library to read EM code, according to read_em(3)
- a library implementing the em_code(3) interface.
Thus, this program could serve as an EM_encoder, an
EM_decoder, or some code generator, depending on how it is
linked.
*/
#include <stdarg.h>
#include <stdlib.h>
#include "system.h"
#include "print.h"
#include "em_pseu.h"
#include "em_mnem.h"
#include "em_spec.h"
#include "em_flag.h"
#include "em_ptyp.h"
#include "em.h"
#include "em_comp.h"
char *filename; /* Name of input file */
int errors; /* Number of errors */
extern char *C_error;
void error(const char *, ...);
void fatal(const char *, ...);
int
main(int argc, char **argv)
{
struct e_instr buf;
register struct e_instr *p = &buf;
if (argc >= 2) {
filename = argv[1];
}
else filename = 0;
if (!EM_open(filename)) {
fatal(EM_error);
}
EM_getinstr(p);
C_init((arith) EM_wordsize, (arith) EM_pointersize);
if (argc >= 3) {
if (!C_open(argv[2])) {
fatal("C_open failed");
}
}
else if (!C_open( (char *) 0)) fatal("C_open failed");
C_magic();
while (p->em_type != EM_EOF) {
if (p->em_type == EM_FATAL) {
fatal("%s", EM_error);
}
if (EM_error) {
error("%s", EM_error);
}
if (p->em_type != EM_ERROR && !C_out(p)) {
error("%s", C_error);
}
EM_getinstr(p);
}
C_close();
EM_close();
exit(errors ? 1 : 0);
}
/* VARARGS */
void
error(const char *s, ...)
{
va_list ap;
va_start(ap, s);
fprint(STDERR,
"%s, line %d: ",
filename ? filename : "standard input",
EM_lineno);
doprnt(STDERR, s, ap);
fprint(STDERR, "\n");
errors++;
va_end(ap);
}
/* VARARGS */
void
fatal(const char *s, ...)
{
va_list ap;
va_start(ap, s);
if (C_busy()) C_close();
error(s, ap);
exit(1);
}