zsh - ksh/tcsh-like shell (part 6 of 8)

Paul John Falstad pfalstad at phoenix.Princeton.EDU
Sat Dec 15 10:32:40 AEST 1990


---cut here---cut here---cut here---
-			}
-	zerr("warning: undefined signal name: SIG%s",s+4);
-}
-
-void unsettrap(char *s)
-{
-int t0;
-
-	if (strncmp(s,"TRAP",4))
-		return;
-	for (t0 = 0; t0 != SIGCOUNT+2; t0++)
-		if (!strcmp(s+4,sigs[t0]))
-			{
-			if (jobbing && (t0 == SIGTTOU || t0 == SIGTSTP || t0 == SIGTTIN
-					|| t0 == SIGPIPE))
-				{
-				zerr("can't trap SIG%s in interactive shells",s);
-				return;
-				}
-			sigtrapped[t0] = 0;
-			if (t0 == SIGINT)
-				intr();
-			else if (t0 && t0 < SIGCOUNT && t0 != SIGCHLD)
-				signal(t0,SIG_DFL);
-			return;
-			}
-	zerr("warning: undefined signal name: SIG%s",s+4);
-}
-
-void dotrap(int sig)
-{
-char buf[16];
-list l;
-int sav;
-
-	sav = sigtrapped[sig];
-	if (sav == 2)
-		return;
-	sigtrapped[sig] = 2;
-	sprintf(buf,"TRAP%s",sigs[sig]);
-	if (l = gethnode(buf,shfunchtab))
-		newrunlist(l);
-	sigtrapped[sig] = sav;
-}
-
-/* get the text corresponding to a command */
-
-char *gettext(comm comm)
-{
-char *s,*t;
-
-	switch(comm->type)
-		{
-		case SIMPLE:
-			return getsimptext(comm);
-		case SUBSH:
-			t = getltext(comm->left);
-			s = tricat("(",t,")");
-			free(t);
-			return s;
-		case CURSH:
-		case SHFUNC:
-			t = getltext(comm->left);
-			s = tricat("{",t,"}");
-			free(t);
-			return s;
-		case CFOR:
-			return getfortext((struct fornode *) comm->info,comm);
-		case CWHILE:
-			return getwhiletext((struct whilenode *) comm->info);
-		case CREPEAT:
-			return getrepeattext((struct repeatnode *) comm->info);
-		case CIF:
-			return getiftext((struct ifnode *) comm->info);
-		case CCASE:
-			return getcasetext((struct casenode *) comm->info,comm->args);
-		case CSELECT:
-			return getfortext((struct fornode *) comm->info,comm);
-		default:
-			return strdup("(...)");
-		}
-	return NULL;
-}
-
-char *getltext(list l)
-{
-char *s,*t,*u;
-
-	s = getl2text(l->left);
-	if (l->type == ASYNC)
-		{
-		t = dyncat(s," &");
-		free(s);
-		s = t;
-		}
-	if (!l->right)
-		return s;
-	t = getltext(l->right);
-	u = tricat(s,(l->type == SYNC) ? "\n" : "",t);
-	free(s);
-	free(t);
-	return u;
-}
-
-char *getl2text(list2 l)
-{
-char *s,*t,*u;
-
-	s = getptext(l->left);
-	if (!l->right)
-		return s;
-	t = getl2text(l->right);
-	u = tricat(s,(l->type == ORNEXT) ? " || " : " && ",t);
-	free(s);
-	free(t);
-	return u;
-}
-
-char *getptext(pline p)
-{
-char *s,*t,*u;
-
-	s = gettext(p->left);
-	if (!p->right)
-		return s;
-	t = getptext(p->right);
-	u = tricat(s," | ",t);
-	free(s);
-	free(t);
-	return u;
-}
-
-char *getsimptext(comm comm)
-{
-int len = 0;
-Node n;
-char *fstr[] = {
-	">",">!",">>",">>!","<","<<","<&",">&",">&-"
-	};
-struct fnode *f;
-char *s,*t,u = '=';
-
-	for (n = comm->args->first; n; n = n->next)
-		len += strlen(n->dat)+1;
-	if (comm->vars)
-		for (n = comm->vars->first; n; n = n->next)
-			len += strlen(n->dat)+1;
-	for (n = comm->redir->first; n; n = n->next)
-		{
-		f = n->dat;
-		switch(f->type)
-			{
-			case WRITE: case WRITENOW: case APP: case APPNOW: case READ:
-				len += strlen(fstr[f->type])+strlen(f->u.name)+8;
-				break;
-			case HEREDOC: case MERGE: case MERGEOUT:
-				len += strlen(fstr[f->type])+10;
-				break;
-			case CLOSE:
-				len += 10;
-				break;
-			case INPIPE:
-			case OUTPIPE:
-				len += strlen(f->u.name)+10;
-				break;
-			}
-		}
-	len += strlen(comm->cmd);
-	s = t = zalloc(len+5);
-	if (comm->vars)
-		for (n = comm->vars->first; n; n = n->next)
-			{
-			strucpy(&t,n->dat);
-			*t++ = u;
-			u = ('='+' ')-u;
-			}
-	strucpy(&t,comm->cmd);
-	*t++ = ' ';
-	for (n = comm->args->first; n; n = n->next)
-		{
-		strucpy(&t,n->dat);
-		*t++ = ' ';
-		}
-	for (n = comm->redir->first; n; n = n->next)
-		{
-		f = n->dat;
-		switch(f->type)
-			{
-			case WRITE: case WRITENOW: case APP: case APPNOW: case READ:
-				if (f->fd1 != ((f->type == READ) ? 0 : 1))
-					*t++ = '0'+f->fd1;
-				strucpy(&t,fstr[f->type]);
-				*t++ = ' ';
-				strucpy(&t,f->u.name);
-				*t++ = ' ';
-				break;
-			case HEREDOC: case MERGE: case MERGEOUT:
-				if (f->fd1 != ((f->type == MERGEOUT) ? 1 : 0))
-					*t++ = '0'+f->fd1;
-				strucpy(&t,fstr[f->type]);
-				*t++ = ' ';
-				sprintf(t,"%d ",f->u.fd2);
-				t += strlen(t);
-				break;
-			case CLOSE:
-				*t++ = '0'+f->fd1;
-				strucpy(&t,">&- ");
-				break;
-			case INPIPE:
-			case OUTPIPE:
-				if (f->fd1 != ((f->type == INPIPE) ? 0 : 1))
-					*t++ = '0'+f->fd1;
-				strucpy(&t,(f->type == INPIPE) ? "< " : "> ");
-				strucpy(&t,f->u.name);
-				strucpy(&t," ");
-				len += strlen(f->u.name)+6;
-				break;
-			}
-		}
-	t[-1] = '\0';
-	return s;
-}
-
-char *getfortext(struct fornode *n,comm comm)
-{
-char *s,*t,*u,*v;
-
-	s = getltext(n->list);
-	u = dyncat((comm->type == CFOR) ? "for " : "select ",n->name);
-	if (comm->args)
-		{
-		t = makehlist(comm->args,0);
-		v = tricat(u," in ",t);
-		free(u);
-		free(t);
-		u = v;
-		}
-	v = dyncat(u,"\n do ");
-	free(u);
-	u = tricat(v,s,"\n done");
-	free(v);
-	free(s);
-	return u;
-}
-
-char *getwhiletext(struct whilenode *n)
-{
-char *s,*t,*u,*v;
-
-	t = getltext(n->cont);
-	v = getltext(n->loop);
-	s = tricat((!n->cond) ? "while " : "until ",t,"\n do ");
-	u = tricat(s,v,"\n done");
-	free(s);
-	free(t);
-	free(v);
-	return u;
-}
-
-char *getrepeattext(struct repeatnode *n)
-{
-char buf[100];
-char *s,*t,*u;
-
-	s = getltext(n->list);
-	sprintf(buf,"%d",n->count);
-	t = tricat("repeat ",buf," do ");
-	u = tricat(t,s,"\n done");
-	free(s);
-	free(t);
-	return u;
-}
-
-char *getiftext(struct ifnode *n)
-{
-int fst = 1;
-char *v = strdup("");
-char *s,*t,*u,*w;
-
-	while (n && n->ifl)
-		{
-		s = getltext(n->ifl);
-		t = getltext(n->thenl);
-		u = tricat((fst) ? "if " : "elif ",s,"\n then ");
-		w = tricat(u,t,"\n ");
-		free(s);
-		free(t);
-		free(u);
-		s = dyncat(v,w);
-		free(v);
-		free(w);
-		v = s;
-		fst = 0;
-		n = n->next;
-		}
-	if (n)
-		{
-		s = getltext(n->thenl);
-		t = tricat(v,"else ",s);
-		u = dyncat(t,"\n fi");
-		free(s);
-		free(t);
-		free(v);
-		return u;
-		}
-	u = dyncat(v,"\n fi");
-	free(v);
-	return u;
-}
-
-char *getcasetext(struct casenode *n,table l)
-{
-char *s,*t,*u,*v;
-
-	s = tricat("case ",l->first->dat," in ");
-	while (n)
-		{
-		u = getltext(n->list);
-		t = tricat(n->pat,") ",u);
-		v = tricat(s,t," ;;\n");
-		free(s);
-		free(t);
-		free(u);
-		s = v;
-		n = n->next;
-		}
-	t = dyncat(s,"esac\n");
-	free(s);
-	return t;
-}
-
-/* copy t into *s and update s */
-
-void strucpy(char **s,char *t)
-{
-char *u = *s;
-
-	while (*u++ = *t++);
-	*s = u-1;
-}
-
-void checkrmall(void)
-{
-	fflush(stdin);
-	fprintf(stderr,"zsh: are you sure you want to delete "
-		"all the files? ");
-	fflush(stderr);
-	ding();
-	errflag |= !getquery();
-}
-
-int getquery(void)
-{
-char c;
-int yes = 0;
-
-	setcbreak();
-	if (read(SHTTY,&c,1) == 1 && (c == 'y' || c == 'Y'))
-		yes = 1;
-	unsetcbreak();
-	if (c != '\n')
-		write(2,"\n",1);
-	return yes;
-}
-
-static int d;
-static char *guess,*best;
-
-void spscan(char *s,char *junk)
-{
-int nd;
-
-	nd = spdist(s,guess);
-	if (nd <= d && nd != 3)
-		{
-		best = s;
-		d = nd;
-		}
-}
-
-/* spellcheck a command */
-
-void spckcmd(char **s)
-{
-char *t;
-
-	if (gethnode(*s,chtab) || gethnode(*s,shfunchtab))
-		return;
-	for (t = *s; *t; t++)
-		if (*t == '/')
-			return;
-	if (access(*s,F_OK) == 0)
-		return;
-	best = NULL;
-	guess = *s;
-	d = 3;
-	listhtable(chtab,spscan);
-	listhtable(shfunchtab,spscan);
-	if (best)
-		{
-		fprintf(stderr,"zsh: correct to `%s' (y/n)? ",best);
-		fflush(stderr);
-		ding();
-		if (getquery())
-			{
-			free(*s);
-			*s = strdup(best);
-			}
-		}
-}
-
-void addlocal(char *s)
-{
-	if (locallist)
-		addnode(locallist,strdup(s));
-}
-
-/* perform pathname substitution on a PATH or CDPATH component */
-
-void pathsub(char **s)
-{
-	if (**s == '=')
-		**s = Equals;
-	if (**s == '~')
-		**s = Tilde;
-	filesub((void **) s);
-}
-
-#ifndef STRFTIME
-int strftime(char *buf,int bufsize,char *fmt,struct tm *tm)
-{
-char *astr[] = {"Sun","Mon","Tue","Wed","Thu","Fri","Sat"};
-char *estr[] = {"Jan","Feb","Mar","Apr","May","Jun","Jul",
-	"Aug","Sep","Oct","Nov","Dec"};
-char *lstr[] = {"12"," 1"," 2"," 3"," 4"," 5"," 6"," 7"," 8"," 9","10","11"};
-
-	while (*fmt)
-		if (*fmt == '%')
-			{
-			fmt++;
-			switch(*fmt++)
-				{
-				case 'a':
-					strucpy(&buf,astr[tm->tm_wday]);
-					break;
-				case 'b':
-					strucpy(&buf,estr[tm->tm_mon]);
-					break;
-				case 'd':
-					*buf++ = '0'+tm->tm_mday/10;
-					*buf++ = '0'+tm->tm_mday%10;
-					break;
-				case 'e':
-					*buf++ = (tm->tm_mday > 9) ? '0'+tm->tm_mday/10 : ' ';
-					*buf++ = '0'+tm->tm_mday%10;
-					break;
-				case 'k':
-					*buf++ = (tm->tm_hour > 9) ? '0'+tm->tm_hour/10 : ' ';
-					*buf++ = '0'+tm->tm_hour%10;
-					break;
-				case 'l':
-					strucpy(&buf,lstr[tm->tm_hour%12]);
-					break;
-				case 'm':
-					*buf++ = '0'+tm->tm_mon/10;
-					*buf++ = '0'+tm->tm_mon%10;
-					break;
-				case 'M':
-					*buf++ = '0'+tm->tm_min/10;
-					*buf++ = '0'+tm->tm_min%10;
-					break;
-				case 'p':
-					*buf++ = (tm->tm_hour > 11) ? 'P' : 'A';
-					*buf++ = 'M';
-					break;
-				case 'S':
-					*buf++ = '0'+tm->tm_sec/10;
-					*buf++ = '0'+tm->tm_sec%10;
-					break;
-				case 'y':
-					*buf++ = '0'+tm->tm_year/10;
-					*buf++ = '0'+tm->tm_year%10;
-					break;
-				default:
-					exit(20);
-				}
-			}
-		else
-			*buf++ = *fmt++;
-	*buf = '\0';
-	return 0;
-}
-#endif
-
-#ifndef PUTENV
-int putenv(char *a)
-{
-char *b = a;
-
-	while (*a++ != '=');
-	a[-1] = '\0';
-	setenv(strdup(b),strdup(a));
-	free(b);
-	return 0;
-}
-#endif
-
-int ppcount(void)
-{
-Node n;
-int val = -1;
-
-	for (n = pparms->first; n; n = n->next,val++);
-	return val;
-}
-
End of utils.c
echo utils.pro 1>&2
sed 's/^-//' >utils.pro <<'End of utils.pro'
-void addvars(table vars);
-void setiparm(char *s,long v,int isint);
-void setparm(char *s,char *t,int ex,int isint);
-void unsetparm(char *s);
-long getiparm(char *s);
-char *getparm(char *s);
-void parsepath(void);
-void parsecdpath(void);
-int source(char *s);
-void sourcehome(char *s);
-void zerrnam(char *cmd, char *fmt, ...);
-void zerr(char *fmt,...);
-void niceputc(int c,FILE *f);
-void intr(void);
-void noholdintr(void);
-void holdintr(void);
-char *fgetline(char *buf,int len,FILE *in);
-char *findcwd(char *s);
-char *xsymlink(char *s);
-char **slashsplit(char *s);
-int islink(char *s);
-int xsymlinks(char *s);
-void printdir(char *s);
-int ddifftime(time_t t1,time_t t2);
-void scanjobs(void);
-void preprompt(void);
-void checkmail(void);
-void checkfirstmail(void);
-void checkmailpath(void);
-void createchtab(void);
-void freechnode(void *a);
-void freestr(void *a);
-void freeanode(void *a);
-void freeredir(void *a);
-void freeshfunc(void *a);
-void freepm(void *a);
-void restoretty(void);
-void gettyinfo(struct ttyinfo *ti);
-void settyinfo(struct ttyinfo *ti);
-int zyztem(char *s,char *t);
-int waitfork(void);
-int movefd(int fd);
-void redup(int x,int y);
-void settrap(char *s,int empty);
-void unsettrap(char *s);
-void dotrap(int sig);
-char *gettext(comm comm);
-char *getltext(list l);
-char *getl2text(list2 l);
-char *getptext(pline p);
-char *getsimptext(comm comm);
-char *getfortext(struct fornode *n,comm comm);
-char *getwhiletext(struct whilenode *n);
-char *getrepeattext(struct repeatnode *n);
-char *getiftext(struct ifnode *n);
-char *getcasetext(struct casenode *n,table l);
-void strucpy(char **s,char *t);
-void checkrmall(void);
-int getquery(void);
-void spscan(char *s,char *junk);
-void spckcmd(char **s);
-void addlocal(char *s);
-void pathsub(char **s);
-int strftime(char *buf,int bufsize,char *fmt,struct tm *tm);
End of utils.pro
echo vars.c 1>&2
sed 's/^-//' >vars.c <<'End of vars.c'
-/*
-
-	vars.c - variable declarations
-
-	This file is part of zsh, the Z shell.
-
-   zsh is free software; no one can prevent you from reading the source
-   code, or giving it to someone else.
-   This file is copyrighted under the GNU General Public License, which
-   can be found in the file called COPYING.
-
-   Copyright (C) 1990 Paul Falstad
-
-   zsh is distributed in the hope that it will be useful, but
-   WITHOUT ANY WARRANTY.  No author or distributor accepts
-   responsibility to anyone for the consequences of using it or for
-   whether it serves any particular purpose or works at all, unless he
-   says so in writing.  Refer to the GNU General Public License
-   for full details.
-
-   Everyone is granted permission to copy, modify and redistribute
-   zsh, but only under the conditions described in the GNU General Public
-   License.   A copy of this license is supposed to have been given to you
-   along with zsh so you can know your rights and responsibilities.
-   It should be in a file named COPYING.
-
-   Among other things, the copyright notice and this notice must be
-   preserved on all copies.
-
-*/
-
-#include "zsh.h"
-
-/* buffered shell input for non-interactive shells */
-
-FILE *bshin;
-
-/* null-terminated array of pointers to strings containing elements
-	of PATH and CDPATH */
-
-char **path,**cdpath;
-
-/* number of elements in aforementioned array */
-
-int pathct,cdpathct;
-
-/* error/break flag */
-
-int errflag = 0;
-
-/* current history event number */
-
-int cev = 0;
-
-/* if != 0, this is the first line of the command */
-
-int firstln;
-
-/* if != 0, this is the first char of the command (not including
-	white space */
-
-int firstch;
-
-/* first event number in the history table */
-
-int tfev = 1;
-
-/* capacity of history table */
-
-int tevs = 20;
-
-/* if = 1, we have performed history substitution on the current line
-	if = 2, we have used the 'p' modifier */
-
-int hflag;
-
-/* default event (usually cev-1, that is, "!!") */
-
-int dev = 0;
-
-/* != 0 if we are in the middle of parsing a command (== 0 if we
-	have not yet parsed the command word */
-
-int incmd = 0;
-
-/* the list of history events */
-
-table histlist;
-
-/* the current history event (can be NULL) */
-
-table curtab;
-
-/* the directory stack */
-
-table dirstack;
-
-/* a string containing all the ungot characters (hungetch()) */
-
-char *ungots;
-
-/* the pointer to the next character to read from ungots */
-
-char *ungotptr;
-
-/* the contents of the IFS parameter */
-
-char *ifs;
-
-/* != 0 if this is a subshell */
-
-int subsh;
-
-/* # of break levels (break builtin) */
-
-int breaks;
-
-/* != 0 if we have a return pending (return builtin) */
-
-int retflag;
-
-/* # of nested loops we are in */
-
-int loops;
-
-/* # of continue levels */
-
-int contflag;
-
-/* the job currently being created/waited for (not current job in the sense
-	of '+' and '-', that's topjob */
-
-int curjob;
-
-/* the current job (+) */
-
-int topjob = -1;
-
-/* the previous job (-) */
-
-int prevjob = -1;
-
-/* hash table containing the aliases and reserved words */
-
-htable alhtab;
-
-/* hash table containing the parameters */
-
-htable parmhtab;
-
-/* hash table containing the builtins/hashed commands */
-
-htable chtab;
-
-/* hash table containing the shell functions */
-
-htable shfunchtab;
-
-/* the job table */
-
-struct jobnode jobtab[MAXJOB];
-
-/* the list of sched jobs pending */
-
-struct schnode *scheds = NULL;
-
-/* the last l for s/l/r/ history substitution */
-
-char *last;
-
-/* the last r for s/l/r/ history substitution */
-
-char *rast;
-
-/* if peek == STRING or ENVSTRING, the next token */
-
-char *tstr;
-
-/* who am i */
-
-char *username;
-
-/* the return code of the last command */
-
-int lastval;
-
-/* != 0 if this is a login shell */
-
-int islogin;
-
-/* the next token (enum xtok) */
-
-int peek;
-
-/* the file descriptor associated with the next token, if it
-	is something like '<' or '>>', etc. */
-
-int peekfd;
-
-/* input fd from the coprocess */
-
-int spin = -1;
-
-/* output fd from the coprocess */
-
-int spout = -1;
-
-/* the last time we checked mail */
-
-time_t lastmailcheck;
-
-/* the last modified date on the mail file last time we checked */
-
-time_t lastmailval;
-
-/* the last time we checked the people in the WATCH variable */
-
-time_t lastwatch;
-
-/* the last time we did the periodic() shell function */
-
-time_t lastperiod;
-
-/* $SECONDS = time(NULL) - shtimer */
-
-time_t shtimer;
-
-/* the size of the mail file last time we checked */
-
-off_t lastmailsize;
-
-/* $$ */
-
-long procnum;
-
-/* $! (the pid of the last background command invoked */
-
-long proclast;
-
-/* the process group of the shell */
-
-long shpgrp;
-
-/* the current working directory */
-
-char *cwd;
-
-/* the hostname, truncated after the '.' */
-
-char *hostM;
-
-/* the hostname */
-
-char *hostm;
-
-/* the home directory */
-
-char *home;
-
-/* the positional parameters */
-
-table pparms;
-
-/* the list of local variables we have to destroy */
-
-table locallist;
-
-/* the shell input fd */
-
-int SHIN;
-
-/* the shell tty fd */
-
-int SHTTY;
-
-/* the stack of aliases we are expanding */
-
-struct anode *alstack[MAXAL];
-
-/* the alias stack pointer; also, the number of aliases currently
-	being expanded */
-
-int alix = 0;
-
-/* != 0 means we are reading input from a string */
-
-int strin = 0;
-
-/* == 1 means we are doing TAB expansion
-	== 2 means expansion has occurred during TAB expansion */
-
-int magic = 0;
-
-/* period between periodic() commands, in seconds */
-
-int period = 0;
-
-/* != 0 means history is turned off (through !" or setopt nobanghist) */
-
-int stophist = 0;
-
-/* != 0 means we have removed the current event from the history list */
-
-int histremmed = 0;
-
-/* the options; e.g. if opts['a'] is nonzero, -a is turned on */
-
-int opts[128];
-
-/* LINENO */
-
-int lineno;
-
-/* != 0 means we have called execlist() and then intend to exit(),
-	so don't fork if not necessary */
-
-int exiting = 0;
-
-/* the limits for child processes */
-
-struct rlimit limits[RLIM_NLIMITS];
-
-/* the tokens */
-
-char *tokens = "#$^*()$=|{}[]`<>?~`,";
-
-/* the current word in the history list */
-
-char *hlastw;
-
-/* the pointer to the current character in the current word
-	in the history list */
-
-char *hlastp;
-
-/* the size of the current word in the history list */
-
-int hlastsz;
-
-/* the alias expansion status - if == ALSTAT_MORE, we just finished
-	expanding an alias ending with a space */
-
-int alstat;
-
-/* we have printed a 'you have stopped (running) jobs.' message */
-
-int stopmsg;
-
-/* the default tty state */
-
-struct ttyinfo shttyinfo;
-
-/* signal names */
-
-char *sigs[] = { "EXIT",
- "HUP", "INT", "QUIT", "ILL", "TRAP", "IOT", "EMT", "FPE", "KILL",
- "BUS", "SEGV", "SYS", "PIPE", "ALRM", "TERM", "URG", "STOP", "TSTP",
- "CONT", "CHLD", "TTIN", "TTOU", "IO", "XCPU", "XFSZ", "VTALRM", "PROF",
- "WINCH", "LOST", "USR1", "USR2", "ERR", "DEBUG"
-};
-
-/* signals that are trapped = 1, signals ignored =2 */
-
-int sigtrapped[SIGCOUNT+2];
-
End of vars.c
echo vars.pro 1>&2
sed 's/^-//' >vars.pro <<'End of vars.pro'
End of vars.pro
echo zhistory.c 1>&2
sed 's/^-//' >zhistory.c <<'End of zhistory.c'
-/*
-
-	zhistory.c - interface between readline an zsh's ideas of history
-
-	This file is part of zsh, the Z shell.
-
-   zsh is free software; no one can prevent you from reading the source
-   code, or giving it to someone else.
-   This file is copyrighted under the GNU General Public License, which
-   can be found in the file called COPYING.
-
-   Copyright (C) 1990 Paul Falstad
-
-   zsh is distributed in the hope that it will be useful, but
-   WITHOUT ANY WARRANTY.  No author or distributor accepts
-   responsibility to anyone for the consequences of using it or for
-   whether it serves any particular purpose or works at all, unless he
-   says so in writing.  Refer to the GNU General Public License
-   for full details.
-
-   Everyone is granted permission to copy, modify and redistribute
-   zsh, but only under the conditions described in the GNU General Public
-   License.   A copy of this license is supposed to have been given to you
-   along with zsh so you can know your rights and responsibilities.
-   It should be in a file named COPYING.
-
-   Among other things, the copyright notice and this notice must be
-   preserved on all copies.
-
-*/
-
-#include "zsh.h"
-#include "funcs.h"
-#include "readline/history.h"
-
-/* bindings to make zsh and readline get along */
-
-static int histline;
-
-void using_history(void)
-{
-	histline = cev;
-}
-
-int where_history(void)
-{
-	return histline;
-}
-
-int history_set_pos(int pos)
-{
-	histline = pos;
-	return 0;
-}
-
-HIST_ENTRY *current_history(void)
-{
-table tab;
-char *str;
-HIST_ENTRY *he;
-
-	tab = quietgetevent(histline);
-	if (!tab)
-		return NULL;
-	str = makehlist(tab,0);
-	he = (HIST_ENTRY *) malloc(sizeof *he);
-	he->line = str;
-	he->data = NULL;
-	return he;
-}
-
-HIST_ENTRY *previous_history(void)
-{
-	if (histline == tfev)
-		return NULL;
-	histline--;
-	return current_history();
-}
-
-HIST_ENTRY *next_history(void)
-{
-	if (histline == cev)
-		return NULL;
-	histline++;
-	return current_history();
-}
-
-char *extracthistarg(int num)
-{
-Node n;
-
-	if (histlist->last == (Node) histlist ||
-			histlist->last->last == (Node) histlist)
-		return NULL;
-	n = ((table) (histlist->last->last))->first;
-	for (; n && num; num--,n = n->next);
-	if (!n)
-		return NULL;
-	return strdup(n->dat);
-}
-
End of zhistory.c
echo readline/chardefs.h 1>&2
sed 's/^-//' >readline/chardefs.h <<'End of readline/chardefs.h'
-/* chardefs.h -- Character definitions for readline. */
-#ifndef _CHARDEFS_
-
-#ifndef savestring
-#define savestring(x) (char *)strcpy (xmalloc (1 + strlen (x)), (x))
-#endif
-
-#ifndef whitespace
-#define whitespace(c) (((c) == ' ') || ((c) == '\t'))
-#endif
-
-#ifdef CTRL
-#undef CTRL
-#endif
-
-/* Some character stuff. */
-#define control_character_threshold 0x020   /* smaller than this is control */
-#define meta_character_threshold 0x07f	    /* larger than this is Meta. */
-#define control_character_bit 0x40	    /* 0x000000, must be off. */
-#define meta_character_bit 0x080	    /* x0000000, must be on. */
-
-#define CTRL(c) ((c) & (~control_character_bit))
-#define META(c) ((c) | meta_character_bit)
-
-#define UNMETA(c) ((c) & (~meta_character_bit))
-#define UNCTRL(c) to_upper(((c)|control_character_bit))
-
-#define lowercase_p(c) (((c) > ('a' - 1) && (c) < ('z' + 1)))
-#define uppercase_p(c) (((c) > ('A' - 1) && (c) < ('Z' + 1)))
-
-#define pure_alphabetic(c) (lowercase_p(c) || uppercase_p(c))
-
-#ifndef to_upper
-#define to_upper(c) (lowercase_p(c) ? ((c) - 32) : (c))
-#define to_lower(c) (uppercase_p(c) ? ((c) + 32) : (c))
-#endif
-
-#define CTRL_P(c) ((c) < control_character_threshold)
-#define META_P(c) ((c) > meta_character_threshold)
-
-#define NEWLINE '\n'
-#define RETURN CTRL('M')
-#define RUBOUT 0x07f
-#define TAB '\t'
-#define ABORT_CHAR CTRL('G')
-#define PAGE CTRL('L')
-#define SPACE 0x020
-#define ESC CTRL('[')
-
-#endif  /* _CHARDEFS_ */
End of readline/chardefs.h
echo readline/emacs_keymap.c 1>&2
sed 's/^-//' >readline/emacs_keymap.c <<'End of readline/emacs_keymap.c'
-/* emacs_keymap.c -- the keymap for emacs_mode in readline (). */
-
-/* Copyright (C) 1988,1989 Free Software Foundation, Inc.
-
-   This file is part of GNU Readline, a library for reading lines
-   of text with interactive input and history editing.
-
-   Readline is free software; you can redistribute it and/or modify it
-   under the terms of the GNU General Public License as published by the
-   Free Software Foundation; either version 1, or (at your option) any
-   later version.
-
-   Readline is distributed in the hope that it will be useful, but
-   WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   General Public License for more details.
-
-   You should have received a copy of the GNU General Public License
-   along with Readline; see the file COPYING.  If not, write to the Free
-   Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
-
-#ifndef FILE
-#include <stdio.h>
-#endif /* FILE */
-
-#include "readline.h"
-
-/* An array of function pointers, one for each possible key.
-   If the type byte is ISKMAP, then the pointer is the address of
-   a keymap. */
-
-KEYMAP_ENTRY_ARRAY emacs_standard_keymap = {
-
-  /* Control keys. */
-  { ISFUNC, (Function *)0x0 },		/* Control-@ */
-  { ISFUNC, rl_beg_of_line },		/* Control-a */
-  { ISFUNC, rl_backward },		/* Control-b */
-  { ISFUNC, (Function *)0x0 },	/* Control-c */
-  { ISFUNC, rl_delete },		/* Control-d */
-  { ISFUNC, rl_end_of_line },		/* Control-e */
-  { ISFUNC, rl_forward },		/* Control-f */
-  { ISFUNC, rl_abort },			/* Control-g */
-  { ISFUNC, rl_rubout },		/* Control-h */  /* pjf */
-  { ISFUNC, rl_complete },		/* Control-i */
-  { ISFUNC, rl_newline },		/* Control-j */
-  { ISFUNC, rl_kill_line },		/* Control-k */
-  { ISFUNC, rl_clear_screen },		/* Control-l */
-  { ISFUNC, rl_newline },		/* Control-m */
-  { ISFUNC, rl_get_next_history },	/* Control-n */
-  { ISFUNC, (Function *)0x0 },		/* Control-o */
-  { ISFUNC, rl_get_previous_history },	/* Control-p */
-  { ISFUNC, rl_quoted_insert },		/* Control-q */
-  { ISFUNC, (Function *)0x0 }, /* Control-r */
-  { ISFUNC, (Function *)0x0 }, /* Control-s */
-  { ISFUNC, rl_transpose_chars },	/* Control-t */
-  { ISFUNC, rl_unix_line_discard },	/* Control-u */
-  { ISFUNC, rl_quoted_insert },		/* Control-v */
-  { ISFUNC, rl_unix_word_rubout },	/* Control-w */
-  { ISKMAP, (Function *)emacs_ctlx_keymap },	/* Control-x */
-  { ISFUNC, rl_yank },			/* Control-y */
-  { ISFUNC, (Function *)0x0 },		/* Control-z */
-  { ISKMAP, (Function *)emacs_meta_keymap }, /* Control-[ */
-  { ISFUNC, (Function *)0x0 },		/* Control-\ */
-  { ISFUNC, (Function *)0x0 },		/* Control-] */
-  { ISFUNC, (Function *)0x0 },		/* Control-^ */
-  { ISFUNC, rl_undo_command },		/* Control-_ */
-
-  /* The start of printing characters. */
-  { ISFUNC, rl_insert },	/* SPACE */
-  { ISFUNC, rl_insert },	/* ! */
-  { ISFUNC, rl_insert },	/* " */
-  { ISFUNC, rl_insert },	/* # */
-  { ISFUNC, rl_insert },	/* $ */
-  { ISFUNC, rl_insert },	/* % */
-  { ISFUNC, rl_insert },	/* & */
-  { ISFUNC, rl_insert },	/* ' */
-  { ISFUNC, rl_insert },	/* ( */
-  { ISFUNC, rl_insert },	/* ) */
-  { ISFUNC, rl_insert },	/* * */
-  { ISFUNC, rl_insert },	/* + */
-  { ISFUNC, rl_insert },	/* , */
-  { ISFUNC, rl_insert },	/* - */
-  { ISFUNC, rl_insert },	/* . */
-  { ISFUNC, rl_insert },	/* / */
-
-  /* Regular digits. */
-  { ISFUNC, rl_insert },	/* 0 */
-  { ISFUNC, rl_insert },	/* 1 */
-  { ISFUNC, rl_insert },	/* 2 */
-  { ISFUNC, rl_insert },	/* 3 */
-  { ISFUNC, rl_insert },	/* 4 */
-  { ISFUNC, rl_insert },	/* 5 */
-  { ISFUNC, rl_insert },	/* 6 */
-  { ISFUNC, rl_insert },	/* 7 */
-  { ISFUNC, rl_insert },	/* 8 */
-  { ISFUNC, rl_insert },	/* 9 */
-
-  /* A little more punctuation. */
-  { ISFUNC, rl_insert },	/* : */
-  { ISFUNC, rl_insert },	/* ; */
-  { ISFUNC, rl_insert },	/* < */
-  { ISFUNC, rl_insert },	/* = */
-  { ISFUNC, rl_insert },	/* > */
-  { ISFUNC, rl_insert },	/* ? */
-  { ISFUNC, rl_insert },	/* @ */
-
-  /* Uppercase alphabet. */
-  { ISFUNC, rl_insert },	/* A */
-  { ISFUNC, rl_insert },	/* B */
-  { ISFUNC, rl_insert },	/* C */
-  { ISFUNC, rl_insert },	/* D */
-  { ISFUNC, rl_insert },	/* E */
-  { ISFUNC, rl_insert },	/* F */
-  { ISFUNC, rl_insert },	/* G */
-  { ISFUNC, rl_insert },	/* H */
-  { ISFUNC, rl_insert },	/* I */
-  { ISFUNC, rl_insert },	/* J */
-  { ISFUNC, rl_insert },	/* K */
-  { ISFUNC, rl_insert },	/* L */
-  { ISFUNC, rl_insert },	/* M */
-  { ISFUNC, rl_insert },	/* N */
-  { ISFUNC, rl_insert },	/* O */
-  { ISFUNC, rl_insert },	/* P */
-  { ISFUNC, rl_insert },	/* Q */
-  { ISFUNC, rl_insert },	/* R */
-  { ISFUNC, rl_insert },	/* S */
-  { ISFUNC, rl_insert },	/* T */
-  { ISFUNC, rl_insert },	/* U */
-  { ISFUNC, rl_insert },	/* V */
-  { ISFUNC, rl_insert },	/* W */
-  { ISFUNC, rl_insert },	/* X */
-  { ISFUNC, rl_insert },	/* Y */
-  { ISFUNC, rl_insert },	/* Z */
-
-  /* Some more punctuation. */
-  { ISFUNC, rl_insert },	/* [ */
-  { ISFUNC, rl_insert },	/* \ */
-  { ISFUNC, rl_insert },	/* ] */
-  { ISFUNC, rl_insert },	/* ^ */
-  { ISFUNC, rl_insert },	/* _ */
-  { ISFUNC, rl_insert },	/* ` */
-
-  /* Lowercase alphabet. */
-  { ISFUNC, rl_insert },	/* a */
-  { ISFUNC, rl_insert },	/* b */
-  { ISFUNC, rl_insert },	/* c */
-  { ISFUNC, rl_insert },	/* d */
-  { ISFUNC, rl_insert },	/* e */
-  { ISFUNC, rl_insert },	/* f */
-  { ISFUNC, rl_insert },	/* g */
-  { ISFUNC, rl_insert },	/* h */
-  { ISFUNC, rl_insert },	/* i */
-  { ISFUNC, rl_insert },	/* j */
-  { ISFUNC, rl_insert },	/* k */
-  { ISFUNC, rl_insert },	/* l */
-  { ISFUNC, rl_insert },	/* m */
-  { ISFUNC, rl_insert },	/* n */
-  { ISFUNC, rl_insert },	/* o */
-  { ISFUNC, rl_insert },	/* p */
-  { ISFUNC, rl_insert },	/* q */
-  { ISFUNC, rl_insert },	/* r */
-  { ISFUNC, rl_insert },	/* s */
-  { ISFUNC, rl_insert },	/* t */
-  { ISFUNC, rl_insert },	/* u */
-  { ISFUNC, rl_insert },	/* v */
-  { ISFUNC, rl_insert },	/* w */
-  { ISFUNC, rl_insert },	/* x */
-  { ISFUNC, rl_insert },	/* y */
-  { ISFUNC, rl_insert },	/* z */
-
-  /* Final punctuation. */
-  { ISFUNC, rl_insert },	/* { */
-  { ISFUNC, rl_insert },	/* | */
-  { ISFUNC, rl_insert },	/* } */
-  { ISFUNC, rl_insert },	/* ~ */
-  { ISFUNC, rl_rubout }		/* RUBOUT */
-};
-
-KEYMAP_ENTRY_ARRAY emacs_meta_keymap = {
-
-  /* Meta keys.  Just like above, but the high bit is set. */
-  { ISFUNC, (Function *)0x0 },	/* Meta-Control-@ */
-  { ISFUNC, (Function *)0x0 },	/* Meta-Control-a */
-  { ISFUNC, (Function *)0x0 },	/* Meta-Control-b */
-  { ISFUNC, (Function *)0x0 },	/* Meta-Control-c */
-  { ISFUNC, (Function *)0x0 },	/* Meta-Control-d */
-  { ISFUNC, (Function *)0x0 },	/* Meta-Control-e */
-  { ISFUNC, (Function *)0x0 },	/* Meta-Control-f */
-  { ISFUNC, rl_abort },		/* Meta-Control-g */
-  { ISFUNC, (Function *)0x0 },	/* Meta-Control-h */
-  { ISFUNC, (Function *)0x0 },	/* Meta-Control-i */
-  { ISFUNC, rl_vi_editing_mode }, /* Meta-Control-j */
-  { ISFUNC, (Function *)0x0 },	/* Meta-Control-k */
-  { ISFUNC, (Function *)0x0 },	/* Meta-Control-l */
-  { ISFUNC, rl_vi_editing_mode }, /* Meta-Control-m */
-  { ISFUNC, (Function *)0x0 },	/* Meta-Control-n */
-  { ISFUNC, (Function *)0x0 },	/* Meta-Control-o */
-  { ISFUNC, (Function *)0x0 },	/* Meta-Control-p */
-  { ISFUNC, (Function *)0x0 },	/* Meta-Control-q */
-  { ISFUNC, rl_revert_line },	/* Meta-Control-r */
-  { ISFUNC, (Function *)0x0 },	/* Meta-Control-s */
-  { ISFUNC, (Function *)0x0 },	/* Meta-Control-t */
-  { ISFUNC, (Function *)0x0 },	/* Meta-Control-u */
-  { ISFUNC, (Function *)0x0 },	/* Meta-Control-v */
-  { ISFUNC, (Function *)0x0 },	/* Meta-Control-w */
-  { ISFUNC, (Function *)0x0 },	/* Meta-Control-x */
-  { ISFUNC, rl_yank_nth_arg },	/* Meta-Control-y */
-  { ISFUNC, (Function *)0x0 },	/* Meta-Control-z */
-
-  { ISFUNC, (Function *)0x0 },   /* Meta-Control-[ */
-  { ISFUNC, (Function *)0x0 },	/* Meta-Control-\ */
-  { ISFUNC, (Function *)0x0 },	/* Meta-Control-] */
-  { ISFUNC, (Function *)0x0 },	/* Meta-Control-^ */
-  { ISFUNC, (Function *)0x0 },	/* Meta-Control-_ */
-
-  /* The start of printing characters. */
-  { ISFUNC, (Function *)rl_magic_space },	/* Meta-SPACE */
-  { ISFUNC, (Function *)0x0 },	/* Meta-! */
-  { ISFUNC, (Function *)0x0 },	/* Meta-" */
-  { ISFUNC, (Function *)0x0 },	/* Meta-# */
-  { ISFUNC, rl_check_spelling },	/* Meta-$ */
-  { ISFUNC, (Function *)0x0 },	/* Meta-% */
-  { ISFUNC, (Function *)0x0 },	/* Meta-& */
-  { ISFUNC, (Function *)0x0 },	/* Meta-' */
-  { ISFUNC, (Function *)0x0 },	/* Meta-( */
-  { ISFUNC, (Function *)0x0 },	/* Meta-) */
-  { ISFUNC, (Function *)0x0 },	/* Meta-* */
-  { ISFUNC, (Function *)0x0 },	/* Meta-+ */
-  { ISFUNC, (Function *)0x0 },	/* Meta-, */
-  { ISFUNC, rl_digit_argument }, /* Meta-- */
-  { ISFUNC, (Function *)0x0 },	/* Meta-. */
-  { ISFUNC, (Function *)0x0 },	/* Meta-/ */
-
-  /* Regular digits. */
-  { ISFUNC, rl_digit_argument }, /* Meta-0 */
-  { ISFUNC, rl_digit_argument }, /* Meta-1 */
-  { ISFUNC, rl_digit_argument }, /* Meta-2 */
-  { ISFUNC, rl_digit_argument }, /* Meta-3 */
-  { ISFUNC, rl_digit_argument }, /* Meta-4 */
-  { ISFUNC, rl_digit_argument }, /* Meta-5 */
-  { ISFUNC, rl_digit_argument }, /* Meta-6 */
-  { ISFUNC, rl_digit_argument }, /* Meta-7 */
-  { ISFUNC, rl_digit_argument }, /* Meta-8 */
-  { ISFUNC, rl_digit_argument }, /* Meta-9 */
-
-  /* A little more punctuation. */
-  { ISFUNC, (Function *)0x0 },		/* Meta-: */
-  { ISFUNC, (Function *)0x0 },		/* Meta-; */
-  { ISFUNC, rl_beginning_of_history },	/* Meta-< */
-  { ISFUNC, (Function *)0x0 },		/* Meta-= */
-  { ISFUNC, rl_end_of_history },	/* Meta-> */
-  { ISFUNC, rl_possible_completions },	/* Meta-? */
-  { ISFUNC, (Function *)0x0 },		/* Meta-@ */
-
-  /* Uppercase alphabet. */
-  { ISFUNC, rl_do_lowercase_version },	/* Meta-A */
-  { ISFUNC, rl_do_lowercase_version },	/* Meta-B */
-  { ISFUNC, rl_do_lowercase_version },	/* Meta-C */
-  { ISFUNC, rl_do_lowercase_version },	/* Meta-D */
-  { ISFUNC, rl_do_lowercase_version },	/* Meta-E */
-  { ISFUNC, rl_do_lowercase_version },	/* Meta-F */
-  { ISFUNC, rl_do_lowercase_version },	/* Meta-G */
-  { ISFUNC, rl_do_lowercase_version },	/* Meta-H */
-  { ISFUNC, rl_do_lowercase_version },	/* Meta-I */
-  { ISFUNC, rl_do_lowercase_version },	/* Meta-J */
-  { ISFUNC, rl_do_lowercase_version },	/* Meta-K */
-  { ISFUNC, rl_do_lowercase_version },	/* Meta-L */
-  { ISFUNC, rl_do_lowercase_version },	/* Meta-M */
-  { ISFUNC, rl_do_lowercase_version },	/* Meta-N */
-  { ISFUNC, rl_do_lowercase_version },	/* Meta-O */
-  { ISFUNC, rl_do_lowercase_version },	/* Meta-P */
-  { ISFUNC, rl_do_lowercase_version },	/* Meta-Q */
-  { ISFUNC, rl_do_lowercase_version },	/* Meta-R */
-  { ISFUNC, rl_do_lowercase_version },	/* Meta-S */
-  { ISFUNC, rl_do_lowercase_version },	/* Meta-T */
-  { ISFUNC, rl_do_lowercase_version },	/* Meta-U */
-  { ISFUNC, rl_do_lowercase_version },	/* Meta-V */
-  { ISFUNC, rl_do_lowercase_version },	/* Meta-W */
-  { ISFUNC, rl_do_lowercase_version },	/* Meta-X */
-  { ISFUNC, rl_do_lowercase_version },	/* Meta-Y */
-  { ISFUNC, rl_do_lowercase_version },	/* Meta-Z */
-
-  /* Some more punctuation. */
-  { ISFUNC, rl_function_key },	/* Meta-[ */
-  { ISFUNC, (Function *)0x0 },	/* Meta-\ */
-  { ISFUNC, (Function *)0x0 },	/* Meta-] */
-  { ISFUNC, (Function *)0x0 },	/* Meta-^ */
-  { ISFUNC, (Function *)0x0 },	/* Meta-_ */
-  { ISFUNC, (Function *)0x0 },	/* Meta-` */
-
-  /* Lowercase alphabet. */
-  { ISFUNC, (Function *)0x0 },	/* Meta-a */
-  { ISFUNC, rl_backward_word },	/* Meta-b */
-  { ISFUNC, rl_capitalize_word }, /* Meta-c */
-  { ISFUNC, rl_kill_word },	/* Meta-d */
-  { ISFUNC, (Function *)0x0 },	/* Meta-e */
-  { ISFUNC, rl_forward_word },	/* Meta-f */
-  { ISFUNC, (Function *)0x0 },	/* Meta-g */
-  { ISFUNC, (Function *)0x0 },	/* Meta-h */
-  { ISFUNC, (Function *)0x0 },	/* Meta-i */
-  { ISFUNC, (Function *)0x0 },	/* Meta-j */
-  { ISFUNC, (Function *)0x0 },	/* Meta-k */
-  { ISFUNC, rl_downcase_word },	/* Meta-l */
-  { ISFUNC, (Function *)0x0 },	/* Meta-m */
-  { ISFUNC, (Function *)0x0 },	/* Meta-n */
-  { ISFUNC, (Function *)0x0 },	/* Meta-o */
-  { ISFUNC, (Function *)0x0 },	/* Meta-p */
-  { ISFUNC, (Function *)0x0 },	/* Meta-q */
-  { ISFUNC, rl_revert_line },	/* Meta-r */
-  { ISFUNC, (Function *)0x0 },	/* Meta-s */
-  { ISFUNC, rl_transpose_words }, /* Meta-t */
-  { ISFUNC, rl_upcase_word },	/* Meta-u */
-  { ISFUNC, (Function *)0x0 },	/* Meta-v */
-  { ISFUNC, (Function *)0x0 },	/* Meta-w */
-  { ISFUNC, (Function *)0x0 },	/* Meta-x */
-  { ISFUNC, rl_yank_pop },	/* Meta-y */
-  { ISFUNC, (Function *)0x0 },	/* Meta-z */
-
-  /* Final punctuation. */
-  { ISFUNC, (Function *)0x0 },	/* Meta-{ */
-  { ISFUNC, (Function *)0x0 },	/* Meta-| */
-  { ISFUNC, (Function *)0x0 },	/* Meta-} */
-  { ISFUNC, (Function *)0x0 },	/* Meta-~ */
-  { ISFUNC, rl_backward_kill_word } /* Meta-rubout */
-};
-
-KEYMAP_ENTRY_ARRAY emacs_ctlx_keymap = {
-
-  /* Control keys. */
-  { ISFUNC, (Function *)0x0 },		/* Control-@ */
-  { ISFUNC, (Function *)0x0 },		/* Control-a */
-  { ISFUNC, (Function *)0x0 },		/* Control-b */
-  { ISFUNC, (Function *)0x0 },		/* Control-c */
-  { ISFUNC, (Function *)0x0 },		/* Control-d */
-  { ISFUNC, (Function *)0x0 },		/* Control-e */
-  { ISFUNC, (Function *)0x0 },		/* Control-f */
-  { ISFUNC, rl_abort },			/* Control-g */
-  { ISFUNC, (Function *)0x0 },		/* Control-h */
-  { ISFUNC, (Function *)0x0 },		/* Control-i */
-  { ISFUNC, (Function *)0x0 },		/* Control-j */
-  { ISFUNC, (Function *)0x0 },		/* Control-k */
-  { ISFUNC, (Function *)0x0 },		/* Control-l */
-  { ISFUNC, (Function *)0x0 },		/* Control-m */
-  { ISFUNC, (Function *)0x0 },		/* Control-n */
-  { ISFUNC, (Function *)0x0 },		/* Control-o */
-  { ISFUNC, (Function *)0x0 },		/* Control-p */
-  { ISFUNC, (Function *)0x0 },		/* Control-q */
-  { ISFUNC, rl_re_read_init_file },	/* Control-r */
-  { ISFUNC, (Function *)0x0 },		/* Control-s */
-  { ISFUNC, (Function *)0x0 },		/* Control-t */
-  { ISFUNC, rl_undo_command },		/* Control-u */
-  { ISFUNC, (Function *)0x0 },		/* Control-v */
-  { ISFUNC, (Function *)0x0 },		/* Control-w */
-  { ISFUNC, (Function *)0x0 },		/* Control-x */
-  { ISFUNC, (Function *)0x0 },		/* Control-y */
-  { ISFUNC, (Function *)0x0 },		/* Control-z */
-  { ISFUNC, (Function *)0x0 },		/* Control-[ */
-  { ISFUNC, (Function *)0x0 },		/* Control-\ */
-  { ISFUNC, (Function *)0x0 },		/* Control-] */
-  { ISFUNC, (Function *)0x0 },		/* Control-^ */
-  { ISFUNC, (Function *)0x0 },		/* Control-_ */
-
-  /* The start of printing characters. */
-  { ISFUNC, (Function *)0x0 },		/* SPACE */
-  { ISFUNC, (Function *)0x0 },		/* ! */
-  { ISFUNC, (Function *)0x0 },		/* " */
-  { ISFUNC, (Function *)0x0 },		/* # */
-  { ISFUNC, (Function *)0x0 },		/* $ */
-  { ISFUNC, (Function *)0x0 },		/* % */
-  { ISFUNC, (Function *)0x0 },		/* & */
-  { ISFUNC, (Function *)0x0 },		/* ' */
-  { ISFUNC, rl_start_kbd_macro },	/* ( */
-  { ISFUNC, rl_end_kbd_macro  },	/* ) */
-  { ISFUNC, (Function *)0x0 },		/* * */
-  { ISFUNC, (Function *)0x0 },		/* + */
-  { ISFUNC, (Function *)0x0 },		/* , */
-  { ISFUNC, (Function *)0x0 },		/* - */
-  { ISFUNC, (Function *)0x0 },		/* . */
-  { ISFUNC, (Function *)0x0 },		/* / */
-
-  /* Regular digits. */
-  { ISFUNC, (Function *)0x0 },		/* 0 */
-  { ISFUNC, (Function *)0x0 },		/* 1 */
-  { ISFUNC, (Function *)0x0 },		/* 2 */
-  { ISFUNC, (Function *)0x0 },		/* 3 */
-  { ISFUNC, (Function *)0x0 },		/* 4 */
-  { ISFUNC, (Function *)0x0 },		/* 5 */
-  { ISFUNC, (Function *)0x0 },		/* 6 */
-  { ISFUNC, (Function *)0x0 },		/* 7 */
-  { ISFUNC, (Function *)0x0 },		/* 8 */
-  { ISFUNC, (Function *)0x0 },		/* 9 */
-
-  /* A little more punctuation. */
-  { ISFUNC, (Function *)0x0 },	/* : */
-  { ISFUNC, (Function *)0x0 },	/* ; */
-  { ISFUNC, (Function *)0x0 },	/* < */
-  { ISFUNC, (Function *)0x0 },	/* = */
-  { ISFUNC, (Function *)0x0 },	/* > */
-  { ISFUNC, (Function *)0x0 },	/* ? */
-  { ISFUNC, (Function *)0x0 },	/* @ */
-
-  /* Uppercase alphabet. */
-  { ISFUNC, rl_do_lowercase_version },	/* A */
-  { ISFUNC, rl_do_lowercase_version },	/* B */
-  { ISFUNC, rl_do_lowercase_version },	/* C */
-  { ISFUNC, rl_do_lowercase_version },	/* D */
-  { ISFUNC, rl_do_lowercase_version },	/* E */
-  { ISFUNC, rl_do_lowercase_version },	/* F */
-  { ISFUNC, rl_do_lowercase_version },	/* G */
-  { ISFUNC, rl_do_lowercase_version },	/* H */
-  { ISFUNC, rl_do_lowercase_version },	/* I */
-  { ISFUNC, rl_do_lowercase_version },	/* J */
-  { ISFUNC, rl_do_lowercase_version },	/* K */
-  { ISFUNC, rl_do_lowercase_version },	/* L */
-  { ISFUNC, rl_do_lowercase_version },	/* M */
-  { ISFUNC, rl_do_lowercase_version },	/* N */
-  { ISFUNC, rl_do_lowercase_version },	/* O */
-  { ISFUNC, rl_do_lowercase_version },	/* P */
-  { ISFUNC, rl_do_lowercase_version },	/* Q */
-  { ISFUNC, rl_do_lowercase_version },	/* R */
-  { ISFUNC, rl_do_lowercase_version },	/* S */
-  { ISFUNC, rl_do_lowercase_version },	/* T */
-  { ISFUNC, rl_do_lowercase_version },	/* U */
-  { ISFUNC, rl_do_lowercase_version },	/* V */
-  { ISFUNC, rl_do_lowercase_version },	/* W */
-  { ISFUNC, rl_do_lowercase_version },	/* X */
-  { ISFUNC, rl_do_lowercase_version },	/* Y */
-  { ISFUNC, rl_do_lowercase_version },	/* Z */
-
-  /* Some more punctuation. */
-  { ISFUNC, (Function *)0x0 },		/* [ */
-  { ISFUNC, (Function *)0x0 },		/* \ */
-  { ISFUNC, (Function *)0x0 },		/* ] */
-  { ISFUNC, (Function *)0x0 },		/* ^ */
-  { ISFUNC, (Function *)0x0 },		/* _ */
-  { ISFUNC, (Function *)0x0 },		/* ` */
-
-  /* Lowercase alphabet. */
-  { ISFUNC, (Function *)0x0 },		/* a */
-  { ISFUNC, (Function *)0x0 },		/* b */
-  { ISFUNC, (Function *)0x0 },		/* c */
-  { ISFUNC, (Function *)0x0 },		/* d */
-  { ISFUNC, rl_call_last_kbd_macro },	/* e */
-  { ISFUNC, (Function *)0x0 },		/* f */
-  { ISFUNC, (Function *)0x0 },		/* g */
-  { ISFUNC, (Function *)0x0 },		/* h */
-  { ISFUNC, (Function *)0x0 },		/* i */
-  { ISFUNC, (Function *)0x0 },		/* j */
-  { ISFUNC, (Function *)0x0 },		/* k */
-  { ISFUNC, (Function *)0x0 },		/* l */
-  { ISFUNC, (Function *)0x0 },		/* m */
-  { ISFUNC, (Function *)0x0 },		/* n */
-  { ISFUNC, (Function *)0x0 },		/* o */
-  { ISFUNC, (Function *)0x0 },		/* p */
-  { ISFUNC, (Function *)0x0 },		/* q */
-  { ISFUNC, (Function *)0x0 },		/* r */
-  { ISFUNC, (Function *)0x0 },		/* s */
-  { ISFUNC, (Function *)0x0 },		/* t */
-  { ISFUNC, (Function *)0x0 },		/* u */
-  { ISFUNC, (Function *)0x0 },		/* v */
-  { ISFUNC, (Function *)0x0 },		/* w */
-  { ISFUNC, (Function *)0x0 },		/* x */
-  { ISFUNC, (Function *)0x0 },		/* y */
-  { ISFUNC, (Function *)0x0 },		/* z */
-
-  /* Final punctuation. */
-  { ISFUNC, (Function *)0x0 },		/* { */
-  { ISFUNC, (Function *)0x0 },		/* | */
-  { ISFUNC, (Function *)0x0 },		/* } */
-  { ISFUNC, (Function *)0x0 },		/* ~ */
-  { ISFUNC, rl_backward_kill_line }	/* RUBOUT */
-};
End of readline/emacs_keymap.c
echo readline/funmap.c 1>&2
sed 's/^-//' >readline/funmap.c <<'End of readline/funmap.c'
-/* funmap.c -- attach names to functions. */
-
-/* Copyright (C) 1988,1989 Free Software Foundation, Inc.
-
-   This file is part of GNU Readline, a library for reading lines
-   of text with interactive input and history editing.
-
-   Readline is free software; you can redistribute it and/or modify it
-   under the terms of the GNU General Public License as published by the
-   Free Software Foundation; either version 1, or (at your option) any
-   later version.
-
-   Readline is distributed in the hope that it will be useful, but
-   WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   General Public License for more details.
-
-   You should have received a copy of the GNU General Public License
-   along with Readline; see the file COPYING.  If not, write to the Free
-   Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
-
-#define STATIC_MALLOC
-#ifndef STATIC_MALLOC
-extern char *xmalloc (), *xrealloc ();
-#else
-static char *xmalloc (), *xrealloc ();
-#endif
-
-#ifndef FILE
-#include <stdio.h>
-#endif /* FILE */
-
-#include "readline.h"
-
-FUNMAP **funmap = (FUNMAP **)NULL;
-static int funmap_size = 0;
-static int funmap_entry = 0;
-
-static FUNMAP default_funmap[] = {
-  { "beginning-of-line", rl_beg_of_line },
-  { "backward-char", rl_backward },
-  { "delete-char", rl_delete },
-  { "end-of-line", rl_end_of_line },
-  { "forward-char", rl_forward },
-  { "accept-line", rl_newline },
-  { "kill-line", rl_kill_line },
-  { "clear-screen", rl_clear_screen },
-  { "next-history", rl_get_next_history },
-  { "previous-history", rl_get_previous_history },
-  { "quoted-insert", rl_quoted_insert },
-  { "transpose-chars", rl_transpose_chars },
-  { "unix-line-discard", rl_unix_line_discard },
-  { "unix-word-rubout", rl_unix_word_rubout },
-  { "yank", rl_yank },
-  { "yank-pop", rl_yank_pop },
-  { "yank-nth-arg", rl_yank_nth_arg },
-  { "backward-delete-char", rl_rubout },
-  { "backward-word", rl_backward_word },
-  { "kill-word", rl_kill_word },
-  { "forward-word", rl_forward_word },
-  { "tab-insert", rl_tab_insert },
-  { "backward-kill-word", rl_backward_kill_word },
-  { "backward-kill-line", rl_backward_kill_line },
-  { "transpose-words", rl_transpose_words },
-  { "digit-argument", rl_digit_argument },
-  { "complete", rl_complete },
-  { "possible-completions", rl_possible_completions },
-  { "do-lowercase-version", rl_do_lowercase_version },
-  { "digit-argument", rl_digit_argument },
-  { "universal-argument", rl_universal_argument },
-  { "abort", rl_abort },
-  { "undo", rl_undo_command },
-  { "upcase-word", rl_upcase_word },
-  { "downcase-word", rl_downcase_word },
-  { "capitalize-word", rl_capitalize_word },
-  { "revert-line", rl_revert_line },
-  { "beginning-of-history", rl_beginning_of_history },
-  { "end-of-history", rl_end_of_history },
-  { "self-insert", rl_insert },
-  { "start-kbd-macro", rl_start_kbd_macro },
-  { "end-kbd-macro", rl_end_kbd_macro },
-  { "re-read-init-file", rl_re_read_init_file },
-  { "history-expand", rl_magic_space },
-  { "check-spelling", rl_check_spelling },
-#ifdef VI_MODE
-  { "vi-movement-mode", rl_vi_movement_mode },
-  { "vi-insertion-mode", rl_vi_insertion_mode },
-  { "vi-arg-digit", rl_vi_arg_digit },
-  { "vi-prev-word", rl_vi_prev_word },
-  { "vi-next-word", rl_vi_next_word },
-  { "vi-char-search", rl_vi_char_search },
-  { "vi-editing-mode", rl_vi_editing_mode },
-  { "vi-eof-maybe", rl_vi_eof_maybe },
-  { "vi-append-mode", rl_vi_append_mode },
-  { "vi-put", rl_vi_put },
-  { "vi-append-eol", rl_vi_append_eol },
-  { "vi-insert-beg", rl_vi_insert_beg },
-  { "vi-delete", rl_vi_delete },
-  { "vi-comment", rl_vi_comment },
-  { "vi-first-print", rl_vi_first_print },
-  { "vi-fword", rl_vi_fword },
-  { "vi-fWord", rl_vi_fWord },
-  { "vi-bword", rl_vi_bword },
-  { "vi-bWord", rl_vi_bWord },
-  { "vi-eword", rl_vi_eword },
-  { "vi-eWord", rl_vi_eWord },
-  { "vi-end-word", rl_vi_end_word },
-  { "vi-change-case", rl_vi_change_case },
-  { "vi-match", rl_vi_match },
-  { "vi-bracktype", rl_vi_bracktype },
-  { "vi-change-char", rl_vi_change_char },
-  { "vi-yank-arg", rl_vi_yank_arg },
-  { "vi-search", rl_vi_search },
-  { "vi-search-again", rl_vi_search_again },
-  { "vi-dosearch", rl_vi_dosearch },
-  { "vi-subst", rl_vi_subst },
-  { "vi-overstrike", rl_vi_overstrike },
-  { "vi-overstrike-delete", rl_vi_overstrike_delete },
-  { "vi-replace, ", rl_vi_replace },
-  { "vi-column", rl_vi_column },
-  { "vi-delete-to", rl_vi_delete_to },
-  { "vi-change-to", rl_vi_change_to },
-  { "vi-yank-to", rl_vi_yank_to },
-  { "vi-complete", rl_vi_complete },
-#endif /* VI_MODE */
-
- {(char *)NULL, (Function *)NULL }
-};
-
-rl_add_funmap_entry (name, function)
-     char *name;
-     Function *function;
-{
-  if (funmap_entry + 2 >= funmap_size)
-    if (!funmap)
-      funmap = (FUNMAP **)xmalloc ((funmap_size = 80) * sizeof (FUNMAP *));
-    else
-      funmap =
-	(FUNMAP **)xrealloc (funmap, (funmap_size += 80) * sizeof (FUNMAP *));
-  
-  funmap[funmap_entry] = (FUNMAP *)xmalloc (sizeof (FUNMAP));
-  funmap[funmap_entry]->name = name;
-  funmap[funmap_entry]->function = function;
-
-  funmap[++funmap_entry] = (FUNMAP *)NULL;
-}
-
-static int funmap_initialized = 0;
-
-/* Make the funmap contain all of the default entries. */
-rl_initialize_funmap ()
-{
-  register int i;
-
-  if (funmap_initialized)
-    return;
-
-  for (i = 0; default_funmap[i].name; i++)
-    rl_add_funmap_entry (default_funmap[i].name, default_funmap[i].function);
-
-  funmap_initialized = 1;
-}
-
-/* Things that mean `Control'. */
-char *possible_control_prefixes[] = {
-  "Control-", "C-", "CTRL-", (char *)NULL
-};
-
-char *possible_meta_prefixes[] = {
-  "Meta", "M-", (char *)NULL
-};
-
-#ifdef STATIC_MALLOC
-
-/* **************************************************************** */
-/*								    */
-/*			xmalloc and xrealloc ()		     	    */
-/*								    */
-/* **************************************************************** */
-
-static void memory_error_and_abort ();
-
-static char *
-xmalloc (bytes)
-     int bytes;
-{
-  char *temp = (char *)malloc (bytes);
-
-  if (!temp)
-    memory_error_and_abort ();
-  return (temp);
-}
-
-static char *
-xrealloc (pointer, bytes)
-     char *pointer;
-     int bytes;
-{
-  char *temp = (char *)realloc (pointer, bytes);
-
-  if (!temp)
-    memory_error_and_abort ();
-  return (temp);
-}
-
-static void
-memory_error_and_abort ()
-{
-  fprintf (stderr, "history: Out of virtual memory!\n");
-  abort ();
-}
-#endif /* STATIC_MALLOC */
End of readline/funmap.c
echo readline/history.h 1>&2
sed 's/^-//' >readline/history.h <<'End of readline/history.h'
-/* History.h -- the names of functions that you can call in history. */
-/* modified by pjf */
-
-typedef struct _hist_entry {
-  char *line;
-  char *data;
-} HIST_ENTRY;
-
-/* For convenience only.  You set this when interpreting history commands.
-   It is the logical offset of the first history element. */
-extern int tfev;
-#define history_base tfev
-
-/* Begin a session in which the history functions might be used.  This
-   just initializes the interactive variables. */
-extern void using_history ();
-
-/* Place STRING at the end of the history list.
-   The associated data field (if any) is set to NULL. */
-/* extern void add_history (); */
-
-/* Returns the number which says what history element we are now
-   looking at.  */
-extern int where_history ();
-  
-/* Set the position in the history list to POS. */
-int history_set_pos ();
-   
-/* Search for STRING in the history list, starting at POS, an
-   absolute index into the list.  DIR, if negative, says to search
-   backwards from POS, else forwards.
-   Returns the absolute index of the history element where STRING
-   was found, or -1 otherwise. */
-extern int history_search_pos ();
-
-/* A reasonably useless function, only here for completeness.  WHICH
-   is the magic number that tells us which element to delete.  The
-   elements are numbered from 0. */
-/* inline HIST_ENTRY *remove_history () {return NULL;} */
-
-/* Stifle the history list, remembering only MAX number of entries. */
-/* extern void stifle_history (); */
-
-/* Stop stifling the history.  This returns the previous amount the
-   history was stifled by.  The value is positive if the history was
-   stifled, negative if it wasn't. */
-/* extern int unstifle_history (); */
-
-/* Add the contents of FILENAME to the history list, a line at a time.
-   If FILENAME is NULL, then read from ~/.history.  Returns 0 if
-   successful, or errno if not. */
-/* extern int read_history (); */
-
-/* Append the current history to FILENAME.  If FILENAME is NULL,
-   then append the history list to ~/.history.  Values returned
-   are as in read_history ().  */
-/* extern int write_history (); */
-
-
-/* Make the history entry at WHICH have LINE and DATA.  This returns
-   the old entry so you can dispose of the data.  In the case of an
-   invalid WHICH, a NULL pointer is returned. */
-/* extern HIST_ENTRY *replace_history_entry (); */
-
-/* Return the history entry at the current position, as determined by
-   history_offset.  If there is no entry there, return a NULL pointer. */
-HIST_ENTRY *current_history ();
-
-/* Back up history_offset to the previous history entry, and return
-   a pointer to that entry.  If there is no previous entry, return
-   a NULL pointer. */
-extern HIST_ENTRY *previous_history ();
-
-/* Move history_offset forward to the next item in the input_history,
-   and return the a pointer to that entry.  If there is no next entry,
-   return a NULL pointer. */
-extern HIST_ENTRY *next_history ();
-
-/* Return a NULL terminated array of HIST_ENTRY which is the current input
-   history.  Element 0 of this list is the beginning of time.  If there
-   is no history, return NULL. */
-/*extern HIST_ENTRY **history_list ();*/
-
-/* Search the history for STRING, starting at history_offset.
-   If DIRECTION < 0, then the search is through previous entries,
-   else through subsequent.  If the string is found, then
-   current_history () is the history entry, and the value of this function
-   is the offset in the line of that history entry that the string was
-   found in.  Otherwise, nothing is changed, and a -1 is returned. */
-/* extern int history_search (); */
-
-/* Expand the string STRING, placing the result into OUTPUT, a pointer
-   to a string.  Returns:
-
-   0) If no expansions took place (or, if the only change in
-      the text was the de-slashifying of the history expansion
-      character)
-   1) If expansions did take place
-  -1) If there was an error in expansion.
-
-  If an error ocurred in expansion, then OUTPUT contains a descriptive
-  error message. */
-/*extern int history_expand ();*/
-
-/* Extract a string segment consisting of the FIRST through LAST
-   arguments present in STRING.  Arguments are broken up as in
-   the shell. pjf: only 1-segment strings are supported.  */
-extern char *history_arg_extract ();
-
-
End of readline/history.h
echo readline/keymaps.c 1>&2
sed 's/^-//' >readline/keymaps.c <<'End of readline/keymaps.c'
-/* keymaps.c -- Functions and keymaps for the GNU Readline library. */
-
-/* Copyright (C) 1988,1989 Free Software Foundation, Inc.
-
-   This file is part of GNU Readline, a library for reading lines
-   of text with interactive input and history editing.
-
-   Readline is free software; you can redistribute it and/or modify it
-   under the terms of the GNU General Public License as published by the
-   Free Software Foundation; either version 1, or (at your option) any
-   later version.
-
-   Readline is distributed in the hope that it will be useful, but
-   WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   General Public License for more details.
-
-   You should have received a copy of the GNU General Public License
-   along with Readline; see the file COPYING.  If not, write to the Free
-   Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
-
-#include "keymaps.h"
-#include "emacs_keymap.c"
-
-#ifdef VI_MODE
-#include "vi_keymap.c"
-#endif
-
-/* Remove these declarations when we have a complete libgnu.a. */
-#define STATIC_MALLOC
-#ifndef STATIC_MALLOC
-extern char *xmalloc (), *xrealloc ();
-#else
-static char *xmalloc (), *xrealloc ();
-#endif
-
-/* **************************************************************** */
-/*								    */
-/*		      Functions for manipulating Keymaps.	    */
-/*								    */
-/* **************************************************************** */
-
-
-/* Return a new, empty keymap.
-   Free it with free() when you are done. */
-Keymap
-rl_make_bare_keymap ()
-{
-  register int i;
-  Keymap keymap = (Keymap)xmalloc (128 * sizeof (KEYMAP_ENTRY));
-
-  for (i = 0; i < 128; i++)
-    {
-      keymap[i].type = ISFUNC;
-      keymap[i].function = (Function *)NULL;
-    }
-
-  for (i = 'A'; i < ('Z' + 1); i++)
-    {
-      keymap[i].type = ISFUNC;
-      keymap[i].function = rl_do_lowercase_version;
-    }
-
-  return (keymap);
-}
-
-/* Return a new keymap which is a copy of MAP. */
-Keymap
-rl_copy_keymap (map)
-     Keymap map;
-{
-  register int i;
-  Keymap temp = rl_make_bare_keymap ();
-
-  for (i = 0; i < 128; i++)
-    {
-      temp[i].type = map[i].type;
-      temp[i].function = map[i].function;
-    }
-  return (temp);
-}
-
-/* Return a new keymap with the printing characters bound to rl_insert,
-   the uppercase Meta characters bound to run their lowercase equivalents,
-   and the Meta digits bound to produce numeric arguments. */
-Keymap
-rl_make_keymap ()
-{
-  extern rl_insert (), rl_rubout (), rl_do_lowercase_version ();
-  extern rl_digit_argument ();
-  register int i;
-  Keymap newmap;
-
-  newmap = rl_make_bare_keymap ();
-
-  /* All printing characters are self-inserting. */
-  for (i = ' '; i < 126; i++)
-    newmap[i].function = rl_insert;
-
-  newmap[TAB].function = rl_insert;
-  newmap[RUBOUT].function = rl_rubout;
-
-  return (newmap);
-}
-
-/* Free the storage associated with MAP. */
-rl_discard_keymap (map)
-     Keymap (map);
-{
-  int i;
-
-  if (!map)
-    return;
-
-  for (i = 0; i < 128; i++)
-    {
-      switch (map[i].type)
-	{
-	case ISFUNC:
-	  break;
-
-	case ISKMAP:
-	  rl_discard_keymap ((Keymap)map[i].function);
-	  break;
-
-	case ISMACR:
-	  free ((char *)map[i].function);
-	  break;
-	}
-    }
-}
-
-#ifdef STATIC_MALLOC
-
-/* **************************************************************** */
-/*								    */
-/*			xmalloc and xrealloc ()		     	    */
-/*								    */
-/* **************************************************************** */
-
-static void memory_error_and_abort ();
-
-static char *
-xmalloc (bytes)
-     int bytes;
-{
-  char *temp = (char *)malloc (bytes);
-
-  if (!temp)
-    memory_error_and_abort ();
-  return (temp);
-}
-
-static char *
-xrealloc (pointer, bytes)
-     char *pointer;
-     int bytes;
-{
-  char *temp = (char *)realloc (pointer, bytes);
-
-  if (!temp)
-    memory_error_and_abort ();
-  return (temp);
-}
-
-static void
-memory_error_and_abort ()
-{
-  fprintf (stderr, "readline: Out of virtual memory!\n");
-  abort ();
-}
-#endif /* STATIC_MALLOC */
End of readline/keymaps.c
echo readline/keymaps.h 1>&2
sed 's/^-//' >readline/keymaps.h <<'End of readline/keymaps.h'
-/* keymaps.h -- Manipulation of readline keymaps. */
-
-#ifndef _KEYMAPS_H_
-#define _KEYMAPS_H_
-
-#include <readline/chardefs.h>
-
-#ifndef __FUNCTION_DEF
-typedef int Function ();
-#define __FUNCTION_DEF
-#endif
-
-/* A keymap contains one entry for each key in the ASCII set.
-   Each entry consists of a type and a pointer.
-   POINTER is the address of a function to run, or the
-   address of a keymap to indirect through.
-   TYPE says which kind of thing POINTER is. */
-typedef struct _keymap_entry {
-  char type;
-  Function *function;
-} KEYMAP_ENTRY;
-
-/* I wanted to make the above structure contain a union of:
-   union { Function *function; struct _keymap_entry *keymap; } value;
-   but this made it impossible for me to create a static array.
-   Maybe I need C lessons. */
-
-typedef KEYMAP_ENTRY KEYMAP_ENTRY_ARRAY[128];
-typedef KEYMAP_ENTRY *Keymap;
-
-/* The values that TYPE can have in a keymap entry. */
-#define ISFUNC 0
-#define ISKMAP 1
-#define ISMACR 2
-
-extern KEYMAP_ENTRY_ARRAY emacs_standard_keymap, emacs_meta_keymap, emacs_ctlx_keymap;
-extern KEYMAP_ENTRY_ARRAY vi_insertion_keymap, vi_movement_keymap;
-
-/* Return a new, empty keymap.
-   Free it with free() when you are done. */
-Keymap rl_make_bare_keymap ();
-
-/* Return a new keymap which is a copy of MAP. */
-Keymap rl_copy_keymap ();
-
-/* Return a new keymap with the printing characters bound to rl_insert,
-   the lowercase Meta characters bound to run their equivalents, and
-   the Meta digits bound to produce numeric arguments. */
-Keymap rl_make_keymap ();
-
-#endif /* _KEYMAPS_H_ */
-
-
End of readline/keymaps.h
echo readline/readline.c 1>&2
sed 's/^-//' >readline/readline.c <<'End of readline/readline.c'
-/* readline.c -- a general facility for reading lines of input
-   with emacs style editing and completion. */
-
-/* Copyright (C) 1987,1989 Free Software Foundation, Inc.
-
-   This file contains the Readline Library (the Library), a set of
-   routines for providing Emacs style line input to programs that ask
-   for it.
-
-   The Library is free software; you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 1, or (at your option)
-   any later version.
-
-   The Library is distributed in the hope that it will be useful, but
-   WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   General Public License for more details.
-
-   The GNU General Public License is often shipped with GNU software, and
-   is generally kept in a file called COPYING or LICENSE.  If you do not
-   have a copy of the license, write to the Free Software Foundation,
-   675 Mass Ave, Cambridge, MA 02139, USA. */
-
-/* Remove these declarations when we have a complete libgnu.a. */
-#define STATIC_MALLOC
-#ifndef STATIC_MALLOC
-extern char *xmalloc (), *xrealloc ();
-#else
-static char *xmalloc (), *xrealloc ();
-#endif
-
-char *docompsubs();
-extern int errno,errflag;
-
-#include <stdio.h>
-#include <sys/types.h>
-#include <fcntl.h>
-#include <sys/file.h>
-#include <sys/param.h>
-#include <signal.h>
-
-#ifdef __GNUC__
-#define alloca __builtin_alloca
-#else
-#if defined (sparc) && defined (sun)
-#include <alloca.h>
-#endif
-#endif
-
-#define NEW_TTY_DRIVER
-#if defined (SYSV) || defined (hpux)
-#undef NEW_TTY_DRIVER
-#include <termio.h>
-#else
-#include <sgtty.h>
-#endif
-
-#include <errno.h>
-extern int errno;
-
-#include <setjmp.h>
-
-/* These next are for filename completion.  Perhaps this belongs
-   in a different place. */
-#include <sys/stat.h>
-
-#include <pwd.h>
-#ifdef SYSV
-struct passwd *getpwuid (), *getpwent ();
-#endif
-
-#define HACK_TERMCAP_MOTION
-
-#ifndef SYSV
-#include <sys/dir.h>
-#else  /* SYSV */
-#if defined (xenix)
-#include <sys/ndir.h>
-#else
-#ifdef hpux
-#include <ndir.h>
-#else
-#include <dirent.h>
-#define direct dirent
-#define d_namlen d_reclen
-#endif  /* hpux */
-#endif  /* xenix */
-#endif  /* SYSV */
-
-#ifndef O_CBREAK
-#define O_CBREAK CBREAK
-#define O_ECHO ECHO
-#define O_RAW RAW
-#endif
-
-/* Some standard library routines. */
-#include "readline.h"
-#include "history.h"
-
-#ifndef digit
-#define digit(c)  ((c) >= '0' && (c) <= '9')
-#endif
-
-#ifndef isletter
-#define isletter(c) (((c) >= 'A' && (c) <= 'Z') || ((c) >= 'a' && (c) <= 'z'))
-#endif
-
-#ifndef digit_value
-#define digit_value(c) ((c) - '0')
-#endif
-
-#ifndef member
-char *index ();
-#define member(c, s) ((c) ? index ((s), (c)) : 0)
-#endif
-
-#ifndef isident
-#define isident(c) ((isletter(c) || digit(c) || c == '_'))
-#endif
-
-#ifndef exchange
-#define exchange(x, y) {int temp = x; x = y; y = temp;}
-#endif
-
-static update_line ();
-static void output_character_function ();
-static delete_chars ();
-static delete_chars ();
-static insert_some_chars ();
-
-void rl_safe_insert_text();
-
-#ifdef VOID_SIGHANDLER
-#define sighandler void
-#else
-#define sighandler int
-#endif
-
-/* This typedef is equivalant to the one for Function; it allows us
-   to say SigHandler *foo = signal (SIGKILL, SIG_IGN); */
-typedef sighandler SigHandler ();
-
-#ifdef SIGWINCH
-static sighandler rl_handle_sigwinch ();
-static SigHandler *old_sigwinch = (SigHandler *)NULL;
-#endif
-
-/* If on, then readline handles signals in a way that doesn't screw. */
-#define HANDLE_SIGNALS
-
-#if defined (SYSV)
-#ifdef HANDLE_SIGNALS
-#undef HANDLE_SIGNALS
-#endif
-#endif
-
-
-/* **************************************************************** */
-/*                                                                  */
-/*                      Line editing input utility                  */
-/*                                                                  */
-/* **************************************************************** */
-
-/* A pointer to the keymap that is currently in use.
-   By default, it is the standard emacs keymap. */
-Keymap keymap = emacs_standard_keymap;
-
-#define vi_mode 0
-#define emacs_mode 1
-
-/* The current style of editing. */
-int rl_editing_mode = emacs_mode;
-
-/* Non-zero if the previous command was a kill command. */
-static int last_command_was_kill = 0;
-
-/* The current value of the numeric argument specified by the user. */
-int rl_numeric_arg = 1;
-
-/* Non-zero if an argument was typed. */
-int rl_explicit_arg = 0;
-
-/* Temporary value used while generating the argument. */
-static int arg_sign = 1;
-
-/* Non-zero means we have been called at least once before. */
-static int rl_initialized = 0;
-
-/* If non-zero, this program is running in an EMACS buffer. */
-static char *running_in_emacs = (char *)NULL;
-
-/* The current offset in the current input line. */
-int rl_point;
-
-/* Mark in the current input line. */
-int rl_mark;
-
-/* Length of the current input line. */
-int rl_end;
-
-/* Make this non-zero to return the current input_line. */
-int rl_done;
-
-/* The last function executed by readline. */
-Function *rl_last_func = (Function *)NULL;
-
-/* Top level environment for readline_internal (). */
-static jmp_buf readline_top_level;
-
-/* The streams we interact with. */
-static FILE *in_stream, *out_stream;
-
-/* The names of the streams that we do input and output to. */
-FILE *rl_instream = stdin, *rl_outstream = stdout;
-
-/* Non-zero means echo characters as they are read. */
-int readline_echoing_p = 1;
-
-/* Current prompt. */
-char *rl_prompt;
-
-/* The number of characters read in order to type this complete command. */
-int rl_key_sequence_length = 0;
-
-/* 1 means the line editor is active. */
-int rl_active = 0;
-
-/* 1 means we are waiting for a character. */
-int rl_waiting = 0;
-
-/* If non-zero, then this is the address of a function to call just
-   before readline_internal () prints the first prompt. */
-Function *rl_startup_hook = (Function *)NULL;
-
-/* What we use internally.  You should always refer to RL_LINE_BUFFER. */
-static char *the_line;
-
-/* The character that can generate an EOF.  Really read from
-   the terminal driver... just defaulted here. */
-static int eof_char = CTRL ('D');
-
-/* Non-zero makes this the next keystroke to read. */
-int rl_pending_input = 0;
-
-/* Pointer to a useful terminal name. */
-char *rl_terminal_name = (char *)NULL;
-
-/* Line buffer and maintenence. */
-char *rl_line_buffer = (char *)NULL;
-static int rl_line_buffer_len = 0;
-#define DEFAULT_BUFFER_SIZE 256
-
-
-/* **************************************************************** */
-/*                                                                  */
-/*                      `Forward' declarations                      */
-/*                                                                  */
-/* **************************************************************** */
-
-/* Non-zero means do not parse any lines other than comments and
-   parser directives. */
-static unsigned char parsing_conditionalized_out = 0;
-
-/* Caseless strcmp (). */
-static int stricmp (), strnicmp ();
-
-/* Non-zero means to save keys that we dispatch on in a kbd macro. */
-static int defining_kbd_macro = 0;
-
-
-/* **************************************************************** */
-/*                                                                  */
-/*                      Top Level Functions                         */
-/*                                                                  */
-/* **************************************************************** */
-
-/* Read a line of input.  Prompt with PROMPT.  A NULL PROMPT means
-   none.  A return value of NULL means that EOF was encountered. */
-char *
-readline (prompt)
-char *prompt;
-{
-	int rl_prep_terminal (), rl_deprep_terminal ();
-	char *readline_internal ();
-	char *value;
-
-	rl_prompt = prompt;
-
-	/* If we are at EOF return a NULL string. */
-	if (rl_pending_input == EOF)
-	{
-		rl_pending_input = 0;
-		return ((char *)NULL);
-	}
-
-	rl_initialize ();
-	rl_prep_terminal ();
-
-#ifdef SIGWINCH
-	old_sigwinch = (SigHandler *)signal (SIGWINCH, rl_handle_sigwinch);
-#endif
-
-#ifdef HANDLE_SIGNALS
-	rl_set_signals ();
-#endif
-
-	rl_active = 1;
-	rl_waiting = 0;
-	value = readline_internal ();
-	rl_active = 0;
-	rl_deprep_terminal ();
-
-#ifdef SIGWINCH
-	signal (SIGWINCH, old_sigwinch);
-#endif
-
-#ifdef HANDLE_SIGNALS
-	rl_clear_signals ();
-#endif
-
-	return (value);
-}
-
-/* Read a line of input from the global rl_instream, doing output on
-   the global rl_outstream.
-   If rl_prompt is non-null, then that is our prompt. */
-char *
-readline_internal ()
-{
-	int lastc, c, eof_found;
-
-	in_stream = rl_instream; 
-	out_stream = rl_outstream;
-	lastc = eof_found = 0;
-
-	if (rl_startup_hook)
-		(*rl_startup_hook) ();
-
-	if (!readline_echoing_p)
-	{
-		if (rl_prompt)
-		{
-			fprintf (out_stream, "%s", rl_prompt);
-			fflush (out_stream);
-		}
-	}
-	else
-	{
-		rl_on_new_line ();
-		rl_redisplay ();
-#ifdef VI_MODE
-		if (rl_editing_mode == vi_mode)
-			rl_vi_insertion_mode ();
-#endif /* VI_MODE */
-	}
-
-	while (!rl_done)
-	{
-		int lk = last_command_was_kill;
-		int code = setjmp (readline_top_level);
-
-		if (code)
-			rl_redisplay ();
-
-		if (!rl_pending_input)
-		{
-			/* Then initialize the argument and number of keys read. */
-			rl_init_argument ();
-			rl_key_sequence_length = 0;
-		}
-
-		c = rl_read_key ();
-		if (c == EOF)
-			{
-			eof_found = 1;
-			putc('\n',stderr);
-			break;
-			}
-
-		/* EOF typed to a non-blank line is a <NL>. */
-		if (c == EOF && rl_end)
-			c = NEWLINE;
-
-		if (errflag)
-		{
-			eof_found = 1;
-			break;
-		}
-
-		/* The character eof_char typed to blank line, and not as the
-	 previous character is interpreted as EOF. */
-		if (((c == eof_char && lastc != c) || c == EOF) && !rl_end)
-		{
-			eof_found = 1;
-			break;
-		}
-
-		lastc = c;
-		rl_dispatch (c, keymap);
-
-		/* If there was no change in last_command_was_kill, then no kill
-	 has taken place.  Note that if input is pending we are reading
-	 a prefix command, so nothing has changed yet. */
-		if (!rl_pending_input)
-		{
-			if (lk == last_command_was_kill)
-				last_command_was_kill = 0;
-		}
-
-#ifdef VI_MODE
-		/* In vi mode, when you exit insert mode, the cursor moves back
-	 over the previous character.  We explicitly check for that here. */
-		if (rl_editing_mode == vi_mode && keymap == vi_movement_keymap)
-			rl_vi_check ();
-#endif
-		if (!rl_done)
-			rl_redisplay ();
-	}
-
-	/* Restore the original of this history line, iff the line that we
-     are editing was originally in the history, AND the line has changed. */
-	{
-		HIST_ENTRY *entry = current_history ();
-
-		if (entry && rl_undo_list)
-		{
-			char *temp = savestring (the_line);
-			rl_revert_line ();
-			free_history_entry (entry);
-
-			strcpy (the_line, temp);
-			free (temp);
-		}
-	}
-
-	/* At any rate, it is highly likely that this line has an undo list.  Get
-     rid of it now. */
-	if (rl_undo_list)
-		free_undo_list ();
-
-	if (eof_found)
-		return (char *)NULL;
-	else
-		return (savestring (the_line));
-}
-
-
-/* **************************************************************** */
-/*					        		    */
-/*			   Signal Handling                          */
-/*								    */
-/* **************************************************************** */
-
-#ifdef SIGWINCH
-static sighandler
-rl_handle_sigwinch (sig, code, scp)
-int sig, code;
-struct sigcontext *scp;
-{
-	char *term = rl_terminal_name, *getenv ();
-
-	if (readline_echoing_p)
-	{
-		if (!term)
-			term = getenv ("TERM");
-		if (!term)
-			term = "dumb";
-		rl_reset_terminal (term);
-#ifdef NEVER
-		crlf ();
-		rl_forced_update_display ();
-#endif
-	}
-
-	if (old_sigwinch &&
-	    old_sigwinch != (SigHandler *)SIG_IGN &&
-	    old_sigwinch != (SigHandler *)SIG_DFL)
-		(*old_sigwinch)(sig, code, scp);
-}
-#endif  /* SIGWINCH */
-
-#ifdef HANDLE_SIGNALS
-/* Interrupt handling. */
-static SigHandler *old_int  = (SigHandler *)NULL,
-*old_tstp = (SigHandler *)NULL,
-*old_ttou = (SigHandler *)NULL,
-*old_ttin = (SigHandler *)NULL,
-*old_cont = (SigHandler *)NULL;
-
-/* Handle an interrupt character. */
-static sighandler
-rl_signal_handler (sig, code, scp)
-int sig, code;
-struct sigcontext *scp;
-{
-	rl_prep_terminal (), rl_deprep_terminal ();
-
-	switch (sig)
-	{
-	case SIGINT:
-		free_undo_list ();
-		rl_clear_message ();
-		rl_init_argument ();
-#ifdef SIGWINCH
-		signal (SIGWINCH, old_sigwinch);
-#endif
-
-#ifdef SIGTSTP
-	case SIGTSTP:
-	case SIGTTOU:
-	case SIGTTIN:
-#endif
-
-		rl_clean_up_for_exit ();
-		rl_deprep_terminal ();
-		rl_clear_signals ();
-		rl_pending_input = 0;
-
-		kill (getpid (), sig);
-		sigsetmask (0);
-
-		rl_prep_terminal ();
-		rl_set_signals ();
-	}
-}
-
-rl_set_signals ()
-{
-	old_int = (SigHandler *)signal (SIGINT, rl_signal_handler);
-	if (old_int == (SigHandler *)SIG_IGN)
-		signal (SIGINT, SIG_IGN);
-
-#ifdef SIGTSTP
-	old_tstp = (SigHandler *)signal (SIGTSTP, rl_signal_handler);
-	if (old_tstp == (SigHandler *)SIG_IGN)
-		signal (SIGTSTP, SIG_IGN);
-#endif
-#ifdef SIGTTOU
-	old_ttou = (SigHandler *)signal (SIGTTOU, rl_signal_handler);
-	old_ttin = (SigHandler *)signal (SIGTTIN, rl_signal_handler);
-
-	if (old_tstp == (SigHandler *)SIG_IGN)
-	{
-		signal (SIGTTOU, SIG_IGN);
-		signal (SIGTTIN, SIG_IGN);
-	}
-#endif
-}
-
-rl_clear_signals ()
-{
-	signal (SIGINT, old_int);
-
-#ifdef SIGTSTP
-	signal (SIGTSTP, old_tstp);
-#endif
-#ifdef SIGTTOU
-	signal (SIGTTOU, old_ttou);
-	signal (SIGTTIN, old_ttin);
-#endif
-}
-#endif  /* HANDLE_SIGNALS */
-
-
-/* **************************************************************** */
-/*								    */
-/*			Character Input Buffering       	    */
-/*								    */
-/* **************************************************************** */
-
-/* If the terminal was in xoff state when we got to it, then xon_char
-   contains the character that is supposed to start it again. */
-static int xon_char, xoff_state;
-static int pop_index = 0, push_index = 0, ibuffer_len = 511;
-static unsigned char ibuffer[512];
-
-/* Non-null means it is a pointer to a function to run while waiting for
-   character input. */
-Function *rl_event_hook = (Function *)NULL;
-
-#define any_typein (push_index != pop_index)
-
-/* Add KEY to the buffer of characters to be read. */
-rl_stuff_char (key)
-int key;
-{
-	if (key == EOF)
-	{
-		key = NEWLINE;
-		rl_pending_input = EOF;
-	}
-	ibuffer[push_index++] = key;
-	if (push_index >= ibuffer_len)
-		push_index = 0;
-}
-
-/* Return the amount of space available in the
-   buffer for stuffing characters. */
-int
-ibuffer_space ()
-{
-	if (pop_index > push_index)
-		return (pop_index - push_index);
-	else
-		return (ibuffer_len - (push_index - pop_index));
-}
-
-/* Get a key from the buffer of characters to be read.
-   Return the key in KEY.
-   Result is KEY if there was a key, or 0 if there wasn't. */
-int
-rl_get_char (key)
-int *key;
-{
-	if (push_index == pop_index)
-		return (0);
-
-	*key = ibuffer[pop_index++];
-
-	if (pop_index >= ibuffer_len)
-		pop_index = 0;
-
-	return (1);
-}
-
-/* Stuff KEY into the *front* of the input buffer.
-   Returns non-zero if successful, zero if there is
-   no space left in the buffer. */
-int
-rl_unget_char (key)
-int key;
-{
-	if (ibuffer_space ())
-	{
-		pop_index--;
-		if (pop_index < 0)
-			pop_index = ibuffer_len - 1;
-		ibuffer[pop_index] = key;
-		return (1);
-	}
-	return (0);
-}
-
-/* If a character is available to be read, then read it
-   and stuff it into IBUFFER.  Otherwise, just return. */
-rl_gather_tyi ()
-{
-	int tty = fileno (in_stream);
-	register int tem, result = -1;
-	long chars_avail;
-	char input;
-
-#ifdef FIONREAD
-	result = ioctl (tty, FIONREAD, &chars_avail);
-#endif
-
-	if (result == -1)
-	{
-		fcntl (tty, F_SETFL, O_NDELAY);
-		chars_avail = read (tty, &input, 1);
-		fcntl (tty, F_SETFL, 0);
-		if (chars_avail == -1 && errno == EAGAIN)
-			return;
-	}
-
-	tem = ibuffer_space ();
-
-	if (chars_avail > tem)
-		chars_avail = tem;
-
-	/* One cannot read all of the available input.  I can only read a single
-     character at a time, or else programs which require input can be
-     thwarted.  If the buffer is larger than one character, I lose.
-     Damn! */
-	if (tem < ibuffer_len)
-		chars_avail = 0;
-
-	if (result != -1)
-	{
-		while (chars_avail--)
-			rl_stuff_char (rl_getc (in_stream));
-	}
-	else
-	{
-		if (chars_avail)
-			rl_stuff_char (input);
-	}
-}
-
-/* Read a key, including pending input. */
-int
-rl_read_key ()
-{
-	int c;
-
-	rl_key_sequence_length++;
-
-	if (rl_pending_input)
-	{
-		c = rl_pending_input;
-		rl_pending_input = 0;
-	}
-	else
-	{
-		static int next_macro_key ();
-
-		/* If input is coming from a macro, then use that. */
-		if (c = next_macro_key ())
-			return (c);
-
-		/* If the user has an event function, then call it periodically. */
-		if (rl_event_hook)
-		{
-			while (rl_event_hook && !rl_get_char (&c))
-			{
-				(*rl_event_hook) ();
-				rl_gather_tyi ();
-			}
-		}
-		else
-		{
-			if (!rl_get_char (&c))
-				c = rl_getc (in_stream);
-		}
-	}
-
-#ifdef NEVER  /* This breaks supdup to 4.0.3c machines. */
-#ifdef TIOCSTART
-	/* Ugh.  But I can't think of a better way. */
-	if (xoff_state && c == xon_char)
-	{
-		ioctl (fileno (in_stream), TIOCSTART, 0);
-		xoff_state = 0;
-		return (rl_read_key ());
-	}
-#endif /* TIOCSTART */
-#endif
-
-	return (c);
-}
-
-/* I'm beginning to hate the declaration rules for various compilers. */
-static void add_macro_char ();
-
-/* Do the command associated with KEY in MAP.
-   If the associated command is really a keymap, then read
-   another key, and dispatch into that map. */
-rl_dispatch (key, map)
-register int key;
-Keymap map;
-{
-
-	if (defining_kbd_macro)
-		add_macro_char (key);
-
-	if (key > 127 && key < 256)
-	{
-		if (map[ESC].type == ISKMAP)
-		{
-			map = (Keymap)map[ESC].function;
-			key -= 128;
-			rl_dispatch (key, map);
-		}
-		else
-			ding ();
-		return;
-	}
-
-	switch (map[key].type)
-	{
-	case ISFUNC:
-		{
-			Function *func = map[key].function;
-
-			if (func != (Function *)NULL)
-			{
-				/* Special case rl_do_lowercase_version (). */
-				if (func == rl_do_lowercase_version)
-				{
-					rl_dispatch (to_lower (key), map);
-					return;
-				}
-
-				(*map[key].function)(rl_numeric_arg * arg_sign, key);
-			}
-			else
-			{
-				ding ();
-				return;
-			}
-		}
-		break;
-
-	case ISKMAP:
-		if (map[key].function != (Function *)NULL)
-		{
-			int newkey;
-
-			rl_key_sequence_length++;
-			newkey = rl_read_key ();
-			rl_dispatch (newkey, (Keymap)map[key].function);
-		}
-		else
-		{
-			ding ();
-			return;
-		}
-		break;
-
-	case ISMACR:
-		if (map[key].function != (Function *)NULL)
-		{
-			static with_macro_input ();
-			char *macro = savestring ((char *)map[key].function);
-
-			with_macro_input (macro);
-			return;
-		}
-		break;
-	}
-
-	/* If we have input pending, then the last command was a prefix
-     command.  Don't change the state of rl_last_func. */
-	if (!rl_pending_input)
-		rl_last_func = map[key].function;
-}
-
-
-/* **************************************************************** */
-/*								    */
-/*			Hacking Keyboard Macros 		    */
-/*								    */
-/* **************************************************************** */
-
-/* The currently executing macro string.  If this is non-zero,
-   then it is a malloc ()'ed string where input is coming from. */
-static char *executing_macro = (char *)NULL;
-
-/* The offset in the above string to the next character to be read. */
-static int executing_macro_index = 0;
-
-/* The current macro string being built.  Characters get stuffed
-   in here by add_macro_char (). */
-static char *current_macro = (char *)NULL;
-
-/* The size of the buffer allocated to current_macro. */
-static int current_macro_size = 0;
-
-/* The index at which characters are being added to current_macro. */
-static int current_macro_index = 0;
-
-/* A structure used to save nested macro strings.
-   It is a linked list of string/index for each saved macro. */
-struct saved_macro {
-	struct saved_macro *next;
-	char *string;
-	int index;
-};
-
-/* The list of saved macros. */
-struct saved_macro *macro_list = (struct saved_macro *)NULL;
-
-/* Forward declarations of static functions.  Thank you C. */
-static void push_executing_macro (), pop_executing_macro ();
-
-/* This one has to be declared earlier in the file. */
-/* static void add_macro_char (); */
-
-/* Set up to read subsequent input from STRING.
-   STRING is free ()'ed when we are done with it. */
-static
-with_macro_input (string)
-char *string;
-{
-	push_executing_macro ();
-	executing_macro = string;
-	executing_macro_index = 0;
-}
-
-/* Return the next character available from a macro, or 0 if
-   there are no macro characters. */
-static int
-next_macro_key ()
-{
-	if (!executing_macro)
-		return (0);
-
-	if (!executing_macro[executing_macro_index])
-	{
-		pop_executing_macro ();
-		return (next_macro_key ());
-	}
-
-	return (executing_macro[executing_macro_index++]);
-}
-
-/* Save the currently executing macro on a stack of saved macros. */
-static void
-push_executing_macro ()
-{
-	struct saved_macro *saver;
-
-	saver = (struct saved_macro *)xmalloc (sizeof (struct saved_macro));
-	saver->next = macro_list;
-	saver->index = executing_macro_index;
-	saver->string = executing_macro;
-
-	macro_list = saver;
-}
-
-/* Discard the current macro, replacing it with the one
-   on the top of the stack of saved macros. */
-static void
-pop_executing_macro ()
-{
-	if (executing_macro)
-		free (executing_macro);
-
-	executing_macro = (char *)NULL;
-	executing_macro_index = 0;
-
-	if (macro_list)
-	{
-		struct saved_macro *disposer = macro_list;
-		executing_macro = macro_list->string;
-		executing_macro_index = macro_list->index;
-		macro_list = macro_list->next;
-		free (disposer);
-	}
-}
-
-/* Add a character to the macro being built. */
-static void
-add_macro_char (c)
-int c;
-{
-	if (current_macro_index + 1 >= current_macro_size)
-	{
-		if (!current_macro)
-			current_macro = (char *)xmalloc (current_macro_size = 25);
-		else
-			current_macro =
-			    (char *)xrealloc (current_macro, current_macro_size += 25);
-	}
-
-	current_macro[current_macro_index++] = c;
-	current_macro[current_macro_index] = '\0';
-}
-
-/* Begin defining a keyboard macro.
-   Keystrokes are recorded as they are executed.
-   End the definition with rl_end_kbd_macro ().
-   If a numeric argument was explicitly typed, then append this
-   definition to the end of the existing macro, and start by
-   re-executing the existing macro. */
-rl_start_kbd_macro (ignore1, ignore2)
-int ignore1, ignore2;
-{
-	if (defining_kbd_macro)
-		rl_abort ();
-
-	if (rl_explicit_arg)
-	{
-		if (current_macro)
-			with_macro_input (savestring (current_macro));
-	}
-	else
-		current_macro_index = 0;
-
-	defining_kbd_macro = 1;
-}
-
-/* Stop defining a keyboard macro.
-   A numeric argument says to execute the macro right now,
-   that many times, counting the definition as the first time. */
-rl_end_kbd_macro (count, ignore)
-int count, ignore;
-{
-	if (!defining_kbd_macro)
-		rl_abort ();
-
-	current_macro_index -= (rl_key_sequence_length - 1);
-	current_macro[current_macro_index] = '\0';
-
-	defining_kbd_macro = 0;
-
-	rl_call_last_kbd_macro (--count, 0);
-}
-
-/* Execute the most recently defined keyboard macro.
-   COUNT says how many times to execute it. */
-rl_call_last_kbd_macro (count, ignore)
-int count, ignore;
-{
-	if (!current_macro)
-		rl_abort ();
-
-	while (count--)
-		with_macro_input (savestring (current_macro));
-}
-
-
-/* **************************************************************** */
-/*								    */
-/*			Initializations 			    */
-/*								    */
-/* **************************************************************** */
-
-/* Initliaze readline (and terminal if not already). */
-rl_initialize ()
-{
-	extern char *rl_display_prompt;
-
-	/* If we have never been called before, initialize the
-     terminal and data structures. */
-	if (!rl_initialized)
-	{
-		readline_initialize_everything ();
-		rl_initialized++;
-	}
-
-	/* Initalize the current line information. */
-	rl_point = rl_end = 0;
-	the_line = rl_line_buffer;
-	the_line[0] = 0;
-
-	/* We aren't done yet.  We haven't even gotten started yet! */
-	rl_done = 0;
-
-	/* Tell the history routines what is going on. */
-	start_using_history ();
-
-	/* Make the display buffer match the state of the line. */
-	{
-		extern char *rl_display_prompt;
-		extern int forced_display;
-
-		rl_on_new_line ();
-
-		rl_display_prompt = rl_prompt ? rl_prompt : "";
-		forced_display = 1;
-	}
-
-	/* No such function typed yet. */
-	rl_last_func = (Function *)NULL;
-
-	/* Parsing of key-bindings begins in an enabled state. */
-	parsing_conditionalized_out = 0;
-}
-
-/* Initialize the entire state of the world. */
-readline_initialize_everything ()
-{
-	/* Find out if we are running in Emacs. */
-	running_in_emacs = (char *)getenv ("EMACS");
-
-	/* Allocate data structures. */
-	if (!rl_line_buffer)
-		rl_line_buffer =
-		    (char *)xmalloc (rl_line_buffer_len = DEFAULT_BUFFER_SIZE);
-
-	/* Initialize the terminal interface. */
-	init_terminal_io ((char *)NULL);
-
-	/* Bind tty characters to readline functions. */
-	readline_default_bindings ();
-
-	/* Initialize the function names. */
-	rl_initialize_funmap ();
-
-	/* Read in the init file. */
-	rl_read_init_file ((char *)NULL);
-
-	/* If the completion parser's default word break characters haven't
-     been set yet, then do so now. */
-	{
-		extern char *rl_completer_word_break_characters;
-		extern char *rl_basic_word_break_characters;
-
-		if (rl_completer_word_break_characters == (char *)NULL)
-			rl_completer_word_break_characters = rl_basic_word_break_characters;
-	}
-}
-
-/* If this system allows us to look at the values of the regular
-   input editing characters, then bind them to their readline
-   equivalents. */
-readline_default_bindings ()
-{
-
-#ifdef NEW_TTY_DRIVER
-	struct sgttyb ttybuff;
-	int tty = fileno (rl_instream);
-
-	if (ioctl (tty, TIOCGETP, &ttybuff) != -1)
-	{
-		int erase = ttybuff.sg_erase, kill = ttybuff.sg_kill;
-
-		if (erase != -1 && keymap[erase].type == ISFUNC)
-			keymap[erase].function = rl_rubout;
-
-		if (kill != -1 && keymap[kill].type == ISFUNC)
-			keymap[kill].function = rl_unix_line_discard;
-	}
-
-#ifdef TIOCGLTC
-	{
-		struct ltchars lt;
-
-		if (ioctl (tty, TIOCGLTC, &lt) != -1)
-		{
-			int erase = lt.t_werasc, nextc = lt.t_lnextc;
-
-			if (erase != -1 && keymap[erase].type == ISFUNC)
-				keymap[erase].function = rl_unix_word_rubout;
-
-			if (nextc != -1 && keymap[nextc].type == ISFUNC)
-				keymap[nextc].function = rl_quoted_insert;
-		}
-	}
-#endif /* TIOCGLTC */
-#else /* not NEW_TTY_DRIVER */
-	struct termio ttybuff;
-	int tty = fileno (rl_instream);
-
-	if (ioctl (tty, TCGETA, &ttybuff) != -1)
-	{
-		int erase = ttybuff.c_cc[VERASE];
-		int kill = ttybuff.c_cc[VKILL]l
-
-		if (erase != -1 && keymap[(unsigned char)erase].type == ISFUNC)
-			keymap[(unsigned char)erase].function = rl_rubout;
-
-		if (kill != -1 && keymap[(unsigned char)kill].type == ISFUNC)
-			keymap[(unsigned char)kill].function = rl_unix_line_discard;
-	}
-#endif /* NEW_TTY_DRIVER */
-}
-
-
-/* **************************************************************** */
-/*								    */
-/*			Numeric Arguments			    */
-/*								    */
-/* **************************************************************** */
-
-/* Handle C-u style numeric args, as well as M--, and M-digits. */
-
-/* Add the current digit to the argument in progress. */
-rl_digit_argument (ignore, key)
-int ignore, key;
-{
-	rl_pending_input = key;
-	rl_digit_loop ();
-}
-
-/* What to do when you abort reading an argument. */
-rl_discard_argument ()
-{
-	ding ();
-	rl_clear_message ();
-	rl_init_argument ();
-}
-
-/* Create a default argument. */
-rl_init_argument ()
-{
-	rl_numeric_arg = arg_sign = 1;
-	rl_explicit_arg = 0;
-}
-
-/* C-u, universal argument.  Multiply the current argument by 4.
-   Read a key.  If the key has nothing to do with arguments, then
-   dispatch on it.  If the key is the abort character then abort. */
-rl_universal_argument ()
-{
-	rl_numeric_arg *= 4;
-	rl_digit_loop ();
-}
-
-rl_digit_loop ()
-{
-	int key, c;
-	while (1)
-	{
-		rl_message ("(arg: %d) ", arg_sign * rl_numeric_arg);
-		key = c = rl_read_key ();
-
-		if (keymap[c].type == ISFUNC &&
-		    keymap[c].function == rl_universal_argument)
-		{
-			rl_numeric_arg *= 4;
-			continue;
-		}
-		c = UNMETA (c);
-		if (numeric (c))
-		{
-			if (rl_explicit_arg)
-				rl_numeric_arg = (rl_numeric_arg * 10) + (c - '0');
-			else
-				rl_numeric_arg = (c - '0');
-			rl_explicit_arg = 1;
-		}
-		else
-		{
-			if (c == '-' && !rl_explicit_arg)
-			{
-				rl_numeric_arg = 1;
-				arg_sign = -1;
-			}
-			else
-			{
-				rl_clear_message ();
-				rl_dispatch (key, keymap);
-				return;
-			}
-		}
-	}
-}
-
-
-/* **************************************************************** */
-/*								    */
-/*			Display stuff				    */
-/*								    */
-/* **************************************************************** */
-
-/* This is the stuff that is hard for me.  I never seem to write good
-   display routines in C.  Let's see how I do this time. */
-
-/* (PWP) Well... Good for a simple line updater, but totally ignores
-   the problems of input lines longer than the screen width.
-
-   update_line and the code that calls it makes a multiple line,
-   automatically wrapping line update.  Carefull attention needs
-   to be paid to the vertical position variables.
-
-   handling of terminals with autowrap on (incl. DEC braindamage)
-   could be improved a bit.  Right now I just cheat and decrement
-   screenwidth by one. */
-
-/* Keep two buffers; one which reflects the current contents of the
-   screen, and the other to draw what we think the new contents should
-   be.  Then compare the buffers, and make whatever changes to the
-   screen itself that we should.  Finally, make the buffer that we
-   just drew into be the one which reflects the current contents of the
-   screen, and place the cursor where it belongs.
-
-   Commands that want to can fix the display themselves, and then let
-   this function know that the display has been fixed by setting the
-   RL_DISPLAY_FIXED variable.  This is good for efficiency. */
-
-/* Termcap variables: */
-extern char *term_up, *term_dc, *term_cr;
-extern int screenheight, screenwidth, terminal_can_insert;
-
---cut here---cut here---cut here---



More information about the Alt.sources mailing list