ack/util/misc/convert.c

88 lines
1.7 KiB
C
Raw Normal View History

1987-02-05 14:47:47 +00:00
#ifndef NORCSID
static char rcsid[] = "$Header$";
#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 <stdio.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 */
main(argc,argv)
char **argv;
{
struct e_instr *EM_getinstr();
register struct e_instr *p;
register struct e_args *ap;
if (argc >= 2) {
filename = argv[1];
}
else filename = 0;
if (!EM_open(filename)) {
fatal(EM_error);
}
p = EM_getinstr();
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) {
if (p->em_type == EM_FATAL) {
fatal("EM_getinstr: %s", EM_error);
}
if (p->em_type == EM_ERROR) {
error("EM_getinstr: %s", EM_error);
continue;
}
if (!EM_mkcalls(p)) {
error("EM_mkcalls: %s", EM_error);
}
p = EM_getinstr();
}
C_close();
EM_close();
return errors ? 1 : 0;
}
/* VARARGS */
error(s,a1,a2,a3,a4)
char *s;
{
fprintf(stderr,
"%s, line %d: ",
filename ? filename : "standard input",
EM_lineno);
fprintf(stderr,s,a1,a2,a3,a4);
putc('\n', stderr);
errors++;
}
/* VARARGS */
fatal(s,a1,a2,a3,a4)
char *s;
{
error(s,a1,a2,a3,a4);
exit(1);
}