Initial revision
authorceriel <none@none>
Thu, 5 Feb 1987 14:47:47 +0000 (14:47 +0000)
committerceriel <none@none>
Thu, 5 Feb 1987 14:47:47 +0000 (14:47 +0000)
util/misc/convert.c [new file with mode: 0644]

diff --git a/util/misc/convert.c b/util/misc/convert.c
new file mode 100644 (file)
index 0000000..44df72d
--- /dev/null
@@ -0,0 +1,87 @@
+#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);
+}