home *** CD-ROM | disk | FTP | other *** search
- From: pvr@wang.com (Peter Reilley)
- Newsgroups: alt.sources
- Subject: BEAV (01/10) ver 1.2 Binary File Editor, new release
- Message-ID: <b6lmky.hmr@wang.com>
- Date: 6 Jun 91 13:24:33 GMT
-
-
- This is the latest release of BEAV. I am posting it to alt.sources
- because I my posting to comp.sources.unix has not been released by the
- moderator. It has sat in the mill for over 3 months. I would like
- to find an archive for the source. If someone would like to archive it
- and tell me where I would be most appreciative. If this is not propper
- protocol please excuse me, I am reletively new to news.
-
- This release 1.20 of BEAV (Binary Editor And Viewer),
- a full featured binary file editor. Just about any operation that
- you could want to do to a binary file is possible with BEAV. You
- can insert or delete in the middle of a file thereby changing it's size.
- You can display and edit data in hex, octal, decimal, binary, ascii,
- or ebcdic formats. You can display data in byte, word, or long word
- formats in either Intel or Motorola byte ordering. You can send the
- formatted display mode to a file or printer.
-
- Version 1.20 (3/10/91) of beav contains the following
- fixes and enhancements;
-
- * Under unix files are created with read/write
- permissions.
-
- * Fixed the bug in the terminal I/O routine that
- caused beav to spin rather than give up control when
- waiting for a character.
-
- * Added the ANSI #define that was missing for MSDOS.
-
- * Changed the D16 #define to a unsigned short.
-
- * Called ttclose on error exit.
-
- * Check and limit ncol and nrow to the actual screen
- array size.
-
- * Add the ability to load key bindings from a file
- automatically under MSDOS and unix.
-
- * Add delete current window command.
-
- * Support VT100 type function keys.
-
- BEAV is based on the source for emacs for display and keyboard handling
- functions. The binary file handling and display formats are special
- to BEAV. There is a full manual included in this release. There
- are makefiles for unix, xenix 286, and MSC 5.1 under DOS. The old Wang PC
- is supported. This has been tested on 286 and 386 PC's under SCO UNIX and
- XENIX as well as under UNIX on a MIPS system.
- I am willing to maintain BEAV and will entertain suggestions for
- modifications and/or bug fixes. I can be reached at;
-
- pvr@wang.com
-
- or at;
-
- Peter Reilley
- 19 Heritage Cir.
- Hudson, N.H. 03051
-
- -----> CUT HERE <-----> CUT HERE <-----> CUT HERE <-----> CUT HERE <-----
- #! /bin/sh
- # This is a shell archive. Remove anything before this line, then unpack
- # it by saving it into a file and typing "sh file". To overwrite existing
- # files, type "sh file -c". You can also feed this as standard input via
- # unshar, or by typing "sh <file", e.g.. If this archive is complete, you
- # will see the following message at the end:
- # "End of archive 1 (of 10)."
- # Contents: cinfo.c ebcdic.c editor.lnk fileio.c kbd.c lintfunc.dec
- # machine.c makefile.286 makefile.dos makefile.unx region.c spawn.c
- # tcap.c termio.c tty.c ttyio.c wangpc.c word.c
- # Wrapped by pvr@elf on Thu Mar 14 08:16:45 1991
- PATH=/bin:/usr/bin:/usr/ucb ; export PATH
- if test -f 'cinfo.c' -a "${1}" != "-c" ; then
- echo shar: Will not clobber existing file \"'cinfo.c'\"
- else
- echo shar: Extracting \"'cinfo.c'\" \(2700 characters\)
- sed "s/^X//" >'cinfo.c' <<'END_OF_FILE'
- X/*
- X* Character class tables.
- X* Do it yourself character classification
- X* macros, that understand the multinational character set,
- X* and let me ask some questions the standard macros (in
- X* ctype.h) don't let you ask.
- X*/
- X#define LINT_ARGS 1 /* enable lint type checking */
- X#include "def.h"
- X#include "lintfunc.dec"
- X/*
- X* This table, indexed by a character drawn
- X* from the 256 member character set, is used by my
- X* own character type macros to answer questions about the
- X* type of a character. It handles the full multinational
- X* character set, and lets me ask some questions that the
- X* standard "ctype" macros cannot ask.
- X*/
- Xchar cinfo[256] =
- X{
- X
- X _C, _C, _C, _C, /* 0x0X */
- X _C, _C, _C, _C,
- X _C, _C, _C, _C,
- X _C, _C, _C, _C,
- X _C, _C, _C, _C, /* 0x1X */
- X _C, _C, _C, _C,
- X _C, _C, _C, _C,
- X _C, _C, _C, _C,
- X 0, 0, 0, 0, /* 0x2X */
- X _W, 0, 0, _W,
- X 0, 0, 0, 0,
- X 0, 0, 0, 0,
- X _W, _W, _W, _W, /* 0x3X */
- X _W, _W, _W, _W,
- X _W, _W, 0, 0,
- X 0, 0, 0, 0,
- X 0, _U | _W, _U | _W, _U | _W,/* 0x4X */
- X _U | _W, _U | _W, _U | _W, _U | _W,
- X _U | _W, _U | _W, _U | _W, _U | _W,
- X _U | _W, _U | _W, _U | _W, _U | _W,
- X _U | _W, _U | _W, _U | _W, _U | _W,/* 0x5X */
- X _U | _W, _U | _W, _U | _W, _U | _W,
- X _U | _W, _U | _W, _U | _W, 0,
- X 0, 0, 0, _W,
- X 0, _L | _W, _L | _W, _L | _W,/* 0x6X */
- X _L | _W, _L | _W, _L | _W, _L | _W,
- X _L | _W, _L | _W, _L | _W, _L | _W,
- X _L | _W, _L | _W, _L | _W, _L | _W,
- X _L | _W, _L | _W, _L | _W, _L | _W,/* 0x7X */
- X _L | _W, _L | _W, _L | _W, _L | _W,
- X _L | _W, _L | _W, _L | _W, 0,
- X 0, 0, 0, _C,
- X 0, 0, 0, 0, /* 0x8X */
- X 0, 0, 0, 0,
- X 0, 0, 0, 0,
- X 0, 0, 0, 0,
- X 0, 0, 0, 0, /* 0x9X */
- X 0, 0, 0, 0,
- X 0, 0, 0, 0,
- X 0, 0, 0, 0,
- X 0, 0, 0, 0, /* 0xAX */
- X 0, 0, 0, 0,
- X 0, 0, 0, 0,
- X 0, 0, 0, 0,
- X 0, 0, 0, 0, /* 0xBX */
- X 0, 0, 0, 0,
- X 0, 0, 0, 0,
- X 0, 0, 0, 0,
- X _U | _W, _U | _W, _U | _W, _U | _W,/* 0xCX */
- X _U | _W, _U | _W, _U | _W, _U | _W,
- X _U | _W, _U | _W, _U | _W, _U | _W,
- X _U | _W, _U | _W, _U | _W, _U | _W,
- X 0, _U | _W, _U | _W, _U | _W,/* 0xDX */
- X _U | _W, _U | _W, _U | _W, _U | _W,
- X _U | _W, _U | _W, _U | _W, _U | _W,
- X _U | _W, _U | _W, 0, _W,
- X _L | _W, _L | _W, _L | _W, _L | _W,/* 0xEX */
- X _L | _W, _L | _W, _L | _W, _L | _W,
- X _L | _W, _L | _W, _L | _W, _L | _W,
- X _L | _W, _L | _W, _L | _W, _L | _W,
- X 0, _L | _W, _L | _W, _L | _W,/* 0xFX */
- X _L | _W, _L | _W, _L | _W, _L | _W,
- X _L | _W, _L | _W, _L | _W, _L | _W,
- X _L | _W, _L | _W, 0, 0
- X}
- X ;
- END_OF_FILE
- if test 2700 -ne `wc -c <'cinfo.c'`; then
- echo shar: \"'cinfo.c'\" unpacked with wrong size!
- fi
- chmod +x 'cinfo.c'
- # end of 'cinfo.c'
- fi
- if test -f 'ebcdic.c' -a "${1}" != "-c" ; then
- echo shar: Will not clobber existing file \"'ebcdic.c'\"
- else
- echo shar: Extracting \"'ebcdic.c'\" \(2681 characters\)
- sed "s/^X//" >'ebcdic.c' <<'END_OF_FILE'
- X
- X#define LINT_ARGS 1 /* enable lint type checking */
- X#include "def.h"
- X
- Xextern char ERR_ebcdic[];
- X
- X#include "lintfunc.dec"
- X/* Function definitions */
- X
- X/* This table defines the translation from EBCDIC code to ASCII. */
- X
- Xchar ebcdic_table[] =
- X{0x2E, 0x2E, 0x2E, 0x2E, 0x2E, 0x2E, 0x2E, 0x2E,/* 00-07 */
- X 0x2E, 0x2E, 0x2E, 0x2E, 0x2E, 0x2E, 0x2E, 0x2E,/* 08-0F */
- X 0x2E, 0x2E, 0x2E, 0x2E, 0x2E, 0x2E, 0x2E, 0x2E,/* 10-17 */
- X 0x2E, 0x2E, 0x2E, 0x2E, 0x2E, 0x2E, 0x2E, 0x2E,/* 18-1F */
- X 0x2E, 0x2E, 0x2E, 0x2E, 0x2E, 0x2E, 0x2E, 0x2E,/* 20-27 */
- X 0x2E, 0x2E, 0x2E, 0x2E, 0x2E, 0x2E, 0x2E, 0x2E,/* 28-2F */
- X 0x2E, 0x2E, 0x2E, 0x2E, 0x2E, 0x2E, 0x2E, 0x2E,/* 30-37 */
- X 0x2E, 0x2E, 0x2E, 0x2E, 0x2E, 0x2E, 0x2E, 0x2E,/* 38-3F */
- X 0x20, 0x2E, 0x2E, 0x2E, 0x2E, 0x2E, 0x2E, 0x2E,/* 40-47 */
- X 0x2E, 0x2E, 0x2E, 0x2E, 0x3C, 0x28, 0x2B, 0x2E,/* 48-4F */
- X 0x26, 0x2E, 0x2E, 0x2E, 0x2E, 0x2E, 0x2E, 0x2E,/* 50-57 */
- X 0x2E, 0x2E, 0x21, 0x24, 0x2A, 0x29, 0x3B, 0x5E,/* 58-5F */
- X 0x2D, 0x2F, 0x2E, 0x2E, 0x2E, 0x2E, 0x2E, 0x2E,/* 60-67 */
- X 0x2E, 0x2E, 0x7C, 0x2E, 0x25, 0x5F, 0x3E, 0x3F,/* 68-6F */
- X 0x2E, 0x2E, 0x2E, 0x2E, 0x2E, 0x27, 0x2E, 0x2E,/* 70-77 */
- X 0x2E, 0x60, 0x3A, 0x23, 0x40, 0x2C, 0x3D, 0x22,/* 78-7F */
- X 0x2E, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,/* 80-87 */
- X 0x68, 0x69, 0x2E, 0x2E, 0x2E, 0x2E, 0x2E, 0x2E,/* 88-8F */
- X 0x2E, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F, 0x70,/* 90-97 */
- X 0x71, 0x72, 0x2E, 0x2E, 0x2E, 0x2E, 0x2E, 0x2E,/* 98-9F */
- X 0x2E, 0x7E, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78,/* A0-A7 */
- X 0x79, 0x7A, 0x2E, 0x2E, 0x2E, 0x2E, 0x2E, 0x2E,/* A8-AF */
- X 0x2E, 0x2E, 0x2E, 0x2E, 0x2E, 0x2E, 0x2E, 0x2E,/* B0-B7 */
- X 0x2E, 0x2E, 0x2E, 0x2E, 0x2E, 0x2E, 0x2E, 0x2E,/* B8-BF */
- X 0x7B, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47,/* C0-C7 */
- X 0x48, 0x49, 0x2E, 0x2E, 0x2E, 0x2E, 0x2E, 0x2E,/* C8-CF */
- X 0x7D, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F, 0x50,/* D0-D7 */
- X 0x51, 0x52, 0x2E, 0x2E, 0x2E, 0x2E, 0x2E, 0x2E,/* D8-DF */
- X 0x5C, 0x2E, 0X53, 0x54, 0x55, 0x56, 0x57, 0x58,/* E0-E7 */
- X 0x59, 0x5A, 0x2E, 0x2E, 0x2E, 0x2E, 0x2E, 0x2E,/* E8-EF */
- X 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,/* F0-F7 */
- X 0x38, 0x39, 0x2E, 0x2E, 0x2E, 0x2E, 0x2E, 0x2E/* F8-FF */
- X};
- X
- X/* convert a ASCII character to an EBCDIC character */
- Xchar to_ebcdic (ch)
- X
- Xchar ch;
- X{
- X int cnt;
- X char buf[70], buf1[70];
- X
- X for (cnt = 0; cnt < sizeof (ebcdic_table); cnt++)
- X {
- X if (ch == ebcdic_table[cnt])
- X return (cnt);
- X }
- X sprintf (buf1, ERR_ebcdic, R_BYTE_FMT(curwp));
- X sprintf (buf, buf1, ch);
- X writ_echo(buf);
- X return (0);
- X}
- END_OF_FILE
- if test 2681 -ne `wc -c <'ebcdic.c'`; then
- echo shar: \"'ebcdic.c'\" unpacked with wrong size!
- fi
- chmod +x 'ebcdic.c'
- # end of 'ebcdic.c'
- fi
- if test -f 'editor.lnk' -a "${1}" != "-c" ; then
- echo shar: Will not clobber existing file \"'editor.lnk'\"
- else
- echo shar: Extracting \"'editor.lnk'\" \(193 characters\)
- sed "s/^X//" >'editor.lnk' <<'END_OF_FILE'
- XBASIC +BUFFER +CINFO +DISPLAY +ECHO +EXTEND + EBCDIC +
- XFILE +FILEIO +FORMAT +KBD +LINE +MAIN +RANDOM +REGION +
- XSEARCH +SPAWN +SYMBOL +TEXT +TTY +TTYIO +TTYKBD +
- XWINDOW +WORD + WANGPC
- XBEAV.EXE;
- END_OF_FILE
- if test 193 -ne `wc -c <'editor.lnk'`; then
- echo shar: \"'editor.lnk'\" unpacked with wrong size!
- fi
- chmod +x 'editor.lnk'
- # end of 'editor.lnk'
- fi
- if test -f 'fileio.c' -a "${1}" != "-c" ; then
- echo shar: Will not clobber existing file \"'fileio.c'\"
- else
- echo shar: Extracting \"'fileio.c'\" \(4787 characters\)
- sed "s/^X//" >'fileio.c' <<'END_OF_FILE'
- X/*
- X* file I/O.
- X*/
- X#include <sys/types.h>
- X#include "def.h"
- X
- X#ifdef UNIX
- X#include <fcntl.h>
- X#include <sys/stat.h>
- X#endif
- X
- Xextern char MSG_cnt_wr[];
- Xextern char MSG_wr_io_er[];
- Xextern char MSG_rd_er[];
- Xextern char MSG_bak[];
- Xextern char MSG_backup[];
- Xextern char MSG_back_er[];
- Xextern char MSG_back_of[];
- X
- X#include "lintfunc.dec"
- X
- X#ifdef MSDOS
- Xstatic FILE * ffp;
- X#endif
- X
- X#ifdef UNIX
- Xstatic int ffp;
- X#endif
- X
- X/*
- X* Open a file for reading.
- X*/
- Xchar ffropen (fn)
- Xchar *fn;
- X{
- X#ifdef MSDOS
- X if ((ffp = fopen (fn, "rb")) == NULL)/* pvr */
- X return (FIOERR);;
- X return (FIOSUC);
- X#endif
- X#ifdef UNIX
- X if ((ffp = open (fn, O_RDONLY)) == -1)/* pvr */
- X return (FIOERR);;
- X return (FIOSUC);
- X#endif
- X}
- X/*
- X* Get the file length
- X*/
- XA32 file_len ()
- X {
- X#ifdef MSDOS
- X return (filelength (fileno (ffp)));
- X#endif
- X#ifdef UNIX
- X struct stat st;
- X
- X if (fstat (ffp, &st) == -1)
- X return (-1);
- X return (st.st_size);
- X#endif
- X }
- X
- X/*
- X* Open a file for writing.
- X* Return TRUE if all is well, and
- X* FALSE on error (cannot create).
- X*/
- Xchar ffwopen (fn)
- Xchar *fn;
- X{
- X#ifdef MSDOS
- X if ((ffp = fopen (fn, "wb")) == NULL)/* pvr */
- X {
- X writ_echo (MSG_cnt_wr);
- X return (FIOERR);
- X }
- X return (FIOSUC);
- X#endif
- X#ifdef UNIX
- X /* set perms 1.13 */
- X if ((ffp = open (fn, O_WRONLY | O_CREAT, S_IREAD | S_IWRITE)) == -1)/* pvr */
- X return (FIOERR);;
- X return (FIOSUC);
- X#endif
- X}
- X
- X/*
- X* Close a file.
- X* Should look at the status.
- X*/
- Xchar ffclose ()
- X{
- X#ifdef MSDOS
- X fclose (ffp);
- X#endif
- X#ifdef UNIX
- X close (ffp);
- X#endif
- X return (FIOSUC);
- X}
- X
- X/*
- X* Write a line to the already
- X* opened file. The "buf" points to the
- X* buffer, and the "nbuf" is its length. pvr
- X* Return the status.
- X*/
- Xchar ffputline (buf, nbuf)
- Xregister char buf[];
- Xint nbuf;
- X{
- X register int i;
- X
- X#ifdef MSDOS
- X i = fwrite (buf, 1, nbuf, ffp);
- X#endif
- X#ifdef UNIX
- X i = write (ffp, buf, nbuf);
- X#endif
- X
- X if ((i != nbuf)
- X#ifdef MSDOS
- X || (ferror (ffp) != FALSE))
- X#else
- X )
- X#endif
- X {
- X writ_echo (MSG_wr_io_er);
- X return (FIOERR);
- X }
- X return (FIOSUC);
- X}
- X
- X/*
- X* Read a line from a file, and store the bytes
- X* in the supplied buffer. Stop on end of file or after 'nbuf' characters. pvr
- X* the first byte in the buffer is the length in bytes.
- X*/
- Xchar ffgetline (buf, nbuf, rbuf)
- Xregister char *buf;
- Xregister int *rbuf, nbuf;
- X{
- X
- X register int c;
- X register int i;
- X
- X#ifdef MSDOS
- X *rbuf = fread (buf, 1, nbuf, ffp);
- X#endif
- X
- X#ifdef UNIX
- X *rbuf = read (ffp, buf, nbuf);
- X#endif
- X
- X /* End of file. */
- X#ifdef MSDOS
- X if (ferror (ffp) != FALSE)
- X {
- X writ_echo (MSG_rd_er);
- X return (FIOERR);
- X }
- X#endif
- X if (*rbuf == 0)
- X return (FIOEOF);
- X
- X return (FIOSUC);
- X}
- X
- X/*
- X* Seek to specified position in file.
- X* Return the actual position in the file.
- X*/
- XA32 ffseek (posn)
- X A32 posn;
- X {
- X#ifdef MSDOS
- X fseek (ffp, posn, SEEK_SET);
- X return (ftell (ffp));
- X#endif
- X#ifdef UNIX
- X return (lseek (ffp, posn, 0));
- X#endif
- X }
- X
- X/*
- X* Some backup user on MS-DOS might want
- X* to determine some rule for doing backups on that
- X* system, and fix this. I don't use MS-DOS, so I don't
- X* know what the right rules would be. Return TRUE so
- X* the caller does not abort a write.
- X*/
- X#if BACKUP
- Xbool fbackupfile (fname)
- Xchar *fname;
- X{
- X FILE * backupfile;
- X char backname[128];
- X char *source,
- X *backup;
- X extern char time_string[];
- X char buf[80];
- X
- X source = fname;
- X backup = backname;
- X while ((*source > 0) && (*source != '.'))
- X {
- X *backup = *source;
- X backup++;
- X source++;
- X *backup = 0;
- X }
- X strcat (backname, MSG_bak);
- X sprintf (buf, MSG_backup, fname, backname);
- X writ_echo (buf);
- X unlink (backname);
- X#ifdef MSDOS
- X if (rename (backname, fname) > 0)
- X#else
- X if ((link (fname, backname) != 0) || (unlink (fname) != 0))
- X#endif
- X {
- X sprintf (buf, MSG_back_er, fname, backname);
- X writ_echo (buf);
- X return (FALSE);
- X }
- X return (TRUE); /* Hack. */
- X}
- X
- X#endif
- X
- X/*
- X* The string "fn" is a file name.
- X* Perform any required case adjustments. All systems
- X* we deal with so far have case insensitive file systems.
- X* We zap everything to lower case. The problem we are trying
- X* to solve is getting 2 buffers holding the same file if
- X* you visit one of them with the "caps lock" key down.
- X* On UNIX file names are dual case, so we leave
- X* everything alone.
- X*/
- Xvoid adjustcase (fn)
- Xregister char *fn;
- X{
- X register int c;
- X
- X while ((c = *fn) != 0)
- X {
- X if (c >= 'A' && c <= 'Z')
- X *fn = c + 'a' - 'A';
- X ++fn;
- X }
- X}
- X
- X
- END_OF_FILE
- if test 4787 -ne `wc -c <'fileio.c'`; then
- echo shar: \"'fileio.c'\" unpacked with wrong size!
- fi
- chmod +x 'fileio.c'
- # end of 'fileio.c'
- fi
- if test -f 'kbd.c' -a "${1}" != "-c" ; then
- echo shar: Will not clobber existing file \"'kbd.c'\"
- else
- echo shar: Extracting \"'kbd.c'\" \(4640 characters\)
- sed "s/^X//" >'kbd.c' <<'END_OF_FILE'
- X/* KBD.C
- X* Terminal independent keyboard handling.
- X*/
- X#define LINT_ARGS 1 /* enable lint type checking */
- X#include "def.h"
- X
- Xchar *keystrings ();
- X
- Xextern char MSG_tab[];
- Xextern char MSG_esc[];
- Xextern char MSG_ctl_x[];
- Xextern char MSG_ctl[];
- Xextern char MSG_fn[];
- Xextern char MSG_ret[];
- Xextern char MSG_bksp[];
- Xextern char MSG_space[];
- Xextern char MSG_rubout[];
- X
- X#include "lintfunc.dec"
- X/*
- X* Read in a key, doing the terminal
- X* independent prefix handling. The terminal specific
- X* "getkbd" routine gets the first swing, and may return
- X* one of the special codes used by the special keys
- X* on the keyboard. The "getkbd" routine returns the
- X* C0 controls as received; this routine moves them to
- X* the right spot in 11 bit code.
- X*/
- Xint getkey ()
- X{
- X
- X register int c;
- X c = getkbd ();
- X if (c == METACH) /* M- */
- X {
- X c = KMETA | getctl ();
- X#ifdef VT100KEY
- X if ((c & KCHAR) == '[')
- X c = KMETA | KCTRL | KCTLX | getctl (); /* flag VT100 sequence */
- X#endif
- X }
- X else if (c == CTRLCH) /* C- */
- X c = KCTRL | getctl ();
- X else if (c == CTMECH) /* C-M- */
- X c = KCTRL | KMETA | getctl ();
- X else if (c >= 0x00 && c <= 0x1F)/* Relocate control. */
- X c = KCTRL | (c + '@');
- X
- X if (c == (KCTRL | 'X')) /* C-X */
- X c = KCTLX | getctl ();
- X return (c);
- X}
- X
- X
- X/*
- X* Used above.
- X*/
- Xint getctl ()
- X{
- X
- X register int c;
- X
- X#if 1
- X c = getkbd ();
- X if (c == METACH) /* M- */
- X c = KMETA | getctl ();
- X else
- X if (c == CTRLCH) /* C- */
- X c = KCTRL | getctl ();
- X else
- X if (c == CTMECH) /* C-M- */
- X c = KCTRL | KMETA | getctl ();
- X else
- X if (c >= 0x00 && c <= 0x1F)/* Relocate control. */
- X c = KCTRL | (c + '@');
- X#else
- X c = getkey (); /* Note recursion */
- X if (ISLOWER (c & 0xFF))
- X c = (c & ~0xFF) | TOUPPER (c & 0xFF);
- X if (c >= 0x00 && c <= 0x1F) /* Relocate control. */
- X c = KCTRL | (c + '@');
- X#endif
- X if (ISLOWER (c & 0xFF))
- X c = (c & ~0xFF) | TOUPPER (c & 0xFF);
- X return (c);
- X}
- X
- X
- X/*
- X* Transform a key code into a name,
- X* using a table for the special keys and combination
- X* of some hard code and some general processing for
- X* the rest. None of this code is terminal specific any
- X* more. This makes adding keys easier.
- X*/
- Xvoid keyname (cp, k)
- Xregister char *cp;
- Xregister int k;
- X{
- X register char *np;
- X char nbuf[3];
- X
- X static char hex[] =
- X {
- X '0', '1', '2', '3',
- X '4', '5', '6', '7',
- X '8', '9', 'A', 'B',
- X 'C', 'D', 'E', 'F'
- X };
- X *cp = 0; /* terminate previous string */
- X#ifdef VT100KEY
- X if ((k & (KMETA | KCTRL | KCTLX)) == (int)(KMETA | KCTRL | KCTLX))
- X {
- X sprintf (&cp[strlen (cp)], MSG_fn);
- X sprintf (&cp[strlen (cp)], "%c", k & KCHAR);
- X return;
- X }
- X#endif
- X if (k & 0x80)
- X {
- X if ((np = keystrings (k)) != NULL)
- X {
- X if ((k & KMETA) != 0)
- X sprintf (&cp[strlen (cp)], MSG_esc);
- X
- X strcat (cp, np);
- X }
- X else
- X cp[strlen (cp)] = 0; /* null string */
- X return;
- X }
- X
- X if ((k & KCTLX) != 0)
- X {
- X /* Ctl-X prefix. */
- X sprintf (&cp[strlen (cp)], MSG_ctl_x);
- X k &= ~KCTLX;
- X }
- X
- X if ((k & KMETA) != 0)
- X {
- X /* Add Esc- mark. */
- X sprintf (&cp[strlen (cp)], MSG_esc);
- X k &= ~KMETA;
- X }
- X
- X if (k == (KCTRL | 'I'))/* Some specials. */
- X np = MSG_tab;
- X else
- X {
- X if (k == (KCTRL | 'M'))
- X np = MSG_ret;
- X else if (k == (KCTRL | 'H'))
- X np = MSG_bksp;
- X else if (k == ' ')
- X np = MSG_space;
- X else if (k == 0x7F)
- X np = MSG_rubout;
- X else
- X {
- X if ((k & KCTRL) != 0)
- X {
- X /* Add Ctl- mark. */
- X sprintf (&cp[strlen (cp)], MSG_ctl);
- X }
- X np = &nbuf[0];
- X if (((k & KCHAR) >= 0x20 && (k & KCHAR) <= 0x7E)
- X || ((k & KCHAR) >= 0xA0 && (k & KCHAR) <= 0xFE))
- X {
- X nbuf[0] = k & KCHAR;/* Graphic. */
- X nbuf[1] = 0;
- X }
- X else
- X {
- X /* Non graphic. */
- X nbuf[0] = hex[(k >> 4) & 0x0F];
- X nbuf[1] = hex[k & 0x0F];
- X nbuf[2] = 0;
- X }
- X }
- X }
- X strcat (cp, np);
- X}
- X
- END_OF_FILE
- if test 4640 -ne `wc -c <'kbd.c'`; then
- echo shar: \"'kbd.c'\" unpacked with wrong size!
- fi
- chmod +x 'kbd.c'
- # end of 'kbd.c'
- fi
- if test -f 'lintfunc.dec' -a "${1}" != "-c" ; then
- echo shar: Will not clobber existing file \"'lintfunc.dec'\"
- else
- echo shar: Extracting \"'lintfunc.dec'\" \(25 characters\)
- sed "s/^X//" >'lintfunc.dec' <<'END_OF_FILE'
- X/* Dummy include file */
- END_OF_FILE
- if test 25 -ne `wc -c <'lintfunc.dec'`; then
- echo shar: \"'lintfunc.dec'\" unpacked with wrong size!
- fi
- # end of 'lintfunc.dec'
- fi
- if test -f 'machine.c' -a "${1}" != "-c" ; then
- echo shar: Will not clobber existing file \"'machine.c'\"
- else
- echo shar: Extracting \"'machine.c'\" \(2190 characters\)
- sed "s/^X//" >'machine.c' <<'END_OF_FILE'
- X/* This program sniffs around to see what type of MSDOS computer
- X it is running in
- X*/
- X
- X/* Checks what type of machine it is running in and returns
- X 0 if unknown
- X 1 if Wang PC
- X 2 if Wang APC
- X 3 if IBM PC/XT
- X 4 if IBM PC/AT
- X 5 if IBM PC Jr
- X 6 if IBM PC
- X 7 if Wang Laptop
- X 8 if Wang PC200
- X 9 if Wang PC300
- X 10 if IBM PS/2
- X*/
- Xint host_mach()
- X{
- Xunsigned char far *memptr;
- Xunsigned char c;
- Xint i, match;
- Xstatic char wang_pc[]={"WANG PROFE"};
- Xstatic char wang_apc[]={"WANG ADVAN"};
- Xstatic char wang_lap[]={"WANG"};
- X
- X/* test for Wang PC */
- Xmemptr = (unsigned char far *)0xFC003FC2L;
- Xmatch = 1;
- Xfor (i=0;(i<10 && match!=0);i++)
- X {
- X if(*memptr != wang_pc[i])
- X match=0;
- X memptr++;
- X }
- Xif(match ==1)
- X return(1);
- X
- X/* test for Wang APC */
- Xmemptr = (unsigned char far *)0xFC003FC2L;
- Xmatch = 1;
- Xfor (i=0;(i<10 && match!=0);i++)
- X {
- X if(*memptr != wang_apc[i])
- X match=0;
- X memptr++;
- X }
- Xif(match ==1)
- X return(2);
- X
- X/* test for Wang Laptop */
- Xmemptr = (unsigned char far *)0xFC003FC2L;
- Xmatch = 1;
- Xfor (i=0;(i<4 && match!=0);i++)
- X {
- X if(*memptr != wang_pc[i])
- X match=0;
- X memptr++;
- X }
- Xif(match ==1)
- X /* I should really do an INT 88h func 0 now to verify for sure
- X but I'm too lazy!
- X */
- X return(7);
- X
- X/* Must be an IBM or clone */
- Xmemptr = (unsigned char far *)0xF000FFFEL;
- Xc = *memptr;
- X
- Xswitch(c)
- X {
- Xcase 0xFC: /* IBM AT or clone */
- X /* for the moment a PC200 is the same as an AT */
- X return(4);
- X
- Xcase 0xFD: /* IBM PC Jr */
- X return(5);
- X
- Xcase 0xFE: /* IBM XT or clone */
- X return(3);
- X
- Xcase 0xFF: /* IBM PC or clone */
- X return(6);
- X
- X }
- X
- Xreturn(0);
- X}
- X
- X
- X
- Xmain()
- X{
- Xint machine;
- X
- Xmachine = host_mach();
- X
- Xprintf("This is a ");
- Xswitch(machine)
- X {
- Xcase 0: printf("unknown type of machine\n");
- X break;
- Xcase 1: printf("Wang PC\n");
- X break;
- Xcase 2: printf("Wang Advanced PC\n");
- X break;
- Xcase 3: printf("IBM PC/XT\n");
- X break;
- Xcase 4: printf("IBM PC/AT\n");
- X break;
- Xcase 5: printf("IBM PC Jr\n");
- X break;
- Xcase 6: printf("IBM PC \n");
- X break;
- Xcase 7: printf("Wang LapTop\n");
- X break;
- X }
- X
- X}
- END_OF_FILE
- if test 2190 -ne `wc -c <'machine.c'`; then
- echo shar: \"'machine.c'\" unpacked with wrong size!
- fi
- chmod +x 'machine.c'
- # end of 'machine.c'
- fi
- if test -f 'makefile.286' -a "${1}" != "-c" ; then
- echo shar: Will not clobber existing file \"'makefile.286'\"
- else
- echo shar: Extracting \"'makefile.286'\" \(655 characters\)
- sed "s/^X//" >'makefile.286' <<'END_OF_FILE'
- X# This is a makefile for 286 xenix
- XCFLAGS= -O -Ml -DUNIX
- X
- XOFILES= basic.o ebcdic.o fileio.o region.o text.o wangpc.o \
- X buffer.o echo.o main.o search.o tty.o window.o \
- X cinfo.o extend.o kbd.o spawn.o ttyio.o termio.o tcap.o word.o \
- X display.o file.o line.o random.o symbol.o ttykbd.o format.o
- X
- X
- XCFILES= basic.c ebcdic.c fileio.c region.c text.c wangpc.c \
- X buffer.c echo.c format.c main.c search.c tty.c window.c \
- X cinfo.c extend.c kbd.c spawn.c ttyio.c termio.c tcap.c word.c \
- X display.c file.c line.c random.c symbol.c ttykbd.c
- X
- XHFILES= def.h
- X
- Xbeav: $(OFILES)
- X $(CC) $(CFLAGS) $(OFILES) -ltermcap -lc -o beav
- X
- X(OFILES): $(HFILES)
- X
- END_OF_FILE
- if test 655 -ne `wc -c <'makefile.286'`; then
- echo shar: \"'makefile.286'\" unpacked with wrong size!
- fi
- # end of 'makefile.286'
- fi
- if test -f 'makefile.dos' -a "${1}" != "-c" ; then
- echo shar: Will not clobber existing file \"'makefile.dos'\"
- else
- echo shar: Extracting \"'makefile.dos'\" \(1914 characters\)
- sed "s/^X//" >'makefile.dos' <<'END_OF_FILE'
- X# make BEAV MSC 5.1
- X
- XBASIC.OBJ: BASIC.C DEF.H LINTFUNC.DEC
- X CL -c -Ml BASIC.C ;
- X
- XBUFFER.OBJ: BUFFER.C DEF.H LINTFUNC.DEC
- X CL -c -Ml BUFFER.C ;
- X
- XCINFO.OBJ: CINFO.C DEF.H LINTFUNC.DEC
- X CL -c -Ml CINFO.C ;
- X
- XDISPLAY.OBJ: DISPLAY.C DEF.H LINTFUNC.DEC
- X CL -c -Ml DISPLAY.C ;
- X
- XEBCDIC.OBJ: EBCDIC.C DEF.H LINTFUNC.DEC
- X CL -c -Ml EBCDIC.C ;
- X
- XECHO.OBJ: ECHO.C DEF.H LINTFUNC.DEC
- X CL -c -Ml ECHO.C ;
- X
- XEXTEND.OBJ: EXTEND.C DEF.H LINTFUNC.DEC
- X CL -c -Ml EXTEND.C ;
- X
- XFILE.OBJ: FILE.C DEF.H LINTFUNC.DEC
- X CL -c -Ml FILE.C ;
- X
- XFILEIO.OBJ: FILEIO.C DEF.H LINTFUNC.DEC
- X CL -c -Ml FILEIO.C ;
- X
- XFORMAT.OBJ: FORMAT.C DEF.H LINTFUNC.DEC
- X CL -c -Ml FORMAT.C ;
- X
- XKBD.OBJ: KBD.C DEF.H LINTFUNC.DEC
- X CL -c -Ml KBD.C ;
- X
- XLINE.OBJ: LINE.C DEF.H LINTFUNC.DEC
- X CL -c -Ml LINE.C ;
- X
- XMAIN.OBJ: MAIN.C DEF.H LINTFUNC.DEC
- X CL -c -Ml MAIN.C ;
- X
- XRANDOM.OBJ: RANDOM.C DEF.H LINTFUNC.DEC
- X CL -c -Ml RANDOM.C ;
- X
- XREGION.OBJ: REGION.C DEF.H LINTFUNC.DEC
- X CL -c -Ml REGION.C ;
- X
- XSEARCH.OBJ: SEARCH.C DEF.H LINTFUNC.DEC
- X CL -c -Ml SEARCH.C ;
- X
- XSPAWN.OBJ: SPAWN.C DEF.H LINTFUNC.DEC
- X CL -c -Ml SPAWN.C ;
- X
- XSYMBOL.OBJ: SYMBOL.C DEF.H LINTFUNC.DEC
- X CL -c -Ml SYMBOL.C ;
- X
- XTEXT.OBJ: TEXT.C DEF.H LINTFUNC.DEC
- X CL -c -Ml TEXT.C ;
- X
- XTTY.OBJ: TTY.C DEF.H LINTFUNC.DEC
- X CL -c -Ml TTY.C ;
- X
- XTTYIO.OBJ: TTYIO.C DEF.H LINTFUNC.DEC
- X CL -c -Ml TTYIO.C ;
- X
- XTTYKBD.OBJ: TTYKBD.C DEF.H LINTFUNC.DEC
- X CL -c -Ml TTYKBD.C ;
- X
- XWANGPC.OBJ: WANGPC.C DEF.H LINTFUNC.DEC
- X CL -c -Ml WANGPC.C ;
- X
- XWINDOW.OBJ: WINDOW.C DEF.H LINTFUNC.DEC
- X CL -c -Ml WINDOW.C ;
- X
- XWORD.OBJ: WORD.C DEF.H LINTFUNC.DEC
- X CL -c -Ml WORD.C ;
- X
- XBEAV.EXE: BASIC.OBJ BUFFER.OBJ CINFO.OBJ DISPLAY.OBJ ECHO.OBJ EXTEND.OBJ \
- X EBCDIC.OBJ FILE.OBJ FILEIO.OBJ FORMAT.OBJ KBD.OBJ LINE.OBJ \
- X MAIN.OBJ RANDOM.OBJ TEXT.OBJ \
- X REGION.OBJ SEARCH.OBJ SPAWN.OBJ SYMBOL.OBJ TTY.OBJ TTYIO.OBJ \
- X TTYKBD.OBJ WINDOW.OBJ WORD.OBJ WANGPC.OBJ
- X LINK @editor.lnk
- X
- X
- X
- X
- END_OF_FILE
- if test 1914 -ne `wc -c <'makefile.dos'`; then
- echo shar: \"'makefile.dos'\" unpacked with wrong size!
- fi
- # end of 'makefile.dos'
- fi
- if test -f 'makefile.unx' -a "${1}" != "-c" ; then
- echo shar: Will not clobber existing file \"'makefile.unx'\"
- else
- echo shar: Extracting \"'makefile.unx'\" \(615 characters\)
- sed "s/^X//" >'makefile.unx' <<'END_OF_FILE'
- XCFLAGS= -O -DUNIX
- X
- XOFILES= basic.o ebcdic.o fileio.o region.o text.o wangpc.o \
- X buffer.o echo.o main.o search.o tty.o window.o \
- X cinfo.o extend.o kbd.o spawn.o ttyio.o termio.o tcap.o word.o \
- X display.o file.o line.o random.o symbol.o ttykbd.o format.o
- X
- X
- XCFILES= basic.c ebcdic.c fileio.c region.c text.c wangpc.c \
- X buffer.c echo.c format.c main.c search.c tty.c window.c \
- X cinfo.c extend.c kbd.c spawn.c ttyio.c termio.c tcap.c word.c \
- X display.c file.c line.c random.c symbol.c ttykbd.c
- X
- XHFILES= def.h
- X
- Xbeav: $(OFILES)
- X $(CC) $(CFLAGS) $(OFILES) -ltermcap -lc -o beav
- X
- X(OFILES): $(HFILES)
- END_OF_FILE
- if test 615 -ne `wc -c <'makefile.unx'`; then
- echo shar: \"'makefile.unx'\" unpacked with wrong size!
- fi
- # end of 'makefile.unx'
- fi
- if test -f 'region.c' -a "${1}" != "-c" ; then
- echo shar: Will not clobber existing file \"'region.c'\"
- else
- echo shar: Extracting \"'region.c'\" \(4582 characters\)
- sed "s/^X//" >'region.c' <<'END_OF_FILE'
- X/*
- X* Region based commands.
- X* The routines in this file
- X* deal with the region, that magic space
- X* between "." and mark. Some functions are
- X* commands. Some functions are just for
- X* internal use.
- X*/
- X#include "def.h"
- X
- Xbool setsize ();
- Xbool getregion ();
- X
- X
- Xextern char MSG_reg_lrg[];
- Xextern char MSG_sv_in_b[];
- Xextern char MSG_sav_slf[];
- Xextern char MSG_no_mark[];
- X
- X#include "lintfunc.dec"
- X/*
- X* Kill the region. Ask "getregion"
- X* to figure out the bounds of the region.
- X* Move "." to the start, and kill the characters.
- X*/
- Xchar killregion (f, n, k)
- X{
- X register char s;
- X REGION region;
- X int error;
- X
- X if ((s = getregion (®ion)) != TRUE)
- X return (s);
- X if ((lastflag & CFKILL) == 0)/* This is a kill type */
- X kdelete (); /* clean out k-buffer */
- X thisflag |= CFKILL; /* kill buffer stuff. */
- X curwp -> w_dotp = region.r_linep;
- X curwp -> w_doto = region.r_offset;
- X error = ldelete (region.r_size, TRUE);
- X writ_echo (okmsg);
- X return (error);
- X}
- X
- X
- X/*
- X* Copy all of the characters in the
- X* region to the kill buffer. Don't move dot
- X* at all. This is a bit like a kill region followed
- X* by a yank.
- X*/
- Xchar copyregion (f, n, k)
- X{
- X register LINE * linep;
- X register int loffs;
- X register char s;
- X REGION region;
- X
- X if ((s = getregion (®ion)) != TRUE)
- X return (s);
- X if ((lastflag & CFKILL) == 0)/* Kill type command. */
- X kdelete ();
- X thisflag |= CFKILL;
- X linep = region.r_linep; /* Current line. */
- X loffs = region.r_offset; /* Current offset. */
- X while (region.r_size--)
- X {
- X if (loffs == llength (linep))
- X {
- X /* End of line. */
- X if ((s = kinsert ('\n')) != TRUE)
- X return (s);
- X linep = lforw (linep);
- X loffs = 0;
- X }
- X else
- X {
- X /* Middle of line. */
- X if ((s = kinsert (lgetc (linep, loffs))) != TRUE)
- X return (s);
- X ++loffs;
- X }
- X }
- X writ_echo (okmsg);
- X return (TRUE);
- X}
- X
- X/*
- X* This routine figures out the bound of the region
- X* in the current window, and stores the results into the fields
- X* of the REGION structure. Dot and mark are usually close together,
- X* but I don't know the order. The size is kept in a long. At the
- X* end, after the size is figured out, it is assigned to the size
- X* field of the region structure. If this assignment loses any bits,
- X* then we print an error. This is "type independent" overflow
- X* checking. All of the callers of this routine should be ready to
- X* get an ABORT status, because I might add a "if regions is big,
- X* ask before clobberring" flag.
- X*/
- Xbool getregion (rp)
- Xregister REGION * rp;
- X{
- X if (curwp -> w_markp == NULL)
- X {
- X writ_echo (MSG_no_mark);
- X return (FALSE);
- X }
- X
- X if (DOT_POS(curwp) < MARK_POS(curwp))
- X {
- X rp -> r_linep = curwp -> w_dotp;
- X rp -> r_offset = curwp -> w_doto;
- X rp -> r_size = (int)(MARK_POS(curwp) - DOT_POS(curwp));
- X }
- X else
- X {
- X rp -> r_linep = curwp -> w_markp;
- X rp -> r_offset = curwp -> w_marko;
- X rp -> r_size = (int)(DOT_POS(curwp) - MARK_POS(curwp));
- X }
- X return (TRUE);
- X}
- X
- X/*
- X* Set size, and check for overflow.
- X*/
- Xbool setsize (rp, size)
- Xregister REGION * rp;
- Xregister long size;
- X{
- X rp -> r_size = size;
- X if (rp -> r_size != size)
- X {
- X writ_echo (MSG_reg_lrg);
- X return (FALSE);
- X }
- X return (TRUE);
- X}
- X
- X
- X/* save some region in a buffer
- X* (use _usebuffer to handle non-existent buffers)
- X*
- X* hack as it uses kill buffer to transfer stuff (quick and dirty!)
- X* and doesn't do clever things at all with dot in destination buffer!
- X*/
- Xchar save_region (f, n, k)
- X{
- X char bufn[NBUFN];
- X char oldbufn[NBUFN];
- X register char s;
- X
- X if ((s = ereply (MSG_sv_in_b, bufn, NBUFN, NULL)) != TRUE)
- X return (s);
- X
- X if (strcmp (bufn, curbp -> b_bname) == 0)
- X {
- X writ_echo (MSG_sav_slf);
- X return (FALSE);
- X }
- X
- X /* save this name for ughly reversal */
- X strcpy (oldbufn, curbp -> b_bname);
- X
- X /* copy stuff using killbuffer as work space - hack !! * than move it to
- X named place using yank - Quick AND Dirty */
- X copyregion (f, n, k);
- X _usebuffer (bufn);
- X curbp -> b_flag |= BFSAV; /* mark as a saved buffer */
- X
- X yank (f, n, k);
- X kdelete (); /* clean out kill buffer */
- X _usebuffer (oldbufn);
- X writ_echo (okmsg);
- X return (TRUE);
- X}
- X
- X
- END_OF_FILE
- if test 4582 -ne `wc -c <'region.c'`; then
- echo shar: \"'region.c'\" unpacked with wrong size!
- fi
- chmod +x 'region.c'
- # end of 'region.c'
- fi
- if test -f 'spawn.c' -a "${1}" != "-c" ; then
- echo shar: Will not clobber existing file \"'spawn.c'\"
- else
- echo shar: Extracting \"'spawn.c'\" \(1534 characters\)
- sed "s/^X//" >'spawn.c' <<'END_OF_FILE'
- X/*
- X* MS-DOS spawn command.com
- X*/
- X#include "def.h"
- X
- Xextern char MSG_shell[];
- Xextern char MSG_def_shell[];
- Xextern char MSG_pmpt[];
- Xextern char MSG_pt[];
- Xextern char MSG_pme[];
- Xextern char MSG_null[];
- X
- X#include "lintfunc.dec"
- X/* #include <dos.h> */
- X#if MSDOS
- X#include "process.h"
- X#endif
- Xchar *cspec = NULL; /* Command string. */
- Xchar *pspec = NULL;
- X
- X/*
- X* Create a subjob with a copy
- X* of the command intrepreter in it. When the
- X* command interpreter exits, mark the screen as
- X* garbage so that you do a full repaint.
- X*/
- Xbool spawncli (f, n, k)
- X{
- X#if MSDOS
- X
- X char *getenv ();
- X char old_prompt[128];
- X char prompt_line[128];
- X
- X ttcolor (CTEXT); /* Normal color. */
- X ttmove (nrow - 1, 0); /* Last line. */
- X ttflush ();
- X ttcooked ();
- X#ifndef IBM
- X strcpy (prompt_line, MSG_pmpt);
- X pspec = getenv (MSG_pt);
- X strcpy (old_prompt, pspec);
- X strcat (prompt_line, pspec);
- X if (strlen (prompt_line - strlen (MSG_pme)) >= 64)
- X /* VERY rude, but setenv not found */
- X {
- X if (putenv (MSG_pmpt) == -1)
- X exit (1);
- X }
- X else
- X if (putenv (prompt_line) == -1)
- X exit (1);
- X
- X#endif
- X if (!cspec && !(cspec = getenv (MSG_shell)))/* jam */
- X cspec = MSG_def_shell;
- X spawnl (P_WAIT, cspec, MSG_null, NULL);
- X putenv (MSG_pme);
- X if (putenv (old_prompt) == -1)
- X exit (1);
- X ttraw ();
- X sgarbf = TRUE;
- X#endif
- X return (TRUE);
- X}
- X
- END_OF_FILE
- if test 1534 -ne `wc -c <'spawn.c'`; then
- echo shar: \"'spawn.c'\" unpacked with wrong size!
- fi
- chmod +x 'spawn.c'
- # end of 'spawn.c'
- fi
- if test -f 'tcap.c' -a "${1}" != "-c" ; then
- echo shar: Will not clobber existing file \"'tcap.c'\"
- else
- echo shar: Extracting \"'tcap.c'\" \(2764 characters\)
- sed "s/^X//" >'tcap.c' <<'END_OF_FILE'
- X/* tcap: Unix V5, V7 and BS4.2 Termcap video driver
- X for beav
- X*/
- X
- X#include "def.h"
- X
- X#ifdef UNIX
- X
- X#define MARGIN 8
- X#define SCRSIZ 64
- X#define NPAUSE 10 /* # times thru update to pause */
- X#define BEL 0x07
- X#define ESC 0x1B
- X
- Xextern int ttgetc();
- Xextern int ttputc();
- Xextern int tgetnum();
- Xextern int ttflush();
- Xextern int ttclose();
- Xextern int tput();
- Xextern char *tgoto();
- X#if COLOR
- Xextern int tcapfcol();
- Xextern int tcapbcol();
- X#endif
- X
- X#define TCAPSLEN 315
- Xchar tcapbuf[TCAPSLEN];
- Xchar *UP, PC, *CM, *CE, *CL, *SO, *SE;
- X
- Xtcapopen()
- X{
- X char *getenv();
- X char *t, *p, *tgetstr();
- X char tcbuf[1024];
- X char *tv_stype;
- X char err_str[72];
- X
- X if ((tv_stype = getenv("TERM")) == NULL)
- X {
- X puts("Environment variable TERM not defined!\r");
- X ttclose();
- X exit(1);
- X }
- X
- X if ((tgetent(tcbuf, tv_stype)) != 1)
- X {
- X sprintf(err_str, "Unknown terminal type %s!\r", tv_stype);
- X puts(err_str);
- X ttclose(); /* fix in 1.13 */
- X exit(1);
- X }
- X
- X
- X if ((nrow=(short)tgetnum("li")-1) == -1){
- X puts("termcap entry incomplete (lines)\r");
- X ttclose(); /* fix in 1.13 */
- X exit(1);
- X }
- X /* don't allow to specify a larger number of rows than we can handle 1.13 */
- X if (nrow > NROW)
- X nrow = NROW;
- X
- X if ((ncol=(short)tgetnum("co")) == -1){
- X puts("Termcap entry incomplete (columns)\r");
- X ttclose(); /* fix in 1.13 */
- X exit(1);
- X }
- X /* don't allow to specify a larger number of cols than we can handle 1.13 */
- X if (ncol > NCOL)
- X ncol = NCOL;
- X
- X p = tcapbuf;
- X t = tgetstr("pc", &p);
- X if(t)
- X PC = *t;
- X
- X CL = tgetstr("cl", &p);
- X CM = tgetstr("cm", &p);
- X CE = tgetstr("ce", &p);
- X UP = tgetstr("up", &p);
- X SE = tgetstr("se", &p);
- X SO = tgetstr("so", &p);
- X
- X if(CL == NULL || CM == NULL || UP == NULL)
- X {
- X puts("Incomplete termcap entry\r");
- X ttclose(); /* fix in 1.13 */
- X exit(1);
- X }
- X
- X if (p >= &tcapbuf[TCAPSLEN])
- X {
- X puts("Terminal description too big!\r");
- X ttclose(); /* fix in 1.13 */
- X exit(1);
- X }
- X}
- X
- Xtcapmove(row, col)
- Xregister int row, col;
- X{
- X putpad(tgoto(CM, col, row));
- X}
- X
- Xtcapeeol()
- X{
- X putpad(CE);
- X}
- X
- Xtcapeeop()
- X{
- X putpad(CL);
- X}
- X
- Xtcaprev(state) /* change reverse video status */
- Xint state; /* FALSE = normal video, TRUE = reverse video */
- X
- X{
- X static int revstate = FALSE;
- X if (state) {
- X if (SO != NULL)
- X putpad(SO);
- X } else
- X if (SE != NULL)
- X putpad(SE);
- X}
- X
- Xputpad(str)
- Xchar *str;
- X{
- X tputs(str, 1, ttputc);
- X}
- X
- Xputnpad(str, n)
- Xchar *str;
- X{
- X tputs(str, n, ttputc);
- X}
- X
- X#endif
- END_OF_FILE
- if test 2764 -ne `wc -c <'tcap.c'`; then
- echo shar: \"'tcap.c'\" unpacked with wrong size!
- fi
- # end of 'tcap.c'
- fi
- if test -f 'termio.c' -a "${1}" != "-c" ; then
- echo shar: Will not clobber existing file \"'termio.c'\"
- else
- echo shar: Extracting \"'termio.c'\" \(3581 characters\)
- sed "s/^X//" >'termio.c' <<'END_OF_FILE'
- X/*
- X * The functions in this file negotiate with the operating system for
- X * characters, and write characters in a barely buffered fashion on the display.
- X * All operating systems.
- X */
- X
- X#include <sys/types.h> /* 1.13 */
- X#include "def.h"
- X
- X#ifdef UNIX /* System V */
- X
- X#include <stdio.h>
- X#include <signal.h>
- X#include <termio.h>
- X#include <errno.h>
- X#include <fcntl.h>
- Xint kbdflgs; /* saved keyboard fd flags */
- Xint kbdpoll; /* in O_NDELAY mode */
- Xint kbdqp; /* there is a char in kbdq */
- Xchar kbdq; /* char we've already read */
- Xstruct termio otermio; /* original terminal characteristics */
- Xstruct termio ntermio; /* charactoristics to use inside */
- X
- Xextern errno; /* System error number -- Necessary when compiling in BSD 1.13 */
- X
- Xint nrow; /* Terminal size, rows. */
- Xint ncol; /* Terminal size, columns. */
- X
- X/*
- X * This function is called once to set up the terminal device streams.
- X * On VMS, it translates TT until it finds the terminal, then assigns
- X * a channel to it and sets it raw. On CPM it is a no-op.
- X */
- Xttopen()
- X{
- X ioctl(0, TCGETA, &otermio); /* save old settings */
- X ntermio.c_iflag = 0; /* setup new settings */
- X ntermio.c_oflag = 0;
- X ntermio.c_cflag = otermio.c_cflag;
- X ntermio.c_lflag = 0;
- X ntermio.c_line = otermio.c_line;
- X ntermio.c_cc[VMIN] = 1;
- X ntermio.c_cc[VTIME] = 0;
- X ioctl(0, TCSETAW, &ntermio); /* and activate them */
- X kbdflgs = fcntl( 0, F_GETFL, 0 );
- X kbdpoll = FALSE;
- X /* on all screens we are not sure of the initial position
- X of the cursor */
- X ttrow = 999;
- X ttcol = 999;
- X nrow = NROW;
- X ncol = NCOL;
- X}
- X
- X/*
- X * This function gets called just before we go back home to the command
- X * interpreter. On VMS it puts the terminal back in a reasonable state.
- X * Another no-operation on CPM.
- X */
- Xttclose()
- X{
- X if (ioctl(0, TCSETAW, &otermio) == -1) /* restore terminal settings */
- X printf ("closing ioctl on dev 0 failure, error = %d\n", errno);
- X if (fcntl(0, F_SETFL, kbdflgs) == -1)
- X printf ("closing fcntl on dev 0 failure, error = %d\n", errno);
- X}
- X
- X/*
- X * Write a character to the display. On VMS, terminal output is buffered, and
- X * we just put the characters in the big array, after checking for overflow.
- X * On CPM terminal I/O unbuffered, so we just write the byte out. Ditto on
- X * MS-DOS (use the very very raw console output routine).
- X */
- Xttputc(c)
- X{
- X fputc(c, stdout);
- X}
- X
- X/*
- X * Flush terminal buffer. Does real work where the terminal output is buffered
- X * up. A no-operation on systems where byte at a time terminal I/O is done.
- X */
- Xttflush()
- X{
- X fflush(stdout);
- X}
- X
- X/*
- X * Read a character from the terminal, performing no editing and doing no echo
- X * at all. More complex in VMS that almost anyplace else, which figures. Very
- X * simple on CPM, because the system can do exactly what you want.
- X */
- Xttgetc()
- X{
- X if( kbdqp )
- X kbdqp = FALSE;
- X else
- X {
- X if( kbdpoll && fcntl( 0, F_SETFL, kbdflgs ) < 0 )
- X return FALSE;
- X kbdpoll = FALSE;
- X while (read(0, &kbdq, 1) != 1)
- X ;
- X }
- X return ( kbdq & 127 );
- X}
- X
- X/* typahead(): Check to see if any characters are already in the
- X keyboard buffer
- X*/
- Xttkeyready ()
- X{
- X if( !kbdqp )
- X {
- X if( !kbdpoll && fcntl( 0, F_SETFL, kbdflgs | O_NDELAY ) < 0 )
- X return(FALSE);
- X kbdpoll = TRUE; /* fix in 1.13 */
- X kbdqp = (1 == read( 0, &kbdq, 1 ));
- X }
- X return ( kbdqp );
- X}
- X#endif
- X
- END_OF_FILE
- if test 3581 -ne `wc -c <'termio.c'`; then
- echo shar: \"'termio.c'\" unpacked with wrong size!
- fi
- # end of 'termio.c'
- fi
- if test -f 'tty.c' -a "${1}" != "-c" ; then
- echo shar: Will not clobber existing file \"'tty.c'\"
- else
- echo shar: Extracting \"'tty.c'\" \(6972 characters\)
- sed "s/^X//" >'tty.c' <<'END_OF_FILE'
- X/*
- X* Wang PC terminal display TTY.C
- X*
- X*/
- X#include "def.h"
- X
- Xvoid ttinit ();
- Xvoid tttidy ();
- Xvoid ttmove ();
- Xvoid tteeol ();
- Xvoid tteeop ();
- Xvoid ttbeep ();
- Xvoid asciiparm ();
- Xvoid ttnowindow (); /* stub */
- Xvoid ttcolor ();
- Xextern void tcapopen ();
- Xextern void tcapmove ();
- X
- X#if GOSLING
- Xvoid ttinsl ();
- Xvoid ttdell ();
- X#endif
- X
- X#include "lintfunc.dec"
- X#ifdef MSDOS
- X#include "dos.h"
- Xextern bool ibm_pc, mem_map;
- X#endif
- X#define BEL 0x07 /* BEL character. */
- X#define ESC 0x1B /* ESC character. */
- X
- Xextern int ttrow;
- Xextern int ttcol;
- Xextern int tttop;
- Xextern int ttbot;
- Xextern int tthue;
- X
- Xint tceeol = 3; /* Costs. */
- Xint rowb = NROW;
- X
- X/*
- X* Initialize the terminal when the editor
- X* gets started up.
- X*/
- Xvoid ttinit ()
- X{
- X#ifdef MSDOS
- X ttraw ();
- X#endif
- X#ifdef UNIX
- X tcapopen();
- X#endif
- X}
- X
- X/*
- X* Clean up the terminal, in anticipation of
- X* a return to the command interpreter.
- X*/
- Xvoid tttidy ()
- X{
- X#ifdef MSDOS
- X ttcooked ();
- X#endif
- X}
- X
- X/*
- X* Move the cursor to the specified
- X* origin 0 row and column position. Try to
- X* optimize out extra moves; redisplay may
- X* have left the cursor in the right
- X* location last time!
- X*/
- Xvoid ttmove (row, col)
- X{
- X#ifdef MSDOS
- X union REGS regs;
- X
- X/* Move in both axes */
- X if (ibm_pc)
- X {
- X regs.h.ah = 2;
- X regs.h.dh = (char)row;
- X regs.h.dl = (char)col;
- X regs.h.bh = 0;
- X int86 (0x10, ®s, ®s); /* set cursor position */
- X }
- X else
- X#endif
- X#ifdef UNIX
- X tcapmove(row, col);
- X#endif
- X#if ANSI
- X {
- X ttputc (ESC);
- X ttputc ('[');
- X asciiparm (row + 1);
- X ttputc (';');
- X asciiparm (col + 1);
- X ttputc ('H');
- X }
- X#endif
- X ttrow = row;
- X ttcol = col;
- X}
- X
- X/*
- X* Erase to end of line.
- X*/
- Xvoid tteeol ()
- X{
- X char col, row, i;
- X#ifdef MSDOS
- X union REGS regs;
- X
- X if (ibm_pc)
- X {
- X regs.h.ah = 3;
- X regs.h.bh = 0;
- X int86 (0x10, ®s, ®s); /* get cursor position */
- X col = regs.h.dl;
- X row = regs.h.dh;
- X for (i = col ; i < (NCOL - 1); i++)
- X {
- X regs.h.ah = 0x0e;
- X regs.h.bl = 0;
- X regs.h.bh = 0;
- X regs.h.al = ' ';
- X int86 (0x10, ®s, ®s); /* set cursor position */
- X }
- X /* put cursor back to original position */
- X regs.h.ah = 2;
- X regs.h.bh = 0;
- X regs.h.dl = col;
- X regs.h.dh = row;
- X int86 (0x10, ®s, ®s); /* get cursor position */
- X }
- X else
- X#endif
- X#if ANSI
- X {
- X ttputc (ESC);
- X ttputc ('[');
- X#ifdef MSDOS
- X if (ibm_pc)
- X ttputc ('0'); /* this is necessary in IBM PC's */
- X#endif
- X ttputc ('K');
- X }
- X#endif
- X#ifdef UNIX
- X tcapeeol();
- X#endif
- X }
- X
- X/*
- X* Erase to end of page.
- X* only ever used when cursor is at 0,0, so IBM screen erase
- X* is same as eop
- X*/
- Xvoid tteeop ()
- X{
- X#ifdef MSDOS
- X union REGS regs;
- X char i, j;
- X
- X if (ibm_pc)
- X {
- X for (j = 0 ; j < nrow; j++)
- X {
- X for (i = 0 ; i < NCOL; i++)
- X {
- X regs.h.ah = 0x0e;
- X regs.h.bl = 0;
- X regs.h.bh = 0;
- X regs.h.al = ' ';
- X int86 (0x10, ®s, ®s); /* set cursor position */
- X }
- X }
- X }
- X else
- X#endif
- X#if ANSI
- X {
- X ttcolor (CTEXT);
- X ttputc (ESC);
- X ttputc ('[');
- X#ifdef MSDOS
- X if (ibm_pc)
- X ttputc ('0');
- X else
- X#endif
- X ttputc ('2');
- X ttputc ('J');
- X }
- X#endif
- X#ifdef UNIX
- X tcapeeop();
- X#endif
- X}
- X
- X/*
- X* Make a noise.
- X*/
- Xvoid ttbeep ()
- X{
- X ttputc (BEL);
- X ttflush ();
- X}
- X
- X/*
- X* Convert a number to decimal
- X* ascii, and write it out. Used to
- X* deal with numeric arguments.
- X*/
- Xvoid asciiparm (n)
- Xregister int n;
- X{
- X register int q;
- X
- X q = n / 10;
- X if (q != 0)
- X asciiparm (q);
- X ttputc ((n % 10) + '0');
- X}
- X
- X#if GOSLING
- X/*
- X* Insert a block of blank lines onto the
- X* screen, using a scrolling region that starts at row
- X* "row" and extends down to row "bot". Deal with the one
- X* line case, which is a little bit special, with special
- X* case code.
- X*/
- Xvoid ttinsl (row, bot, nchunk)
- X{
- X if (row == bot)
- X {
- X /* Funny case. */
- X if (nchunk != 1)
- X abort ();
- X ttmove (row, 0);
- X tteeol ();
- X }
- X else
- X {
- X /* General case. */
- X ttputc (ESC);
- X ttputc ('/');
- X asciiparm (row + 1);
- X ttputc (';');
- X asciiparm (bot + 1);
- X ttputc (';');
- X asciiparm (nchunk);
- X ttputc (';');
- X ttputc ('0');
- X ttputc ('S');
- X }
- X}
- X
- X/*
- X* Delete a block of lines, with the uppermost
- X* line at row "row", in a screen slice that extends to
- X* row "bot". The "nchunk" is the number of lines that have
- X* to be deleted. Watch for the pathalogical 1 line case,
- X* where the scroll region is *not* the way to do it.
- X* The block delete is used by the slightly more
- X* optimal display code.
- X*/
- Xvoid ttdell (row, bot, nchunk)
- X{
- X if (row == bot)
- X {
- X /* Funny case. */
- X if (nchunk != 1)
- X abort ();
- X ttmove (row, 0);
- X tteeol ();
- X }
- X else
- X {
- X /* General case. */
- X ttputc (ESC);
- X ttputc ('/');
- X asciiparm (row + 1);
- X ttputc (';');
- X asciiparm (bot + 1);
- X ttputc (';');
- X asciiparm (nchunk);
- X ttputc (';');
- X ttputc ('1');
- X ttputc ('S');
- X }
- X}
- X#endif
- X
- X/*
- X* Switch to full screen scroll. This is
- X* used by "spawn.c" just before is suspends the
- X* editor, and by "display.c" when it is getting ready
- X* to exit. This is a no-op.
- X*/
- Xvoid ttnowindow (){}
- X
- X/*
- X* Set the current writing color to the
- X* specified color. Watch for color changes that are
- X* not going to do anything (the color is already right)
- X* and don't send anything to the display.
- X*/
- Xvoid ttcolor (color)
- Xregister int color;
- X{
- X#ifdef MSDOS
- X if (mem_map)
- X {
- X tthue = color; /* Save the color. */
- X return;
- X }
- X#endif
- X#ifdef UNIX
- X if (color == CTEXT)
- X tcaprev (FALSE);
- X else
- X tcaprev (TRUE);
- X tthue = color; /* Save the color. */
- X#endif
- X#if ANSI
- X if (color != tthue)
- X {
- X if (color == CTEXT)
- X { /* Normal video. */
- X ttputc (ESC);
- X ttputc ('[');
- X ttputc ('0');
- X ttputc ('m');
- X }
- X else
- X if (color == CMODE)
- X { /* Reverse video. */
- X ttputc (ESC);
- X ttputc ('[');
- X ttputc ('7');
- X ttputc ('m');
- X }
- X tthue = color; /* Save the color. */
- X }
- X#endif
- X}
- END_OF_FILE
- if test 6972 -ne `wc -c <'tty.c'`; then
- echo shar: \"'tty.c'\" unpacked with wrong size!
- fi
- chmod +x 'tty.c'
- # end of 'tty.c'
- fi
- if test -f 'ttyio.c' -a "${1}" != "-c" ; then
- echo shar: Will not clobber existing file \"'ttyio.c'\"
- else
- echo shar: Extracting \"'ttyio.c'\" \(3623 characters\)
- sed "s/^X//" >'ttyio.c' <<'END_OF_FILE'
- X/*
- X*
- X* MS-DOS terminal I/O. TTYIO.C
- X*/
- X#if MSDOS
- X#include "def.h"
- X
- Xvoid ttopen ();
- Xvoid ttclose (); /* stub */
- Xvoid ttputc ();
- Xvoid putline ();
- Xvoid ttflush (); /* stub */
- Xint ttkeyready ();
- Xint ttgetc ();
- Xvoid ttraw ();
- Xvoid ttcooked ();
- Xint set_crt_type ();
- X#if RUNCHK
- Xchar ERR_bd_pl[];
- X#endif
- X#include "lintfunc.dec"
- X#include "dos.h"
- X
- Xint slot;
- Xint scr_type;
- X#define SCREEN_PORT (video_port)
- Xstatic int video_port =
- X{0x1010
- X};
- X
- Xextern bool wang_pc;
- Xextern bool ibm_pc;
- Xint nrow; /* Terminal size, rows. */
- Xint ncol; /* Terminal size, columns. */
- Xint last_key;
- X
- X/*
- X* Initialization.
- X* Almost no operation in MS-DOS.
- X*/
- Xvoid ttopen ()
- X{
- X if (wang_pc && !ibm_pc)
- X set_crt_type ();
- X nrow = NROW;
- X ncol = NCOL;
- X}
- X
- Xvoid ttclose ()
- X{
- X}
- Xvoid ttflush ()
- X{
- X}
- X/*
- X* Write character.
- X*/
- Xvoid ttputc (c)
- X{
- X bdos (6, c, 0);
- X}
- X
- Xvoid putline (row, startcol, stringsize, string)
- Xint row,
- X startcol,
- X stringsize;
- Xchar *string;
- X{
- X extern int tthue;
- X unsigned short *screen;
- X int x,
- X attribute;
- X char c_row, c_col, i;
- X union REGS regs;
- X
- X if (ibm_pc)
- X {
- X c_row = row - 1;
- X c_col = startcol - 1;
- X for (i = 0; i < stringsize; i++)
- X {
- X regs.h.ah = 2;
- X regs.h.dh = c_row;
- X regs.h.dl= c_col;
- X regs.h.bh = 0;
- X int86 (0x10, ®s, ®s); /* set cursor position */
- X
- X if (tthue == CTEXT)
- X regs.h.bl = 0x07;
- X if (tthue == CMODE)
- X regs.h.bl = 0x70;
- X regs.h.ah = 9;
- X regs.h.bh = 0;
- X regs.h.al = string[i];
- X regs.x.cx= 1;
- X int86 (0x10, ®s, ®s); /* set cursor position */
- X c_col++;
- X }
- X }
- X else if (wang_pc)
- X {
- X if (tthue == CTEXT)
- X attribute = 0x00;
- X else
- X attribute = 0x02;
- X
- X x = stringsize;
- X screen = (unsigned short *) WANG_CHARACTER_SCREEN;
- X screen += ((row - 1) * 80) + startcol - 1;
- X outp (SCREEN_PORT, 01);
- X while (x--)
- X {
- X *screen = (*string++ << 8) | attribute;
- X screen++;
- X }
- X outp (SCREEN_PORT, 00);
- X }
- X}
- X
- X/*
- X* return with a TRUE if key was struck.
- X*/
- Xint ttkeyready ()
- X{
- X int cnt;
- X
- X if (last_key != 0)
- X return (1);
- X
- X last_key = bdos (6, 0xff, 0);
- X last_key &= 0xff;
- X if (last_key == 0)
- X return (0);
- X else
- X return (1);
- X}
- X
- X/*
- X* Read character.
- X*/
- Xint ttgetc ()
- X{
- X int c;
- X if (last_key != 0)
- X {
- X c = last_key;
- X last_key = 0;
- X return (c);
- X }
- X ttcooked ();
- X c = (bdos (7, 0, 0) & 0xFF);
- X ttraw ();
- X return (c);
- X}
- X
- X/* disable nasty cntrl-c during disk io!
- X*/
- Xvoid ttraw ()
- X{
- X union REGS inregs, outregs;
- X
- X inregs.h.al = 1;
- X inregs.h.ah = 0x33;
- X inregs.h.dl = 0;
- X intdos (&inregs, &outregs);
- X/*
- X cntrlcoff();
- X*/
- X}
- X
- X/* re enable cntrl-c for keyboard
- X*/
- Xvoid ttcooked ()
- X{
- X union REGS inregs, outregs;
- X
- X inregs.h.al = 1;
- X inregs.h.ah = 0x33;
- X intdos (&inregs, &outregs);
- X inregs.h.dl = 1;
- X/*
- X cntrlcon();
- X*/
- X}
- X
- X/* switch physical monitors
- X*/
- Xstatic char str[] =
- X{0x1b, '/', 1, 's'
- X};
- X
- Xint set_crt_type ()
- X{
- X char active_screen;
- X
- X active_screen = getscreenstate ();
- X slot = active_screen & 0x0f;
- X scr_type = (active_screen & 0x70) >> 4;
- X video_port = 0x1010 | (slot << 8);
- X}
- X#endif
- END_OF_FILE
- if test 3623 -ne `wc -c <'ttyio.c'`; then
- echo shar: \"'ttyio.c'\" unpacked with wrong size!
- fi
- chmod +x 'ttyio.c'
- # end of 'ttyio.c'
- fi
- if test -f 'wangpc.c' -a "${1}" != "-c" ; then
- echo shar: Will not clobber existing file \"'wangpc.c'\"
- else
- echo shar: Extracting \"'wangpc.c'\" \(3557 characters\)
- sed "s/^X//" >'wangpc.c' <<'END_OF_FILE'
- X#define LINT_ARGS 1 /* enable lint type checking */
- X#include "def.h"
- X#include "lintfunc.dec"
- X#if MSDOS
- X#include "dos.h"
- X
- Xtypedef struct SCREENINFO
- X{
- X unsigned char state;
- X unsigned char scanoff;
- X unsigned short bufseg;
- X unsigned char colors;
- X unsigned char row;
- X unsigned char col;
- X unsigned char attr;
- X unsigned char auxmod;
- X unsigned char auxmod2;
- X} SCREENINFO;
- X
- Xtypedef struct SYSCONFIG
- X{
- X unsigned short version;
- X unsigned short memsize;
- X unsigned short reserved[2];
- X unsigned short screen_count;
- X unsigned short screens[4];
- X} SYSCONFIG;
- X
- X#define SENDCHAR 6
- X#define SENDLINE 0x0d
- X#define BIOS 0x88
- X#define GETSYSCON 1
- X
- Xbool wang_pc = FALSE;
- Xbool ibm_pc = FALSE;
- Xbool mem_map = FALSE;
- X
- Xvoid is_wang ()
- X {
- X union REGS inregs, outregs;
- X struct SREGS segregs;
- X unsigned char far *memptr;
- X unsigned char c;
- X int i;
- X static char wang_id[] = {"WANG"};
- X static char ret_str[6];
- X char *chr_ptr;
- X
- X chr_ptr = ret_str;
- X /* test for Wang PC */
- X memptr = (unsigned char far *)0xFC003FC2L;
- X wang_pc = TRUE;
- X for (i=0;(i<4 && wang_pc);i++)
- X {
- X if(*memptr != wang_id[i])
- X wang_pc = FALSE;
- X memptr++;
- X }
- X
- X if (wang_pc)
- X {
- X mem_map = TRUE;
- X ret_str[0] = 0xFF; /* set to known value */
- X mem_map = TRUE;
- X inregs.h.al = 0x02;
- X inregs.h.ah = 0x44;
- X inregs.x.bx = 0;
- X inregs.x.cx = 1;
- X inregs.x.dx = FP_OFF (chr_ptr);
- X segregs.ds = FP_SEG (chr_ptr);
- X
- X int86x (0x21, &inregs, &outregs, &segregs);
- X if (ret_str[0] == 0x11)
- X {
- X ibm_pc = TRUE;
- X return;
- X }
- X ibm_pc = FALSE;
- X return;
- X }
- X
- X /* Must be an IBM or clone */
- X memptr = (unsigned char far *)0xF000FFFEL;
- X c = *memptr;
- X switch(c)
- X {
- X case 0xFC: /* IBM AT or clone */
- X case 0xFD: /* IBM PC Jr */
- X case 0xFE: /* IBM XT or clone */
- X case 0xFF: /* IBM PC or clone */
- X mem_map = TRUE;
- X ibm_pc = TRUE;
- X return;
- X }
- X }
- X
- Xint getsysconfig (outregs, segregs)
- X union REGS * outregs;
- Xstruct SREGS *segregs;
- X{
- X union REGS inregs;
- X
- X inregs.h.al = GETSYSCON;
- X
- X int86x (BIOS, &inregs, outregs, segregs);
- X}
- X
- Xchar getscreenstate ()
- X{
- X struct SREGS segregs;
- X union REGS outregs;
- X
- X struct SYSCONFIG *config;
- X struct SCREENINFO *screeninfo;
- X unsigned short *shortptr;
- X unsigned int screen_count;
- X
- X getsysconfig (&outregs, &segregs);
- X
- X /* set pointer to force register info into a long pointer. */
- X shortptr = (unsigned short *) & config;
- X
- X /* Offset is first, it comes back in BX */
- X *shortptr = (unsigned short) outregs.x.bx;
- X shortptr++;
- X
- X /* segment is in ES */
- X *shortptr = (unsigned short) segregs.es;
- X
- X /* Now, the config pointer should be set to the config table. */
- X/* printf("Version = %04x \n",config->version);
- X printf("Memsize = %04x \n",config->memsize);
- X printf("Screens = %04x \n",config->screen_count);
- X*/
- X screen_count = config -> screen_count;
- X while (screen_count)
- X {
- X shortptr = (unsigned short *) & screeninfo;
- X *shortptr = (unsigned short) config -> screens[screen_count - 1];
- X shortptr++;
- X *shortptr = (unsigned short) segregs.es;
- X if (screeninfo -> state & 0x80)
- X break;
- X screen_count--;
- X }
- X return (screeninfo -> state);
- X}
- X#endif
- END_OF_FILE
- if test 3557 -ne `wc -c <'wangpc.c'`; then
- echo shar: \"'wangpc.c'\" unpacked with wrong size!
- fi
- chmod +x 'wangpc.c'
- # end of 'wangpc.c'
- fi
- if test -f 'word.c' -a "${1}" != "-c" ; then
- echo shar: Will not clobber existing file \"'word.c'\"
- else
- echo shar: Extracting \"'word.c'\" \(3025 characters\)
- sed "s/^X//" >'word.c' <<'END_OF_FILE'
- X/*
- X* Word mode commands.
- X* The routines in this file
- X* implement commands that work unit at
- X* a time. There are all sorts of unit mode
- X* commands. If I do any sentence and/or paragraph
- X* mode commands, they are likely to be put in
- X* this file.
- X*/
- X#define LINT_ARGS 1 /* enable lint type checking */
- X#include "def.h"
- X
- Xchar forwunit ();
- X
- X#include "lintfunc.dec"
- X/*
- X* Move the cursor backward by
- X* "n" units. All of the details of motion
- X* are performed by the "backchar" and "forwchar"
- X* routines. Error if you try to move beyond
- X* the buffers.
- X*/
- Xchar backunit (f, n, k)
- X{
- X char ret;
- X
- X if (n < 0)
- X return (forwunit (f, -n, KRANDOM));
- X
- X curwp -> w_unit_offset = 0;
- X while (n--)
- X {
- X ret = move_ptr (curwp, -(long)R_B_PER_U(curwp), TRUE, TRUE, TRUE);
- X }
- X wind_on_dot (curwp);
- X curwp -> w_flag |= WFMODE; /* update mode line */
- X return (ret);
- X}
- X
- X
- X/*
- X* Move the cursor forward by
- X* the specified number of units. All of the
- X* motion is done by "forwchar". Error if you
- X* try and move beyond the buffer's end.
- X*/
- Xchar forwunit (f, n, k)
- X{
- X
- X if (n < 0)
- X return (backunit (f, -n, KRANDOM));
- X
- X curwp -> w_unit_offset = 0;
- X while (n--)
- X {
- X move_ptr (curwp, (long)R_B_PER_U(curwp), TRUE, TRUE, TRUE);
- X }
- X wind_on_dot (curwp);
- X curwp -> w_flag |= WFMODE; /* update mode line */
- X return (TRUE);
- X}
- X
- X
- X/*
- X* Kill forward by "n" units. The rules for final
- X* status are now different. It is not considered an error
- X* to delete fewer units than you asked. This lets you say
- X* "kill lots of units" and have the command stop in a reasonable
- X* way when it hits the end of the buffer.
- X*/
- Xbool delfunit (f, n, k)
- X{
- X register LINE * dotp;
- X register int doto;
- X
- X if (n < 0)
- X return (FALSE);
- X if ((lastflag & CFKILL) == 0)/* Purge kill buffer. */
- X kdelete ();
- X thisflag |= CFKILL;
- X while (n--)
- X {
- X ldelete (R_B_PER_U(curwp), TRUE);
- X }
- X curwp -> w_flag |= WFHARD;
- X curwp -> w_unit_offset = 0;
- X return (TRUE);
- X}
- X
- X
- X/*
- X* Kill backwards by "n" units. The rules
- X* for success and failure are now different, to prevent
- X* strange behavior at the start of the buffer. The command
- X* only fails if something goes wrong with the actual delete
- X* of the characters. It is successful even if no characters
- X* are deleted, or if you say delete 5 units, and there are
- X* only 4 units left. I considered making the first call
- X* to "backchar" special, but decided that that would just
- X* be wierd. Normally this is bound to "M-Rubout" and
- X* to "M-Backspace".
- X*/
- Xbool delbunit (f, n, k)
- X{
- X int size;
- X
- X if (n < 0)
- X return (FALSE);
- X if ((lastflag & CFKILL) == 0)/* Purge kill buffer. */
- X kdelete ();
- X thisflag |= CFKILL;
- X size = R_B_PER_U(curwp);
- X while (n--)
- X {
- X if (move_ptr (curwp, -((long)size), TRUE, TRUE, TRUE))
- X ldelete (size, TRUE);
- X }
- X curwp -> w_flag |= WFHARD;
- X return (TRUE);
- X}
- X
- END_OF_FILE
- if test 3025 -ne `wc -c <'word.c'`; then
- echo shar: \"'word.c'\" unpacked with wrong size!
- fi
- chmod +x 'word.c'
- # end of 'word.c'
- fi
- echo shar: End of archive 1 \(of 10\).
- cp /dev/null ark1isdone
- MISSING=""
- for I in 1 2 3 4 5 6 7 8 9 10 ; do
- if test ! -f ark${I}isdone ; then
- MISSING="${MISSING} ${I}"
- fi
- done
- if test "${MISSING}" = "" ; then
- echo You have unpacked all 10 archives.
- rm -f ark[1-9]isdone ark[1-9][0-9]isdone
- else
- echo You still need to unpack the following archives:
- echo " " ${MISSING}
- fi
- ## End of shell archive.
- exit 0
-
- --
- >>>>>>>>>>>>>>>> Peter Reilley ..... pvr@wang.com <<<<<<<<<<<<<<<<<<<<<<<
- Well, that about says it.
-