[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Nmh-commits] [SCM] The nmh Mail Handling System branch, master, updated
From: |
David Levine |
Subject: |
[Nmh-commits] [SCM] The nmh Mail Handling System branch, master, updated. f4aa78ac924c0947683833dd248e89d521910869 |
Date: |
Sun, 25 Dec 2011 21:00:58 +0000 |
This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "The nmh Mail Handling System".
The branch, master has been updated
via f4aa78ac924c0947683833dd248e89d521910869 (commit)
from 31cba404636730df219dd009ca5893ccc56d46af (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
http://git.savannah.gnu.org/cgit/nmh.git/commit/?id=f4aa78ac924c0947683833dd248e89d521910869
commit f4aa78ac924c0947683833dd248e89d521910869
Author: David Levine <address@hidden>
Date: Sun Dec 25 15:00:49 2011 -0600
Removed unused vmh.c and wmh.c.
diff --git a/man/Makefile.in b/man/Makefile.in
index c94ab00..75eb9c1 100644
--- a/man/Makefile.in
+++ b/man/Makefile.in
@@ -74,9 +74,6 @@ MAN1 = $(MAN1SRC:.=.$(manext1))
MAN5 = $(MAN5SRC:.=.$(manext5))
MAN8 = $(MAN8SRC:.=.$(manext8))
-# Since vmh is not built or distributed, neither should vmh.1 be
-# MANEXTRA = vmh.
-
# source for man pages
DIST_MANSRC = $(MAN1SRC) $(MAN5SRC) $(MAN8SRC)
DIST_MAN = $(DIST_MANSRC:.=.man)
diff --git a/man/msh.man b/man/msh.man
index 93d0282..7d0d131 100644
--- a/man/msh.man
+++ b/man/msh.man
@@ -212,21 +212,6 @@ to mark all messages as seen and then
For speedy type\-in, this command is often abbreviated as just
.BR qe .
.PP
-When invoked from
-.BR vmh ,
-another special feature is enabled:
-The `topcur' switch directs
-.B msh
-to have the current message
-\*(lqtrack\*(rq the top line of the
-.B vmh
-scan window. Normally,
-.B msh
-has the current message \*(lqtrack\*(rq the center of the window
-(under
-.BR \-notopcur ,
-which is the default).
-.PP
.B msh
supports an output redirection facility. Commands may be
followed by one of
diff --git a/man/vmh.man b/man/vmh.man
deleted file mode 100644
index 9fe9220..0000000
--- a/man/vmh.man
+++ /dev/null
@@ -1,101 +0,0 @@
-.\"
-.\" %nmhwarning%
-.\"
-.TH VMH %manext1% "%nmhdate%" MH.6.8 [%nmhversion%]
-.SH NAME
-vmh \- visual front-end to nmh
-.SH SYNOPSIS
-.in +.5i
-.ti -.5i
-vmh
-\%[\-prompt\ string]
-\%[\-vmhproc\ program] \%[\-novmhproc]
-.br
-\%[switches\ for\ \fIvmhproc\fR]
-\%[\-version]
-\%[\-help]
-.in -.5i
-.SH DESCRIPTION
-\fIvmh\fR is a program which implements the server side of the \fInmh\fR
-window management protocol and uses \fIcurses\fR\0(3) routines to maintain
-a split\-screen interface to any program which implements the client
-side of the protocol. This latter program, called the \fIvmhproc\fR,
-is specified using the `\-vmhproc\ program' switch.
-
-The upshot of all this is that one can run \fImsh\fR on a display terminal
-and get a nice visual interface. To do this, for example, just add
-the line
-
-.ti +.5i
-mshproc: vmh
-
-to your \&.mh\(ruprofile. (This takes advantage of the fact that
-\fImsh\fR is the default \fIvmhproc\fR for \fIvmh\fR.)
-
-In order to facilitate things, if the `\-novmhproc' switch is given,
-and \fIvmh\fR can't run on the user's terminal, the \fIvmhproc\fR is
-run directly without the window management protocol.
-
-After initializing the protocol, \fIvmh\fR prompts the user for a command
-to be given to the client. Usually, this results in output being sent to
-one or more windows. If a output to a window would cause it to scroll,
-\fIvmh\fR prompts the user for instructions, roughly permitting the
-capabilities of \fIless\fR or \fImore\fR (e.g., the ability to scroll
-backwards and forwards):
-
-.nf
-.in +.5i
-.ta \w'RETURN 'u +\w'* 'u
-SPACE advance to the next windowful
-RETURN * advance to the next line
-y * retreat to the previous line
-d * advance to the next ten lines
-u * retreat to the previous ten lines
-g * go to an arbitrary line
- (preceed g with the line number)
-G * go to the end of the window
- (if a line number is given, this acts like `g')
-CTRL\-L refresh the entire screen
-h print a help message
-q abort the window
-.re
-.in -.5i
-.fi
-
-(A `*' indicates that a numeric prefix is meaningful for this command.)
-
-Note that if a command resulted in more than one window's worth of
-information being displayed, and you allow the command which is generating
-information for the window to gracefully finish (i.e., you don't use
-the `q' command to abort information being sent to the window), then
-\fIvmh\fR will give you one last change to peruse the window. This is
-useful for scrolling back and forth. Just type `q' when you're done.
-
-To abnormally terminate \fIvmh\fR (without core dump), use <QUIT>
-(usually CTRL\-\\). For instance, this does the \*(lqright\*(rq thing
-with \fIbbc\fR and \fImsh\fR.
-
-.Fi
-^$HOME/\&.mh\(ruprofile~^The user profile
-.Pr
-^Path:~^To determine the user's nmh directory
-.Sa
-msh(1)
-.De
-`\-prompt\ (vmh)\ '
-.Ds
-`\-vmhproc\ msh'
-.Co
-None
-.Bu
-The argument to the `\-prompt' switch must be interpreted as a single
-token by the shell that invokes \fIvmh\fR. Therefore, one must usually
-place the argument to this switch inside double\-quotes.
-
-At present, there is no way to pass signals (e.g., interrupt, quit) to
-the client. However, generating QUIT when \fIvmh\fR is reading a command
-from the terminal is sufficient to tell the client to go away quickly.
-
-Acts strangely (loses peer or botches window management protocol with
-peer) on random occasions.
-.En
diff --git a/uip/Makefile.in b/uip/Makefile.in
index 370fc15..5b5ed02 100644
--- a/uip/Makefile.in
+++ b/uip/Makefile.in
@@ -55,9 +55,6 @@ CMDS = ali anno burst comp dist flist folder forw install-mh
mark mhbuild \
msh new packf pick prompter refile repl rmf rmm scan send show \
sortm whatnow whom
-## removed this from CMDS until I can fix it
-## OTHERCMDS = vmh
-
# commands that are links to other commands
LCMDS = flists folders next prev
@@ -79,8 +76,7 @@ SRCS = ali.c aliasbr.c anno.c annosbr.c ap.c burst.c comp.c
\
post.c prompter.c rcvdist.c rcvpack.c rcvstore.c rcvtty.c \
refile.c repl.c replsbr.c rmf.c rmm.c scan.c scansbr.c send.c \
sendsbr.c show.c slocal.c sortm.c spost.c termsbr.c viamail.c \
- vmh.c vmhsbr.c vmhtest.c whatnow.c whatnowproc.c whatnowsbr.c \
- whom.c wmh.c
+ vmhsbr.c whatnow.c whatnowproc.c whatnowsbr.c whom.c
# auxiliary files
AUX = Makefile.in
@@ -235,9 +231,6 @@ spost: spost.o aliasbr.o $(LOCALLIBS)
viamail: viamail.o mhmisc.o mhoutsbr.o sendsbr.o annosbr.o distsbr.o
$(LOCALLIBS)
$(LINK) viamail.o mhmisc.o mhoutsbr.o sendsbr.o annosbr.o distsbr.o
$(LINKLIBS) $(TERMLIB)
-vmh: vmh.o vmhsbr.o $(LOCALLIBS)
- $(LINK) vmh.o vmhsbr.o $(LINKLIBS) $(TERMLIB)
-
whatnow: whatnow.o whatnowsbr.o sendsbr.o annosbr.o distsbr.o $(LOCALLIBS)
$(LINK) whatnow.o whatnowsbr.o sendsbr.o annosbr.o distsbr.o $(LINKLIBS)
diff --git a/uip/vmh.c b/uip/vmh.c
deleted file mode 100644
index 908df85..0000000
--- a/uip/vmh.c
+++ /dev/null
@@ -1,1515 +0,0 @@
-
-/*
- * vmh.c -- visual front-end to nmh
- *
- * This code is Copyright (c) 2002, by the authors of nmh. See the
- * COPYRIGHT file in the root directory of the nmh distribution for
- * complete copyright information.
- */
-
-#include <h/mh.h>
-#include <h/signals.h>
-
-#if 0
-#if defined(SYS5) && !defined(TERMINFO)
-/*
- * Define TERMINFO if you have it.
- * You get it automatically if you're running SYS5, and you don't get
- * it if you're not. (If you're not SYS5, you probably have termcap.)
- * We distinguish TERMINFO from SYS5 because in this file SYS5 really
- * means "AT&T line discipline" (termio, not sgttyb), whereas terminfo
- * is quite a separate issue.
- */
-#define TERMINFO 1
-#endif
-#endif
-
-/*
- * TODO:
- * 1) Pass signals to client during execution
- * 2) Figure out a way for the user to say how big the Scan/Display
- * windows should be.
- * 3) If curses ever gets fixed, then XYZ code can be removed
- */
-
-#include <curses.h>
-
-#ifdef ncr
-# define _SYS_REG_H /* NCR redefines "ERR" in <sys/reg.h> */
-#endif
-
-#undef OK /* tricky */
-
-/* removed for right now */
-#if 0
-#ifdef TERMINFO
-# include <term.h> /* variables describing terminal capabilities */
-#endif /* TERMINFO */
-#endif
-
-#include <h/vmhsbr.h>
-#include <errno.h>
-#include <setjmp.h>
-#include <signal.h>
-
-#ifndef sigmask
-# define sigmask(s) (1 << ((s) - 1))
-#endif /* not sigmask */
-
-#ifdef ridge
-# undef SIGTSTP
-#endif /* ridge */
-
-#ifdef HAVE_WRITEV
-# include <sys/uio.h>
-#else
-struct iovec {
- char *iov_base;
- int iov_len;
-};
-#endif
-
-#ifdef hpux
-# include <termio.h>
-# define TCGETATTR /* tcgetattr() */
-#endif
-
-#ifdef BSD44
-# define USE_OLD_TTY
-# define _maxx maxx /* curses.h */
-# define _maxy maxy
-# define _curx curx /* curses.h */
-# define _cury cury
-void __cputchar __P((int));
-# undef _putchar
-# define _putchar __cputchar
-# include <sys/ioctl.h> /* sgttyb */
-#endif
-
-#define ALARM ((unsigned int) 10)
-#define PAUSE ((unsigned int) 2)
-
-#ifndef abs
-# define abs(a) ((a) > 0 ? (a) : -(a))
-#endif
-
-#define SMALLMOVE 1
-#define LARGEMOVE 10
-
-#define XYZ /* XXX */
-
-static struct swit switches[] = {
-#define PRMPTSW 0
- { "prompt string", 6 },
-#define PROGSW 1
- { "vmhproc program", 7 },
-#define NPROGSW 2
- { "novmhproc", 9 },
-#define VERSIONSW 3
- { "version", 0 },
-#define HELPSW 4
- { "help", 0 },
- { NULL, 0 }
-};
-
- /* PEERS */
-static int PEERpid = NOTOK;
-
-static jmp_buf PEERctx;
-
- /* WINDOWS */
-static char *myprompt = "(%s) ";
-
-static WINDOW *Scan;
-static WINDOW *Status;
-static WINDOW *Display;
-static WINDOW *Command;
-
-#define NWIN 3
-static int numwins;
-WINDOW *windows[NWIN + 1];
-
-
- /* LINES */
-
-struct line {
- int l_no;
- char *l_buf;
- struct line *l_prev;
- struct line *l_next;
-};
-
-static struct line *lhead = NULL;
-static struct line *ltop = NULL;
-static struct line *ltail = NULL;
-
-static int did_less = 0;
-static int smallmove = SMALLMOVE;
-static int largemove = LARGEMOVE;
-
-
- /* TTYS */
-
-static int tty_ready = NOTOK;
-
-static int intrc;
-
-#ifndef SYS5
-# define ERASE sg.sg_erase
-# define KILL sg.sg_kill
-static struct sgttyb sg;
-
-#define EOFC tc.t_eofc
-#define INTR tc.t_intrc
-static struct tchars tc;
-#else /* SYS5 */
-# define ERASE sg.c_cc[VERASE]
-# define KILL sg.c_cc[VKILL]
-# define EOFC sg.c_cc[VEOF]
-# define INTR sg.c_cc[VINTR]
-static struct termio sg;
-#endif /* SYS5 */
-
-#ifndef TIOCGLTC
-# define WERASC ('W' & 037)
-#else /* TIOCGLTC */
-# ifndef SVR4
-# define WERASC ltc.t_werasc
-static struct ltchars ltc;
-# else /* SVR4 */
-# define WERASC sg.c_cc[VWERASE]
-# undef TIOCGLTC /* the define exists, but struct ltchars doesn't */
-# endif
-#endif /* TIOCGLTC */
-
-
-#if !defined(SYS5) && !defined(BSD44)
-int _putchar();
-#endif /* not SYS5 */
-
-#ifdef SIGTSTP
-char *tgoto();
-#endif /* SIGTSTP */
-
- /* SIGNALS */
-static RETSIGTYPE ALRMser(int);
-static RETSIGTYPE PIPEser(int);
-static RETSIGTYPE SIGser(int);
-#ifdef SIGTSTP
-static RETSIGTYPE TSTPser(int);
-#endif /* SIGTSTP */
-
-
- /* MISCELLANY */
-
-/*
- * static prototypes
- */
-static void adorn (char *, char *, ...);
-
-static vmh(), lreset(), linsert(), ladvance(), lretreat(), lgo();
-static TTYon(), TTYoff(), foreground();
-static int PEERinit(), pINI(), pLOOP(), pTTY(), pWIN(), WINinit();
-static int WINgetstr(), WINless(), WINputc(), TTYinit(), pWINaux();
-
-
-int
-main (int argc, char **argv)
-{
- int vecp = 1, nprog = 0;
- char *cp, buffer[BUFSIZ];
- char **argp, **arguments, *vec[MAXARGS];
-
-#ifdef LOCALE
- setlocale(LC_ALL, "");
-#endif
- invo_name = r1bindex (argv[0], '/');
-
- /* read user profile/context */
- context_read();
-
- arguments = getarguments (invo_name, argc, argv, 1);
- argp = arguments;
-
- while ((cp = *argp++))
- if (*cp == '-')
- switch (smatch (++cp, switches)) {
- case AMBIGSW:
- ambigsw (cp, switches);
- done (1);
- case UNKWNSW:
- vec[vecp++] = --cp;
- continue;
-
- case HELPSW:
- snprintf (buffer, sizeof(buffer), "%s [switches for
vmhproc]",
- invo_name);
- print_help (buffer, switches, 1);
- done (1);
- case VERSIONSW:
- print_version(invo_name);
- done (1);
-
- case PRMPTSW:
- if (!(myprompt = *argp++) || *myprompt == '-')
- adios (NULL, "missing argument to %s", argp[-2]);
- continue;
-
- case PROGSW:
- if (!(vmhproc = *argp++) || *vmhproc == '-')
- adios (NULL, "missing argument to %s", argp[-2]);
- continue;
- case NPROGSW:
- nprog++;
- continue;
- }
- else
- vec[vecp++] = cp;
-
- if (TTYinit (nprog) == NOTOK || WINinit (nprog) == NOTOK) {
- vec[vecp] = NULL;
-
- vec[0] = r1bindex (vmhproc, '/');
- execvp (vmhproc, vec);
- adios (vmhproc, "unable to exec");
- }
- TTYoff ();
- PEERinit (vecp, vec);
- TTYon ();
-
- vmh ();
-
- return done (0);
-}
-
-
-static void
-vmh (void)
-{
- char buffer[BUFSIZ];
-
- for (;;) {
- pLOOP (RC_QRY, NULL);
-
- wmove (Command, 0, 0);
- wprintw (Command, myprompt, invo_name);
- wclrtoeol (Command);
- wrefresh (Command);
-
- switch (WINgetstr (Command, buffer)) {
- case NOTOK:
- break;
-
- case OK:
- done (0); /* NOTREACHED */
-
- default:
- if (*buffer)
- pLOOP (RC_CMD, buffer);
- break;
- }
- }
-}
-
-/* PEERS */
-
-static int
-PEERinit (int vecp, char *vec[])
-{
- int pfd0[2], pfd1[2];
- char buf1[BUFSIZ], buf2[BUFSIZ];
-
- if (pipe (pfd0) == NOTOK || pipe (pfd1) == NOTOK)
- adios ("pipe", "unable to");
-#ifdef hpux
- switch (PEERpid = fork ()) {
- /*
- * Calling vfork() and then another routine [like close()] before
- * an exec() messes up the stack frame, causing crib death.
- * Use fork() instead.
- */
-#else /* not hpux */
- switch (PEERpid = vfork ()) {
-#endif /* not hpux */
- case NOTOK:
- adios ("vfork", "unable to");/* NOTREACHED */
-
- case OK:
- close (pfd0[0]);
- close (pfd1[1]);
-
- vec[vecp++] = "-vmhread";
- snprintf (buf1, sizeof(buf1), "%d", pfd1[0]);
- vec[vecp++] = buf1;
- vec[vecp++] = "-vmhwrite";
- snprintf (buf2, sizeof(buf2), "%d", pfd0[1]);
- vec[vecp++] = buf2;
- vec[vecp] = NULL;
-
- SIGNAL (SIGINT, SIG_DFL);
- SIGNAL (SIGQUIT, SIG_DFL);
-
- vec[0] = r1bindex (vmhproc, '/');
- execvp (vmhproc, vec);
- perror (vmhproc);
- _exit (-1); /* NOTREACHED */
-
- default:
- close (pfd0[1]);
- close (pfd1[0]);
-
- rcinit (pfd0[0], pfd1[1]);
- return pINI ();
- }
-}
-
-
-static int
-pINI (void)
-{
- int len, buflen;
- char *bp, buffer[BUFSIZ];
- struct record rcs;
- register struct record *rc = &rcs;
- register WINDOW **w;
-
- initrc (rc);
-
- /* Get buffer ready to go */
- bp = buffer;
- buflen = sizeof(buffer);
-
- snprintf (bp, buflen, "%d %d", RC_VRSN, numwins);
- len = strlen (bp);
- bp += len;
- buflen -= len;
-
- for (w = windows; *w; w++) {
- snprintf (bp, buflen, " %d", (*w)->_maxy);
- len = strlen (bp);
- bp += len;
- buflen -= len;
- }
-
- switch (str2rc (RC_INI, buffer, rc)) {
- case RC_ACK:
- return OK;
-
- case RC_ERR:
- if (rc->rc_len)
- adios (NULL, "%s", rc->rc_data);
- else
- adios (NULL, "pINI peer error");
-
- case RC_XXX:
- adios (NULL, "%s", rc->rc_data);
-
- default:
- adios (NULL, "pINI protocol screw-up");
- }
-/* NOTREACHED */
-}
-
-
-static int
-pLOOP (char *code, char *str)
-{
- int i;
- struct record rcs;
- register struct record *rc = &rcs;
-
- initrc (rc);
-
- str2peer (code, str);
- for (;;)
- switch (peer2rc (rc)) {
- case RC_TTY:
- if (pTTY (rc) == NOTOK)
- return NOTOK;
- break;
-
- case RC_WIN:
- if (sscanf (rc->rc_data, "%d", &i) != 1
- || i <= 0
- || i > numwins) {
- fmt2peer (RC_ERR, "no such window \"%s\"", rc->rc_data);
- return NOTOK;
- }
- if (pWIN (windows[i - 1]) == NOTOK)
- return NOTOK;
- break;
-
- case RC_EOF:
- return OK;
-
- case RC_ERR:
- if (rc->rc_len)
- adorn (NULL, "%s", rc->rc_data);
- else
- adorn (NULL, "pLOOP(%s) peer error",
- code == RC_QRY ? "QRY" : "CMD");
- return NOTOK;
-
- case RC_FIN:
- if (rc->rc_len)
- adorn (NULL, "%s", rc->rc_data);
- rcdone ();
- i = pidwait (PEERpid, OK);
- PEERpid = NOTOK;
- done (i);
-
- case RC_XXX:
- adios (NULL, "%s", rc->rc_data);
-
- default:
- adios (NULL, "pLOOP(%s) protocol screw-up",
- code == RC_QRY ? "QRY" : "CMD");
- }
-}
-
-
-static int
-pTTY (struct record *r)
-{
- SIGNAL_HANDLER hstat, istat, qstat, tstat;
- struct record rcs;
- register struct record *rc = &rcs;
-
- initrc (rc);
-
- TTYoff ();
-
- /* should be changed to block instead of ignore */
- hstat = SIGNAL (SIGHUP, SIG_IGN);
- istat = SIGNAL (SIGINT, SIG_IGN);
- qstat = SIGNAL (SIGQUIT, SIG_IGN);
- tstat = SIGNAL (SIGTERM, SIG_IGN);
-
- rc2rc (RC_ACK, 0, NULL, rc);
-
- SIGNAL (SIGHUP, hstat);
- SIGNAL (SIGINT, istat);
- SIGNAL (SIGQUIT, qstat);
- SIGNAL (SIGTERM, tstat);
-
- TTYon ();
-
- if (r->rc_len && strcmp (r->rc_data, "FAST") == 0)
- goto no_refresh;
-
-#ifdef SIGTSTP
- SIGNAL (SIGTSTP, SIG_IGN);
-#endif
-
-#ifndef TERMINFO
- if (SO)
- tputs (SO, 0, _putchar);
-#else /* TERMINFO */
- putp(enter_standout_mode);
-#endif /* TERMINFO */
- fprintf (stdout, "Type any key to continue... ");
- fflush (stdout);
-#ifndef TERMINFO
- if (SE)
- tputs (SE, 0, _putchar);
-#else /* TERMINFO */
- putp(exit_standout_mode);
-#endif /* TERMINFO */
- getc (stdin);
-#ifdef SIGTSTP
- SIGNAL (SIGTSTP, TSTPser);
-#endif /* SIGTSTP */
-
- wrefresh (curscr);
-
-no_refresh: ;
- switch (rc->rc_type) {
- case RC_EOF:
- rc2peer (RC_ACK, 0, NULL);
- return OK;
-
- case RC_ERR:
- if (rc->rc_len)
- adorn (NULL, "%s", rc->rc_data);
- else
- adorn (NULL, "pTTY peer error");
- return NOTOK;
-
- case RC_XXX:
- adios (NULL, "%s", rc->rc_data);
-
- default:
- adios (NULL, "pTTY protocol screw-up");
- }
-/* NOTREACHED */
-}
-
-
-static int
-pWIN (WINDOW *w)
-{
- int i;
-
- did_less = 0;
- if ((i = pWINaux (w)) == OK && did_less)
- WINless (w, 1);
-
- lreset ();
-
- return i;
-}
-
-
-static int
-pWINaux (WINDOW *w)
-{
- register int n;
- int eol;
- register char c, *bp;
- struct record rcs;
- register struct record *rc = &rcs;
-
- initrc (rc);
-
- werase (w);
- wmove (w, 0, 0);
-#ifdef XYZ
- if (w == Status)
- wstandout (w);
-#endif /* XYZ */
-
- for (eol = 0;;)
- switch (rc2rc (RC_ACK, 0, NULL, rc)) {
- case RC_DATA:
- if (eol && WINputc (w, '\n') == ERR && WINless (w, 0))
- goto flush;
- for (bp = rc->rc_data, n = rc->rc_len; n-- > 0; ) {
- if ((c = *bp++) == '\n')
- linsert (w);
- if (WINputc (w, c) == ERR)
- if (n == 0 && c == '\n')
- eol++;
- else
- if (WINless (w, 0)) {
-flush: ;
- fmt2peer (RC_ERR, "flush window");
-#ifdef XYZ /* should NEVER happen... */
- if (w == Status)
- wstandend (w);
-#endif /* XYZ */
- wrefresh (w);
- return NOTOK;
- }
- }
- break;
-
- case RC_EOF:
- rc2peer (RC_ACK, 0, NULL);
-#ifdef XYZ
- if (w == Status)
- wstandend (w);
-#endif /* XYZ */
- wrefresh (w);
- return OK;
-
- case RC_ERR:
- if (rc->rc_len)
- adorn (NULL, "%s", rc->rc_data);
- else
- adorn (NULL, "pWIN peer error");
- return NOTOK;
-
- case RC_XXX:
- adios (NULL, "%s", rc->rc_data);
-
- default:
- adios (NULL, "pWIN protocol screw-up");
- }
-/* NOTREACHED */
-}
-
-
-static int
-pFIN (void)
-{
- int status;
-
- if (PEERpid <= OK)
- return OK;
-
- rc2peer (RC_FIN, 0, NULL);
- rcdone ();
-
- switch (setjmp (PEERctx)) {
- case OK:
- SIGNAL (SIGALRM, ALRMser);
- alarm (ALARM);
-
- status = pidwait (PEERpid, OK);
-
- alarm (0);
- break;
-
- default:
- kill (PEERpid, SIGKILL);
- status = NOTOK;
- break;
- }
- PEERpid = NOTOK;
-
- return status;
-}
-
-/* WINDOWS */
-
-static int
-WINinit (int nprog)
-{
- register int nlines, /* not "lines" because terminfo uses that */
- top,
- bottom;
-
- foreground ();
- if (initscr () == (WINDOW *) ERR)
- if (nprog)
- return NOTOK;
- else
- adios (NULL, "could not initialize terminal");
-#ifdef SIGTSTP
- SIGNAL (SIGTSTP, SIG_DFL);
-#endif /* SIGTSTP */
- sideground ();
-
-#ifndef TERMINFO
- if (CM == NULL)
-#else /* TERMINFO */
- if (cursor_address == NULL) /* assume mtr wanted "cm", not "CM" */
-#endif /* TERMINFO */
- if (nprog)
- return NOTOK;
- else
- adios (NULL,
- "sorry, your terminal isn't powerful enough to run %s",
- invo_name);
-
-#ifndef TERMINFO
- if (tgetflag ("xt") || tgetnum ("sg") > 0)
- SO = SE = US = UE = NULL;
-#else /* TERMINFO */
-/*
- * If termcap mapped directly to terminfo, we'd use the following:
- * if (teleray_glitch || magic_cookie_glitch > 0)
- * enter_standout_mode = exit_standout_mode =
- * enter_underline_mode = exit_underline_mode = NULL;
- * But terminfo does the right thing so we don't have to resort to that.
- */
-#endif /* TERMINFO */
-
- if ((nlines = LINES - 1) < 11)
- adios (NULL, "screen too small");
- if ((top = nlines / 3 + 1) > LINES / 4 + 2)
- top--;
- bottom = nlines - top - 2;
-
- numwins = 0;
- Scan = windows[numwins++] = newwin (top, COLS, 0, 0);
- Status = windows[numwins++] = newwin (1, COLS, top, 0);
-#ifndef XYZ
- wstandout (Status);
-#endif /* XYZ */
- Display = windows[numwins++] = newwin (bottom, COLS, top + 1, 0);
- Command = newwin (1, COLS - 1, top + 1 + bottom, 0);
- windows[numwins] = NULL;
-
- largemove = Display->_maxy / 2 + 2;
- return OK;
-}
-
-
-static int WINgetstr (WINDOW *w, char *buffer)
-{
- register int c;
- register char *bp;
-
- bp = buffer;
- *bp = 0;
-
- for (;;) {
- switch (c = toascii (wgetch (w))) {
- case ERR:
- adios (NULL, "wgetch lost");
-
- case '\f':
- wrefresh (curscr);
- break;
-
- case '\r':
- case '\n':
- *bp = 0;
- if (bp > buffer) {
- leaveok (curscr, FALSE);
- wmove (w, 0, w->_curx - (bp - buffer));
- wrefresh (w);
- leaveok (curscr, TRUE);
- }
- return DONE;
-
- default:
- if (c == intrc) {
- wprintw (w, " ");
- wstandout (w);
- wprintw (w, "Interrupt");
- wstandend (w);
- wrefresh (w);
- *buffer = 0;
- return NOTOK;
- }
- if (c == EOFC) {
- if (bp <= buffer)
- return OK;
- break;
- }
- if (c == ERASE) {
- if (bp <= buffer)
- continue;
- bp--, w->_curx--;
- wclrtoeol (w);
- break;
- }
- if (c == KILL) {
- if (bp <= buffer)
- continue;
- w->_curx -= bp - buffer;
- bp = buffer;
- wclrtoeol (w);
- break;
- }
- if (c == WERASC) {
- if (bp <= buffer)
- continue;
- do {
- bp--, w->_curx--;
- } while (isspace (*bp) && bp > buffer);
-
- if (bp > buffer) {
- do {
- bp--, w->_curx--;
- } while (!isspace (*bp) && bp > buffer);
- if (isspace (*bp))
- bp++, w->_curx++;
- }
- wclrtoeol (w);
- break;
- }
-
- if (c >= ' ' && c < '\177')
- waddch (w, *bp++ = c);
- break;
- }
-
- wrefresh (w);
- }
-}
-
-
-static int
-WINwritev (WINDOW *w, struct iovec *iov, int n)
-{
- register int i;
-
- werase (w);
- wmove (w, 0, 0);
- for (i = 0; i < n; i++, iov++)
- wprintw (w, "%*.*s", iov->iov_len, iov->iov_len, iov->iov_base);
- wrefresh (w);
-
- sleep (PAUSE);
-
- return OK;
-}
-
-
-static struct {
- char *h_msg;
- int *h_val;
-} hlpmsg[] = {
- " forward backwards", NULL,
- " ------- ---------", NULL,
- "next screen SPACE", NULL,
- "next %d line%s RETURN y", &smallmove,
- "next %d line%s EOT u", &largemove,
- "go g G", NULL,
- "", NULL,
- "refresh CTRL-L", NULL,
- "quit q", NULL,
-
- NULL, NULL
-};
-
-
-static int
-WINless (WINDOW *w, int fin)
-{
- register int c, i, n;
- char *cp;
- register struct line *lbottom;
- int nfresh, nwait;
-
-#ifdef notdef
- int nlatch;
-#endif
-
- did_less++;
-
- cp = NULL;
-#ifdef notdef
- if (fin)
- ltop = NULL;
-#endif /* notdef */
- lbottom = NULL;
- nfresh = 1;
- nwait = 0;
- wrefresh (w);
-
- for (;;) {
- if (nfresh || nwait) {
- nfresh = 0;
-#ifdef notdef
- nlatch = 1;
-
-once_only: ;
-#endif /* notdef */
- werase (w);
- wmove (w, 0, 0);
-
- if (ltop == NULL)
- if (fin) {
- lgo (ltail->l_no - w->_maxy + 1);
- if (ltop == NULL)
- ltop = lhead;
- }
- else
- ltop = lbottom && lbottom->l_prev ? lbottom->l_prev
- : lbottom;
-
- for (lbottom = ltop; lbottom; lbottom = lbottom->l_next)
- if (waddstr (w, lbottom->l_buf) == ERR
- || waddch (w, '\n') == ERR)
- break;
- if (lbottom == NULL)
- if (fin) {
-#ifdef notdef
- if (nlatch && (ltail->l_no >= w->_maxy)) {
- lgo (ltail->l_no - w->_maxy + 1);
- nlatch = 0;
- goto once_only;
- }
-#endif /* notdef */
- lbottom = ltail;
- while (waddstr (w, "~\n") != ERR)
- continue;
- }
- else {
- wrefresh (w);
- return 0;
- }
-
- if (!nwait)
- wrefresh (w);
- }
-
- wmove (Command, 0, 0);
- if (cp) {
- wstandout (Command);
- wprintw (Command, "%s", cp);
- wstandend (Command);
- cp = NULL;
- }
- else
- wprintw (Command, fin ? "top:%d bot:%d end:%d" : "top:%d bot:%d",
- ltop->l_no, lbottom->l_no, ltail->l_no);
- wprintw (Command, ">> ");
- wclrtoeol (Command);
- wrefresh (Command);
-
- c = toascii (wgetch (Command));
-
- werase (Command);
- wrefresh (Command);
-
- if (nwait) {
- nwait = 0;
- wrefresh (w);
- }
-
- n = 0;
-again: ;
- switch (c) {
- case ' ':
- ltop = lbottom->l_next;
- nfresh++;
- break;
-
- case '\r':
- case '\n':
- case 'e':
- case 'j':
- if (n)
- smallmove = n;
- if (ladvance (smallmove))
- nfresh++;
- break;
-
- case 'y':
- case 'k':
- if (n)
- smallmove = n;
- if (lretreat (smallmove))
- nfresh++;
- break;
-
- case 'd':
- eof: ;
- if (n)
- largemove = n;
- if (ladvance (largemove))
- nfresh++;
- break;
-
- case 'u':
- if (n)
- largemove = n;
- if (lretreat (largemove))
- nfresh++;
- break;
-
- case 'g':
- if (lgo (n ? n : 1))
- nfresh++;
- break;
-
- case 'G':
- if (lgo (n ? n : ltail->l_no - w->_maxy + 1))
- nfresh++;
- break;
-
- case '\f':
- case 'r':
- wrefresh (curscr);
- break;
-
- case 'h':
- case '?':
- werase (w);
- wmove (w, 0, 0);
- for (i = 0; hlpmsg[i].h_msg; i++) {
- if (hlpmsg[i].h_val)
- wprintw (w, hlpmsg[i].h_msg, *hlpmsg[i].h_val,
- *hlpmsg[i].h_val != 1 ? "s" : "");
- else
- waddstr (w, hlpmsg[i].h_msg);
- waddch (w, '\n');
- }
- wrefresh (w);
- nwait++;
- break;
-
- case 'q':
- return 1;
-
- default:
- if (c == EOFC)
- goto eof;
-
- if (isdigit (c)) {
- wmove (Command, 0, 0);
- i = 0;
- while (isdigit (c)) {
- wprintw (Command, "%c", c);
- wrefresh (Command);
- i = i * 10 + c - '0';
- c = toascii (wgetch (Command));
- }
- werase (Command);
- wrefresh (Command);
-
- if (i > 0) {
- n = i;
- goto again;
- }
- cp = "bad number";
- }
- else
- cp = "not understood";
- break;
- }
- }
-}
-
-
-static int
-WINputc (WINDOW *w, char c)
-{
- register int x, y;
-
- switch (c) {
- default:
- if (!isascii (c)) {
- if (WINputc (w, 'M') == ERR || WINputc (w, '-') == ERR)
- return ERR;
- c = toascii (c);
- }
- else
- if (c < ' ' || c == '\177') {
- if (WINputc (w, '^') == ERR)
- return ERR;
- c ^= 0100;
- }
- break;
-
- case '\t':
- case '\n':
- break;
- }
-
- if (w != Scan)
- return waddch (w, c);
-
- if ((x = w->_curx) < 0 || x >= w->_maxx
- || (y = w->_cury) < 0 || y >= w->_maxy)
- return DONE;
-
- switch (c) {
- case '\t':
- for (x = 8 - (x & 0x07); x > 0; x--)
- if (WINputc (w, ' ') == ERR)
- return ERR;
- break;
-
- case '\n':
- if (++y < w->_maxy)
- waddch (w, c);
- else
- wclrtoeol (w);
- break;
-
- default:
- if (++x < w->_maxx)
- waddch (w, c);
- break;
- }
-
- return DONE;
-}
-
-/* LINES */
-
-static void
-lreset (void)
-{
- register struct line *lp, *mp;
-
- for (lp = lhead; lp; lp = mp) {
- mp = lp->l_next;
- free (lp->l_buf);
- free ((char *) lp);
- }
- lhead = ltop = ltail = NULL;
-}
-
-
-static void
-linsert (WINDOW *w)
-{
- register char *cp;
- register struct line *lp;
-
- if ((lp = (struct line *) calloc ((size_t) 1, sizeof *lp)) == NULL)
- adios (NULL, "unable to allocate line storage");
-
- lp->l_no = (ltail ? ltail->l_no : 0) + 1;
-#ifndef BSD44
- lp->l_buf = getcpy (w->_y[w->_cury]);
-#else
- lp->l_buf = getcpy (w->lines[w->_cury]->line);
-#endif
- for (cp = lp->l_buf + strlen (lp->l_buf) - 1; cp >= lp->l_buf; cp--)
- if (isspace (*cp))
- *cp = 0;
- else
- break;
-
- if (lhead == NULL)
- lhead = lp;
- if (ltop == NULL)
- ltop = lp;
- if (ltail)
- ltail->l_next = lp;
- lp->l_prev = ltail;
- ltail = lp;
-}
-
-
-static int
-ladvance (int n)
-{
- register int i;
- register struct line *lp;
-
- for (i = 0, lp = ltop; i < n && lp; i++, lp = lp->l_next)
- continue;
-
- if (ltop == lp)
- return 0;
-
- ltop = lp;
- return 1;
-}
-
-
-static int
-lretreat (int n)
-{
- register int i;
- register struct line *lp;
-
- for (i = 0, lp = ltop; i < n && lp; i++, lp = lp->l_prev)
- if (!lp->l_prev)
- break;
-
- if (ltop == lp)
- return 0;
-
- ltop = lp;
- return 1;
-}
-
-
-static int
-lgo (int n)
-{
- register int i, j;
- register struct line *lp;
-
- if ((i = n - (lp = lhead)->l_no)
- > (j = abs (n - (ltop ? ltop : ltail)->l_no)))
- i = j, lp = ltop ? ltop : ltail;
- if (i > (j = abs (ltail->l_no - n)))
- i = j, lp = ltail;
-
- if (n >= lp->l_no) {
- for (; lp; lp = lp->l_next)
- if (lp->l_no == n)
- break;
- }
- else {
- for (; lp; lp = lp->l_prev)
- if (lp->l_no == n)
- break;
- if (!lp)
- lp = lhead;
- }
-
- if (ltop == lp)
- return 0;
-
- ltop = lp;
- return 1;
-}
-
-/* TTYS */
-
-static int
-TTYinit (int nprog)
-{
- if (!isatty (fileno (stdin)) || !isatty (fileno (stdout)))
- if (nprog)
- return NOTOK;
- else
- adios (NULL, "not a tty");
-
- foreground ();
-#ifndef SYS5
- if (ioctl (fileno (stdin), TIOCGETP, (char *) &sg) == NOTOK)
- adios ("failed", "ioctl TIOCGETP");
- if (ioctl (fileno (stdin), TIOCGETC, (char *) &tc) == NOTOK)
- adios ("failed", "ioctl TIOCGETC");
-#else
-#ifdef TCGETATTR
- if( tcgetattr( fileno(stdin), &sg) == NOTOK)
- adios( "failed", "tcgetattr");
-#else /* SYS5 */
- if (ioctl (fileno (stdin), TCGETA, &sg) == NOTOK)
- adios ("failed", "ioctl TCGETA");
-#endif
-#endif
-#ifdef TIOCGLTC
- if (ioctl (fileno (stdin), TIOCGLTC, (char *) <c) == NOTOK)
- adios ("failed", "ioctl TIOCGLTC");
-#endif /* TIOCGLTC */
- intrc = INTR;
- sideground ();
-
- tty_ready = OK;
-
- SIGNAL (SIGPIPE, PIPEser);
-
- return OK;
-}
-
-
-static void
-TTYon (void)
-{
- if (tty_ready == DONE)
- return;
-
- INTR = NOTOK;
-#ifndef SYS5
- ioctl (fileno (stdin), TIOCSETC, (char *) &tc);
-#else /* SYS5 */
- ioctl (fileno (stdin), TCSETA, &sg);
-#endif /* SYS5 */
-
- crmode ();
- noecho ();
- nonl ();
- scrollok (curscr, FALSE);
-
- discard (stdin);
-
- tty_ready = DONE;
-
- SIGNAL (SIGHUP, SIGser);
- SIGNAL (SIGINT, SIGser);
- SIGNAL (SIGQUIT, SIGser);
-#ifdef SIGTSTP
- SIGNAL (SIGTSTP, TSTPser);
-#endif /* SIGTSTP */
-}
-
-
-static void
-TTYoff (void)
-{
- if (tty_ready == NOTOK)
- return;
-
- INTR = intrc;
-#ifndef SYS5
- ioctl (fileno (stdin), TIOCSETC, (char *) &tc);
-#else /* SYS5 */
- ioctl (fileno (stdin), TCSETA, &sg);
-#endif /* SYS5 */
-
- leaveok (curscr, TRUE);
- mvcur (0, COLS - 1, LINES - 1, 0);
- endwin ();
- if (tty_ready == DONE) {
-#ifndef TERMINFO
- if (CE)
- tputs (CE, 0, _putchar);
- else
-#else /* TERMINFO */
- putp(clr_eol);
-#endif /* TERMINFO */
- fprintf (stdout, "\r\n");
- }
- fflush (stdout);
-
- tty_ready = NOTOK;
-
- SIGNAL (SIGHUP, SIG_DFL);
- SIGNAL (SIGINT, SIG_DFL);
- SIGNAL (SIGQUIT, SIG_DFL);
-#ifdef SIGTSTP
- SIGNAL (SIGTSTP, SIG_DFL);
-#endif /* SIGTSTP */
-}
-
-
-static void
-foreground (void)
-{
-#ifdef TIOCGPGRP
- int pgrp, tpgrp;
- SIGNAL_HANDLER tstat;
-
- if ((pgrp = getpgrp()) == NOTOK)
- adios ("process group", "unable to determine");
- for (;;) {
- if (ioctl (fileno (stdin), TIOCGPGRP, (char *) &tpgrp) == NOTOK)
- adios ("tty's process group", "unable to determine");
- if (pgrp == tpgrp)
- break;
-
- tstat = SIGNAL (SIGTTIN, SIG_DFL);
- kill (0, SIGTTIN);
- SIGNAL (SIGTTIN, tstat);
- }
-
- SIGNAL (SIGTTIN, SIG_IGN);
- SIGNAL (SIGTTOU, SIG_IGN);
- SIGNAL (SIGTSTP, SIG_IGN);
-#endif /* TIOCGPGRP */
-}
-
-
-void
-sideground (void)
-{
-#ifdef TIOCGPGRP
- SIGNAL (SIGTTIN, SIG_DFL);
- SIGNAL (SIGTTOU, SIG_DFL);
- SIGNAL (SIGTSTP, SIG_DFL);
-#endif /* TIOCGPGRP */
-}
-
-/* SIGNALS */
-
-
-static RETSIGTYPE
-ALRMser (int sig)
-{
- longjmp (PEERctx, DONE);
-}
-
-
-#ifdef BSD42
-/* ARGSUSED */
-#endif /* BSD42 */
-
-static RETSIGTYPE
-PIPEser (int sig)
-{
-#ifndef RELIABLE_SIGNALS
- SIGNAL (sig, SIG_IGN);
-#endif
-
- adios (NULL, "lost peer");
-}
-
-
-static RETSIGTYPE
-SIGser (int sig)
-{
-#ifndef RELIABLE_SIGNALS
- SIGNAL (sig, SIG_IGN);
-#endif
-
- done (1);
-}
-
-
-#ifdef SIGTSTP
-static RETSIGTYPE
-TSTPser (int sig)
-{
-#ifndef TERMINFO
- tputs (tgoto (CM, 0, LINES - 1), 0, _putchar);
-#else /* TERMINFO */
- move(LINES - 1, 0); /* to lower left corner */
- clrtoeol(); /* clear bottom line */
- wrefresh(curscr); /* flush out everything */
-#endif /* TERMINFO */
- fflush (stdout);
-
- TTYoff ();
-#ifdef BSD42
- sigsetmask (sigblock (0) & ~sigmask (SIGTSTP));
-#endif /* BSD42 */
-
- kill (getpid (), sig);
-
-#ifdef BSD42
- sigblock (sigmask (SIGTSTP));
-#endif /* BSD42 */
- TTYon ();
-
- wrefresh (curscr);
-}
-#endif /* SIGTSTP */
-
-
-/* MISCELLANY */
-
-int
-done (int status)
-{
- TTYoff ();
- pFIN ();
-
- exit (status);
- return 1; /* dead code to satisfy the compiler */
-}
-
-
-static void
-adorn (char *what, char *fmt, ...)
-{
- va_list ap;
- char *cp;
-
- cp = invo_name;
- invo_name = NULL;
-
- va_start(ap, fmt);
- advertise (what, NULL, fmt, ap);
- va_end(ap);
-
- invo_name = cp;
-}
-
-
-void
-advertise (char *what, char *tail, char *fmt, va_list ap)
-{
- int eindex = errno;
- char buffer[BUFSIZ], err[BUFSIZ];
- struct iovec iob[20];
- register struct iovec *iov = iob;
-
- fflush (stdout);
- fflush (stderr);
-
- if (invo_name) {
- iov->iov_len = strlen (iov->iov_base = invo_name);
- iov++;
- iov->iov_len = strlen (iov->iov_base = ": ");
- iov++;
- }
-
- vsnprintf (buffer, sizeof(buffer), fmt, ap);
- iov->iov_len = strlen (iov->iov_base = buffer);
- iov++;
- if (what) {
- if (*what) {
- iov->iov_len = strlen (iov->iov_base = " ");
- iov++;
- iov->iov_len = strlen (iov->iov_base = what);
- iov++;
- iov->iov_len = strlen (iov->iov_base = ": ");
- iov++;
- }
- if (!(iov->iov_base = strerror (eindex))) {
- snprintf (err, sizeof(err), "Error %d", eindex);
- iov->iov_base = err;
- }
- iov->iov_len = strlen (iov->iov_base);
- iov++;
- }
- if (tail && *tail) {
- iov->iov_len = strlen (iov->iov_base = ", ");
- iov++;
- iov->iov_len = strlen (iov->iov_base = tail);
- iov++;
- }
- iov->iov_len = strlen (iov->iov_base = "\n");
- iov++;
-
- if (tty_ready == DONE)
- WINwritev (Display, iob, iov - iob);
- else
- writev (fileno (stderr), iob, iov - iob);
-}
-
diff --git a/uip/vmhtest.c b/uip/vmhtest.c
deleted file mode 100644
index 572bad5..0000000
--- a/uip/vmhtest.c
+++ /dev/null
@@ -1,324 +0,0 @@
-
-/*
- * vmhtest.c -- test out vmh protocol
- *
- * This code is Copyright (c) 2002, by the authors of nmh. See the
- * COPYRIGHT file in the root directory of the nmh distribution for
- * complete copyright information.
- */
-
-#include <h/mh.h>
-#include <h/vmhsbr.h>
-
-static struct swit switches[] = {
-#define READSW 0
- { "vmhread fd", 7 },
-#define WRITESW 1
- { "vmhwrite fd", 8 },
-#define VERSIONSW 2
- { "version", 0 },
-#define HELPSW 3
- { "help", 0 },
- { NULL, NULL }
-};
-
-#define NWIN 20
-static int numwins = 0;
-static int windows[NWIN + 1];
-
-
-static int selcmds = 0;
-#define selcmd() (selcmds++ % 2)
-
-static int selwins = 0;
-#define selwin() (selwins++ % 2 ? 3 : 1)
-
-
-int
-main (int argc, char **argv)
-{
- int fd1, fd2;
- char *cp, buffer[BUFSIZ];
- char **argp, **arguments;
-
-#ifdef LOCALE
- setlocale(LC_ALL, "");
-#endif
- invo_name = r1bindex (argv[0], '/');
-
- /* foil search of user profile/context */
- if (context_foil (NULL) == -1)
- done (1);
-
- arguments = getarguments (invo_name, argc, argv, 0);
- argp = arguments;
-
- while ((cp = *argp++))
- if (*cp == '-')
- switch (smatch (++cp, switches)) {
- case AMBIGSW:
- ambigsw (cp, switches);
- done (1);
- case UNKWNSW:
- adios (NULL, "-%s unknown", cp);
-
- case HELPSW:
- snprintf (buffer, sizeof(buffer), "%s [switches]",
invo_name);
- print_help (buffer, switches, 0);
- done (1);
- case VERSIONSW:
- print_version(invo_name);
- done (1);
-
- case READSW:
- if (!(cp = *argp++) || *cp == '-')
- adios (NULL, "missing argument to %s", argp[-2]);
- if ((fd1 = atoi (cp)) < 1)
- adios (NULL, "bad argument %s %s", argp[-2], cp);
- continue;
- case WRITESW:
- if (!(cp = *argp++) || *cp == '-')
- adios (NULL, "missing argument to %s", argp[-2]);
- if ((fd2 = atoi (cp)) < 1)
- adios (NULL, "bad argument %s %s", argp[-2], cp);
- continue;
- }
- else
- adios (NULL, "usage: %s [switches]", invo_name);
-
- rcinit (fd1, fd2);
- pINI ();
- pLOOP ();
-
- return done (0);
-}
-
-
-static int pINI () {
- int i,
- vrsn;
- char *bp;
- struct record rcs,
- *rc = &rcs;
-
- initrc (rc);
-
- switch (peer2rc (rc)) {
- case RC_INI:
- bp = rc->rc_data;
- while (isspace (*bp))
- bp++;
- if (sscanf (bp, "%d", &vrsn) != 1) {
- bad_init: ;
- fmt2peer (RC_ERR, "bad init \"%s\"", rc->rc_data);
- done (1);
- }
- if (vrsn != RC_VRSN) {
- fmt2peer (RC_ERR, "version %d unsupported", vrsn);
- done (1);
- }
-
- while (*bp && !isspace (*bp))
- bp++;
- while (isspace (*bp))
- bp++;
- if (sscanf (bp, "%d", &numwins) != 1 || numwins <= 0)
- goto bad_init;
- if (numwins > NWIN)
- numwins = NWIN;
-
- for (i = 1; i <= numwins; i++) {
- while (*bp && !isspace (*bp))
- bp++;
- while (isspace (*bp))
- bp++;
- if (sscanf (bp, "%d", &windows[i]) != 1 || windows[i] <= 0)
- goto bad_init;
- }
- rc2peer (RC_ACK, 0, NULL);
- return OK;
-
- case RC_XXX:
- adios (NULL, "%s", rc->rc_data);
-
- default:
- fmt2peer (RC_ERR, "pINI protocol screw-up");
- done (1); /* NOTREACHED */
- }
-}
-
-
-static int pLOOP () {
- struct record rcs,
- *rc = &rcs;
-
- initrc (rc);
-
- for (;;)
- switch (peer2rc (rc)) {
- case RC_QRY:
- pQRY (rc->rc_data);
- break;
-
- case RC_CMD:
- pCMD (rc->rc_data);
- break;
-
- case RC_FIN:
- done (0);
-
- case RC_XXX:
- adios (NULL, "%s", rc->rc_data);
-
- default:
- fmt2peer (RC_ERR, "pLOOP protocol screw-up");
- done (1);
- }
-}
-
-
-static int pQRY (str)
-char *str;
-{
- rc2peer (RC_EOF, 0, NULL);
- return OK;
-}
-
-
-static int pCMD (str)
-char *str;
-{
- if ((selcmd () ? pTTY (str) : pWIN (str)) == NOTOK)
- return NOTOK;
- rc2peer (RC_EOF, 0, NULL);
- return OK;
-}
-
-
-static int pTTY (str)
-char *str;
-{
- struct record rcs,
- *rc = &rcs;
-
- initrc (rc);
-
- switch (rc2rc (RC_TTY, 0, NULL, rc)) {
- case RC_ACK:
- break;
-
- case RC_ERR:
- return NOTOK;
-
- case RC_XXX:
- adios (NULL, "%s", rc->rc_data);
-
- default:
- fmt2peer (RC_ERR, "pTTY protocol screw-up");
- done (1);
- }
-
- system (str);
-
- switch (rc2rc (RC_EOF, 0, NULL, rc)) {
- case RC_ACK:
- return OK;
-
- case RC_XXX:
- adios (NULL, "%s", rc->rc_data);/* NOTREACHED */
-
- default:
- fmt2peer (RC_ERR, "pTTY protocol screw-up");
- done (1); /* NOTREACHED */
- }
-}
-
-
-static int pWIN (str)
-char *str;
-{
- int i,
- pid,
- pd[2];
- char buffer[BUFSIZ];
- struct record rcs,
- *rc = &rcs;
-
- initrc (rc);
-
- snprintf (buffer, sizeof(buffer), "%d", selwin ());
- switch (str2rc (RC_WIN, buffer, rc)) {
- case RC_ACK:
- break;
-
- case RC_ERR:
- return NOTOK;
-
- case RC_XXX:
- adios (NULL, "%s", rc->rc_data);
-
- default:
- fmt2peer (RC_ERR, "pWIN protocol screw-up");
- done (1);
- }
-
- if (pipe (pd) == NOTOK) {
- fmt2peer (RC_ERR, "no pipes");
- return NOTOK;
- }
-
- switch (pid = vfork ()) {
- case NOTOK:
- fmt2peer (RC_ERR, "no forks");
- return NOTOK;
-
- case OK:
- close (0);
- open ("/dev/null", O_RDONLY);
- dup2 (pd[1], 1);
- dup2 (pd[1], 2);
- close (pd[0]);
- close (pd[1]);
- execlp ("/bin/sh", "sh", "-c", str, NULL);
- write (2, "no shell\n", strlen ("no shell\n"));
- _exit (1);
-
- default:
- close (pd[1]);
- while ((i = read (pd[0], buffer, sizeof buffer)) > 0)
- switch (rc2rc (RC_DATA, i, buffer, rc)) {
- case RC_ACK:
- break;
-
- case RC_ERR:
- close (pd[0]);
- pidwait (pid, OK);
- return NOTOK;
-
- case RC_XXX:
- adios (NULL, "%s", rc->rc_data);
-
- default:
- fmt2peer (RC_ERR, "pWIN protocol screw-up");
- done (1);
- }
- if (i == OK)
- switch (rc2rc (RC_EOF, 0, NULL, rc)) {
- case RC_ACK:
- break;
-
- case RC_XXX:
- adios (NULL, "%s", rc->rc_data);
-
- default:
- fmt2peer (RC_ERR, "pWIN protocol screw-up");
- done (1);
- }
- if (i == NOTOK)
- fmt2peer (RC_ERR, "read from pipe lost");
-
- close (pd[0]);
- pidwait (pid, OK);
- return (i != NOTOK ? OK : NOTOK);
- }
-}
diff --git a/uip/wmh.c b/uip/wmh.c
deleted file mode 100644
index e5ff490..0000000
--- a/uip/wmh.c
+++ /dev/null
@@ -1,1389 +0,0 @@
-
-/*
- * wmh.c -- window front-end to nmh
- *
- * This code is Copyright (c) 2002, by the authors of nmh. See the
- * COPYRIGHT file in the root directory of the nmh distribution for
- * complete copyright information.
- */
-
-/*
- * TODO:
- * Pass signals to client during execution
- *
- * Figure out a way for the user to say how big the Scan/Display
- * windows should be, and where all the windows should be.
- */
-
-#include <h/mh.h>
-#include <h/signals.h>
-#include <h/vmhsbr.h>
-#include <errno.h>
-#include <setjmp.h>
-#include <signal.h>
-
-#include <sys/uio.h>
-#include <vt.h>
-#include <bitmap.h>
-#include <tools.h>
-
-#define ALARM ((unsigned int) 10)
-#define PAUSE ((unsigned int) 2)
-
-#define SZ(a) (sizeof a / sizeof a[0])
-
-static struct swit switches[] = {
-#define PRMPTSW 0
- { "prompt string", 6 },
-#define PROGSW 1
- { "vmhproc program", 7 },
-#define NPROGSW 2
- { "novmhproc", 9 },
-#define VERSIONSW 3
- { "version", 0 },
-#define HELPSW 4
- { "help", 0 },
- { NULL, NULL }
-};
- /* PEERS */
-static int PEERpid = NOTOK;
-
-static jmp_buf PEERctx;
-
-
- /* WINDOWS */
-static int dfd = NOTOK;
-static int twd = NOTOK;
-static char *myprompt = "(%s) ";
-
-struct line {
- int l_no;
- char *l_buf;
- struct line *l_prev;
- struct line *l_next;
-};
-
-#define W_NULL 0x00
-#define W_CMND 0x01
-#define W_FAKE 0x02
-#define W_EBAR 0x04
-
-typedef struct {
- int w_fd;
- int w_flags;
- int w_wd;
- struct wstate w_ws;
- char *w_eb;
- int w_ebloc;
- int w_ebsize;
- int w_cbase;
- int w_height;
- int w_cheight;
- int w_width;
- int w_cwidth;
- struct line *w_head;
- struct line *w_top;
- struct line *w_bottom;
- struct line *w_tail;
- char w_buffer[BUFSIZ];
- int w_bufpos;
-} WINDOW;
-
-
-static WINDOW *Scan;
-static WINDOW *Status;
-static WINDOW *Display;
-static WINDOW *Command;
-
-#define NWIN 4
-static int numwins;
-WINDOW *windows[NWIN + 1];
-
-WINDOW *WINnew ();
-
-
-#ifdef HAVE_TERMIOS_H
-static struct termios tio;
-# define ERASE tio.c_cc[VERASE]
-# define KILL tio.c_cc[VKILL]
-# define INTR tio.c_cc[VINTR]
-#else
-# ifdef HAVE_TERMIO_H
-static struct termio tio;
-# define ERASE tio.c_cc[VERASE]
-# define KILL tio.c_cc[VKILL]
-# define INTR tio.c_cc[VINTR]
-# else
-static struct sgttyb tio;
-static struct tchars tc;
-# define ERASE tio.sg_erase
-# define KILL tio.sg_kill
-# define INTR tc.t_intrc
-# define EOFC tc.t_eofc
-# endif
-#endif
-
-#define WERASC ltc.t_werasc
-static struct ltchars ltc;
-
-
-int ALRMser (), PIPEser (), SIGser ();
-int ADJser (), REFser ();
-
-/*
- * static prototypes
- */
-static void adorn(char *, char *, ...);
-
-
-int
-main (int argc, char **argv)
-{
- int vecp = 1, nprog = 0;
- char *cp, buffer[BUFSIZ], **argp;
- char **arguments, *vec[MAXARGS];
-
-#ifdef LOCALE
- setlocale(LC_ALL, "");
-#endif
- invo_name = r1bindex (argv[0], '/');
-
- /* read user profile/context */
- context_read();
-
- arguments = getarguments (invo_name, argc,argv, 1);
- argp = arguments;
-
- while ((cp = *argp++))
- if (*cp == '-')
- switch (smatch (++cp, switches)) {
- case AMBIGSW:
- ambigsw (cp, switches);
- done (1);
- case UNKWNSW:
- vec[vecp++] = --cp;
- continue;
-
- case HELPSW:
- snprintf (buffer, sizeof(buffer), "%s [switches for
vmhproc]",
- invo_name);
- print_help (buffer, switches, 1);
- done (1);
- case VERSIONSW:
- print_version(invo_name);
- done (1);
-
- case PRMPTSW:
- if (!(myprompt = *argp++) || *myprompt == '-')
- adios (NULL, "missing argument to %s", argp[-2]);
- continue;
-
- case PROGSW:
- if (!(vmhproc = *argp++) || *vmhproc == '-')
- adios (NULL, "missing argument to %s", argp[-2]);
- continue;
- case NPROGSW:
- nprog++;
- continue;
- }
- else
- vec[vecp++] = cp;
-
- SIGinit ();
- if (WINinit (nprog) == NOTOK) {
- vec[vecp] = NULL;
-
- vec[0] = r1bindex (vmhproc, '/');
- execvp (vmhproc, vec);
- adios (vmhproc, "unable to exec");
- }
- PEERinit (vecp, vec);
-
- vmh ();
-
- return done (0);
-}
-
-
-static void
-vmh (void)
-{
- char buffer[BUFSIZ], prompt[BUFSIZ];
-
- for (;;) {
- pLOOP (RC_QRY, NULL);
-
- snprintf (prompt, sizeof(prompt), myprompt, invo_name);
-
- switch (WINgetstr (Command, prompt, buffer)) {
- case NOTOK:
- break;
-
- case OK:
- done (0); /* NOTREACHED */
-
- default:
- if (*buffer)
- pLOOP (RC_CMD, buffer);
- break;
- }
- }
-}
-
-/* PEERS */
-
-static int
-PEERinit (int vecp, char *vec[])
-{
- int pfd0[2], pfd1[2];
- char buf1[BUFSIZ], buf2[BUFSIZ];
- register WINDOW **w;
-
- SIGNAL (SIGPIPE, PIPEser);
-
- if (pipe (pfd0) == NOTOK || pipe (pfd1) == NOTOK)
- adios ("pipe", "unable to");
- switch (PEERpid = vfork ()) {
- case NOTOK:
- adios ("vfork", "unable to");/* NOTREACHED */
-
- case OK:
- for (w = windows; *w; w++)
- if ((*w)->w_fd != NOTOK)
- close ((*w)->w_fd);
- close (pfd0[0]);
- close (pfd1[1]);
-
- vec[vecp++] = "-vmhread";
- snprintf (buf1, sizeof(buf1), "%d", pfd1[0]);
- vec[vecp++] = buf1;
- vec[vecp++] = "-vmhwrite";
- snprintf (buf2, sizeof(buf2), "%d", pfd0[1]);
- vec[vecp++] = buf2;
- vec[vecp] = NULL;
-
- SIGNAL (SIGINT, SIG_DFL);
- SIGNAL (SIGQUIT, SIG_DFL);
- SIGNAL (SIGTERM, SIG_DFL);
-
- vec[0] = r1bindex (vmhproc, '/');
- execvp (vmhproc, vec);
- perror (vmhproc);
- _exit (-1); /* NOTREACHED */
-
- default:
- close (pfd0[1]);
- close (pfd1[0]);
-
- rcinit (pfd0[0], pfd1[1]);
- return pINI ();
- }
-}
-
-
-static int
-pINI (void)
-{
- int len, buflen;
- char *bp, buffer[BUFSIZ];
- struct record rcs, *rc;
- WINDOW **w;
-
- rc = &rcs;
- initrc (rc);
-
- /* Get buffer ready to go */
- bp = buffer;
- buflen = sizeof(buffer);
-
- snprintf (bp, buflen, "%d %d", RC_VRSN, numwins);
- len = strlen (bp);
- bp += len;
- buflen -= len;
-
- for (w = windows; *w; w++) {
- snprintf (bp, buflen, " %d", (*w)->w_height);
- len = strlen (bp);
- bp += len;
- buflen -= len;
- }
-
- switch (str2rc (RC_INI, buffer, rc)) {
- case RC_ACK:
- return OK;
-
- case RC_ERR:
- if (rc->rc_len)
- adios (NULL, "%s", rc->rc_data);
- else
- adios (NULL, "pINI peer error");
-
- case RC_XXX:
- adios (NULL, "%s", rc->rc_data);
-
- default:
- adios (NULL, "pINI protocol screw-up");
- }
-/* NOTREACHED */
-}
-
-
-static int
-pLOOP (char code, char *str)
-{
- int i;
- struct record rcs, *rc;
- WINDOW *w;
-
- rc = &rcs;
- initrc (rc);
-
- str2peer (code, str);
- for (;;)
- switch (peer2rc (rc)) {
- case RC_TTY:
- if (pTTY () == NOTOK)
- return NOTOK;
- break;
-
- case RC_WIN:
- if (sscanf (rc->rc_data, "%d", &i) != 1
- || i <= 0
- || i > numwins) {
- fmt2peer (RC_ERR, "no such window \"%s\"", rc->rc_data);
- return NOTOK;
- }
- if ((w = windows[i - 1])->w_flags & W_CMND) {
- fmt2peer (RC_ERR, "not a display window \"%s\"",
rc->rc_data);
- return NOTOK;
- }
- if (pWIN (w) == NOTOK)
- return NOTOK;
- break;
-
- case RC_EOF:
- return OK;
-
- case RC_ERR:
- if (rc->rc_len)
- adorn (NULL, "%s", rc->rc_data);
- else
- adorn (NULL, "pLOOP(%s) peer error",
- code == RC_QRY ? "QRY" : "CMD");
- return NOTOK;
-
- case RC_FIN:
- if (rc->rc_len)
- adorn (NULL, "%s", rc->rc_data);
- rcdone ();
- i = pidwait (PEERpid, OK);
- PEERpid = NOTOK;
- done (i);
-
- case RC_XXX:
- adios (NULL, "%s", rc->rc_data);
-
- default:
- adios (NULL, "pLOOP(%s) protocol screw-up",
- code == RC_QRY ? "QRY" : "CMD");
- }
-}
-
-
-static int
-pTTY (void)
-{
- SIGNAL_HANDLER hstat, istat, qstat, tstat;
- struct record rcs, *rc;
-
- rc = &rcs;
- initrc (rc);
-
- if (ChangeWindowDepth (dfd, twd, 0) == NOTOK)
- adios ("failed", "ChangeWindowDepth");
-
- /* should block here instead of ignore */
- hstat = SIGNAL (SIGHUP, SIG_IGN);
- istat = SIGNAL (SIGINT, SIG_IGN);
- qstat = SIGNAL (SIGQUIT, SIG_IGN);
- tstat = SIGNAL (SIGTERM, SIG_IGN);
-
- rc2rc (RC_ACK, 0, NULL, rc);
-
- SIGNAL (SIGHUP, hstat);
- SIGNAL (SIGINT, istat);
- SIGNAL (SIGQUIT, qstat);
- SIGNAL (SIGTERM, tstat);
-
- switch (rc->rc_type) {
- case RC_EOF:
- rc2peer (RC_ACK, 0, NULL);
- return OK;
-
- case RC_ERR:
- if (rc->rc_len)
- adorn (NULL, "%s", rc->rc_data);
- else
- adorn (NULL, "pTTY peer error");
- return NOTOK;
-
- case RC_XXX:
- adios (NULL, "%s", rc->rc_data);
-
- default:
- adios (NULL, "pTTY protocol screw-up");
- }
-/* NOTREACHED */
-}
-
-
-static int
-pWIN (WINDOW *w)
-{
- int i;
-
- if ((i = pWINaux (w)) == OK)
- WINless (w);
-
- return i;
-}
-
-
-static int
-pWINaux (WINDOW *w)
-{
- register int n;
- register char *bp;
- register struct line *lp, *mp;
- struct record rcs, *rc;
-
- rc = &rcs;
- initrc (rc);
-
- for (lp = w->w_head; lp; lp = mp) {
- mp = lp->l_next;
- free (lp->l_buf);
- free ((char *) lp);
- }
- w->w_head = w->w_top = w->w_bottom = w->w_tail = NULL;
- w->w_bufpos = 0;
-
- for (;;)
- switch (rc2rc (RC_ACK, 0, NULL, rc)) {
- case RC_DATA:
- for (bp = rc->rc_data, n = rc->rc_len; n-- > 0; )
- WINputc (w, *bp++);
- break;
-
- case RC_EOF:
- rc2peer (RC_ACK, 0, NULL);
- if (w->w_bufpos)
- WINputc (w, '\n');
- return OK;
-
- case RC_ERR:
- if (rc->rc_len)
- adorn (NULL, "%s", rc->rc_data);
- else
- adorn (NULL, "pWIN peer error");
- return NOTOK;
-
- case RC_XXX:
- adios (NULL, "%s", rc->rc_data);
-
- default:
- adios (NULL, "pWIN protocol screw-up");
- }
-/* NOTREACHED */
-}
-
-
-static int
-pFIN (void)
-{
- int status;
-
- if (PEERpid <= OK)
- return OK;
-
- rc2peer (RC_FIN, 0, NULL);
- rcdone ();
-
- switch (setjmp (PEERctx)) {
- case OK:
- SIGNAL (SIGALRM, ALRMser);
- alarm (ALARM);
-
- status = pidwait (PEERpid, OK);
-
- alarm (0);
- break;
-
- default:
- kill (PEERpid, SIGKILL);
- status = NOTOK;
- break;
- }
- PEERpid = NOTOK;
-
- return status;
-}
-
-/* WINDOWS */
-
-/* should dynamically determine all this stuff from gconfig... */
-
-#define MyX 20 /* anchored hpos */
-#define MyY 40 /* .. vpos */
-#define MyW 800 /* .. width */
-#define MyH 500 /* .. height */
-#define MyS 30 /* .. height for Status, about one
line */
-
-
-#define MySlop 45 /* slop */
-
-#define EWIDTH 25 /* Width of vertical EBAR */
-#define ESLOP 5 /* .. slop */
-
-
-static intWINinit (nprog) {
- short wx, wy, wh, sy;
- struct gconfig gc;
-
- if (GetGraphicsConfig (fileno (stderr), &gc) == NOTOK)
- if (nprog)
- return NOTOK;
- else
- adios (NULL, "not a window");
-
- if ((dfd = open ("/dev/ttyw0", O_RDWR)) == NOTOK)
- adios ("/dev/ttyw0", "unable to open");
-
- if ((twd = GetTopWindow (dfd)) == NOTOK)
- adios ("failed", "GetTopWindow");
-
- BlockRefreshAdjust (1);
-
- numwins = 0;
-
- wx = gc.w - (MyX + MyW + EWIDTH + ESLOP);
- Scan = WINnew (wx, wy = MyY, MyW, wh = MyH * 2 / 3, "Scan", W_EBAR);
-
- wy += wh + MySlop;
- Status = WINnew (wx, sy = wy, MyW, wh = MyS, "Status", W_FAKE);
-
- wy += wh + MySlop;
- Display = WINnew (wx, wy, MyW, MyH, "Display", W_EBAR);
-
- Command = WINnew (wx, sy, MyW, MyS, invo_name, W_CMND);
-
- windows[numwins] = NULL;
-
- return OK;
-}
-
-
-WINDOW *
-WINnew (short wx, short wy, short ww, short wh, char *name, int flags)
-{
- register WINDOW *w;
-
- if ((w = (WINDOW *) calloc (1, sizeof *w)) == NULL)
- adios (NULL, "unable to allocate window");
-
- if ((w->w_flags = flags) & W_FAKE) {
- w->w_fd = NOTOK;
- w->w_height = 1;
-
- goto out;
- }
-
- if (w->w_flags & W_EBAR)
- ww += EWIDTH + ESLOP;
- else
- wx += EWIDTH + ESLOP;
-
- if ((w->w_fd = OpenWindow (wx, wy, ww, wh, name)) == NOTOK)
- adios ("failed", "OpenWindow");
- if ((w->w_wd = GetTopWindow (dfd)) == NOTOK)
- adios ("failed", "GetTopWindow");
- if (GetWindowState (w->w_fd, &w->w_ws) == NOTOK)
- adios ("failed", "GetWindowState");
- if (SetLineDisc (w->w_fd, TWSDISC) == NOTOK)
- adios ("failed", "SetLineDisc");
-
- SetBuf (w->w_fd, 1024);
- SetAdjust (w->w_fd, numwins, ADJser);
- SetRefresh (w->w_fd, numwins, REFser);
-
- SetAddressing (w->w_fd, VT_ABSOLUTE);
-
- if (w->w_flags & W_EBAR) {
- w->w_eb = CreateElevatorBar (w->w_fd, 0, 0, EWIDTH,
- w->w_ws.height, VT_Gray50, 1, EB_VERTICAL,
- EB_ARROWS, w->w_ebloc = 0, w->w_ebsize = EB_MAX,
- VT_White);
- if (w->w_eb == NULL)
- adios (NULL, "CreateElevatorBar failed");
- RefreshElevatorBar (w->w_eb);
- }
-
- if ((w->w_cbase = CharacterBaseline (w->w_ws.font)) <= 0)
- w->w_cbase = 14;
-
- if ((w->w_cheight = CharacterHeight (w->w_ws.font)) <= 0)
- w->w_cheight = 20;
- w->w_height = w->w_ws.height / w->w_cheight;
- if (w->w_height < 1)
- w->w_height = 1;
-
- /* 1 em */
- if ((w->w_cwidth = CharacterWidth (w->w_ws.font, 'm')) <= 0)
- w->w_cwidth = 10;
- w->w_width = (w->w_ws.width - (w->w_eb ? (EWIDTH + ESLOP) : 0))
- / w->w_cwidth;
- if (w->w_width < 1)
- w->w_width = 1;
-
-out: ;
- windows[numwins++] = w;
-
- return w;
-}
-
-
-static int
-WINgetstr (WINDOW *w, char *prompt, char *buffer)
-{
- register int c;
- register char *bp, *ip;
- char image[BUFSIZ];
- struct vtseq vts;
- register struct vtseq *vt = &vts;
-
- if (w->w_eb != NULL)
- adios (NULL, "internal error--elevator bar found");
-
- if (w->w_head == NULL
- && (w->w_head = (struct line *) calloc (1, sizeof *w->w_head))
- == NULL)
- adios (NULL, "unable to allocate line storage");
- w->w_head->l_buf = image;
- w->w_top = w->w_bottom = w->w_tail = w->w_head;
-
- if (ChangeWindowDepth (dfd, w->w_wd, 0) == NOTOK)
- adios ("failed", "ChangeWindowDepth");
-
- strncpy (image, prompt, sizeof(image));
- bp = ip = image + strlen (image);
-
- Redisplay (w, 0);
-
- for (;;)
- switch (getvtseq (w->w_fd, vt)) {
- case VT_HARDKEY:
- DisplayStatus (w->w_fd, "no hardkeys, please");
- break;
-
- case VT_ASCII:
- switch (c = toascii (vt->u.ascii)) {
- case '\f': /* refresh? */
- break;
-
- case '\r':
- case '\n':
- strcpy (buffer, ip);
- return DONE;
-
- default:
- if (c == INTR) {
- adorn (NULL, "Interrupt");
- return NOTOK;
- }
-
- if (c == EOFC) {
- if (bp <= ip)
- return OK;
- break;
- }
-
- if (c == ERASE) {
- if (bp <= ip)
- continue;
- bp--;
- break;
- }
-
- if (c == KILL) {
- if (bp <= ip)
- continue;
- bp = ip;
- break;
- }
-
- if (c == WERASC) {
- if (bp <= ip)
- continue;
- do {
- bp--;
- } while (isspace (*bp) && bp > ip);
- if (bp > ip) {
- do {
- bp--;
- } while (!isspace (*bp) && bp > buffer);
- if (isspace (*bp))
- bp++;
- }
- break;
- }
-
- if (c < ' ' || c >= '\177')
- continue;
- *bp++ = c;
- break;
- }
- *bp = NULL;
- Redisplay (w, 0);
- break;
-
- case VT_MOUSE:
- switch (vt->u.mouse.buttons
- & (VT_MOUSE_LEFT | VT_MOUSE_MIDDLE | VT_MOUSE_RIGHT)) {
- case VT_MOUSE_LEFT:
- DisplayStatus (w->w_fd, "use middle or right button");
- break;
-
-#define WPOP "WMH\0Advance\0Burst\0Exit\0EOF\0"
- case VT_MOUSE_MIDDLE:
- SetPosition (w->w_fd, vt->u.mouse.x,
- vt->u.mouse.y);
- switch (DisplayPopUp (w->w_fd, WPOP)) {
- case 1: /* Advance */
- do_advance: ;
- strcpy (buffer, "advance");
- return DONE;
-
- case 2: /* Burst */
- strcpy (buffer, "burst");
- return DONE;
-
- case 3: /* Exit */
- strcpy (buffer, "exit");
- return DONE;
-
- case 4: /* EOF */
- return OK;
-
- default: /* failed or none taken */
- break;
- }
- break;
-#undef WPOP
-
- case VT_MOUSE_RIGHT:
- goto do_advance;
- }
- break;
-
- case VT_EOF:
- adios (NULL, "end-of-file on window");/* NOTREACHED */
-
- default:
- DisplayStatus (w->w_fd, "unknown VT sequence");
- break;
- }
-}
-
-
-static int
-WINputc (WINDOW *w, char c)
-{
- register int i;
- register char *cp;
- register struct line *lp;
-
- switch (c) {
- default:
- if (!isascii (c)) {
- if (WINputc (w, 'M') == NOTOK || WINputc (w, '-') == NOTOK)
- return NOTOK;
- c = toascii (c);
- }
- else
- if (c < ' ' || c == '\177') {
- if (WINputc (w, '^') == NOTOK)
- return NOTOK;
- c ^= 0100;
- }
- break;
-
- case '\t':
- for (i = 8 - (w->w_bufpos & 0x07); i > 0; i--)
- if (WINputc (w, ' ') == NOTOK)
- return NOTOK;
- return OK;
-
- case '\b':
- if (w->w_bufpos > 0)
- w->w_bufpos--;
- return OK;
-
- case '\n':
- break;
- }
-
- if (c != '\n') {
- w->w_buffer[w->w_bufpos++] = c;
- return OK;
- }
-
- w->w_buffer[w->w_bufpos] = NULL;
- w->w_bufpos = 0;
-
- if ((lp = (struct line *) calloc (1, sizeof *lp)) == NULL)
- adios (NULL, "unable to allocate line storage");
-
- lp->l_no = (w->w_tail ? w->w_tail->l_no : 0) + 1;
- lp->l_buf = getcpy (w->w_buffer);
- for (cp = lp->l_buf + strlen (lp->l_buf) - 1; cp >= lp->l_buf; cp--)
- if (isspace (*cp))
- *cp = NULL;
- else
- break;
-
- if (w->w_head == NULL)
- w->w_head = lp;
- if (w->w_top == NULL)
- w->w_top = lp;
- if (w->w_bottom == NULL)
- w->w_bottom = lp;
- if (w->w_tail)
- w->w_tail->l_next = lp;
- lp->l_prev = w->w_tail;
- w->w_tail = lp;
-
- return DONE;
-}
-
-#define PSLOP 2
-
-
-static char mylineno[5];
-
-static bool cancel[] = { 1 };
-static struct choice mychoices[] = { LABEL, "cancel", VT_White };
-
-static struct question myquestions[] = {
- STRING, "Line", SZ (mylineno), (struct choice *) 0,
-
- TOGGLE, "", SZ (mychoices), mychoices
-};
-
-static struct menu mymenu = { "Goto", SZ (myquestions), myquestions };
-
-static int *myanswers[] = { (int *) mylineno, (int *) cancel };
-
-
-static void
-WINless (WINDOW *w)
-{
- int clear, pos, forw, refresh;
- struct vtseq vts;
- register struct vtseq *vt = &vts;
-
- if (w->w_fd == NOTOK) {
- if (w->w_head)
- DisplayStatus (dfd, w->w_top->l_buf);
- else
- RemoveStatus (dfd);
-
- return;
- }
-
- if (ChangeWindowDepth (dfd, w->w_wd, 0) == NOTOK)
- adios ("failed", "ChangeWindowDepth");
-
- Redisplay (w, 0);
-
- if (w->w_bottom == w->w_tail)
- return;
-
- if (w->w_eb == NULL)
- adios (NULL, "internal error--no elevator bar");
-
- for (clear = refresh = 0, forw = 1;;) {
- if (clear) {
- RemoveStatus (w->w_fd);
- clear = 0;
- }
- if (refresh) {
- Redisplay (w, 0);
- refresh = 0;
- }
-
- switch (getvtseq (w->w_fd, vt)) {
- case VT_HARDKEY:
- case VT_ASCII:
- DisplayStatus (w->w_fd, "use the mouse");
- clear++;
- break;
-
- case VT_MOUSE:
- switch (vt->u.mouse.buttons
- & (VT_MOUSE_LEFT | VT_MOUSE_MIDDLE | VT_MOUSE_RIGHT)) {
- case VT_MOUSE_LEFT:
- if ((pos = vt->u.mouse.x) < EWIDTH) {
- pos = w->w_ebloc = DoElevatorBar (w->w_eb, pos,
- vt->u.mouse.y);
- refresh = WINgoto (w, ((pos * (w->w_tail->l_no
- - w->w_head->l_no))
- / EB_MAX) + w->w_head->l_no);
- }
- break;
-
-#define WPOP "Paging\0Next\0Prev\0Left\0Right\0First\0Last\0Goto
...\0Exit\0"
- case VT_MOUSE_MIDDLE:
- SetPosition (w->w_fd, vt->u.mouse.x,
- vt->u.mouse.y);
- switch (DisplayPopUp (w->w_fd, WPOP)) {
- case 1: /* Next */
- do_next_page: ;
- if (w->w_bottom == w->w_tail)
- forw = 0;
- refresh = WINgoto (w, w->w_bottom->l_no + 1 -
PSLOP);
- break;
-
- case 2: /* Prev */
- do_prev_page: ;
- if (w->w_top == w->w_head)
- forw = 1;
- refresh = WINgoto (w, w->w_top->l_no
- - w->w_height + PSLOP);
- break;
-
- case 3: /* Left */
- case 4: /* Right */
- DisplayStatus (w->w_fd, "not yet");
- clear++;
- break;
-
- case 5: /* First */
- forw = 1;
- refresh = WINgoto (w, w->w_head->l_no);
- break;
-
- case 6: /* Last */
- forw = 0;
- refresh = WINgoto (w, w->w_tail->l_no
- - w->w_height + 1);
- break;
-
- case 7: /* Goto ... */
- snprintf (mylineno, sizeof(mylineno),
- "%d", w->w_top->l_no);
- cancel[0] = 0;
- if (PresentMenu (&mymenu, myanswers)
- || cancel[0])
- break;
- if (sscanf (mylineno, "%d", &pos) != 1) {
- DisplayStatus (w->w_fd, "bad format");
- clear++;
- break;
- }
- if (pos < w->w_head->l_no
- || pos > w->w_tail->l_no) {
- DisplayStatus (w->w_fd, "no such line");
- clear++;
- break;
- }
- refresh = WINgoto (w, pos);
- break;
-
- case 8: /* Exit */
- return;
-
- default: /* failed or none taken */
- break;
- }
- break;
-#undef WPOP
-
- case VT_MOUSE_RIGHT:
- if (forw) {
- if (w->w_bottom == w->w_tail)
- return;
- else
- goto do_next_page;
- }
- else
- goto do_prev_page;
- }
- break;
-
- case VT_EOF:
- adios (NULL, "end-of-file on window");/* NOTREACHED */
-
- default:
- DisplayStatus (w->w_fd, "unknown VT sequence");
- clear++;
- break;
- }
- }
-}
-
-
-static int
-WINgoto (WINDOW *w, int n)
-{
- register int i, j;
- register struct line *lp;
-
- if (n > (i = w->w_tail->l_no - w->w_height + 1))
- n = i;
- if (n < w->w_head->l_no)
- n = w->w_head->l_no;
-
- if ((i = n - (lp = w->w_head)->l_no)
- > (j = abs (n - w->w_top->l_no)))
- i = j, lp = w->w_top;
-
- if (i > (j = abs (w->w_tail->l_no - n)))
- i = j, lp = w->w_tail;
-
- if (n >= lp->l_no) {
- for (; lp; lp = lp->l_next)
- if (lp->l_no == n)
- break;
- }
- else {
- for (; lp; lp = lp->l_prev)
- if (lp->l_no == n)
- break;
- if (!lp)
- lp = w->w_head;
- }
-
- if (w->w_top == lp)
- return 0;
-
- w->w_top = lp;
-
- return 1;
-}
-
-
-static int
-ADJser (int id, short ww, short wh)
-{
- register WINDOW *w;
-
- if (id < 0 || id >= numwins)
- adios (NULL, "ADJser on bogus window (%d)", id);
- w = windows[id];
- if (w->w_fd == NOTOK)
- adios (NULL, "ADJser on closed window (%d)", id);
-
- w->w_ws.width = w->w_ws.tw = ww;
- w->w_ws.height = w->w_ws.th = wh;
-
- if (w->w_eb) {
- DeleteElevatorBar (w->w_eb);
- w->w_eb = CreateElevatorBar (w->w_fd, 0, 0, EWIDTH,
- w->w_ws.height, VT_Gray50, 1, EB_VERTICAL,
- EB_ARROWS, w->w_ebloc = 0, w->w_ebsize = EB_MAX,
- VT_White);
- if (w->w_eb == NULL)
- adios (NULL, "CreateElevatorBar failed");
- }
-
- Redisplay (w, 1);
-}
-
-
-static int
-REFser (int id, short wx, short wy, short ww, short wh)
-{
- short cx, cy, cw, ch;
- register WINDOW *w;
-
- if (id < 0 || id >= numwins)
- adios (NULL, "REFser on bogus window (%d)", id);
- w = windows[id];
- if (w->w_fd == NOTOK)
- adios (NULL, "REFser on closed window (%d)", id);
-
-
- if (GetWindowState (w->w_fd, &w->w_ws) == NOTOK)
- adios ("failed", "GetWindowState");
-
- GetPermanentClipping (w->w_fd, &cx, &cy, &cw, &ch);
- SetPermanentClipping (w->w_fd, wx, wy, ww, wh);
- Redisplay (w, 1);
- SetPermanentClipping (w->w_fd, cx, cy, cw, ch);
-}
-
-
-static void
-Redisplay (WINDOW *w, int doeb)
-{
- register int y;
- short sx;
- register struct line *lp;
-
- if (w->w_fd == NOTOK)
- return;
-
- sx = w->w_eb ? (EWIDTH + ESLOP) : 0;
- w->w_height = w->w_ws.height / w->w_cheight;
- if (w->w_height < 1)
- w->w_height = 1;
-
- w->w_width = (w->w_ws.width - (w->w_eb ? (EWIDTH + ESLOP) : 0))
- / w->w_cwidth;
- if (w->w_width < 1)
- w->w_width = 1;
-
- SetPosition (w->w_fd, sx, 0);
- SetColor (w->w_fd, VT_White);
- PaintRectangleInterior (w->w_fd, w->w_ws.width, w->w_ws.height);
-
- if (w->w_head) {
- SetColor (w->w_fd, VT_Black);
- for (lp = w->w_top, y = 0;
- lp && y < w->w_height;
- w->w_bottom = lp, lp = lp->l_next, y++) {
- SetPosition (w->w_fd, sx, y * w->w_cheight + w->w_cbase);
- PaintString (w->w_fd, VT_STREND, lp->l_buf);
- }
- }
-
- if (w->w_eb) {
- if ((y = EB_LOC (w)) != w->w_ebloc)
- MoveElevator (w->w_eb, w->w_ebloc = y);
- if ((y = EB_SIZE (w)) != w->w_ebsize)
- SizeElevator (w->w_eb, w->w_ebsize = y);
- if (doeb)
- RefreshElevatorBar (w->w_eb);
- }
-
- Flush (w->w_fd);
-}
-
-
-static int
-EB_SIZE (WINDOW *w)
-{
- register int i;
-
- if (w->w_head == NULL)
- return 0;
-
- if ((i = w->w_tail->l_no - w->w_head->l_no) <= 0)
- return EB_MAX;
-
- return (((w->w_bottom->l_no - w->w_top->l_no) * EB_MAX) / i);
-}
-
-
-static int
-EB_LOC (WINDOW *w)
-{
- register int i;
-
- if (w->w_head == NULL)
- return 0;
-
- if ((i = w->w_tail->l_no - w->w_head->l_no) <= 0)
- return EB_MAX;
-
- return (((w->w_top->l_no - w->w_head->l_no) * EB_MAX) / i);
-}
-
-/* SIGNALS */
-
-static void
-SIGinit (void)
-{
- foreground ();
- if (ioctl (fileno (stdin), TIOCGETP, (char *) &tio) == NOTOK)
- adios ("failed", "ioctl TIOCGETP");
- if (ioctl (fileno (stdin), TIOCGETC, (char *) &tc) == NOTOK)
- adios ("failed", "ioctl TIOCGETC");
- if (ioctl (fileno (stdin), TIOCGLTC, (char *) <c) == NOTOK)
- adios ("failed", "ioctl TIOCGLTC");
- sideground ();
-
- SIGNAL (SIGHUP, SIGser);
- SIGNAL (SIGINT, SIGser);
- SIGNAL (SIGQUIT, SIGser);
-}
-
-
-static void
-foreground (void)
-{
-#ifdef TIOCGPGRP
- int pgrp, tpgrp;
- SIGNAL_HANDLER tstat;
-
- if ((pgrp = getpgrp (0)) == NOTOK)
- adios ("process group", "unable to determine");
- for (;;) {
- if (ioctl (fileno (stdin), TIOCGPGRP, (char *) &tpgrp) == NOTOK)
- adios ("tty's process group", "unable to determine");
- if (pgrp == tpgrp)
- break;
-
- tstat = SIGNAL (SIGTTIN, SIG_DFL);
- kill (0, SIGTTIN);
- SIGNAL (SIGTTIN, tstat);
- }
-
- SIGNAL (SIGTTIN, SIG_IGN);
- SIGNAL (SIGTTOU, SIG_IGN);
- SIGNAL (SIGTSTP, SIG_IGN);
-#endif TIOCGPGRP
-}
-
-
-static void
-sideground (void)
-{
-#ifdef TIOCGPGRP
- SIGNAL (SIGTTIN, SIG_DFL);
- SIGNAL (SIGTTOU, SIG_DFL);
- SIGNAL (SIGTSTP, SIG_DFL);
-#endif TIOCGPGRP
-}
-
-
-static int
-ALRMser (int sig)
-{
- longjmp (PEERctx, DONE);
-}
-
-
-static int
-PIPEser (int sig)
-{
-#ifndef RELIABLE_SIGNALS
- SIGNAL (sig, SIG_IGN);
-#endif
-
- adios (NULL, "lost peer");
-}
-
-
-static int
-SIGser (int sig)
-{
-#ifndef RELIABLE_SIGNALS
- SIGNAL (sig, SIG_IGN);
-#endif
-
- done (1);
-}
-
-
-int
-done (int status)
-{
- if (dfd != NOTOK)
- RemoveStatus (dfd);
-
- pFIN ();
-
- exit (status);
- return 1; /* dead code to satisfy the compiler */
-}
-
-
-static void
-adorn (char *what, char *fmt, ...)
-{
- va_list ap
- char *cp;
-
- cp = invo_name;
- invo_name = NULL;
-
- va_start(ap, fmt);
- advertise (what, NULL, fmt, ap);
- va_end(ap);
-
- invo_name = cp;
-}
-
-
-void
-advertise (char *what, char *tail, va_list ap)
-{
- int eindex = errno;
- char buffer[BUFSIZ], err[BUFSIZ];
- struct iovec iob[20];
- register struct iovec *iov = iob;
-
- fflush (stdout);
- fflush (stderr);
-
- if (invo_name) {
- iov->iov_len = strlen (iov->iov_base = invo_name);
- iov++;
- iov->iov_len = strlen (iov->iov_base = ": ");
- iov++;
- }
-
- vsnprintf (buffer, sizeof(buffer), fmt, ap);
- iov->iov_len = strlen (iov->iov_base = buffer);
- iov++;
- if (what) {
- if (*what) {
- iov->iov_len = strlen (iov->iov_base = " ");
- iov++;
- iov->iov_len = strlen (iov->iov_base = what);
- iov++;
- iov->iov_len = strlen (iov->iov_base = ": ");
- iov++;
- }
- if (!(iov->iov_base = strerror (eindex))) {
- snprintf (err, sizeof(err), "unknown error %d", eindex);
- iov->iov_base = err;
- }
- iov->iov_len = strlen (iov->iov_base);
- iov++;
- }
- if (tail && *tail) {
- iov->iov_len = strlen (iov->iov_base = ", ");
- iov++;
- iov->iov_len = strlen (iov->iov_base = tail);
- iov++;
- }
- iov->iov_len = strlen (iov->iov_base = "\n");
- iov++;
-
- if (dfd != NOTOK)
- DisplayVector (iob, iov - iob);
- else
- writev (fileno (stderr), iob, iov - iob);
-}
-
-
-static void
-DisplayVector (struct iovec *iov, int n)
-{
- register int i;
- register char *cp;
- char buffer[BUFSIZ];
-
- for (i = 0, cp = NULL; i < n; i++, iov++) {
- snprintf (buffer, sizeof(buffer), "%*.*s", iov->iov_len,
- iov->iov_len, iov->iov_base);
- cp = add (buffer, cp);
- }
-
- DisplayStatus (dfd, cp);
- free (cp);
- sleep (PAUSE);
- RemoveStatus (dfd);
-}
-----------------------------------------------------------------------
Summary of changes:
man/Makefile.in | 3 -
man/msh.man | 15 -
man/vmh.man | 101 ----
uip/Makefile.in | 9 +-
uip/vmh.c | 1515 -------------------------------------------------------
uip/vmhtest.c | 324 ------------
uip/wmh.c | 1389 --------------------------------------------------
7 files changed, 1 insertions(+), 3355 deletions(-)
delete mode 100644 man/vmh.man
delete mode 100644 uip/vmh.c
delete mode 100644 uip/vmhtest.c
delete mode 100644 uip/wmh.c
hooks/post-receive
--
The nmh Mail Handling System
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [Nmh-commits] [SCM] The nmh Mail Handling System branch, master, updated. f4aa78ac924c0947683833dd248e89d521910869,
David Levine <=