tcsh with editor (again) (5 of 7)

Paul Placeway paul at osu-dbs.UUCP
Sat Apr 21 04:36:46 AEST 1984


(I'm trying again for everyone who missed some of it)

The following code is my changes to Ken Greer's tcsh.  I have added a visual
mini-editor to the shell, and cleaned up the expansion routines some what.
note that this is the 4.1 version.  When we get 4.2 up I'll repost the new
changes.

Please send any changes back to me so that I can update our version.

Note: this is part 5 of 7, you need all of the parts to make tcsh.

					Paul W. Placeway
					The Ohio State University
					(UUCP: cbosgd!osu-dbs!paul)
					(CSNet: paul at ohio-state)

================ cut here ================
: This is a shar archive.  Extract with sh, not csh.
echo x - dir.h
cat > dir.h << '!Funky!Stuff!'
/* Copyright (c) 1982 Regents of the University of California */

/* @(#)ndir.h 4.4 3/30/82 */

/*
 * This sets the "page size" for directories.
 * Requirements are DEV_BSIZE <= DIRBLKSIZ <= MINBSIZE with
 * DIRBLKSIZ a power of two.
 * Dennis Ritchie feels that directory pages should be atomic
 * operations to the disk, so we use DEV_BSIZE.
 */
#define DIRBLKSIZ 512

/*
 * This limits the directory name length. Its main constraint
 * is that it appears twice in the user structure. (u. area)
 */
#define MAXNAMLEN 255

struct	direct {
	u_long	d_ino;
	short	d_reclen;
	short	d_namlen;
	char	d_name[MAXNAMLEN + 1];
	/* typically shorter */
};

struct _dirdesc {
	int	dd_fd;
	long	dd_loc;
	long	dd_size;
	char	dd_buf[DIRBLKSIZ];
};

/*
 * useful macros.
 */
#undef DIRSIZ
#define DIRSIZ(dp) \
    ((sizeof(struct direct) - MAXNAMLEN + (dp)->d_namlen + sizeof(ino_t) - 1) &\
    ~(sizeof(ino_t) - 1))
typedef	struct _dirdesc DIR;
#ifndef	NULL
#define	NULL	0
#endif

/*
 * functions defined on directories
 */
extern DIR *opendir();
extern struct direct *readdir();
extern long telldir();
extern void seekdir();
#define rewinddir(dirp)	seekdir((dirp), 0)
extern void closedir();
!Funky!Stuff!
echo x - dir14.c
cat > dir14.c << '!Funky!Stuff!'
/* Copyright (c) 1982 Regents of the University of California */

/* @(#)opendir.c 4.2.1.1 7/1/82 - HPL */

#include <sys/types.h>
#include <sys/stat.h>
#include <dir.h>

/*
 * open a directory.
 */
DIR *
opendir(name)
	char *name;
{
	register DIR *dirp;
	register int fd;
	struct stat sbuf;

	if ((fd = open(name, 0)) == -1)
		return NULL;
	fstat(fd, &sbuf);
	if (((sbuf.st_mode & S_IFDIR) == 0) ||
	    ((dirp = (DIR *)malloc(sizeof(DIR))) == NULL)) {
		close (fd);
		return NULL;
	}
	dirp->dd_fd = fd;
	dirp->dd_loc = 0;
	return dirp;
}
/* Copyright (c) 1982 Regents of the University of California */

/* @(#)closedir.c 4.2 3/10/82 */

/*
 * close a directory.
 */
void
closedir(dirp)
	register DIR *dirp;
{
	close(dirp->dd_fd);
	dirp->dd_fd = -1;
	dirp->dd_loc = 0;
	free(dirp);
}
/* Copyright (c) 1982 Regents of the University of California */

/* @(#)readdir.c 4.2 3/12/82 */

/*
 * read an old stlye directory entry and present it as a new one
 */
#define	ODIRSIZ	14

struct	olddirect {
	ino_t	d_ino;
	char	d_name[ODIRSIZ];
};

/*
 * get next entry in a directory.
 */
struct direct *
readdir(dirp)
	register DIR *dirp;
{
	register struct olddirect *dp;
	static struct direct dir;

	for (;;) {
		if (dirp->dd_loc == 0) {
			dirp->dd_size = read(dirp->dd_fd, dirp->dd_buf, 
			    DIRBLKSIZ);
			if (dirp->dd_size <= 0)
				return NULL;
		}
		if (dirp->dd_loc >= dirp->dd_size) {
			dirp->dd_loc = 0;
			continue;
		}
		dp = (struct olddirect *)(dirp->dd_buf + dirp->dd_loc);
		dirp->dd_loc += sizeof(struct olddirect);
		if (dp->d_ino == 0)
			continue;
		dir.d_ino = dp->d_ino;
		strncpy(dir.d_name, dp->d_name, ODIRSIZ);
		dir.d_name[ODIRSIZ] = '\0'; /* insure null termination */
		dir.d_namlen = strlen(dir.d_name);
		dir.d_reclen = DIRSIZ(&dir);
		return (&dir);
	}
}
!Funky!Stuff!
echo x - sh.nfunc.c
cat > sh.nfunc.c << '!Funky!Stuff!'
/* static	char *sccsid = "@(#)sh.nfunc.c 1.0 84/01/31"; */

#include "sh.h"
#include "inputl.h"			/* for the function names */
#include "tw.h"

#include <sys/ioctl.h>

static char *seech ();

/*
 * Tops-C shell
 */

/* do a bind command -- 'bind FUNC key' */
/* list structure... */
struct kfuncs {
    char *name;
    int ifunc;			/* inputl function name */
    int tfunc;			/* twenex function name */
} fnames[] = {
    "auto_insert",		AUTO_INSERT,		NO_OP,
    "AUTO_INSERT",		AUTO_INSERT,		NO_OP,
    "backward_char",		BACKWARD_CHAR,		NO_OP,
    "BACKWARD_CHAR",		BACKWARD_CHAR,		NO_OP,
    "backward_word",		BACKWARD_WORD,		NO_OP,
    "BACKWARD_WORD",		BACKWARD_WORD,		NO_OP,
    "beginning_of_line",	BEGINNING_OF_LINE,	NO_OP,
    "BEGINNING_OF_LINE",	BEGINNING_OF_LINE,	NO_OP,
    "clear_screen",		CLEAR_SCREEN,		NO_OP,
    "CLEAR_SCREEN",		CLEAR_SCREEN,		NO_OP,
    "complete",			SEND_LINE,		COMPLETE,
    "COMPLETE",			SEND_LINE,		COMPLETE,
    "delete_char_backward",	DELETE_CHAR_BACKWARD,	NO_OP,
    "DELETE_CHAR_BACKWARD",	DELETE_CHAR_BACKWARD,	NO_OP,
    "delete_char_forward",	DELETE_CHAR_FORWARD,	NO_OP,
    "DELETE_CHAR_FORWARD",	DELETE_CHAR_FORWARD,	NO_OP,
    "delete_word_backward",	DELETE_WORD_BACKWARD,	NO_OP,
    "DELETE_WORD_BACKWARD",	DELETE_WORD_BACKWARD,	NO_OP,
    "delete_word_forward",	DELETE_WORD_FORWARD,	NO_OP,
    "DELETE_WORD_FORWARD",	DELETE_WORD_FORWARD,	NO_OP,
    "down_history",		SEND_LINE,		DOWN_HIST,
    "DOWN_HISTORY",		SEND_LINE,		DOWN_HIST,
    "end_of_line",		END_OF_LINE,		NO_OP,
    "END_OF_LINE",		END_OF_LINE,		NO_OP,
    "send_eof",			SEND_EOF,		NO_OP,
    "SEND_EOF",			SEND_EOF,		NO_OP,
    "forward_char",		FORWARD_CHAR,		NO_OP,
    "FORWARD_CHAR",		FORWARD_CHAR,		NO_OP,
    "forward_word",		FORWARD_WORD,		NO_OP,
    "FORWARD_WORD",		FORWARD_WORD,		NO_OP,
    "kill_to_beginning",	KILL_TO_BEGINNING,	NO_OP,
    "KILL_TO_BEGINNING",	KILL_TO_BEGINNING,	NO_OP,
    "kill_to_end",		KILL_TO_END,		NO_OP,
    "KILL_TO_END",		KILL_TO_END,		NO_OP,
    "nl_send_line",		NL_SEND_LINE,		NO_OP,
    "NL_SEND_LINE",		NL_SEND_LINE,		NO_OP,
    "quote_next",		QUOTE_NEXT,		NO_OP,
    "QUOTE_NEXT",		QUOTE_NEXT,		NO_OP,
    "redisplay",		REDISPLAY,		NO_OP,
    "REDISPLAY",		REDISPLAY,		NO_OP,
    "list_options",		SEND_LINE,		LIST_CHOICES,
    "LIST_OPTIONS",		SEND_LINE,		LIST_CHOICES,

    "send_line",		SEND_LINE,		ERROR,
    "SEND_LINE",		SEND_LINE,		ERROR,

    "start_over",		START_OVER,		NO_OP,
    "START_OVER",		START_OVER,		NO_OP,
    "transpose_chars",		TRANSPOSE_CHARS,	NO_OP,
    "TRANSPOSE_CHARS",		TRANSPOSE_CHARS,	NO_OP,
    "up_history",		SEND_LINE,		UP_HIST,
    "UP_HISTORY",		SEND_LINE,		UP_HIST,
    "yank_killbuffer",		YANK_KILLBUFFER,	NO_OP,
    "YANK_KILLBUFFER",		YANK_KILLBUFFER,	NO_OP,
    "yank_last_input",		YANK_LAST_INPUT,	NO_OP,
    "YANK_LAST_INPUT",		YANK_LAST_INPUT,	NO_OP,
    "tty_dsusp",		TTY_DSUSP,		NO_OP,
    "TTY_DSUSP",		TTY_DSUSP,		NO_OP,
    "tty_flush_output",		TTY_FLUSH_OUTPUT,	NO_OP,
    "TTY_FLUSH_OUTPUT",		TTY_FLUSH_OUTPUT,	NO_OP,
    "tty_sigintr",		TTY_SIGINTR,		NO_OP,
    "TTY_SIGINTR",		TTY_SIGINTR,		NO_OP,
    "tty_sigquit",		TTY_SIGQUIT,		NO_OP,
    "TTY_SIGQUIT",		TTY_SIGQUIT,		NO_OP,
    "tty_sigtsusp",		TTY_SIGTSUSP,		NO_OP,
    "TTY_SIGTSUSP",		TTY_SIGTSUSP,		NO_OP,
    "tty_start_output",		TTY_START_OUTPUT,	NO_OP,
    "TTY_START_OUTPUT",		TTY_START_OUTPUT,	NO_OP,
    "tty_stop_output",		TTY_STOP_OUTPUT,	NO_OP,
    "TTY_STOP_OUTPUT",		TTY_STOP_OUTPUT,	NO_OP,
    "helpme",			SEND_LINE,		HELPME,
    "HELPME",			SEND_LINE,		HELPME,
    0,				0,			0
};

int
dobind(v)
register char **v;
{
    register char c;
    register struct kfuncs *fp;
    register int i;
    register int isfound;
				/* assume at this point that i'm given 2 or 3
				   args - 'bind', the f-name, and the key;
				   or 'bind' key to print the func for that
				   key. */
    if (v[1] && v[2]) {
        for (fp = fnames; fp->name; fp++) {
	    if (strcmp(v[1], fp->name) == 0) {
	        if ((v[2][0] == '^') && v[2][1]) {
		    c = (v[2][1] == '?') ? 0177 : v[2][1] & 037;
	        }
	        else {
		    c = v[2][0];
	        }
		tw_bind_to_key (fp->tfunc, c);	/* bind for twenex()... */
	        ilbindtokey (fp->ifunc, c);	/* actually bind the thing */
		ilreset_tty ();
	        return;
	    }
        }
        bferr ("I don't know that function.");
    } else if (v[1]) {
	if (strcmp (v[1], "defaults") == 0) {
		/* reset keys to default */
	    for (i=0; i<128; i++) {	/* assign all the keys */
		ilbindtokey (AUTO_INSERT, i);
		tw_bind_to_key (NO_OP, i);
	    }

	    ilbindtokey (SEND_LINE, 000);
	    tw_bind_to_key (HELPME, 000);

	    ilbindtokey (BEGINNING_OF_LINE, 001);
	    ilbindtokey (BACKWARD_CHAR, 002);
	    ilbindtokey (TTY_SIGINTR, 003);
	    ilbindtokey (DELETE_CHAR_FORWARD, 004);
	    ilbindtokey (END_OF_LINE, 005);
	    ilbindtokey (FORWARD_CHAR, 006);
	    ilbindtokey (START_OVER, 007);
	    ilbindtokey (KILL_TO_END, 013);
	    ilbindtokey (SEND_EOF, 037);
	    ilbindtokey (YANK_LAST_INPUT, 010);
	    ilbindtokey (SEND_LINE, 077);
	    tw_bind_to_key (LIST_CHOICES, 077);
	    ilbindtokey (SEND_LINE, 033);
	    tw_bind_to_key (COMPLETE, 033);
	    ilbindtokey (NL_SEND_LINE, 012);
	    ilbindtokey (NL_SEND_LINE, 015);
	    ilbindtokey (FORWARD_WORD, 016);
	    tw_bind_to_key (NO_OP, 016);
	    ilbindtokey (TTY_FLUSH_OUTPUT, 017);
	    ilbindtokey (BACKWARD_WORD, 020);
	    tw_bind_to_key (NO_OP, 020);
	    ilbindtokey (TTY_START_OUTPUT, 021);
	    ilbindtokey (REDISPLAY, 022);
	    ilbindtokey (TTY_STOP_OUTPUT, 023);
	    ilbindtokey (TRANSPOSE_CHARS, 024);
	    ilbindtokey (KILL_TO_BEGINNING, 025);
	    ilbindtokey (QUOTE_NEXT, 026);
	    ilbindtokey (CLEAR_SCREEN, 014);
	    ilbindtokey (DELETE_WORD_BACKWARD, 027);
	    ilbindtokey (DELETE_WORD_FORWARD, 030);
	    ilbindtokey (YANK_KILLBUFFER, 031);
	    ilbindtokey (TTY_SIGTSUSP, 032);
	    ilbindtokey (TTY_SIGQUIT, 034);
	    ilbindtokey (TTY_DSUSP, 035);
	    ilbindtokey (DELETE_CHAR_BACKWARD, 0177);
	    ilreset_tty();
	}
	else {		/* want to know what this key does */
	    if ((v[1][0] == '^') && v[1][1]) {
	        c = (v[1][1] == '?') ? 0177 : v[1][1] & 037;
	    }
	    else {
	        c = v[1][0];
	    }
            for (fp = fnames; fp->name; fp++) {
	        if ((fp->ifunc == ilgetbinding(c)) && 
		    (fp->tfunc == tw_get_binding (c))) {
		    printf ("%s is bound to %s.\n", seech(c), fp->name);
		    return;
	        }
	    }
	    printf ("%s isn't bound to anything.\n", seech(c));
	    printf ("inputl: %d, twenex: %d\n", ilgetbinding (c),
		tw_get_binding (c));
	}
    }
    else {			/* list all the bindings */
	for (i = 0; i < 128; i++) {
	    isfound = 0;
	    for (fp = fnames; fp->name; fp++) {
	        if ((fp->ifunc == ilgetbinding(i)) && 
		    (fp->tfunc == tw_get_binding (i))) {
		    printf ("%s is bound to %s.\n", seech(i), fp->name);
		    isfound++;
		    break;
	        }
	    }
	    if (isfound) continue;
	    printf ("%s isn't bound to anything.\n", seech(i));
	}
    }
}

char *
sprlex(buf, sp0)
struct wordent *sp0;
char *buf;
{
    register struct wordent *sp = sp0->next;

    buf[0] = '\0';

    for (;;) {
        strcat(buf, sp->word);
        sp = sp->next;
        if (sp == sp0)
            break;
        strcat(buf, " ");
    }
    return(buf);
}

donhist(av)
char **av;
{
    char buf[512];
    struct Hist *hp;

    for (hp = Histlist.Hnext; hp != 0; hp = hp->Hnext) {
        sprlex (buf, &hp->Hlex);
        printf ("hist: %s\n", buf);
    }
}

static char *
seech (c)			/* 'c' -> "c", '^C' -> "^" + "C" */
register char c;
{
    static char tmp[3];
    
    if (c >= ' ') {
	tmp[0] = c;
	tmp[1] = '\0';
	return (tmp);
    }
    else {
	tmp[0] = '^';
	if (c == '\177') {
	    tmp[1] = '?';
	}
	else {
	    tmp[1] = '@' + (c & 037);
	}
	tmp[2] = '\0';
	return (tmp);
    }
}
!Funky!Stuff!



More information about the Comp.sources.unix mailing list