Newsgroups: comp.sources.misc
From: Peter Reilley <pvr@wang.com>
Subject:  v22i013:  beav - Binary file editor and viewer, Part04/09
Message-ID: <1991Aug14.200728.5718@sparky.IMD.Sterling.COM>
X-Md4-Signature: 2ba7e5d92e90987c001b46153d21203e
Date: Wed, 14 Aug 1991 20:07:28 GMT
Approved: kent@sparky.imd.sterling.com

Submitted-by: Peter Reilley <pvr@wang.com>
Posting-number: Volume 22, Issue 13
Archive-name: beav/part04
Environment: UNIX, AIX, MSDOS

#! /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 4 (of 9)."
# Contents:  file.c symbol.c text.c
# Wrapped by pvr@elf on Mon Aug 12 13:51:32 1991
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
if test -f 'file.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'file.c'\"
else
echo shar: Extracting \"'file.c'\" \(18927 characters\)
sed "s/^X//" >'file.c' <<'END_OF_FILE'
X/*
X*  File commands.
X*/
X#include        "def.h"
X
Xchar    load_file ();
Xchar    readin ();
Xvoid    makename ();
Xbool    writeout ();
Xbool    parse_f_name ();
XA32	ffseek ();
X
Xextern    char    MSG_rd_file[];
Xextern    char    MSG_trash[];
Xextern    char    MSG_ins_file[];
Xextern    char    MSG_not_fnd[];
Xextern    char    MSG_visit[];
Xextern    char    MSG_view[];
Xextern    char    MSG_buf_ex[];
Xextern    char    MSG_old_buf[];
Xextern    char    MSG_buf_nam[];
Xextern    char    MSG_cnt_cr[];
Xextern    char    MSG_reading[];
Xextern    char    MSG_read_lx[];
Xextern    char    MSG_no_mem_rd[];
Xextern    char    MSG_wr_file[];
Xextern    char    MSG_no_fn[];
Xextern    char    MSG_bk_err[];
Xextern    char    MSG_writing[];
Xextern    char    MSG_wrot_n[];
Xextern    char    MSG_fil_nam[];
Xextern    char    MSG_null[];
Xextern    char    ERR_parse_fn[];
Xextern    char    ERR_addr_neg[];
Xextern    char    ERR_f_size[];
X
Xstatic int  ughlyflag = FALSE;
X
X/*
X* Read a file into the current
X* buffer. This is really easy; all you do it
X* find the name of the file, and call the standard
X* "read a file into the current buffer" code.
X*/
Xchar    fileread ()
X{
X	register char   s;
X	char    fname[NFILEN];
X	A32     start, end;
X
X	if ((s = ereply (MSG_rd_file, fname, NFILEN, NULL)) != TRUE)
X		return (s);
X	if (parse_f_name (fname, &start, &end))
X	{
X		adjustcase (fname);
X		return (readin (fname, start, end));
X	}
X	return (TRUE);
X}
X
X
X/* insert file into current buffer - use readin, and yank
X*/
Xchar    fileinsert ()
X{
X	register char   s;
X	char    bname[NBUFN],
X	fname[NFILEN];
X	A32     start, end;
X	register char  *trash = MSG_trash;
X
X	strcpy (bname, curbp -> b_bname);/* save current buffer */
X	if ((s = _usebuffer (trash)) == 0)/* temp buffer */
X		return (s);
X	if ((s = ereply (MSG_ins_file, fname, NFILEN, NULL)) != TRUE)
X		return (s);
X	/* if file name and starting and ending addresses are good */
X	if (parse_f_name (fname, &start, &end))
X	{
X		adjustcase (fname);
X		if ((s = readin (fname, start, end)) == 0)
X		{
X			writ_echo (MSG_not_fnd);
X			_usebuffer (bname);
X			_killbuffer (trash);
X			return (s);
X		}
X		if ((s = _usebuffer (bname)) == 0)
X		{
X			_killbuffer (trash);
X			return (s);
X		}
X		if ((s = _yankbuffer (trash)) == 0)
X		{
X			_killbuffer (trash);
X			return (s);
X		}
X		writ_echo (okmsg);
X	}
X	else
X	{
X		_usebuffer (bname);
X		_killbuffer (trash);
X		return (FALSE);
X	}
X	if ((s = _killbuffer (trash)) == 0)
X		return (s);
X	wind_on_dot (curwp);
X	return (s);
X}
X
X
X/*
X* Select a file for editing.
X* Look around to see if you can find the
X* fine in another buffer; if you can find it
X* just switch to the buffer. If you cannot find
X* the file, create a new buffer, read in the
X* text, and switch to the new buffer.
X*
X* also various hacked versions for auto load, and 
X* file-vist with auto window split, and readonly (view-file) (jam)
X*/
Xchar    file_visit (f, n, k)
X{
X	char    fname[NFILEN];
X	char    s;
X	A32     start, end;
X	if ((s = ereply (MSG_visit, fname, NFILEN, NULL)) != TRUE)
X		return (s);
X	if (!parse_f_name (fname, &start, &end))
X		return (FALSE);
X
X	splitwind ();
X	return (load_file (fname, start, end));
X}
X
X
X/* like filevisit, only read only
X*/
Xchar    viewfile ()
X{
X	char    fname[NFILEN];
X	char    s;
X	A32     start, end;
X
X	if ((s = ereply (MSG_view, fname, NFILEN, NULL)) != TRUE)
X		return (s);
X	ughlyflag = TRUE;
X	if (!parse_f_name (fname, &start, &end))
X		return (FALSE);
X
X	s = load_file (fname, start, end);
X	if (s)
X		curbp -> b_flag |= BFVIEW;
X	ughlyflag = FALSE;
X	return (s);
X}
X
X
Xchar    filevisit ()
X{
X	char    fname[NFILEN];
X	char    s;
X	A32     start, end;
X
X	if ((s = ereply (MSG_visit, fname, NFILEN, NULL)) != TRUE)
X		return (s);
X	if (!parse_f_name (fname, &start, &end))
X		return (FALSE);
X
X	return (load_file (fname, start, end));
X}
X
X
Xchar    load_file (fname, start, end)       /* jam */
Xchar   *fname;
XA32     start, end;
X{
X	register    BUFFER * bp;
X	register    WINDOW * wp;
X	register    LINE * lp;
X	register int    i;
X	char        s;
X	char        bname[NBUFN];
X	extern int  initial_load;   /* jam */
X	static int  append = 0;
X
X	adjustcase (fname);
X	for (bp = bheadp; bp != NULL; bp = bp -> b_bufp)
X	{
X		if (strcmp (bp -> b_fname, fname) == 0)
X		{
X			if (ughlyflag == TRUE)
X			{
X				writ_echo (MSG_buf_ex);
X				return (FALSE);
X			}
X			if (--curbp -> b_nwnd == 0)
X			{
X				curbp -> b_type = BTFILE;
X				curbp -> b_dotp = curwp -> w_dotp;
X				curbp -> b_doto = curwp -> w_doto;
X				curbp -> b_unit_offset = curwp -> w_unit_offset;
X				curbp -> b_markp = curwp -> w_markp;
X				curbp -> b_marko = curwp -> w_marko;
X			}
X			curbp = bp;
X			curwp -> w_bufp = bp;
X			if (bp -> b_nwnd++ == 0)
X			{
X				curwp -> w_dotp = bp -> b_dotp;
X				curwp -> w_doto = bp -> b_doto;
X				curwp -> w_unit_offset = bp -> b_unit_offset;
X				curwp -> w_markp = bp -> b_markp;
X				curwp -> w_marko = bp -> b_marko;
X			}
X			else
X			{
X				wp = wheadp;
X				while (wp != NULL)
X				{
X					if (wp != curwp && wp -> w_bufp == bp)
X					{
X						curwp -> w_dotp = wp -> w_dotp;
X						curwp -> w_doto = wp -> w_doto;
X						curwp -> w_unit_offset = wp -> w_unit_offset;
X						curwp -> w_markp = wp -> w_markp;
X						curwp -> w_marko = wp -> w_marko;
X						break;
X					}
X					wp = wp -> w_wndp;
X				}
X			}
X			lp = curwp -> w_dotp;
X			i = curwp -> w_ntrows / 2;
X			while (i-- && lback (lp) != curbp -> b_linep)
X				lp = lback (lp);
X			curwp -> w_linep = lp;
X			curwp -> w_flag |= WFMODE | WFHARD;
X			if (kbdmop == NULL)
X			{
X				writ_echo (MSG_old_buf);
X			}
X			return (TRUE);
X		}
X	}
X
X	makename (bname, fname);    /* New buffer name.     */
X	while ((bp = bfind (bname, FALSE)) != NULL)
X	{
X		if (initial_load)       /* patch old name */
X		{
X			funky_name (bname, append++);
X			bp = NULL;
X			break;
X		}
X		s = ereply (MSG_buf_nam, bname, NBUFN, NULL);
X		if (s == ABORT)         /* ^G to just quit      */
X			return (s);
X		if (strcmp (bp -> b_bname, bname) == 0 || s == FALSE)
X		{
X			/* CR to clobber it     */
X			makename (bname, fname);
X			break;
X		}
X	}
X	if (bp == NULL && (bp = bfind (bname, TRUE)) == NULL)
X	{
X		err_echo (MSG_cnt_cr);
X		return (FALSE);
X	}
X	if (--curbp -> b_nwnd == 0)
X	{
X		/* Undisplay.           */
X		curbp -> b_type = BTFILE;
X		curbp -> b_dotp = curwp -> w_dotp;
X		curbp -> b_doto = curwp -> w_doto;
X		curbp -> b_unit_offset = curwp -> w_unit_offset;
X		curbp -> b_markp = curwp -> w_markp;
X		curbp -> b_marko = curwp -> w_marko;
X	}
X	curbp = bp;                 /* Switch to it.        */
X	curwp -> w_bufp = bp;
X	curbp -> b_nwnd++;
X	return (readin (fname, start, end));    /* Read it in.          */
X}
X
X
X/*
X* Read the file "fname" into the current buffer.
X* Make all of the text in the buffer go away, after checking
X* for unsaved changes. This is called by the "read" command, the
X* "visit" command, and the mainline (for "beav file"). If the
X* BACKUP conditional is set, then this routine also does the read
X* end of backup processing. The BFBAK flag, if set in a buffer,
X* says that a backup should be taken. It is set when a file is
X* read in, but not on a new file (you don't need to make a backup
X* copy of nothing). Return a standard status. Print a summary
X* (lines read, error message) out as well.
X*/
Xchar    readin (fname, start, end)
Xchar    fname[];
XA32     start, end;
X{
X	register    LINE * lp1;
X	register    LINE * lp2;
X	register    LPOS   i;
X	register    WINDOW * wp;
X	register    BUFFER * bp;
X	register    char   s, m;
X	long        byte_cnt;
X	LPOS        req_chars;
X	char        buf[80], buf1[80];
X	A32         temp;
X
X	m = TRUE;
X	byte_cnt = 0;
X	bp = curbp;                 /* Cheap.               */
X	if ((s = bclear (bp)) != TRUE)/* Might be old.        */
X		return (s);
X#if     BACKUP
X	bp -> b_flag &= ~(BFCHG | BFBAK);/* No change, backup.   */
X#else
X	bp -> b_flag &= ~BFCHG;     /* No change.           */
X#endif
X	if ((start == 0L) && (end == MAXPOS))
X		strcpy (bp -> b_fname, fname);
X	else
X		strcpy (bp -> b_fname, MSG_null);
X	bp -> b_file_size = 0;
X	bp -> b_type = BTFILE;
X	if ((s = ffropen (fname)) == FIOERR || s == FIOFNF)/* jam */
X		goto out;
X	bp -> b_file_size = file_len ();  /* get the file lenth */
X	sprintf (buf, MSG_reading, fname);/* jam */
X	writ_echo (buf);
X	temp = ffseek (start);
X	if (temp != start)
X	{
X		sprintf (buf1, ERR_f_size, R_POS_FMT(curwp));
X		sprintf (buf, buf1, temp);
X		writ_echo (buf);
X		return (FALSE);
X	}
X	/* only read the requested number of characters */
X	if ((end - start) > NLINE)
X		req_chars = NLINE;
X	else
X		req_chars = (int)(end - start);
X
X	if ((lp1 = lalloc(req_chars)) == NULL)
X	{
X		bp -> b_flag |= BFVIEW; /* if no memory set to read only mode */
X
X		m = FALSE;          /* flag memory allocation error */
X	}
X	else
X	{
X		while ((s = ffgetline (lp1->l_text, lp1->l_size, &lp1->l_used)) == FIOSUC)
X		{
X			/* this code breaks rules for knowing how lines * are stored and linked
X            together, oh well */
X			lp2 = lback (curbp -> b_linep);
X			lp2 -> l_fp = lp1;
X			lp1 -> l_fp = curbp -> b_linep;
X			lp1 -> l_bp = lp2;
X			curbp -> b_linep -> l_bp = lp1;
X			lp1 -> l_file_offset = byte_cnt;   /* file offset from begining */
X			byte_cnt += (long) lp1 -> l_used;	/* number of bytes read in    */
X			start += (long) lp1 -> l_used;
X			if (end <= start)
X				break;
X			/* stop reading after the requested number of characters */
X			if (end < start + req_chars)
X			{
X				req_chars = end - start;
X			}
X			if ((lp1 = lalloc(req_chars)) == NULL)
X			{
X				bp -> b_flag |= BFVIEW; /* if no memory set to read only mode */
X
X				m = FALSE;          /* flag memory allocation error */
X				break;
X			}
X			if ((byte_cnt & 0x7fff) == 0)
X			{
X				sprintf (buf1, MSG_read_lx, R_POS_FMT(curwp));
X				sprintf (buf, buf1, (ulong)byte_cnt);
X				writ_echo (buf);
X				/* check if we should quit */
X				if (ttkeyready ())
X				{
X					wind_on_dot_all();
X					if (ttgetc () == CTL_G)  /* was it an abort key? */
X					{
X						s = FIOERR;
X						break;
X					}
X				}
X			}
X		}
X	}
X	ffclose ();                 /* Ignore errors.       */
X	if (s == FIOEOF && kbdmop == NULL)
X	{
X		/* Don't zap an error.   */
X		sprintf (buf1, MSG_read_lx, R_POS_FMT(curwp));
X		sprintf (buf, buf1, byte_cnt);
X		writ_echo (buf);
X	}
X	if (m == FALSE && kbdmop == NULL)
X	{
X		/* Don't zap an error.   */
X		sprintf (buf, MSG_no_mem_rd);
X		err_echo (buf);
X	}
X
X#if     BACKUP
X	curbp -> b_flag |= BFBAK;   /* Need a backup.       */
X#endif
Xout:
X	for (wp = wheadp; wp != NULL; wp = wp -> w_wndp)
X	{
X		if (wp -> w_bufp == curbp)
X		{
X			wp -> w_linep = lforw (curbp -> b_linep);
X			wp -> w_dotp = lforw (curbp -> b_linep);
X			wp -> w_doto = 0;
X			wp -> w_unit_offset = 0;
X			wp -> w_markp = NULL;
X			wp -> w_marko = 0;
X			wp -> w_flag |= WFMODE | WFHARD;
X		}
X	}
X	/* so tell yank-buffer about it */
X	if ((blistp -> b_nwnd != 0) &&  /* update buffer display */
X	(blistp -> b_type == BTLIST))
X		listbuffers ();
X	if (s == FIOERR || s == FIOFNF)/* False if error.      */
X		return (FALSE);
X	return (TRUE);
X}
X
X
X/*
X* Take a file name, and from it
X* fabricate a buffer name. This routine knows
X* about the syntax of file names on the target system.
X* BDC1         left scan delimiter.
X* BDC2         optional second left scan delimiter.
X* BDC3         optional right scan delimiter.
X*/
Xvoid makename (bname, fname)
Xchar    bname[];
Xchar    fname[];
X{
X	register char  *cp1;
X	register char  *cp2;
X
X	cp1 = &fname[0];
X	while (*cp1 != 0)
X		++cp1;
X#ifdef  BDC2
X	while (cp1 != &fname[0] && cp1[-1] != BDC1 && cp1[-1] != BDC2)
X		--cp1;
X#else
X	while (cp1 != &fname[0] && cp1[-1] != BDC1)
X		--cp1;
X#endif
X	cp2 = &bname[0];
X#ifdef  BDC3
X	while (cp2 != &bname[NBUFN - 1] && *cp1 != 0 && *cp1 != BDC3)
X		*cp2++ = *cp1++;
X#else
X	while (cp2 != &bname[NBUFN - 1] && *cp1 != 0)
X		*cp2++ = *cp1++;
X#endif
X	*cp2 = 0;
X}
X
X
X/*
X* Ask for a file name, and write the
X* contents of the current buffer to that file.
X* Update the remembered file name and clear the
X* buffer changed flag. This handling of file names
X* is different from the earlier versions, and
X* is more compatable with Gosling EMACS than
X* with ITS EMACS.
X*/
Xchar    filewrite ()
X{
X	register    WINDOW * wp;
X	register char   s;
X	char    fname[NFILEN];
X	A32     start, end;
X
X	if ((s = ereply (MSG_wr_file, fname, NFILEN, NULL)) != TRUE)
X		return (s);
X	if (!parse_f_name (fname, &start, &end))
X		return (FALSE);
X
X	adjustcase (fname);
X	if ((s = writeout (fname, start, end)) == TRUE)
X	{
X		strcpy (curbp -> b_fname, fname);
X		curbp -> b_flag &= ~BFCHG;
X		wp = wheadp;            /* Update mode lines.   */
X		while (wp != NULL)
X		{
X			if (wp -> w_bufp == curbp)
X				wp -> w_flag |= WFMODE;
X			wp = wp -> w_wndp;
X		}
X	}
X
X#if     BACKUP
X	curbp -> b_flag &= ~BFBAK;  /* No backup.           */
X#endif
X	return (s);
X}
X
X
X/*
X* Save the contents of the current buffer back into
X* its associated file. Do nothing if there have been no changes
X* (is this a bug, or a feature). Error if there is no remembered
X* file name. If this is the first write since the read or visit,
X* then a backup copy of the file is made.
X*/
Xchar    filesave ()
X{
X	register    WINDOW * wp;
X	register char   s;
X
X	if ((curbp -> b_flag & BFCHG) == 0)/* Return, no changes.  */
X		return (TRUE);
X	if (curbp -> b_fname[0] == 0)/* Must have a name.    */
X	{
X		if (!(curbp -> b_type == BTSAVE))/* yanked buffer */
X		{
X			writ_echo (MSG_no_fn);
X		}
X		return (FALSE);
X	}
X#if     BACKUP
X	if ((curbp -> b_flag & BFBAK) != 0)
X	{
X		s = fbackupfile (curbp -> b_fname);
X		if (s == ABORT)         /* Hard error.          */
X			return (s);
X		if (s == FALSE          /* Softer error.        */
X		&& (s = eyesno (MSG_bk_err)) != TRUE)
X			return (s);
X	}
X
X#endif
X	if ((s = writeout (curbp -> b_fname, 0L, MAXPOS)) == TRUE)
X	{
X		curbp -> b_flag &= ~BFCHG;/* No change.           */
X		curbp -> b_flag &= ~BFBAD;/* if it was trashed, forget it now */
X		wp = wheadp;            /* Update mode lines.   */
X		while (wp != NULL)
X		{
X			if (wp -> w_bufp == curbp)
X				wp -> w_flag |= WFMODE;
X			wp = wp -> w_wndp;
X		}
X	}
X
X#if     BACKUP
X	curbp -> b_flag &= ~BFBAK;  /* No backup.           */
X#endif
X	return (s);
X}
X
X/*
X* This function performs the details of file
X* writing. Uses the file management routines in the
X* "fileio.c" package. The number of lines written is
X* displayed. Sadly, it looks inside a LINE; provide
X* a macro for this. Most of the grief is error
X* checking of some sort.
X*/
Xbool writeout (fn, start, end)
Xchar   *fn;
XA32     start, end;
X{
X	register    int    s, num_chars;
X	register    LINE * lp;
X	register    long   nbytes;
X	char        buf[80], buf1[80];
X	A32         temp;
X
X	if ((s = ffwopen (fn)) != FIOSUC)/* Open writes message. */
X		return (FALSE);
X	temp = ffseek (start);
X	if (temp != start)
X	{
X		sprintf (buf1, ERR_f_size, R_POS_FMT(curwp));
X		sprintf (buf, buf1, temp);
X		writ_echo (buf);
X		return (FALSE);
X	}
X	sprintf (buf, MSG_writing, fn);/* jam */
X	writ_echo (buf);
X
X	/* insure that the help screen reflects the latest bindings */
X	if (curbp == blistp)
X		wallchart (0, 0, 0);
X
X	lp = lforw (curbp -> b_linep);/* First line. */
X	nbytes = 0;                  /* Number of bytes.  */
X	temp = end - start;         /* number of bytes to write */
X	while (lp != curbp -> b_linep)
X	{
X		if (curbp == blistp)
X		{
X			/* special list buffer */
X			num_chars = HENDCOL;	/* limit line length */
X			lp -> l_text[num_chars - 1] = '\n';
X		}
X		else
X		{
X			/* standard buffer */
X			if (nbytes + (long)llength (lp) > temp)
X				num_chars = (int)(temp - nbytes);
X			else
X				num_chars = llength (lp);
X		}
X		if ((s = ffputline (&lp -> l_text[0], num_chars)) != FIOSUC)
X			break;
X		nbytes += num_chars;
X		if (temp <= nbytes)
X			break;
X		lp = lforw (lp);
X
X		if ((nbytes & 0x7fff) == 0)
X		{
X			sprintf (buf1, MSG_wrot_n, R_POS_FMT(curwp));
X			sprintf (buf, buf1, (ulong)nbytes);
X			writ_echo (buf);
X			/* check if we should quit */
X			if (ttkeyready ())
X			{
X				wind_on_dot_all();
X				if (ttgetc () == CTL_G)  /* was it an abort key? */
X				{
X					s = FIOERR;
X					break;
X				}
X			}
X		}
X	}
X	if (s == FIOSUC)
X	{
X		/* No write error. */
X		s = ffclose ();
X		if (s == FIOSUC && kbdmop == NULL)
X		{
X			sprintf (buf1, MSG_wrot_n, R_POS_FMT(curwp));
X			sprintf (buf, buf1, (long) nbytes);
X			writ_echo (buf);
X		}
X	}
X	else /* Ignore close error   */
X		ffclose ();             /* if a write error.    */
X	curbp -> b_file_size = nbytes;  /* update file size */
X	if ((blistp -> b_nwnd != 0) &&  /* update buffer display */
X	(blistp -> b_type == BTLIST))
X		listbuffers ();
X	if (s != FIOSUC)            /* Some sort of error.  */
X		return (FALSE);
X	return (TRUE);
X}
X
X/*
X* The command allows the user
X* to modify the file name associated with
X* the current buffer. It is like the "f" command
X* in UNIX "ed". The operation is simple; just zap
X* the name in the BUFFER structure, and mark the windows
X* as needing an update. You can type a blank line at the
X* prompt if you wish.
X*/
Xchar    filename ()
X{
X	register    WINDOW * wp;
X	register char   s;
X	char    fname[NFILEN];
X	A32     start, end;
X
X	if ((s = ereply (MSG_fil_nam, fname, NFILEN, NULL)) == ABORT)
X		return (s);
X	if (!parse_f_name (fname, &start, &end))
X		return (FALSE);
X
X	adjustcase (fname);
X	curbp -> b_flag |= BFCHG;   /* jam - on name change, set modify */
X	BUF_START(curwp) = start;
X	l_fix_up (curbp -> b_linep -> l_fp); /* adjust file offsets from first line */
X	strcpy (curbp -> b_fname, fname);/* Fix name.            */
X	wp = wheadp;                /* Update mode lines.   */
X	while (wp != NULL)
X	{
X		if (wp -> w_bufp == curbp)
X			wp -> w_flag |= WFMODE;
X		wp = wp -> w_wndp;
X	}
X#if     BACKUP
X	curbp -> b_flag &= ~BFBAK;  /* No backup.           */
X#endif
X	return (TRUE);
X}
X
X/*
X*   Get the length parameters that were entered with the file name.
X*   There can be the file name only.
X*   There can be a file name and a starting position.
X*   There can be a name a starting position and an ending position.
X*   There can be a name a starting position and a length.
X*
X*   input:
X*       fn      pointer to file name string to parse.
X*
X*   output:
X*       fn      pointer to null terminated file name.
X*       start   pointer to the starting point in file (default = 0)
X*       end     pointer to the end point in file (default = -1)
X*       return  FALSE if file name or addresses are bad.
X*/
Xbool    parse_f_name (fn, start, end)
Xchar    *fn;
XA32     *start, *end;
X{
X	char    buf[NFILEN], buf1[80], fmt[10];
X	int     i_cnt;
X	A32     temp;
X
X	/* build up format string according to the current screen format */
X	sprintf (fmt, "%s %s %s", "%s", R_POS_FMT(curwp), R_POS_FMT(curwp));
X
X	*start = 0L;
X	*end = MAXPOS;
X	sscanf (fn, fmt, buf, start, end);
X
X	if (*end != MAXPOS)
X	{
X		for (i_cnt = strlen (fn) - 1; i_cnt >= 0; i_cnt--)
X		{
X			if (fn[i_cnt] == '+')
X			{
X				*end += *start;
X				break;
X			}
X		}
X	}
X	/* start should preceed end */
X	if (*start > *end)
X	{
X		sprintf (buf1, ERR_parse_fn, R_POS_FMT(curwp), R_POS_FMT(curwp));
X		sprintf (buf, buf1, *start, *end);
X		writ_echo (buf);
X		return (FALSE);
X	}
X
X	/* error if addresses are negative */
X	if ((*start < 0) || (*end < 0))
X	{
X		writ_echo (ERR_addr_neg);
X		return (FALSE);
X	}
X
X	/* deposit null terminated file name */
X	strcpy (fn, buf);
X	return (TRUE);
X}
END_OF_FILE
if test 18927 -ne `wc -c <'file.c'`; then
    echo shar: \"'file.c'\" unpacked with wrong size!
