386BSD 0.1 development
authorWilliam F. Jolitz <wjolitz@soda.berkeley.edu>
Sun, 28 Jun 1992 17:09:44 +0000 (09:09 -0800)
committerWilliam F. Jolitz <wjolitz@soda.berkeley.edu>
Sun, 28 Jun 1992 17:09:44 +0000 (09:09 -0800)
Work on file usr/othersrc/public/screen-3.2/screen3.2/help.c

Co-Authored-By: Lynne Greer Jolitz <ljolitz@cardio.ucsf.edu>
Synthesized-from: 386BSD-0.1

usr/othersrc/public/screen-3.2/screen3.2/help.c [new file with mode: 0644]

diff --git a/usr/othersrc/public/screen-3.2/screen3.2/help.c b/usr/othersrc/public/screen-3.2/screen3.2/help.c
new file mode 100644 (file)
index 0000000..f715e8b
--- /dev/null
@@ -0,0 +1,519 @@
+/* Copyright (c) 1991
+ *      Juergen Weigert (jnweiger@immd4.informatik.uni-erlangen.de)
+ *      Michael Schroeder (mlschroe@immd4.informatik.uni-erlangen.de)
+ * Copyright (c) 1987 Oliver Laumann
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 1, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program (see the file COPYING); if not, write to the
+ * Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ * Noteworthy contributors to screen's design and implementation:
+ *     Wayne Davison (davison@borland.com)
+ *     Patrick Wolfe (pat@kai.com, kailand!pat)
+ *     Bart Schaefer (schaefer@cse.ogi.edu)
+ *     Nathan Glasser (nathan@brokaw.lcs.mit.edu)
+ *     Larry W. Virden (lwv27%cas.BITNET@CUNYVM.CUNY.Edu)
+ *     Howard Chu (hyc@hanauma.jpl.nasa.gov)
+ *     Tim MacKenzie (tym@dibbler.cs.monash.edu.au)
+ *     Markku Jarvinen (mta@{cc,cs,ee}.tut.fi)
+ *     Marc Boucher (marc@CAM.ORG)
+ *
+ ****************************************************************
+ */
+
+#ifndef lint
+  static char rcs_id[] = "$Id: help.c,v 1.2 92/02/03 02:28:33 jnweiger Exp $ FAU";
+#endif
+
+#include "config.h"
+#include <stdio.h>
+#include <sys/types.h>
+
+#ifdef BSDI
+# include <sys/signal.h>
+#endif /* BSDI */
+
+#include "screen.h"
+#include "ansi.h"
+#include "extern.h"
+#include "patchlevel.h"
+
+int help_page = 0;
+int command_search, command_bindings = 0;
+extern char Esc, MetaEsc;
+extern char *KeyNames[];
+extern struct key ktab[];
+extern int screenwidth, screenheight;
+extern char *blank, *null, *CE;
+extern struct win *fore;
+
+static void centerline __P((char *));
+static void HelpRedisplayLine __P((int, int, int, int));
+static void process_help_input __P((char **, int *));
+static void AbortHelp __P((void));
+static void add_key_to_buf __P((char *, int));
+
+void
+exit_with_usage(myname)
+char *myname;
+{
+  printf("Use: %s [-opts] [cmd [args]]\n", myname);
+  printf(" or: %s -r [host.tty]\n\nOptions:\n", myname);
+  printf("-a           Force all capabilities into each window's termcap\n");
+  printf("-A -[r|R]    Adapt all windows to the new display width & height\n");
+  printf("-c file      Read configuration file instead of .screenrc\n");
+#ifdef REMOTE_DETACH
+  printf("-d (-r)      Detach the elsewhere running screen (and reattach here)\n");
+  printf("-D (-r)      Detach and logout remote (and reattach here)\n");
+#endif
+  printf("-e xy        Change command characters\n");
+  printf("-f           Flow control on, -fn = off, -fa = auto\n");
+  printf("-h lines     Set the size of the scrollback history buffer\n");
+  printf("-i           Interrupt output sooner when flow control is on\n");
+  printf("-l           Login mode on (update %s), -ln = off\n", UTMPFILE);
+  printf("-list        or -ls. Do nothing, just list our SockDir\n");
+  printf("-L           Terminal's last character can be safely updated\n");
+  printf("-O           Choose optimal output rather than exact vt100 emulation\n");
+  printf("-q           Quiet startup. Sets $status if unsuccessful.\n");
+  printf("-r           Reattach to a detached screen process\n");
+  printf("-R           Reattach if possible, otherwise start a new session\n");
+  printf("-s shell     Shell to execute rather than $SHELL\n");
+  printf("-T term      Use term as $TERM for windows, rather than \"screen\"\n");
+  printf("-t title     Set command's a.k.a. (window title)\n");
+  printf("-wipe        Do nothing, just clean up SockDir\n");
+  exit(1);
+}
+
+/* Esc-char is not consumed. All others are. Esc-char, space, and return end */
+static void
+process_help_input(ppbuf, plen)
+char **ppbuf;
+int *plen;
+{
+  int done = 0;
+
+  if (ppbuf == 0)
+    {
+      AbortHelp();
+      return;
+    }
+  while (!done && *plen > 0)
+    {
+      switch (**ppbuf)
+       {
+       case ' ':
+         if (display_help() == 0)
+            break;
+         /* FALLTHROUGH */
+       case '\r':
+       case '\n':
+         done = 1;
+         break;
+       default:
+         if (**ppbuf == Esc)
+           {
+             done = 1;
+             continue;
+           }
+         break;
+       }
+      ++*ppbuf;
+      --*plen;
+    }
+  if (done)
+    AbortHelp();
+}
+
+static void
+AbortHelp()
+{
+  help_page = 0;
+  ExitOverlayPage();
+  Activate(0);
+}
+
+static int maxrow, grow, numcols, numrows, num_names;
+static int numskip, numpages;
+
+int
+display_help()
+{
+  int col, crow, n, key = 0;
+  enum keytype typ = ktab[0].type;
+  char buf[256], Esc_buf[5], cbuf[256];
+
+  if (!help_page++)
+    {
+      if (screenwidth < 26 || screenheight < 6)
+        {
+         Msg(0, "Window size too small for help page");
+         help_page = 0;
+         return -1;
+        }
+      InitOverlayPage(process_help_input, HelpRedisplayLine, (int (*)())0, 0);
+
+      command_bindings = 0;
+      for (key = 0; key < 256; key++)
+        if ((typ = ktab[key].type) == KEY_CREATE
+           || typ == KEY_SCREEN
+           || typ == KEY_SET
+           || (typ == KEY_AKA && ktab[key].args))
+         command_bindings++;
+      debug1("help: command_bindings counted: %d\n",command_bindings);
+      for (n = 0; KeyNames[n] != NULL; n++)
+       ; /* we dont know "sizeof * KeyNames" */
+      num_names = n - 1;
+      debug1("help: we find %d named keys (+1).\n", num_names);
+      command_search = 0;
+
+      numcols = screenwidth/26;
+      if (numcols == 0)
+        numcols = 1;
+      numrows = (num_names + numcols -1) / numcols;
+      debug1("Numrows: %d\n", numrows);
+      numskip = screenheight-5 - (2 + numrows);
+      while (numskip < 0)
+       numskip += screenheight-5;
+      numskip %= screenheight-5;
+      debug1("Numskip: %d\n", numskip);
+      if (numskip > screenheight/3 || numskip > command_bindings)
+       numskip = 1;
+      maxrow = 2 + numrows + numskip + command_bindings;
+      grow = 0;
+
+      numpages = (maxrow + screenheight-6) / (screenheight-5);
+    }
+
+  if (grow >= maxrow)
+    { 
+      return(-1);
+    }
+
+  /* Clear the help screen */
+  ClearDisplay();
+  
+  sprintf(cbuf,"Screen key bindings, page %d of %d.", help_page, numpages);
+  centerline(cbuf);
+  printf("\n");
+  crow = 2;
+
+  *Esc_buf = '\0';
+  add_key_to_buf(Esc_buf, Esc);
+  Esc_buf[strlen(Esc_buf) - 1] = '\0';
+
+  for (; crow < screenheight - 3; crow++)
+    {
+      if (grow < 1)
+        {
+         *buf = '\0';
+          add_key_to_buf(buf, MetaEsc);
+          buf[strlen(buf) - 1] = '\0';
+          sprintf(cbuf,"Command key:  %s   Literal %s:  %s", Esc_buf, Esc_buf, buf);
+          centerline(cbuf);
+         grow++;
+        }
+      else if (grow >= 2 && grow-2 < numrows)
+       {
+         for (col = 0; col < numcols && (n = numrows * col + (grow-2)) < num_names; col++)
+           {
+             debug1("help: searching key %d\n", n);
+             buf[0] = '\0';
+             for (key = 0; key < 128; key++)
+               if (ktab[key].type == (enum keytype) (n + 2)
+                   && ((enum keytype) (n + 2) != KEY_AKA || !ktab[key].args) )
+                 add_key_to_buf(buf, key);
+             buf[14] = '\0';
+             /*
+              * Format is up to 10 chars of name, 1 spaces, 14 chars of key
+              * bindings, and a space.
+              */
+             printf("%-10.10s %-14.14s ", KeyNames[n + 1], buf);
+           }
+         printf("\r\n");
+          grow++;
+        }
+      else if (grow-2-numrows >= numskip 
+               && grow-2-numrows-numskip < command_bindings)
+        {
+          char **pp, *cp;
+
+         while (command_search < 128
+                && (typ = ktab[command_search].type) != KEY_CREATE
+                && typ != KEY_SCREEN
+                && typ != KEY_SET
+                && (typ != KEY_AKA || !ktab[command_search].args))
+           command_search++;
+         buf[0] = '\0';
+         add_key_to_buf(buf, command_search);
+         printf("%-4s", buf);
+         col = 4;
+         if (typ != KEY_CREATE)
+           {
+             col += strlen(KeyNames[(int)typ - 1]) + 1;
+             printf("%s ", KeyNames[(int)typ - 1]);
+           }
+         pp = ktab[command_search++].args;
+         while (pp && (cp = *pp) != NULL)
+           {
+             if (!*cp || (index(cp, ' ') != NULL))
+               {
+                 if (index(cp, '\'') != NULL)
+                   *buf = '"';
+                 else
+                   *buf = '\'';
+                 sprintf(buf + 1, "%s%c", cp, *buf);
+                 cp = buf;
+               }
+             if ((col += strlen(cp) + 1) >= screenwidth)
+               {
+                 col = screenwidth - (col - (strlen(cp) + 1)) - 2;
+                 if (col >= 0)
+                   {
+                     n = cp[col];
+                     cp[col] = '\0';
+                     printf("%s$", *pp);
+                     cp[col] = (char) n;
+                   }
+                 break;
+               }
+             printf("%s%c", cp, (screenwidth - col != 1 || !pp[1]) ? ' ' : '$');
+             pp++;
+           }
+         printf("\r\n");
+         grow++;
+       }
+      else
+       {
+          putchar('\n');
+         grow++;
+       }
+    }
+  printf("\n");
+  sprintf(cbuf,"[Press Space %s Return to end; %s to begin a command.]",
+        grow < maxrow ? "for next page;" : "or", Esc_buf);
+  centerline(cbuf);
+  fflush(stdout);
+  SetLastPos(0, screenheight-1);
+  return(0);
+}
+
+static void
+add_key_to_buf(buf, key)
+char *buf;
+int key;
+{
+  debug1("help: key found: %c\n", key);
+  switch (key)
+    {
+    case ' ':
+      strcat(buf, "sp ");
+      break;
+    case 0x7f:
+      strcat(buf, "^? ");
+      break;
+    default:
+      if (key < ' ')
+       sprintf(buf + strlen(buf), "^%c ", (key | 0x40));
+      else
+       sprintf(buf + strlen(buf), "%c ", key);
+      break;
+    }
+}
+
+static void
+centerline(str)
+char *str;
+{
+  int l;
+  l = (screenwidth - 1 + strlen(str)) / 2;
+  if (l > screenwidth - 1)
+    l = screenwidth - 1;
+  printf("%*.*s\r\n", l, l, str);
+}
+
+static void
+HelpRedisplayLine(y, xs, xe, isblank)
+int y, xs, xe, isblank;
+{
+  if (isblank)
+    return;
+  if (CE)
+    {
+      GotoPos(xs, y);
+      PutStr(CE);
+      return;
+    }
+  DisplayLine(null, null, null, blank, null, null, y, xs, xe);
+}
+
+/*
+ * here all the copyright stuff 
+ */
+
+
+static char version[40];
+
+static char cpmsg[] = "\
+\n\
+iScreen version %v\n\
+\n\
+Copyright (c) 1991\n\
+    Juergen Weigert (jnweiger@immd4.informatik.uni-erlangen.de)\n\
+    Michael Schroeder (mlschroe@immd4.informatik.uni-erlangen.de)\n\
+Copyright (c) 1987 Oliver Laumann\n\
+\n\
+This program is free software; you can redistribute it and/or \
+modify it under the terms of the GNU General Public License as published \
+by the Free Software Foundation; either version 1, or (at your option) \
+any later version.\n\
+\n\
+This program is distributed in the hope that it will be useful, \
+but WITHOUT ANY WARRANTY; without even the implied warranty of \
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the \
+GNU General Public License for more details.\n\
+\n\
+You should have received a copy of the GNU General Public License \
+along with this program (see the file COPYING); if not, write to the \
+Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.\n";
+
+
+static void process_copyright_input __P((char **, int *));
+static void AbortCopyright __P((void));
+static void copypage __P((void));
+
+static char *cps, *savedcps;
+
+static void
+process_copyright_input(ppbuf, plen)
+char **ppbuf;
+int *plen;
+{
+  int done = 0;
+
+  if (ppbuf == 0)
+    {
+      AbortCopyright();
+      return;
+    }
+  while (!done && *plen > 0)
+    {
+      switch (**ppbuf)
+       {
+       case ' ':
+          if (*cps)
+           {
+             copypage();
+             break;
+           }
+         /* FALLTHROUGH */
+       case '\r':
+       case '\n':
+         AbortCopyright();
+         done = 1;
+         break;
+       default:
+         break;
+       }
+      ++*ppbuf;
+      --*plen;
+    }
+}
+
+static void
+AbortCopyright()
+{
+  ExitOverlayPage();
+  Activate(0);
+}
+
+void
+display_copyright()
+{
+  if (screenwidth < 10 || screenheight < 5)
+    {
+      Msg(0, "Window size too small for copyright page");
+      return;
+    }
+  InitOverlayPage(process_copyright_input, HelpRedisplayLine, (int (*)())0, 0);
+  sprintf(version, "%d.%.2d.%.2d%s (%s) %s", REV, VERS, PATCHLEVEL, STATE, ORIGIN, DATE);
+  cps = cpmsg;
+  savedcps = 0;
+  copypage();
+}
+
+
+static void
+copypage()
+{
+  char *ws;
+  int x, y, l;
+  char cbuf[80];
+
+  ClearDisplay();
+  x = y = 0;
+  while(*cps)
+    {
+      ws = cps;
+      while (*cps == ' ')
+       cps++;
+      if (strncmp(cps, "%v", 2) == 0)
+       {
+         savedcps = cps + 2;
+         ws = cps = version;
+       }
+      while (*cps && *cps != ' ' && *cps != '\n')
+       cps++;
+      l = cps - ws;
+      cps = ws;
+      if (l > screenwidth - 1)
+       l = screenwidth - 1;
+      if (x && x + l >= screenwidth - 2)
+       {
+         printf("\r\n");
+         x = 0;
+         if (++y > screenheight - 4)
+            break;
+       }
+      if (x)
+       {
+         putchar(' ');
+         x++;
+       }
+      if (l)
+        printf("%*.*s", l, l, ws);
+      x += l;
+      cps += l;
+      if (*cps == 0 && savedcps)
+       {
+         cps = savedcps;
+         savedcps = 0;
+       }
+      if (*cps == '\n')
+       {
+         printf("\r\n");
+         x = 0;
+         if (++y > screenheight - 4)
+            break;
+       }
+      if (*cps == ' ' || *cps == '\n')
+       cps++;
+    }
+  while (y++ < screenheight - 2)
+    printf("\r\n");
+  sprintf(cbuf,"[Press Space %s Return to end.]",
+        *cps ? "for next page;" : "or");
+  centerline(cbuf);
+  fflush(stdout);
+  SetLastPos(0, screenheight-1);
+}
+