summaryrefslogtreecommitdiff
path: root/dviware/umddvi/dev/dmdhost.c
diff options
context:
space:
mode:
Diffstat (limited to 'dviware/umddvi/dev/dmdhost.c')
-rw-r--r--dviware/umddvi/dev/dmdhost.c236
1 files changed, 236 insertions, 0 deletions
diff --git a/dviware/umddvi/dev/dmdhost.c b/dviware/umddvi/dev/dmdhost.c
new file mode 100644
index 0000000000..344b5d02b1
--- /dev/null
+++ b/dviware/umddvi/dev/dmdhost.c
@@ -0,0 +1,236 @@
+
+#include <stdio.h>
+#ifdef sys5
+#include <sys/termio.h>
+#else
+#include <sgtty.h>
+#endif
+#include <signal.h>
+#include <sys/jioctl.h>
+#include <setjmp.h>
+#include "dmdcodes.h"
+
+static jmp_buf jenv;
+int jerq;
+static char prooftty[] = "/dev/tty";
+#ifdef sys5
+static struct termio sttybuf, sttysave;
+#else
+static struct sgttyb modes, savetty;
+#endif
+static int termraw;
+
+void
+sighup()
+{
+ putchar(DMD_EXIT);
+ exit(1);
+}
+
+dmdstart()
+{
+ char command[256];
+ int ismpx;
+
+ signal(SIGHUP, sighup);
+
+ if ((jerq = open(prooftty, 2)) < 0) {
+ error(1, 0, prooftty);
+ exit(1);
+ }
+ if (ioctl(jerq, JMPX, 0) == -1)
+ ismpx = 0;
+ else
+ ismpx = 1;
+
+#ifdef sys5
+ ioctl(jerq, TCGETA, &sttysave);
+ sttybuf.c_iflag = IGNBRK;
+ sttybuf.c_cflag = (sttysave.c_cflag & (CBAUD | CLOCAL)) | CS8 | CREAD;
+ sttybuf.c_cc[VMIN] = 1;
+ (void)ioctl(jerq, TCSETAW, &sttybuf);
+#else
+ ioctl(jerq, TIOCGETP, &modes);
+ savetty = modes;
+ modes.sg_flags |= RAW;
+ modes.sg_flags &= ~ECHO;
+ ioctl(jerq, TIOCSETP, &modes);
+#endif
+ termraw++;
+#define Proofm "/usr/local/lib/dvidmd.m"
+#define Proofj "/usr/local/lib/dvidmd.j"
+#define X32ld "32ld"
+ if (!isatty(1) || !verify()) {
+ sprintf(command, "%s %s < %s > %s", X32ld,
+ ismpx ? Proofm : Proofj, prooftty, prooftty);
+ if (system(command) != 0)
+ error(1, 0, "%s failed", X32ld);
+ if (!verify())
+ error(1, 0, "could not sync display");
+ }
+}
+
+void
+alarmcatch(sig)
+{
+ longjmp(jenv, 1);
+}
+
+verify()
+{
+ char c;
+
+ signal(SIGALRM, alarmcatch);
+ c = DMD_TYPESET;
+ write(jerq, &c, 1);
+ if (setjmp(jenv))
+ return(0);
+ alarm(2);
+ read(jerq, &c, 1);
+ alarm(0);
+ return (c == DMD_ACK);
+}
+
+pagecmd()
+{
+ int i, c;
+
+ switch (c = inkbd()) {
+ case DMD_EXIT:
+ exit(0);
+ case DMD_PAGE:
+ i = inkbd();
+ if (i > 127)
+ i -= 256;
+ return(i);
+ default:
+ error(1, 0, "bad pagecmd response 0%o", c);
+ }
+ /*NOTREACHED*/
+}
+
+inkbd()
+{
+ char c;
+ register i;
+
+ fflush(stdout);
+ if (read(jerq, &c, 1) != 1)
+ c = 4; /* ^D, looks like EOF */
+ i = c & 0377;
+ return(i);
+}
+
+exit(n)
+{
+ fflush(stdout);
+ fflush(stderr);
+ if (termraw) {
+#ifdef sys5
+ (void)ioctl(jerq, TCSETAW, &sttysave);
+#else
+ ioctl(jerq, TIOCSETP, &savetty);
+#endif
+ }
+ _exit(n);
+}
+
+#ifndef lint
+static char rcsid[] = "$Header: error.c,v 2.5 86/11/08 17:09:39 chris Exp $";
+#endif
+
+/*
+ * Print an error message with an optional system error number, and
+ * optionally quit.
+ *
+ * THIS CODE IS SYSTEM DEPENDENT UNLESS varargs WORKS WITH vprintf
+ * OR _doprnt. It should work properly under System V using vprintf.
+ * (If you have vprintf, define HAVE_VPRINTF.)
+ */
+
+#include <varargs.h>
+
+#ifdef lint
+
+/* VARARGS3 ARGSUSED */
+error(quit, e, fmt) int quit, e; char *fmt; {;}
+
+/* VARARGS1 ARGSUSED */
+panic(fmt) char *fmt; { exit(1); /* NOTREACHED */ }
+
+#else lint
+
+extern char *ProgName;
+extern int errno;
+extern char *sys_errlist[];
+extern int sys_nerr;
+
+/*
+ * We can be civlised by calling legitimate routines.
+ */
+error(va_alist)
+ va_dcl
+{
+ va_list l;
+ int quit, e;
+ char *fmt;
+
+ if (termraw)
+ putchar(DMD_ASCII);
+ (void) fflush(stdout); /* sync error messages */
+ (void) fprintf(stderr, "%s: ", ProgName);
+ va_start(l);
+ /* pick up the constant arguments: quit, errno, printf format */
+ quit = va_arg(l, int);
+ e = va_arg(l, int);
+ if (e < 0)
+ e = errno;
+ fmt = va_arg(l, char *);
+#if defined(sys5) || defined(HAVE_VPRINTF)
+ (void) vfprintf(stderr, fmt, l);
+#else
+ _doprnt(fmt, l, stderr);
+#endif
+ va_end(l);
+ if (e) {
+ if (e < sys_nerr)
+ (void) fprintf(stderr, ": %s", sys_errlist[e]);
+ else
+ (void) fprintf(stderr, ": Unknown error code %d", e);
+ }
+ (void) putc('\n', stderr);
+ (void) fflush(stderr); /* just in case */
+ if (termraw)
+ putchar(0);
+ if (quit) {
+ if (termraw)
+ putchar(DMD_TERM);
+ exit(quit);
+ }
+}
+
+panic(va_alist)
+ va_dcl
+{
+ va_list l;
+ char *fmt;
+
+ if (termraw)
+ putchar(DMD_TERM);
+ (void) fflush(stdout);
+ (void) fprintf(stderr, "%s: panic: ", ProgName);
+ va_start(l);
+ /* pick up the constant argument: printf format */
+ fmt = va_arg(l, char *);
+#if defined(sys5) || defined(HAVE_VPRINTF)
+ (void) vfprintf(stderr, fmt, l);
+#else
+ _doprnt(fmt, l, stderr);
+#endif
+ va_end(l);
+ (void) putc('\n', stderr);
+ (void) fflush(stderr);
+ abort();
+}
+
+#endif /* lint */