fi
# end of 'file.c'
fi
if test -f 'symbol.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'symbol.c'\"
else
echo shar: Extracting \"'symbol.c'\" \(18831 characters\)
sed "s/^X//" >'symbol.c' <<'END_OF_FILE'
X/*
X*              Symbol table stuff.
X* Symbol tables, and keymap setup.
X* The terminal specific parts of building the
X* keymap has been moved to a better place.
X*/
X#define LINT_ARGS   1           /* enable lint type checking */
X#include        "def.h"
X
Xvoid keyadd ();
Xvoid keydup ();
X
X
Xextern    char    MSG_byte_shift[];
Xextern    char    MSG_back_char[];
Xextern    char    MSG_quit[];
Xextern    char    MSG_forw_del_char[];
Xextern    char    MSG_toggle_swap[];
Xextern    char    MSG_forw_char[];
Xextern    char    MSG_abort[];
Xextern    char    MSG_ins_self[];
Xextern    char    MSG_back_del_char[];
Xextern    char    MSG_refresh[];
Xextern    char    MSG_forw_line[];
Xextern    char    MSG_back_line[];
Xextern    char    MSG_quote[];
Xextern    char    MSG_recall[];
Xextern    char    MSG_twiddle[];
Xextern    char    MSG_forw_page[];
Xextern    char    MSG_kill_region[];
Xextern    char    MSG_yank[];
Xextern    char    MSG_down_window[];
Xextern    char    MSG_ins_toggle[];
Xextern    char    MSG_display_buffers[];
Xextern    char    MSG_quit[];
Xextern    char    MSG_exit_flush_all[];
Xextern    char    MSG_set_file_name[];
Xextern    char    MSG_file_insert[];
Xextern    char    MSG_buf_size_lock[];
Xextern    char    MSG_flush_all[];
Xextern    char    MSG_down_window[];
Xextern    char    MSG_up_window[];
Xextern    char    MSG_file_read[];
Xextern    char    MSG_file_save[];
Xextern    char    MSG_file_visit[];
Xextern    char    MSG_file_write[];
Xextern    char    MSG_swap_dot_and_mark[];
Xextern    char    MSG_shrink_window[];
Xextern    char    MSG_display_position[];
Xextern    char    MSG_start_macro[];
Xextern    char    MSG_end_macro[];
Xextern    char    MSG_help[];
Xextern    char    MSG_only_window[];
Xextern    char    MSG_del_window[];
Xextern    char    MSG_split_window[];
Xextern    char    MSG_use_buffer[];
Xextern    char    MSG_spawn_cli[];
Xextern    char    MSG_execute_macro[];
Xextern    char    MSG_goto_line[];
Xextern    char    MSG_ins_unit[];
Xextern    char    MSG_kill_buffer[];
Xextern    char    MSG_load_bindings[];
Xextern    char    MSG_forw_window[];
Xextern    char    MSG_back_window[];
Xextern    char    MSG_view_file[];
Xextern    char    MSG_enlarge_window[];
Xextern    char    MSG_ascii_mode[];
Xextern    char    MSG_binary_mode[];
Xextern    char    MSG_buffer_name[];
Xextern    char    MSG_decimal_mode[];
Xextern    char    MSG_ebcdic_mode[];
Xextern    char    MSG_hex_mode[];
Xextern    char    MSG_back_del_unit[];
Xextern    char    MSG_octal_mode[];
Xextern    char    MSG_display_version[];
Xextern    char    MSG_unit_size1[];
Xextern    char    MSG_unit_size2[];
Xextern    char    MSG_unit_size4[];
Xextern    char    MSG_reposition_window[];
Xextern    char    MSG_set_mark[];
Xextern    char    MSG_goto_eob[];
Xextern    char    MSG_goto_bob[];
Xextern    char    MSG_next_buff[];
Xextern    char    MSG_prev_buff[];
Xextern    char    MSG_query_replace[];
Xextern    char    MSG_display_bindings[];
Xextern    char    MSG_auto_save[];
Xextern    char    MSG_back_unit[];
Xextern    char    MSG_compare[];
Xextern    char    MSG_forw_del_unit[];
Xextern    char    MSG_forw_unit[];
Xextern    char    MSG_link_windows[];
Xextern    char    MSG_print[];
Xextern    char    MSG_back_search[];
Xextern    char    MSG_forw_search[];
Xextern    char    MSG_back_page[];
Xextern    char    MSG_copy_region[];
Xextern    char    MSG_extended_command[];
Xextern    char    MSG_up_window[];
Xextern    char    MSG_search_again[];
Xextern    char    MSG_bind_to_key[];
Xextern    char    MSG_file_visit_split[];
Xextern    char    MSG_yank_buffer[];
Xextern    char    MSG_save_region[];
Xextern    char    MSG_use_buffer_split[];
Xextern    char    MSG_no_f_tb[];
Xextern    char    MSG_n_split[];
Xextern    char    MSG_n_combine[];
Xextern    char    MSG_show_save_buf[];
X
X/*
X* Defined by "main.c".
X*/
Xextern char ctrlg ();           /* Abort out of things      */
Xextern char quit ();            /* Quit             */
Xextern char ctlxlp ();          /* Begin macro          */
Xextern char ctlxrp ();          /* End macro            */
Xextern char ctlxe ();           /* Execute macro        */
Xextern char showversion ();     /* Show version numbers, etc.   */
Xextern char flushnquit ();      /* Flush buffers & exit (fitz)  */
Xextern char flush_all ();       /* Flush buffers (jam)      */
Xextern char autosave ();        /* autosave function (jam)  */
X
X/*
X* Defined by "search.c".
X*/
Xextern char forwsearch ();      /* Search forward       */
Xextern char backsearch ();      /* Search backwards     */
Xextern char searchagain ();     /* Repeat last search command   */
Xextern char queryrepl ();       /* Query replace        */
Xextern char compare ();         /* Compare two windows  */
Xextern char recall ();          /* Recall last search string  */
X
X/*
X* Defined by "basic.c".
X*/
Xextern char backchar ();        /* Move backward by characters  */
Xextern char forwchar ();        /* Move forward by characters   */
Xextern char gotobob ();         /* Move to start of buffer  */
Xextern char gotoeob ();         /* Move to end of buffer    */
Xextern char forwline ();        /* Move forward by lines    */
Xextern char backline ();        /* Move backward by lines   */
Xextern char forwpage ();        /* Move forward by pages    */
Xextern char backpage ();        /* Move backward by pages   */
Xextern char setmark ();         /* Set mark         */
Xextern char swapmark ();        /* Swap "." and mark        */
Xextern char gotoline ();        /* Go to a specified line.  */
X
X/*
X* Defined by "buffer.c".
X*/
Xextern char listbuffers ();     /* Display list of buffers  */
Xextern char showsavebuf ();     /* Show the save buffer contents */
Xextern char usebuffer ();       /* Switch a window to a buffer  */
Xextern char use_buffer ();      /* ditto, plus window split */
Xextern char killbuffer ();      /* Make a buffer go away.   */
Xextern char next_buf ();        /* goto next buffer     */
Xextern char prev_buf ();        /* goto prev buffer     */
Xextern char yank_buffer ();     /* yank buffer by name      */
Xextern char buffername ();      /* change buffer name       */
Xextern char bufsizlock ();      /* lock buffer size         */
X
X/*
X* Defined by "file."
X*/
Xextern char fileread ();        /* Get a file, read only    */
Xextern char filevisit ();       /* Get a file, read write   */
Xextern char file_visit ();      /* ditto , plus window split    */
Xextern char filewrite ();       /* Write a file         */
Xextern char filesave ();        /* Save current file        */
Xextern char filename ();        /* Adjust file name     */
Xextern char fileinsert ();      /* insert file to cursor (jam ) */
Xextern char viewfile ();        /* readonly file visit (jam)    */
X
X/*
X* Defined by "random.c".
X*/
X
Xextern char dispshift ();       /* Increment display shift   */
Xextern char selfinsert ();      /* Insert character  */
Xextern char insert_toggle ();   /* toggle insert mode  (jam)    */
Xextern char insertunit ();      /* insert unit  (pvr)    */
Xextern char showcpos ();        /* Show the cursor position */
Xextern char twiddle ();         /* Twiddle units        */
Xextern char forwdel ();         /* Forward delete       */
Xextern char backdel ();         /* Backward delete      */
Xextern char quote ();           /* Insert literal       */
Xextern char asciimode ();       /* display ASCII data   */
Xextern char ebcdicmode ();      /* display EBCDIC data   */
Xextern char decimalmode ();     /* display DECIMAL data   */
Xextern char hexmode ();         /* display HEX data   */
Xextern char octalmode ();       /* display OCTAL data   */
Xextern char binarymode ();      /* display BINARY data   */
Xextern char dispsize1 ();       /* display in BYTE format */
Xextern char dispsize2 ();       /* display in WORD format */
Xextern char dispsize4 ();       /* display in DWORD format*/
Xextern char dispswapbyte ();    /* Display swaped bytes    pvr   */
Xextern char yank ();            /* Yank back from killbuffer.   */
Xextern char linkwind ();        /* Link all windows on one buffer. */
Xextern char n_way_split ();     /* Split buffer into n buffers. */
Xextern char n_way_combine ();   /* Combine n buffers into one. */
X
X/*
X* Defined by "region.c".
X*/
Xextern char killregion ();      /* Kill region.         */
Xextern char copyregion ();      /* Copy region to kill buffer.  */
Xextern char save_region ();     /* Save region in named buffer. */
X
X/*
X* Defined by "spawn.c".
X*/
Xextern char spawncli ();        /* Run CLI in a subjob.     */
Xextern char clock ();           /* display time in modeline */
X
X/*
X* Defined by "window.c".
X*/
Xextern char reposition ();      /* Reposition window        */
Xextern char refresh ();         /* Refresh the screen       */
Xextern char nextwind ();        /* Move to the next window  */
Xextern char prevwind ();        /* Move to the previous window  */
Xextern char mvdnwind ();        /* Move window down     */
Xextern char mvupwind ();        /* Move window up       */
Xextern char onlywind ();        /* Make current window only one */
Xextern char delwind ();         /* Delete current window */
Xextern char splitwind ();       /* Split current window     */
Xextern char enlargewind ();     /* Enlarge display window.  */
Xextern char shrinkwind ();      /* Shrink window.       */
X
X/*
X* Defined by "word.c".
X*/
Xextern char backunit ();        /* Backup by units      */
Xextern char forwunit ();        /* Advance by units     */
Xextern char delfunit ();        /* Delete forward unit. */
Xextern char delbunit ();        /* Delete backward unit.    */
X
X/*
X* Defined by "extend.c".
X*/
Xextern char extend ();          /* Extended commands.       */
Xextern char help ();            /* Help key.            */
Xextern char bindtokey ();       /* Modify key bindings.     */
Xextern char wallchart ();       /* Make wall chart.     */
Xextern void check_extend ();    /* load extended key file   */
Xextern char load_extend ();     /* load extended file by name   */
X
X/*
X* Defined by "display.c
X*/
Xextern char print ();           /* print window from mark to dot */
X
Xtypedef struct
X{
X
X	short   k_key;              /* Key to bind.                 */
X	char    (*k_funcp) ();      /* Function.            */
X	char   *k_name;             /* Function name string.        */
X	char    k_modify;           /* modify bit */
X}                KEY;
X
X/*
X* Default key binding table. This contains
X* the function names, the symbol table name, and (possibly)
X* a key binding for the builtin functions. There are no
X* bindings for C-U or C-X. These are done with special
X* code, but should be done normally.
X*/
XKEY key[] =
X{
X	KCTRL | 'A', dispshift, MSG_byte_shift, 0,
X	    KCTRL | 'B', backchar, MSG_back_char, SSRCH | SRPLC,
X	    KCTRL | 'C', quit, MSG_quit, 0,/* pvr */
X	KCTRL | 'D', forwdel, MSG_forw_del_char, SMOD | SSIZE | SSRCH | SRPLC,
X	    KCTRL | 'E', dispswapbyte, MSG_toggle_swap, SSRCH | SRPLC,/* pvr */
X	KCTRL | 'F', forwchar, MSG_forw_char, SSRCH | SRPLC,
X	    KCTRL | 'G', ctrlg, MSG_abort, SSRCH | SRPLC,
X	    KCTRL | 'I', selfinsert, MSG_ins_self, SMOD | SSRCH | SRPLC,
X	    KCTRL | 'H', backdel, MSG_back_del_char, SMOD | SSIZE | SSRCH | SRPLC,
X	    KCTRL | 'L', refresh, MSG_refresh, SSRCH | SRPLC,
X	    KCTRL | 'N', forwline, MSG_forw_line, SSRCH | SRPLC,
X	    KCTRL | 'P', backline, MSG_back_line, SSRCH | SRPLC,
X	    KCTRL | 'Q', quote, MSG_quote, 0,
X	    KCTRL | 'R', recall, MSG_recall, SSRCH | SRPLC,
X	    KCTRL | 'T', twiddle, MSG_twiddle, SMOD | SSRCH | SRPLC,
X	    KCTRL | 'V', forwpage, MSG_forw_page, SRPLC,
X	    KCTRL | 'W', killregion, MSG_kill_region, SMOD | SSIZE,
X	    KCTRL | 'Y', yank, MSG_yank, SMOD | SSIZE,
X	    KCTRL | 'Z', mvdnwind, MSG_down_window, 0,/* fitz */
X	KCTLX | KCTRL | 'A', insert_toggle, MSG_ins_toggle, SSRCH | SRPLC,
X	    KCTLX | KCTRL | 'B', listbuffers, MSG_display_buffers, 0,
X	    KCTLX | KCTRL | 'C', quit, MSG_quit, 0,
X	    KCTLX | KCTRL | 'E', flushnquit, MSG_exit_flush_all, 0,/* fitz */
X	KCTLX | KCTRL | 'F', filename, MSG_set_file_name, SMOD,/* jam */
X	KCTLX | KCTRL | 'I', fileinsert, MSG_file_insert, SMOD | SSIZE,
X	    KCTLX | KCTRL | 'L', bufsizlock, MSG_buf_size_lock, 0,
X	    KCTLX | KCTRL | 'M', flush_all, MSG_flush_all, 0,
X	    KCTLX | KCTRL | 'N', mvdnwind, MSG_down_window, 0,
X	    KCTLX | KCTRL | 'P', mvupwind, MSG_up_window, 0,
X	    KCTLX | KCTRL | 'R', fileread, MSG_file_read, 0,
X	    KCTLX | KCTRL | 'S', filesave, MSG_file_save, 0,
X	    KCTLX | KCTRL | 'V', filevisit, MSG_file_visit, 0,
X	    KCTLX | KCTRL | 'W', filewrite, MSG_file_write, 0,
X	    KCTLX | KCTRL | 'X', swapmark, MSG_swap_dot_and_mark, 0,
X	    KCTLX | KCTRL | 'Z', shrinkwind, MSG_shrink_window, 0,
X	    KCTLX | '=', showcpos, MSG_display_position, 0,
X	    KCTLX | '(', ctlxlp, MSG_start_macro, 0,
X	    KCTLX | ')', ctlxrp, MSG_end_macro, 0,
X	    KCTLX | '?', help, MSG_help, 0,
X	    KCTLX | '0', delwind, MSG_del_window, 0,
X	    KCTLX | '1', onlywind, MSG_only_window, 0,
X	    KCTLX | '2', splitwind, MSG_split_window, 0,
X	    KCTLX | 'B', usebuffer, MSG_use_buffer, 0,
X	    KCTLX | 'C', spawncli, MSG_spawn_cli, 0,/* fitz */
X	KCTLX | 'E', ctlxe, MSG_execute_macro, 0,
X	    KCTLX | 'G', gotoline, MSG_goto_line, 0,
X	    KCTLX | 'I', insertunit, MSG_ins_unit, SMOD | SSIZE | SSRCH | SRPLC,
X	    KCTLX | 'K', killbuffer, MSG_kill_buffer, 0,
X	    KCTLX | 'L', load_extend, MSG_load_bindings, 0,
X	    KCTLX | 'N', nextwind, MSG_forw_window, 0,
X	    KCTLX | 'P', prevwind, MSG_back_window, 0,
X	    KCTLX | 'V', viewfile, MSG_view_file, 0,/* jam */
X	KCTLX | 'Z', enlargewind, MSG_enlarge_window, 0,
X	    KMETA | KCTRL | 'A', asciimode, MSG_ascii_mode, SSRCH | SRPLC, /* pvr */
X	KMETA | KCTRL | 'B', binarymode, MSG_binary_mode, SSRCH | SRPLC, /* pvr */
X	KMETA | KCTRL | 'F', n_way_combine, MSG_n_combine, SSIZE | SMOD, /* pvr */
X	KMETA | KCTRL | 'N', buffername, MSG_buffer_name, 0,
X	    KMETA | KCTRL | 'D', decimalmode, MSG_decimal_mode, SSRCH | SRPLC, /* pvr */
X	KMETA | KCTRL | 'E', ebcdicmode, MSG_ebcdic_mode, SSRCH | SRPLC, /* pvr */
X	KMETA | KCTRL | 'H', hexmode, MSG_hex_mode, SSRCH | SRPLC, /* pvr */
X	KMETA | KCTRL | 'K', delbunit, MSG_back_del_unit, SMOD | SSIZE | SSRCH | SRPLC,
X	    KMETA | KCTRL | 'O', octalmode, MSG_octal_mode, SSRCH | SRPLC, /* pvr */
X	KMETA | KCTRL | 'S', n_way_split, MSG_n_split, 0, /* pvr */
X	KMETA | KCTRL | 'V', showversion, MSG_display_version, 0,
X	    KMETA | KCTRL | 'W', showsavebuf, MSG_show_save_buf, 0,
X	    KMETA | '1', dispsize1, MSG_unit_size1, SSRCH | SRPLC,/* pvr */
X	KMETA | '2', dispsize2, MSG_unit_size2, SSRCH | SRPLC,/* pvr */
X	KMETA | '4', dispsize4, MSG_unit_size4, SSRCH | SRPLC,/* pvr */
X	KMETA | '!', reposition, MSG_reposition_window, 0,
X	    KMETA | '.', setmark, MSG_set_mark, 0,
X	    KMETA | '>', gotoeob, MSG_goto_eob, SSRCH | SRPLC,
X	    KMETA | '<', gotobob, MSG_goto_bob, SSRCH | SRPLC,
X	    KMETA | '+', next_buf, MSG_next_buff, 0,
X	    KMETA | '-', prev_buf, MSG_prev_buff, 0,
X	    KMETA | '%', queryrepl, MSG_query_replace, SMOD,
X	    KMETA | '?', wallchart, MSG_display_bindings, 0,
X	    KMETA | 'A', autosave, MSG_auto_save, 0,
X	    KMETA | 'B', backunit, MSG_back_unit, SSRCH | SRPLC,
X	    KMETA | 'C', compare, MSG_compare, 0,
X	    KMETA | 'D', delfunit, MSG_forw_del_unit, SMOD | SSIZE | SSRCH | SRPLC,
X	    KMETA | 'F', forwunit, MSG_forw_unit, SSRCH | SRPLC,
X	    KMETA | 'G', use_buffer, MSG_use_buffer_split, 0,
X	    KMETA | 'K', bindtokey, MSG_bind_to_key, 0,
X	    KMETA | 'L', linkwind, MSG_link_windows, 0,
X	    KMETA | 'O', save_region, MSG_save_region, 0,
X	    KMETA | 'P', print, MSG_print, 0,
X	    KMETA | 'R', backsearch, MSG_back_search, 0,
X	    KMETA | 'S', forwsearch, MSG_forw_search, 0,
X	    KMETA | 'T', searchagain, MSG_search_again, 0,
X	    KMETA | 'U', file_visit, MSG_file_visit_split, 0,
X	    KMETA | 'V', backpage, MSG_back_page, SRPLC,
X	    KMETA | 'W', copyregion, MSG_copy_region, 0,
X	    KMETA | 'X', extend, MSG_extended_command, 0,
X	    KMETA | 'Y', yank_buffer, MSG_yank_buffer, SMOD | SSIZE,
X	    KMETA | 'Z', mvupwind, MSG_up_window, 0
X};
X
X#define NKEY    (sizeof(key) / sizeof(key[0]))
X
X/*
X* Symbol table lookup.
X* Return a pointer to the SYMBOL node, or NULL if
X* the symbol is not found.
X*/
XSYMBOL * symlookup (cp)
Xregister char  *cp;
X{
X	register    SYMBOL * sp;
X
X	sp = symbol[symhash (cp)];
X	while (sp != NULL)
X	{
X		if (strcmp (cp, sp -> s_name) == 0)
X			return (sp);
X		sp = sp -> s_symp;
X	}
X	return (NULL);
X}
X
X
X/*
X* Take a string, and compute the symbol table
X* bucket number. This is done by adding all of the characters
X* together, and taking the sum mod NSHASH. The string probably
X* should not contain any GR characters; if it does the "*cp"
X* may get a nagative number on some machines, and the "%"
X* will return a negative number!
X*/
Xint     symhash (cp)
Xregister char  *cp;
X{
X	register int    c;
X	register int    n;
X
X	n = 0;
X	while ((c = *cp++) != 0)
X		n += c;
X	return (n % NSHASH);
X}
X
X
X/*
X* Build initial keymap. The funny keys
X* (commands, odd control characters) are mapped using
X* a big table and calls to "keyadd". The printing characters
X* are done with some do-it-yourself handwaving. The terminal
X* specific keymap initialization code is called at the
X* very end to finish up. All errors are fatal.
X*/
Xvoid keymapinit ()
X{
X	register    SYMBOL * sp;
X	register    KEY * kp;
X	register int    i;
X	register int    hash;
X
X	for (i = 0; i < NKEYS; ++i)
X		binding[i] = NULL;
X	for (kp = &key[0]; kp < &key[NKEY]; ++kp)
X		keyadd (kp -> k_key, kp -> k_funcp, kp -> k_name, kp -> k_modify);
X	keydup (KCTLX | KCTRL | 'G', MSG_abort);
X	keydup (KMETA | KCTRL | 'G', MSG_abort);
X	keydup (0x7F, MSG_back_del_char);
X	keydup (KMETA | 'Q', MSG_quote);
X	keydup (KMETA | 0x7F, MSG_back_del_unit);
X	/* 
X  * Should be bound by "tab" already.
X  */
X	if ((sp = symlookup (MSG_ins_self)) == NULL)
X		abort ();
X	for (i = 0x20; i < 0x7F; ++i)
X	{
X		if (binding[i] != NULL)
X			abort ();
X		binding[i] = sp;
X		++sp -> s_nkey;
X	}
X	ttykeymapinit ();
X}
X
X
X/*
X* Create a new builtin function "name"
X* with function "funcp". If the "new" is a real
X* key, bind it as a side effect. All errors
X* are fatal.
X*/
Xvoid keyadd (new, funcp, name, modify)
Xbool   (*funcp) ();
Xchar   *name;
X{
X	register    SYMBOL * sp;
X	register int    hash;
X
X	if ((sp = (SYMBOL *) malloc (sizeof (SYMBOL))) == NULL)
X		abort ();
X	hash = symhash (name);
X	sp -> s_symp = symbol[hash];
X	symbol[hash] = sp;
X	sp -> s_nkey = 0;
X	sp -> s_name = name;
X	sp -> s_funcp = funcp;
X	sp -> s_modify = modify;
X	if (new >= 0)
X	{
X		/* Bind this key.       */
X		if (binding[new] != NULL)
X			abort ();
X		binding[new] = sp;
X		++sp -> s_nkey;
X	}
X}
X
X/*
X* Bind key "new" to the existing
X* routine "name". If the name cannot be found,
X* or the key is already bound, abort.
X*/
Xvoid keydup (new, name)
Xregister int    new;
Xchar   *name;
X{
X	register    SYMBOL * sp;
X
X	if (binding[new] != NULL || (sp = symlookup (name)) == NULL)
X	{
X		printf (MSG_no_f_tb, name);
X		abort ();
X	}
X	binding[new] = sp;
X	++sp -> s_nkey;
X}
END_OF_FILE
if test 18831 -ne `wc -c <'symbol.c'`; then
    echo shar: \"'symbol.c'\" unpacked with wrong size!
fi
# end of 'symbol.c'
fi
if test -f 'text.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'text.c'\"
else
echo shar: Extracting \"'text.c'\" \(15253 characters\)
sed "s/^X//" >'text.c' <<'END_OF_FILE'
X/*
X*   This file contains all text srtings
X*/
X#include    "def.h"
X
X/* in basic.c */
Xchar    MSG_mark_set[]  = "Mark set";
Xchar    MSG_no_mark[]   = "No mark in this window";
Xchar    MSG_go_b_n[]    = "Goto byte number: ";
Xchar    MSG_bad_num[]   = "ERROR: Bad number";
Xchar    MSG_lX[]        = "%lX";
Xchar    MSG_lO[]        = "%lO";
Xchar    MSG_lD[]        = "%lD";
X
X/* in buffer.c */
Xchar    MSG_use_b[]     = "Enter name of buffer to goto: ";
Xchar    MSG_kill_b[]    = "Enter name of buffer to delete: ";
Xchar    MSG_no_del_m[]  = "ERROR: Can't delete 'main'";
Xchar    MSG_buf_disp[]  = "ERROR: Buffer is displayed - continue";
Xchar    MSG_main[]      = "main";
Xchar    MSG_l_buf_h[]   = "S T    Size  Buffer           File";
Xchar    MSG_l_buf_h1[]  = "- -   ------ ------           ----";
Xchar    MSG_no_chg[]    = "Discard changes";
Xchar    MSG_yank_b[]    = "Yank from buffer: ";
Xchar    MSG_no_buf[]    = "ERROR: no such buffer";
Xchar    MSG_no_s_yank[] = "ERROR: can't yank to self!";
Xchar    MSG_buf_nam[]   = "Buffer name: ";
Xchar    MSG_bad_l[]     = "ERROR: Bad line!";
Xchar    MSG_pick[]      = "%s: G(oto) or K(ill) S(ave) ";
Xchar    MSG_siz_chg[]   = "Current buffer size may be changed";
Xchar    MSG_no_siz_chg[]= "Current buffer size is locked";
Xchar    MSG_up_arrow[]  = "^";
Xchar    MSG_null[]      = "";
Xchar    MSG_cnt_al_b[]  = "ERROR: Cannot allocate BUFFER block";
Xchar    MSG_ins_cnt[]   = "Insert %s bytes, Hit Ctl-G to quit.";
X
X/* in display.c */
Xchar    MSG_prn_to[]    = "Print to: ";
Xchar    MSG_disp_r_n[]  = "\r\n";
Xchar    MSG_11lX[]      = "%11lX:";
Xchar    MSG_11lo[]      = "%11lo:";
Xchar    MSG_11ld[]      = "%11ld:";
Xchar    MSG_03o[]       = "%03o";
Xchar    MSG_06o[]       = "%06o";
Xchar    MSG_011lo[]     = "%011lo";
Xchar    MSG_03u[]       = "%03u";
Xchar    MSG_05u[]       = "%05u";
Xchar    MSG_010lu[]     = "%010lu";
Xchar    MSG_02X[]       = "%02X";
Xchar    MSG_04X[]       = "%04X";
Xchar    MSG_08lX[]      = "%08lX";
Xchar    MSG_prog_name[] = "BEAV";
Xchar    MSG_disp_b_lst[]= " Buffer List ";
Xchar    MSG_file[]      = "File: ";
Xchar    MSG_RO[]        = " [RO]";
Xchar    MSG_WL[]        = " [WL]";
Xchar    MSG_RW[]        = " [RW]";
Xchar    MSG_AU[]        = "[AU]";
Xchar    MSG_NOT_AU[]    = "    ";
Xchar    MSG_curs_asc[]  = "CURSOR=%08lX,   ASCII";
Xchar    MSG_curs_ebc[]  = "CURSOR=%08lX,  EBCDIC";
Xchar    MSG_curs_hex[]  = "CURSOR=%08lX,%2X   HEX";
Xchar    MSG_curs_bin[]  = "CURSOR=%08lX,%2X   BIN";
Xchar    MSG_curs_dec[]  = "CURSOR=%08lu,%2u   DEC";
Xchar    MSG_curs_oct[]  = "CURSOR=%08lo,%2o OCTAL";
Xchar    MSG_siz_8[]     = " 8 ";
Xchar    MSG_siz_16[]    = " 16";
Xchar    MSG_siz_32[]    = " 32";
Xchar    MSG_siz_null[]  = "   ";
Xchar    MSG_int_shift[] = " S%X";
Xchar    MSG_mot_shift[] = "  %X";
Xchar    MSG_print1[]    = "Writing: %s; Hit Ctl-G to quit";
Xchar    MSG_print2[]    = "Wrote %s lines";
X
X/*  in ebcdic.c */
X#if RUNCHK
Xchar    ERR_ebcdic[]    = 
X"ERROR: Character %s not found in EBCDIC table\n";
X#endif
X
X/* in echo.c */
Xchar    MSG_y_n[]       = "%s [y/n]? ";
Xchar    MSG_hex_dig[]   = "0123456789ABCDEF";
Xchar    MSG_hit_key[]   = "  Hit Ctl-G to continue";
X
X/* in extend.c */
Xchar    MSG_not_now[]   = "Not now";
Xchar    MSG_func[]      = "Function: ";
Xchar    MSG_unk_func[]  = "ERROR: Unknown function for binding";
Xchar    MSG_cmd_t_ex[]  = "Command to execute: ";
Xchar    MSG_unk_ext[]   = "ERROR: Unknown extended command";
Xchar    MSG_d_b[]       = 
X"Display key binding for which key? (hit key now!)";
Xchar    MSG_unbd[]      = "%s is unbound";
Xchar    MSG_bnd_to[]    = "%s is bound to %s";
Xchar    MSG_ins_self[]  = "ins-self";
Xchar    MSG_bnd_file[]  = "Binding file: ";
Xchar    MSG_bld_wall[]  = "Building help buffer";
Xchar    MSG_wall_head[] = "#  Function name                Key binding        Key code";
Xchar    MSG_beavrc[]  = "beavrc";
X
X/* in file.c */
Xchar    MSG_rd_file[]   = "Read file: ";
Xchar    MSG_trash[]     = "#tempbuf#";
Xchar    MSG_ins_file[]  = "Insert file: ";
Xchar    MSG_not_fnd[]   = "Not found";
Xchar    MSG_visit[]     = "Visit file: ";
Xchar    MSG_view[]      = "View file (read only): ";
Xchar    MSG_buf_ex[]    = "ERROR: Buffer exists";
Xchar    MSG_old_buf[]   = "ERROR: Old buffer";
Xchar    MSG_cnt_cr[]    = "ERROR: Cannot create buffer";
Xchar    MSG_reading[]   = "reading <%s>";
Xchar    MSG_read_lx[]   = "Read %s bytes, Hit Ctl-G to quit.";
Xchar    MSG_no_mem_rd[] = 
X"ERROR: Insufficient memory, buffer set to read only";
Xchar    MSG_wr_file[]   = "Write file: ";
Xchar    MSG_no_fn[]     = "ERROR: No file name";
Xchar    MSG_bk_err[]    = "ERROR: Backup error, save anyway";
Xchar    MSG_writing[]   = "writing <%s>";
Xchar    MSG_wrot_n[]    = "Wrote %s bytes, Hit Ctl-G to quit.";
Xchar    MSG_fil_nam[]   = "File name: ";
X#if RUNCHK
Xchar    ERR_parse_fn[]  = 
X"ERROR: Starting address (%s) must preceede ending address (%s)";
Xchar    ERR_addr_neg[]  = "ERROR: Addresses cannot be negative";
Xchar    ERR_f_size[]    = 
X"ERROR: Cannot access past end of file. (file size = %s)";
X#endif
X
X/* in fileio.c */
Xchar    MSG_cnt_wr[]    = "ERROR: Cannot open file for writing";
Xchar    MSG_wr_io_er[]  = "ERROR: Write I/O error";
Xchar    MSG_rd_er[]     = "ERROR: File read error";
Xchar    MSG_bak[]       = ".bak";
Xchar    MSG_backup[]    = "Back-up of %s to %s";
Xchar    MSG_back_er[]   = "ERROR: Back-up of %s to %s FAILED !!";
Xchar    MSG_back_of[]   = "%s - Back-up of  <%s> to <%s>\n";
X
X/* in format.c */
Xchar    hex_str[]       = "%X";
Xchar    hex_l_str[]     = "%lX";
Xchar    octal_str[]     = "%o";
Xchar    octal_l_str[]   = "%lo";
Xchar    decimal_str[]   = "%u";
Xchar    decimal_l_str[] = "%lu";
Xchar    char_str[]      = "%c";
X
X/* in kbd.c */
Xchar    MSG_tab[]       = "Tab";
Xchar    MSG_ret[]       = "Return";
Xchar    MSG_bksp[]      = "Backspace";
Xchar    MSG_space[]     = "Space";
Xchar    MSG_rubout[]    = "Rubout";
X
X/* in line.c */
Xchar    MSG_cnt_alloc[] = "ERROR: Cannot allocate %s bytes for a line";
Xchar    MSG_save_buf[]  = "save-buffer";
X
X/* in main.c */
Xchar    MSG_ok[]        = "ok";
Xchar    MSG_no_mod[]    = "ERROR: Buffer can not be modified";
Xchar    MSG_no_s_chg[]  = "ERROR: Buffer size can not be changed";
Xchar    MSG_auto_fl[]   = "Doing auto buffer flush";
Xchar    MSG_quit[]      = "quit-no-save";
Xchar    MSG_st_mac[]    = "Start macro";
Xchar    MSG_end_mac[]   = "End macro";
Xchar    MSG_num_mod[]   = "Number of modifcations per update: ";
Xchar    version[]       = "BEAV, Ver 1.30,  08/01/91";
X
X/*  in random.c */
Xchar    MSG_sh_pos[]  = 
X"Cursor: %s, Mark: %s,  Buffer Size: %s, File Size: %s";
Xchar    MSG_sh_pos1[] = 
X"Cursor: %s, No Mark, Buffer Size: %s, File Size: %s";
Xchar    MSG_f_str[]     = ", File: <%s>";
Xchar    MSG_3u[]        = "%3u";
Xchar    MSG_5u[]        = "%5u";
Xchar    MSG_lu[]        = "%lu";
Xchar    MSG_lnk[]       = "All windows on buffer <%s> are %s";
Xchar    MSG_unlink[]    = "unlinked";
Xchar    MSG_link[]      = "linked";
Xchar    MSG_bad_key[]   = "ERROR: bad key = ";
Xchar    MSG_esc[]       = "Esc,";
Xchar    MSG_ctl_x[]     = "Ctl-X,";
Xchar    MSG_ctl[]       = "Ctl-";
Xchar    MSG_fn[]        = "FN,";
Xchar    MSG_key_code[]  = "%s, %s";
Xchar    MSG_w_not_empty[] = "Destination buffer must be empty and modifiable";
Xchar    MSG_procing[]   = "Processing at %s, Hit Ctl-G to quit.";
X
X/* in region.c */
Xchar    MSG_sv_in_b[]   = "Save in buffer: ";
Xchar    MSG_sav_slf[]   = "ERROR: Can't save to self!";
X
X/* in search.c */
Xchar    MSG_sch_str[]   = " Search String";
Xchar    MSG_bsrc_str[]  = "Back Search String";
Xchar    MSG_rpl_str[]   = "Replace String";
Xchar    MSG_pat_fnd[]   = "Pattern found at %s";
Xchar    MSG_no_srch[]   = "ERROR: No last search";
Xchar    MSG_fnd_at[]    = 
X"Found at %s, (R)eplace, (S)kip, (A)ll, (O)ne, (Q)uit.";
Xchar    MSG_no_rpl[]    = "No replacements done";
Xchar    MSG_1_rpl[]     = "1 replacement done";
Xchar    MSG_n_rpl[]     = "%s replacements done";
Xchar    MSG_srcing[]    = "Searching at %s, Hit Ctl-G to quit.";
Xchar    MSG_curs[]      = "%s; Curs = %s, %s Len = %s => ";
Xchar    MSG_cmp_end[]   = "Compare reached the end of a buffer";
Xchar    MSG_cmp_term[]  = "Compare terminated by user";
Xchar    MSG_cmp_dif[]   =
X"Difference is detected at the two cursor positions";
Xchar    MSG_only_2[]    = 
X"ERROR: There must be exactly two windows displayed to use Compare";
Xchar    MSG_cmping[]    = "Comparing at %s, Hit Ctl-G to quit.";
X
X/* in spawn.c */
Xchar    MSG_shell[]     = "COMSPEC";
Xchar    MSG_def_shell[] = "/command.com";
Xchar    MSG_pmpt[]      = "PROMPT=[BEAV]";
Xchar    MSG_pt[]        = "PROMPT";
Xchar    MSG_pme[]       = "PROMPT=";
X
X/* in symbol.c */
Xchar    MSG_byte_shift[]        = "display-byte-shift";
Xchar    MSG_back_char[]         = "move-back-char";
Xchar    MSG_forw_del_char[]     = "delete-forw-char";
Xchar    MSG_toggle_swap[]       = "display-swap-order";
Xchar    MSG_forw_char[]         = "move-forw-char";
Xchar    MSG_abort[]             = "abort-cmd";
Xchar    MSG_back_del_char[]     = "delete-back-char";
Xchar    MSG_refresh[]           = "refresh-screen";
Xchar    MSG_forw_line[]         = "move-forw-line";
Xchar    MSG_back_line[]         = "move-back-line";
Xchar    MSG_quote[]             = "insert-literally";
Xchar    MSG_recall[]            = "recall-srch-string";
Xchar    MSG_twiddle[]           = "unit-twiddle";
Xchar    MSG_forw_page[]         = "move-forw-page";
Xchar    MSG_kill_region[]       = "delete-mark-to-cursor";
Xchar    MSG_yank[]              = "yank";
Xchar    MSG_down_window[]       = "move-window-down";
Xchar    MSG_ins_toggle[]        = "insert-toggle";
Xchar    MSG_display_buffers[]   = "buffers-display";
Xchar    MSG_exit_flush_all[]    = "quit-save-all";
Xchar    MSG_set_file_name[]     = "buffer-set-file-name";
Xchar    MSG_file_insert[]       = "insert-file";
Xchar    MSG_buf_size_lock[]     = "buffer-size-lock";
Xchar    MSG_flush_all[]         = "save-all-buffers";
Xchar    MSG_up_window[]         = "move-window-up";
Xchar    MSG_file_read[]         = "file-read";
Xchar    MSG_file_save[]         = "file-save";
Xchar    MSG_file_visit[]        = "file-visit";
Xchar    MSG_file_write[]        = "file-write";
Xchar    MSG_swap_dot_and_mark[] = "swap-cursor-and-mark";
Xchar    MSG_shrink_window[]     = "window-shrink";
Xchar    MSG_display_position[]  = "show-position";
Xchar    MSG_start_macro[]       = "macro-start";
Xchar    MSG_end_macro[]         = "macro-end";
Xchar    MSG_help[]              = "binding-for-key";
Xchar    MSG_only_window[]       = "window-single";
Xchar    MSG_del_window[]        = "window-delete";
Xchar    MSG_split_window[]      = "window-split";
Xchar    MSG_use_buffer[]        = "change-buffer";
Xchar    MSG_spawn_cli[]         = "spawn-shell";
Xchar    MSG_execute_macro[]     = "macro-execute";
Xchar    MSG_goto_line[]         = "move-to-byte";
Xchar    MSG_ins_unit[]          = "insert-unit";
Xchar    MSG_kill_buffer[]       = "kill-buffer";
Xchar    MSG_load_bindings[]     = "bindings-load";
Xchar    MSG_forw_window[]       = "change-window-forw";
Xchar    MSG_back_window[]       = "change-window-back";
Xchar    MSG_view_file[]         = "file-view";
Xchar    MSG_enlarge_window[]    = "window-enlarge";
Xchar    MSG_ascii_mode[]        = "display-ascii";
Xchar    MSG_binary_mode[]       = "display-binary";
Xchar    MSG_n_combine[]         = "n-way-combine";
Xchar    MSG_buffer_name[]       = "buffer-set-name";
Xchar    MSG_decimal_mode[]      = "display-decimal";
Xchar    MSG_ebcdic_mode[]       = "display-ebcdic";
Xchar    MSG_hex_mode[]          = "display-hex";
Xchar    MSG_back_del_unit[]     = "delete-back-unit";
Xchar    MSG_octal_mode[]        = "display-octal";
Xchar    MSG_n_split[]           = "n-way-split";
Xchar    MSG_display_version[]   = "show-version";
Xchar    MSG_show_save_buf[]     = "show-save-buf";
Xchar    MSG_unit_size1[]        = "display-bytes";
Xchar    MSG_unit_size2[]        = "display-words";
Xchar    MSG_unit_size4[]        = "display-double-words";
Xchar    MSG_reposition_window[] = "window-reposition";
Xchar    MSG_set_mark[]          = "mark-set";
Xchar    MSG_goto_eob[]          = "move-to-end";
Xchar    MSG_goto_bob[]          = "move-to-begining";
Xchar    MSG_next_buff[]         = "change-to-next-buffer";
Xchar    MSG_prev_buff[]         = "change-to-prev-buffer";
Xchar    MSG_query_replace[]     = "replace";
Xchar    MSG_display_bindings[]  = "help";
Xchar    MSG_auto_save[]         = "auto-save";
Xchar    MSG_back_unit[]         = "move-back-unit";
Xchar    MSG_compare[]           = "compare";
Xchar    MSG_forw_del_unit[]     = "delete-forw-unit";
Xchar    MSG_forw_unit[]         = "move-forw-unit";
Xchar    MSG_link_windows[]      = "window-link";
Xchar    MSG_print[]             = "print-mark-to-cursor";
Xchar    MSG_back_search[]       = "search-back";
Xchar    MSG_forw_search[]       = "search-forw";
Xchar    MSG_back_page[]         = "move-back-page";
Xchar    MSG_copy_region[]       = "copy-mark-to-cursor";
Xchar    MSG_extended_command[]  = "extended-command";
Xchar    MSG_search_again[]      = "search-again";
Xchar    MSG_bind_to_key[]       = "bind-to-key";
Xchar    MSG_file_visit_split[]  = "file-visit-split";
Xchar    MSG_yank_buffer[]       = "yank-buffer";
Xchar    MSG_save_region[]       = "save-mark-to-cursor";
Xchar    MSG_use_buffer_split[]  = "move-to-buffer-split";
Xchar    MSG_no_f_tb[]           = 
X"ERROR: Could not find <%s> in look up table\n";
X
X/* in ttykbd.c */
Xchar    MSG_sp_key[]    = "%u special keys bound\n";
X
X/* in window.c */
Xchar    MSG_no_splt[]   = "ERROR: Cannot split a %s line window";
Xchar    MSG_cnt_al_w[]  = "ERROR: Cannot allocate WINDOW block";
Xchar    MSG_one_w[]     = "ERROR: Only one window";
Xchar    MSG_imp_chg[]   = "ERROR: Impossible change";
X
X#if RUNCHK
X/* in basic.c */
Xchar    ERR_bas_1[]     = "ERROR: unknown r_type in basic #1";
X
X/* in display.c */
Xchar    ERR_disp_1[]    = "ERROR: unknown r_type in display #1";
Xchar    ERR_disp_2[]    = "ERROR: unknown r_type in display #2";
Xchar    ERR_disp_3[]    = "ERROR: row less than zero\n";
Xchar    ERR_disp_4[]    = "ERROR: row greater then window size\n";
Xchar    ERR_disp_5[]    = "ERROR: unknown r_type in display #3";
Xchar    ERR_disp_6[]    = "ERROR: unknown r_size in display ";
X/* in line.c */
Xchar    ERR_no_alloc[]  = 
X"ERROR: new line was allocated during read pattern\n";
Xchar    ERR_db_dalloc[] = 
X"ERROR: line was deallocated during read pattern\n";
Xchar    ERR_lock[]      = "ERROR: This is size locked, cannot insert.";
Xchar    ERR_lock_del[]  = "ERROR: This is size locked, cannot delete.";
X/* in random.c */
Xchar    ERR_rnd_1[]     = "ERROR: unknown r_type in random #1";
Xchar    ERR_rnd_2[]     = "ERROR: unknown r_size in random #2";
Xchar    ERR_rnd_3[]     = "ERROR: unknown r_type in random #3";
Xchar    ERR_rnd_4[]     = "ERROR: unknown r_size in random #4";
Xchar    ERR_rnd_5[]     = "ERROR: unknown r_size in random #5";
Xchar    ERR_rnd_6[]     = "ERROR: unknown r_size in random #6";
Xchar    ERR_rnd_7[]     = "ERROR: unknown r_size in random #7";
X/* in search.c */
Xchar    ERR_rdpat[] = "ERROR: bad r_type in readpattern\n";
Xchar    ERR_mask[]  = "ERROR: size of mask pattern, pat=%d, mask=%d\n";
Xchar    ERR_m_cl[]  = "ERROR: in ascii mode mask byte was not cleared\n";
X/* in ttyio.c */
Xchar    ERR_bd_pl[] = "ERROR: bad call to putline\n";
X#endif
END_OF_FILE
if test 15253 -ne `wc -c <'text.c'`; then
    echo shar: \"'text.c'\" unpacked with wrong size!
fi
# end of 'text.c'
fi
echo shar: End of archive 4 \(of 9\).
cp /dev/null ark4isdone
MISSING=""
for I in 1 2 3 4 5 6 7 8 9 ; do
    if test ! -f ark${I}isdone ; then
	MISSING="${MISSING} ${I}"
    fi
done
if test "${MISSING}" = "" ; then
    echo You have unpacked all 9 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.

exit 0 # Just in case...
-- 
Kent Landfield                   INTERNET: kent@sparky.IMD.Sterling.COM
Sterling Software, IMD           UUCP:     uunet!sparky!kent
Phone:    (402) 291-8300         FAX:      (402) 291-4362
Please send comp.sources.misc-related mail to kent@uunet.uu.net.
