Imported from ../bash-2.01.tar.gz.
This commit is contained in:
parent
ccc6cda312
commit
d166f04881
304 changed files with 14702 additions and 13012 deletions
|
|
@ -26,10 +26,11 @@ CPPFLAGS = @CPPFLAGS@
|
|||
LDFLAGS = @LDFLAGS@ @LOCAL_LDFLAGS@
|
||||
|
||||
DEFS = @DEFS@
|
||||
LOCAL_DEFS = @LOCAL_DEFS@
|
||||
|
||||
INCLUDES = -I. -I../.. -I$(topdir) -I$(topdir)/lib
|
||||
|
||||
CCFLAGS = $(DEFS) $(CPPFLAGS) ${INCLUDES} $(LOCAL_CFLAGS) $(CFLAGS)
|
||||
CCFLAGS = $(DEFS) $(LOCAL_DEFS) $(CPPFLAGS) ${INCLUDES} $(LOCAL_CFLAGS) $(CFLAGS)
|
||||
|
||||
# Here is a rule for making .o files from .c files that doesn't force
|
||||
# the type of the machine (like -sun3) into the flags.
|
||||
|
|
@ -99,7 +100,10 @@ mostlyclean: clean
|
|||
# #
|
||||
######################################################################
|
||||
|
||||
fnmatch.o: fnmatch.c fnmatch.h
|
||||
|
||||
fnmatch.o: fnmatch.h
|
||||
fnmatch.o: $(BUILD_DIR)/config.h
|
||||
|
||||
glob.o: $(BUILD_DIR)/config.h
|
||||
glob.o: $(topdir)/bashtypes.h $(topdir)/ansi_stdlib.h $(topdir)/bashansi.h
|
||||
glob.o: $(topdir)/posixstat.h $(topdir)/memalloc.h
|
||||
glob.o: fnmatch.h
|
||||
|
|
|
|||
|
|
@ -50,15 +50,23 @@ fnmatch (pattern, string, flags)
|
|||
if (*n == '\0')
|
||||
return (FNM_NOMATCH);
|
||||
else if ((flags & FNM_PATHNAME) && *n == '/')
|
||||
/* If we are matching a pathname, `?' can never match a `/'. */
|
||||
return (FNM_NOMATCH);
|
||||
else if ((flags & FNM_PERIOD) && *n == '.' &&
|
||||
(n == string || ((flags & FNM_PATHNAME) && n[-1] == '/')))
|
||||
/* `?' cannot match a `.' if it is the first character of the
|
||||
string or if it is the first character following a slash and
|
||||
we are matching a pathname. */
|
||||
return (FNM_NOMATCH);
|
||||
break;
|
||||
|
||||
case '\\':
|
||||
if (!(flags & FNM_NOESCAPE))
|
||||
c = *p++;
|
||||
{
|
||||
c = *p++;
|
||||
if (c == '\0')
|
||||
return (FNM_NOMATCH);
|
||||
}
|
||||
if (*n != c)
|
||||
return (FNM_NOMATCH);
|
||||
break;
|
||||
|
|
@ -66,23 +74,38 @@ fnmatch (pattern, string, flags)
|
|||
case '*':
|
||||
if ((flags & FNM_PERIOD) && *n == '.' &&
|
||||
(n == string || ((flags & FNM_PATHNAME) && n[-1] == '/')))
|
||||
/* `*' cannot match a `.' if it is the first character of the
|
||||
string or if it is the first character following a slash and
|
||||
we are matching a pathname. */
|
||||
return (FNM_NOMATCH);
|
||||
|
||||
/* Collapse multiple consecutive, `*' and `?', but make sure that
|
||||
one character of the string is consumed for each `?'. */
|
||||
for (c = *p++; c == '?' || c == '*'; c = *p++)
|
||||
{
|
||||
if (((flags & FNM_PATHNAME) && *n == '/') ||
|
||||
(c == '?' && *n == '\0'))
|
||||
if ((flags & FNM_PATHNAME) && *n == '/')
|
||||
/* A slash does not match a wildcard under FNM_PATHNAME. */
|
||||
return (FNM_NOMATCH);
|
||||
if (c == '?')
|
||||
n++;
|
||||
else if (c == '?')
|
||||
{
|
||||
if (*n == '\0')
|
||||
return (FNM_NOMATCH);
|
||||
/* One character of the string is consumed in matching
|
||||
this ? wildcard, so *??? won't match if there are
|
||||
fewer than three characters. */
|
||||
n++;
|
||||
}
|
||||
}
|
||||
|
||||
if (c == '\0')
|
||||
return (0);
|
||||
|
||||
/* General case, use recursion. */
|
||||
{
|
||||
char c1 = (!(flags & FNM_NOESCAPE) && c == '\\') ? *p : c;
|
||||
for (--p; *n != '\0'; ++n)
|
||||
/* Only call fnmatch if the first character indicates a
|
||||
possible match. */
|
||||
if ((c == '[' || *n == c1) &&
|
||||
fnmatch (p, n, flags & ~FNM_PERIOD) == 0)
|
||||
return (0);
|
||||
|
|
@ -97,22 +120,30 @@ fnmatch (pattern, string, flags)
|
|||
if (*n == '\0')
|
||||
return (FNM_NOMATCH);
|
||||
|
||||
/* A character class cannot match a `.' if it is the first
|
||||
character of the string or if it is the first character
|
||||
following a slash and we are matching a pathname. */
|
||||
if ((flags & FNM_PERIOD) && *n == '.' &&
|
||||
(n == string || ((flags & FNM_PATHNAME) && n[-1] == '/')))
|
||||
return (FNM_NOMATCH);
|
||||
|
||||
/* Make sure there is a closing `]'. If there isn't, the `['
|
||||
is just a character to be matched. */
|
||||
/* POSIX.2 2.8.3.1.2 says: `An expression containing a `[' that
|
||||
is not preceded by a backslash and is not part of a bracket
|
||||
expression produces undefined results.' This implementation
|
||||
treats the `[' as just a character to be matched if there is
|
||||
not a closing `]'. This code will have to be changed when
|
||||
POSIX.2 character classes are implemented. */
|
||||
{
|
||||
register char *np;
|
||||
|
||||
for (np = p; np && *np && *np != ']'; np++);
|
||||
for (np = p; np && *np && *np != ']'; np++)
|
||||
;
|
||||
|
||||
if (np && !*np)
|
||||
{
|
||||
if (*n != '[')
|
||||
return (FNM_NOMATCH);
|
||||
goto next_char;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -123,10 +154,18 @@ fnmatch (pattern, string, flags)
|
|||
c = *p++;
|
||||
for (;;)
|
||||
{
|
||||
register char cstart = c, cend = c;
|
||||
register char cstart, cend;
|
||||
|
||||
/* Initialize cstart and cend in case `-' is the last
|
||||
character of the pattern. */
|
||||
cstart = cend = c;
|
||||
|
||||
if (!(flags & FNM_NOESCAPE) && c == '\\')
|
||||
cstart = cend = *p++;
|
||||
{
|
||||
if (*p == '\0')
|
||||
return FNM_NOMATCH;
|
||||
cstart = cend = *p++;
|
||||
}
|
||||
|
||||
if (c == '\0')
|
||||
/* [ (unterminated) loses. */
|
||||
|
|
@ -138,6 +177,9 @@ fnmatch (pattern, string, flags)
|
|||
/* [/] can never match. */
|
||||
return (FNM_NOMATCH);
|
||||
|
||||
/* This introduces a range, unless the `-' is the last
|
||||
character of the class. Find the end of the range
|
||||
and move past it. */
|
||||
if (c == '-' && *p != ']')
|
||||
{
|
||||
cend = *p++;
|
||||
|
|
@ -145,6 +187,7 @@ fnmatch (pattern, string, flags)
|
|||
cend = *p++;
|
||||
if (cend == '\0')
|
||||
return (FNM_NOMATCH);
|
||||
|
||||
c = *p++;
|
||||
}
|
||||
|
||||
|
|
@ -156,8 +199,6 @@ fnmatch (pattern, string, flags)
|
|||
}
|
||||
if (!not)
|
||||
return (FNM_NOMATCH);
|
||||
|
||||
next_char:
|
||||
break;
|
||||
|
||||
matched:
|
||||
|
|
@ -170,8 +211,12 @@ fnmatch (pattern, string, flags)
|
|||
|
||||
c = *p++;
|
||||
if (!(flags & FNM_NOESCAPE) && c == '\\')
|
||||
/* 1003.2d11 is unclear if this is right. %%% */
|
||||
++p;
|
||||
{
|
||||
if (*p == '\0')
|
||||
return FNM_NOMATCH;
|
||||
/* XXX 1003.2d11 is unclear if this is right. */
|
||||
++p;
|
||||
}
|
||||
}
|
||||
if (not)
|
||||
return (FNM_NOMATCH);
|
||||
|
|
|
|||
|
|
@ -103,6 +103,8 @@ extern void free ();
|
|||
#endif /* !NULL */
|
||||
|
||||
#if defined (SHELL)
|
||||
extern void throw_to_top_level ();
|
||||
|
||||
extern int interrupt_state;
|
||||
#endif /* SHELL */
|
||||
|
||||
|
|
@ -265,7 +267,8 @@ glob_vector (pat, dir)
|
|||
continue;
|
||||
|
||||
/* If a dot must be explicity matched, check to see if they do. */
|
||||
if (noglob_dot_filenames && dp->d_name[0] == '.' && pat[0] != '.')
|
||||
if (noglob_dot_filenames && dp->d_name[0] == '.' && pat[0] != '.' &&
|
||||
(pat[0] != '\\' || pat[1] != '.'))
|
||||
continue;
|
||||
|
||||
flags = (noglob_dot_filenames ? FNM_PERIOD : 0) | FNM_PATHNAME;
|
||||
|
|
@ -295,7 +298,9 @@ glob_vector (pat, dir)
|
|||
}
|
||||
|
||||
/* Have we run out of memory? */
|
||||
#if defined (SHELL)
|
||||
lost:
|
||||
#endif
|
||||
if (lose)
|
||||
{
|
||||
/* Here free the strings we have got. */
|
||||
|
|
|
|||
|
|
@ -17,16 +17,20 @@ RM = rm -f
|
|||
CP = cp
|
||||
MV = mv
|
||||
|
||||
PROFILE_FLAGS =
|
||||
|
||||
CFLAGS = @CFLAGS@
|
||||
LOCAL_CFLAGS = @LOCAL_CFLAGS@
|
||||
CPPFLAGS = @CPPFLAGS@
|
||||
LDFLAGS = @LDFLAGS@
|
||||
|
||||
DEFS = @DEFS@
|
||||
LOCAL_DEFS = @LOCAL_DEFS@
|
||||
|
||||
INCLUDES = -I. -I../.. -I$(topdir) -I$(topdir)/lib
|
||||
|
||||
CCFLAGS = ${INCLUDES} $(DEFS) $(LOCAL_CFLAGS) $(CFLAGS) $(MALLOC_CFLAGS) $(CPPFLAGS)
|
||||
CCFLAGS = ${PROFILE_FLAGS} ${INCLUDES} $(DEFS) $(LOCAL_DEFS) $(LOCAL_CFLAGS) \
|
||||
$(CFLAGS) $(MALLOC_CFLAGS) $(CPPFLAGS)
|
||||
|
||||
.c.o:
|
||||
$(CC) $(CCFLAGS) -c $<
|
||||
|
|
@ -35,6 +39,9 @@ CCFLAGS = ${INCLUDES} $(DEFS) $(LOCAL_CFLAGS) $(CFLAGS) $(MALLOC_CFLAGS) $(CPPFL
|
|||
$(CC) $(CCFLAGS) -c $<
|
||||
|
||||
MALLOC_SOURCE = malloc.c
|
||||
GMALLOC_SOURCE = gmalloc.c
|
||||
NMALLOC_SOURCE = nmalloc.c
|
||||
STUB_SOURCE = stub.c
|
||||
|
||||
ALLOCA_SOURCE = alloca.c
|
||||
ALLOCA_OBJECT = alloca.o
|
||||
|
|
@ -43,12 +50,46 @@ MALLOC_SRC = @MALLOC_SRC@
|
|||
MALLOC = @MALLOC@
|
||||
ALLOCA = @ALLOCA@
|
||||
|
||||
libmalloc.a: $(MALLOC) $(ALLOCA) stub.o
|
||||
$(RM) $@
|
||||
$(AR) cr $@ $(MALLOC) $(ALLOCA) stub.o
|
||||
-test -n "$(RANLIB)" && $(RANLIB) $@
|
||||
MALLOC_OBJS = malloc.o $(ALLOCA) stub.o
|
||||
GMALLOC_OBJS = gmalloc.o $(ALLOCA) stub.o
|
||||
NMALLOC_OBJS = nmalloc.o $(ALLOCA) stub.o
|
||||
NMALLOC2_OBJS = nmalloc2.o $(ALLOCA) stub.o
|
||||
NGMALLOC_OBJS = ngmalloc.o $(ALLOCA) stub.o
|
||||
STUB_OBJS = $(ALLOCA) stub.o
|
||||
|
||||
malloc.o: malloc.c getpagesize.h
|
||||
.PHONY: malloc gmalloc stubmalloc nmalloc ngmalloc nmalloc2
|
||||
|
||||
all: malloc
|
||||
|
||||
malloc: ${MALLOC_OBJS}
|
||||
${RM} libmalloc.a
|
||||
${AR} cr libmalloc.a ${MALLOC_OBJS}
|
||||
-test -n "$(RANLIB)" && $(RANLIB) libmalloc.a
|
||||
|
||||
nmalloc: ${NMALLOC_OBJS}
|
||||
${RM} libmalloc.a
|
||||
${AR} cr libmalloc.a ${NMALLOC_OBJS}
|
||||
-test -n "$(RANLIB)" && $(RANLIB) libmalloc.a
|
||||
|
||||
nmalloc2: ${NMALLOC2_OBJS}
|
||||
${RM} libmalloc.a
|
||||
${AR} cr libmalloc.a ${NMALLOC2_OBJS}
|
||||
-test -n "$(RANLIB)" && $(RANLIB) libmalloc.a
|
||||
|
||||
gmalloc: ${GMALLOC_OBJS}
|
||||
${RM} libmalloc.a
|
||||
${AR} cr libmalloc.a ${GMALLOC_OBJS}
|
||||
-test -n "$(RANLIB)" && $(RANLIB) libmalloc.a
|
||||
|
||||
ngmalloc: ${NGMALLOC_OBJS}
|
||||
${RM} libmalloc.a
|
||||
${AR} cr libmalloc.a ${NGMALLOC_OBJS}
|
||||
-test -n "$(RANLIB)" && $(RANLIB) libmalloc.a
|
||||
|
||||
stubmalloc: ${STUB_OBJS}
|
||||
${RM} libmalloc.a
|
||||
${AR} cr libmalloc.a ${STUB_OBJS}
|
||||
-test -n "$(RANLIB)" && $(RANLIB) libmalloc.a
|
||||
|
||||
alloca.o: $(ALLOCA_SOURCE)
|
||||
$(CC) $(CCFLAGS) -c $(ALLOCA_SOURCE)
|
||||
|
|
@ -62,7 +103,12 @@ mostlyclean clean:
|
|||
distclean realclean maintainer-clean: clean
|
||||
$(RM) Makefile
|
||||
|
||||
malloc.o: malloc.c
|
||||
gmalloc.o: gmalloc.c
|
||||
|
||||
alloca.o: $(BUILD_DIR)/config.h
|
||||
malloc.o: $(BUILD_DIR)/config.h
|
||||
xmalloc.o: $(BUILD_DIR)/config.h
|
||||
malloc.o: $(BUILD_DIR)/config.h $(topdir)/bashtypes.h getpagesize.h
|
||||
nmalloc.o: $(BUILD_DIR)/config.h $(topdir)/bashtypes.h getpagesize.h
|
||||
nmalloc2.o: $(BUILD_DIR)/config.h $(topdir)/bashtypes.h getpagesize.h
|
||||
xmalloc.o: $(BUILD_DIR)/config.h $(topdir)/ansi_stdlib.h
|
||||
gmalloc.o: $(BUILD_DIR)/config.h
|
||||
|
|
|
|||
|
|
@ -19,6 +19,10 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
|
|||
# include <unistd.h>
|
||||
# if defined (_SC_PAGESIZE)
|
||||
# define getpagesize() sysconf(_SC_PAGESIZE)
|
||||
# else
|
||||
# if defined (_SC_PAGE_SIZE)
|
||||
# define getpagesize() sysconf(_SC_PAGE_SIZE)
|
||||
# endif /* _SC_PAGE_SIZE */
|
||||
# endif /* _SC_PAGESIZE */
|
||||
#endif
|
||||
|
||||
|
|
|
|||
|
|
@ -74,7 +74,11 @@ what you give them. Help stamp out software-hoarding! */
|
|||
#endif
|
||||
|
||||
/* Determine which kind of system this is. */
|
||||
#include <sys/types.h>
|
||||
#if defined (SHELL)
|
||||
# include "bashtypes.h"
|
||||
#else
|
||||
# include <sys/types.h>
|
||||
#endif
|
||||
#include <signal.h>
|
||||
|
||||
/* Define getpagesize () if the system does not. */
|
||||
|
|
@ -93,6 +97,20 @@ what you give them. Help stamp out software-hoarding! */
|
|||
# undef HAVE_RESOURCE
|
||||
#endif
|
||||
|
||||
#if __GNUC__ > 1
|
||||
# define FASTCOPY(s, d, n) __builtin_memcpy (d, s, n)
|
||||
#else /* !__GNUC__ */
|
||||
# if !defined (HAVE_BCOPY)
|
||||
# if !defined (HAVE_MEMMOVE)
|
||||
# define FASTCOPY(s, d, n) memcpy (d, s, n)
|
||||
# else
|
||||
# define FASTCOPY(s, d, n) memmove (d, s, n)
|
||||
# endif /* !HAVE_MEMMOVE */
|
||||
# else /* HAVE_BCOPY */
|
||||
# define FASTCOPY(s, d, n) bcopy (s, d, n)
|
||||
# endif /* HAVE_BCOPY */
|
||||
#endif /* !__GNUC__ */
|
||||
|
||||
#if !defined (NULL)
|
||||
# define NULL 0
|
||||
#endif
|
||||
|
|
@ -138,10 +156,10 @@ struct mhead {
|
|||
char mh_index; /* index in nextf[] */
|
||||
/* Remainder are valid only when block is allocated */
|
||||
unsigned short mh_size; /* size, if < 0x10000 */
|
||||
#ifdef rcheck
|
||||
#ifdef RCHECK
|
||||
unsigned int mh_nbytes; /* number of bytes allocated */
|
||||
int mh_magic4; /* should be == MAGIC4 */
|
||||
#endif /* rcheck */
|
||||
#endif /* RCHECK */
|
||||
};
|
||||
|
||||
/* Access free-list pointer of a block.
|
||||
|
|
@ -154,10 +172,12 @@ struct mhead {
|
|||
#define CHAIN(a) \
|
||||
(*(struct mhead **) (sizeof (char *) + (char *) (a)))
|
||||
|
||||
#ifdef rcheck
|
||||
#ifdef RCHECK
|
||||
# include <stdio.h>
|
||||
# if !defined (botch)
|
||||
# define botch(x) abort ()
|
||||
# else
|
||||
extern void botch();
|
||||
# endif /* botch */
|
||||
|
||||
# if !defined (__STRING)
|
||||
|
|
@ -178,10 +198,10 @@ struct mhead {
|
|||
# define MAGIC4 0x55555555
|
||||
# define ASSERT(p) if (!(p)) botch(__STRING(p)); else
|
||||
# define EXTRA 4 /* 4 bytes extra for MAGIC1s */
|
||||
#else /* !rcheck */
|
||||
#else /* !RCHECK */
|
||||
# define ASSERT(p)
|
||||
# define EXTRA 0
|
||||
#endif /* rcheck */
|
||||
#endif /* RCHECK */
|
||||
|
||||
/* nextf[i] is free list of blocks of size 2**(i + 3) */
|
||||
|
||||
|
|
@ -441,15 +461,15 @@ malloc (n) /* get a block */
|
|||
/* If not for this check, we would gobble a clobbered free chain ptr */
|
||||
/* and bomb out on the NEXT allocate of this size block */
|
||||
if (p -> mh_alloc != ISFREE || p -> mh_index != nunits)
|
||||
#ifdef rcheck
|
||||
#ifdef RCHECK
|
||||
botch ("block on free list clobbered");
|
||||
#else /* not rcheck */
|
||||
#else /* not RCHECK */
|
||||
abort ();
|
||||
#endif /* not rcheck */
|
||||
#endif /* not RCHECK */
|
||||
|
||||
/* Fill in the info, and if range checking, set up the magic numbers */
|
||||
p -> mh_alloc = ISALLOC;
|
||||
#ifdef rcheck
|
||||
#ifdef RCHECK
|
||||
p -> mh_nbytes = n;
|
||||
p -> mh_magic4 = MAGIC4;
|
||||
{
|
||||
|
|
@ -457,9 +477,9 @@ malloc (n) /* get a block */
|
|||
|
||||
*m++ = MAGIC1, *m++ = MAGIC1, *m++ = MAGIC1, *m = MAGIC1;
|
||||
}
|
||||
#else /* not rcheck */
|
||||
#else /* not RCHECK */
|
||||
p -> mh_size = n;
|
||||
#endif /* not rcheck */
|
||||
#endif /* not RCHECK */
|
||||
#ifdef MEMSCRAMBLE
|
||||
zmemset ((char *)(p + 1), 0xdf, n); /* scramble previous contents */
|
||||
#endif
|
||||
|
|
@ -485,17 +505,19 @@ free (mem)
|
|||
|
||||
if (p -> mh_alloc == ISMEMALIGN)
|
||||
{
|
||||
#ifdef rcheck
|
||||
#ifdef RCHECK
|
||||
ap -= p->mh_nbytes;
|
||||
#else
|
||||
ap -= p->mh_size; /* XXX */
|
||||
#endif
|
||||
p = (struct mhead *) ap - 1;
|
||||
}
|
||||
|
||||
#ifndef rcheck
|
||||
#ifndef RCHECK
|
||||
if (p -> mh_alloc != ISALLOC)
|
||||
abort ();
|
||||
|
||||
#else /* rcheck */
|
||||
#else /* RCHECK */
|
||||
if (p -> mh_alloc != ISALLOC)
|
||||
{
|
||||
if (p -> mh_alloc == ISFREE)
|
||||
|
|
@ -508,17 +530,17 @@ free (mem)
|
|||
ap += p -> mh_nbytes;
|
||||
ASSERT (*ap++ == MAGIC1); ASSERT (*ap++ == MAGIC1);
|
||||
ASSERT (*ap++ == MAGIC1); ASSERT (*ap == MAGIC1);
|
||||
#endif /* rcheck */
|
||||
#endif /* RCHECK */
|
||||
}
|
||||
#ifdef MEMSCRAMBLE
|
||||
{
|
||||
register int n;
|
||||
|
||||
#ifdef rcheck
|
||||
#ifdef RCHECK
|
||||
n = p->mh_nbytes;
|
||||
#else /* not rcheck */
|
||||
#else /* not RCHECK */
|
||||
n = p->mh_size;
|
||||
#endif /* not rcheck */
|
||||
#endif /* not RCHECK */
|
||||
zmemset (mem, 0xcf, n);
|
||||
}
|
||||
#endif
|
||||
|
|
@ -557,19 +579,19 @@ realloc (mem, n)
|
|||
p--;
|
||||
nunits = p -> mh_index;
|
||||
ASSERT (p -> mh_alloc == ISALLOC);
|
||||
#ifdef rcheck
|
||||
#ifdef RCHECK
|
||||
ASSERT (p -> mh_magic4 == MAGIC4);
|
||||
{
|
||||
register char *m = mem + (tocopy = p -> mh_nbytes);
|
||||
ASSERT (*m++ == MAGIC1); ASSERT (*m++ == MAGIC1);
|
||||
ASSERT (*m++ == MAGIC1); ASSERT (*m == MAGIC1);
|
||||
}
|
||||
#else /* not rcheck */
|
||||
#else /* not RCHECK */
|
||||
if (p -> mh_index >= 13)
|
||||
tocopy = (1 << (p -> mh_index + 3)) - sizeof *p;
|
||||
else
|
||||
tocopy = p -> mh_size;
|
||||
#endif /* not rcheck */
|
||||
#endif /* not RCHECK */
|
||||
|
||||
/* See if desired size rounds to same power of 2 as actual size. */
|
||||
nbytes = (n + sizeof *p + EXTRA + 7) & ~7;
|
||||
|
|
@ -577,15 +599,15 @@ realloc (mem, n)
|
|||
/* If ok, use the same block, just marking its size as changed. */
|
||||
if (nbytes > (4 << nunits) && nbytes <= (8 << nunits))
|
||||
{
|
||||
#ifdef rcheck
|
||||
#ifdef RCHECK
|
||||
register char *m = mem + tocopy;
|
||||
*m++ = 0; *m++ = 0; *m++ = 0; *m++ = 0;
|
||||
p-> mh_nbytes = n;
|
||||
m = mem + n;
|
||||
*m++ = MAGIC1; *m++ = MAGIC1; *m++ = MAGIC1; *m++ = MAGIC1;
|
||||
#else /* not rcheck */
|
||||
#else /* not RCHECK */
|
||||
p -> mh_size = n;
|
||||
#endif /* not rcheck */
|
||||
#endif /* not RCHECK */
|
||||
return mem;
|
||||
}
|
||||
|
||||
|
|
@ -596,7 +618,7 @@ realloc (mem, n)
|
|||
|
||||
if ((new = malloc (n)) == 0)
|
||||
return 0;
|
||||
bcopy (mem, new, tocopy);
|
||||
FASTCOPY (mem, new, tocopy);
|
||||
free (mem);
|
||||
return new;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -45,13 +45,13 @@
|
|||
# include <alloca.h>
|
||||
# endif /* !IBMESA */
|
||||
# else /* !HAVE_ALLOCA_H */
|
||||
# if defined (hpux_9) && defined (__STDC__) && !defined (alloca)
|
||||
# if defined (__hpux) && defined (__STDC__) && !defined (alloca)
|
||||
extern void *alloca ();
|
||||
# else
|
||||
# if !defined (alloca)
|
||||
extern char *alloca ();
|
||||
# endif /* !alloca */
|
||||
# endif /* !hpux_9 || !__STDC__ && !alloca */
|
||||
# endif /* !__hpux || !__STDC__ && !alloca */
|
||||
# endif /* !HAVE_ALLOCA_H */
|
||||
#endif /* !__GNUC__ */
|
||||
|
||||
|
|
|
|||
|
|
@ -42,7 +42,7 @@
|
|||
# define D_NAMLEN(d) ((d)->d_namlen)
|
||||
#endif /* !HAVE_DIRENT_H */
|
||||
|
||||
#if defined (STRUCT_DIRENT_HAS_D_INO)
|
||||
#if defined (STRUCT_DIRENT_HAS_D_INO) && !defined (STRUCT_DIRENT_HAS_D_FILENO)
|
||||
# define d_fileno d_ino
|
||||
#endif
|
||||
|
||||
|
|
|
|||
20
lib/posixheaders/posixjmp.h
Normal file
20
lib/posixheaders/posixjmp.h
Normal file
|
|
@ -0,0 +1,20 @@
|
|||
/* posixjmp.h -- wrapper for setjmp.h with changes for POSIX systems. */
|
||||
|
||||
#ifndef _POSIXJMP_H_
|
||||
#define _POSIXJMP_H_
|
||||
|
||||
#include <setjmp.h>
|
||||
|
||||
/* This *must* be included *after* config.h */
|
||||
|
||||
#if defined (HAVE_POSIX_SIGSETJMP)
|
||||
# define procenv_t sigjmp_buf
|
||||
# undef setjmp
|
||||
# define setjmp(x) sigsetjmp((x), 1)
|
||||
# undef longjmp
|
||||
# define longjmp(x, n) siglongjmp((x), (n))
|
||||
#else
|
||||
# define procenv_t jmp_buf
|
||||
#endif
|
||||
|
||||
#endif /* _POSIXJMP_H_ */
|
||||
|
|
@ -1,8 +1,8 @@
|
|||
## -*- text -*- ####################################################
|
||||
# #
|
||||
# Makefile for the GNU Readline and History Libraries. #
|
||||
# #
|
||||
####################################################################
|
||||
## -*- text -*- #############################################################
|
||||
# #
|
||||
# Makefile for the Bash versions of the GNU Readline and History Libraries. #
|
||||
# #
|
||||
#############################################################################
|
||||
|
||||
srcdir = @srcdir@
|
||||
VPATH = .:@srcdir@
|
||||
|
|
@ -20,7 +20,11 @@ RM = rm -f
|
|||
CP = cp
|
||||
MV = mv
|
||||
|
||||
# See the file STANDALONE for the -D defines that readline understands
|
||||
SHELL = /bin/sh
|
||||
|
||||
# Programs to make tags files.
|
||||
ETAGS = etags -tw
|
||||
CTAGS = ctags -tw
|
||||
|
||||
CFLAGS = @CFLAGS@
|
||||
LOCAL_CFLAGS = @LOCAL_CFLAGS@
|
||||
|
|
@ -28,13 +32,12 @@ CPPFLAGS = @CPPFLAGS@
|
|||
LDFLAGS = @LDFLAGS@
|
||||
|
||||
DEFS = @DEFS@
|
||||
LOCAL_DEFS = @LOCAL_DEFS@
|
||||
|
||||
INCLUDES = -I. -I$(BUILD_DIR) -I$(topdir) -I$(topdir)/lib
|
||||
|
||||
CCFLAGS = $(DEFS) $(APP_CFLAGS) $(CPPFLAGS) ${INCLUDES} $(LOCAL_CFLAGS) $(CFLAGS)
|
||||
CCFLAGS = $(DEFS) $(LOCAL_DEFS) $(APP_CFLAGS) $(CPPFLAGS) ${INCLUDES} $(LOCAL_CFLAGS) $(CFLAGS)
|
||||
|
||||
# Here is a rule for making .o files from .c files that doesn't force
|
||||
# the type of the machine (like -sun3) into the flags.
|
||||
.c.o:
|
||||
$(CC) -c $(CCFLAGS) $<
|
||||
|
||||
|
|
@ -50,20 +53,20 @@ CSOURCES = $(srcdir)/readline.c $(srcdir)/funmap.c $(srcdir)/keymaps.c \
|
|||
$(srcdir)/undo.c $(srcdir)/macro.c $(srcdir)/input.c \
|
||||
$(srcdir)/callback.c $(srcdir)/terminal.c $(srcdir)/xmalloc.c \
|
||||
$(srcdir)/history.c $(srcdir)/histsearch.c $(srcdir)/histexpand.c \
|
||||
$(srcdir)/histfile.c $(srcdir)/nls.c \
|
||||
$(srcdir)/tilde.c \
|
||||
$(srcdir)/histfile.c $(srcdir)/nls.c $(srcdir)/search.c \
|
||||
$(srcdir)/shell.c $(srcdir)/tilde.c
|
||||
|
||||
# The header files for this library.
|
||||
HSOURCES = readline.h rldefs.h chardefs.h keymaps.h history.h histlib.h \
|
||||
posixstat.h tilde.h rlconf.h tcap.h
|
||||
posixstat.h posixdir.h posixjmp.h tilde.h rlconf.h rltty.h \
|
||||
ansi_stdlib.h tcap.h
|
||||
|
||||
HISTOBJ = history.o histexpand.o histfile.o histsearch.o
|
||||
TILDEOBJ= tilde.o
|
||||
HISTOBJ = history.o histexpand.o histfile.o histsearch.o shell.o
|
||||
TILDEOBJ = tilde.o
|
||||
OBJECTS = readline.o vi_mode.o funmap.o keymaps.o parens.o search.o \
|
||||
rltty.o complete.o bind.o isearch.o display.o signals.o \
|
||||
util.o kill.o undo.o macro.o input.o callback.o terminal.o \
|
||||
nls.o xmalloc.o \
|
||||
$(HISTOBJ) $(TILDEOBJ)
|
||||
nls.o $(HISTOBJ) $(TILDEOBJ) xmalloc.o
|
||||
|
||||
# The texinfo files which document this library.
|
||||
DOCSOURCE = doc/rlman.texinfo doc/rltech.texinfo doc/rluser.texinfo
|
||||
|
|
@ -84,12 +87,12 @@ INSTALLED_HEADERS = readline.h chardefs.h keymaps.h history.h tilde.h
|
|||
all: libreadline.a libhistory.a
|
||||
|
||||
libreadline.a: $(OBJECTS)
|
||||
$(RM) -f $@
|
||||
$(RM) $@
|
||||
$(AR) cr $@ $(OBJECTS)
|
||||
-test -n "$(RANLIB)" && $(RANLIB) $@
|
||||
|
||||
libhistory.a: $(HISTOBJ) xmalloc.o
|
||||
$(RM) -f $@
|
||||
$(RM) $@
|
||||
$(AR) cr $@ $(HISTOBJ) xmalloc.o
|
||||
-test -n "$(RANLIB)" && $(RANLIB) $@
|
||||
|
||||
|
|
@ -99,94 +102,113 @@ documentation: force
|
|||
|
||||
force:
|
||||
|
||||
# The rule for 'includes' is written funny so that the if statement
|
||||
# always returns TRUE unless there really was an error installing the
|
||||
# include files.
|
||||
install: installdirs libreadline.a
|
||||
for file in $(INSTALLED_HEADERS) ; do \
|
||||
$(INSTALL_DATA) $(srcdir)/$$file $(includedir)/readline ; \
|
||||
done
|
||||
-${MV} $(libdir)/libreadline.a $(libdir)/libreadline.old
|
||||
${INSTALL_DATA} libreadline.a $(libdir)/libreadline.a
|
||||
-test -n "$(RANLIB)" && $(RANLIB) -t $(bindir)/libreadline.a
|
||||
|
||||
installdirs: $(topdir)/support/mkdirs
|
||||
$(SHELL) $(topdir)/support/mkdirs $(includedir) \
|
||||
$(includedir)/readline $(libdir) $(infodir) $(man3dir)
|
||||
install:
|
||||
@echo "This version of the readline library should not be installed."
|
||||
|
||||
uninstall:
|
||||
cd $(includedir)/readline && ${RM} -f ${INSTALLED_HEADERS}
|
||||
cd $(libdir) && ${RM} -f libreadline.a libreadline.old
|
||||
|
||||
tags: force
|
||||
etags $(CSOURCES) $(HSOURCES)
|
||||
@echo "This version of the readline library should not be installed."
|
||||
|
||||
TAGS: force
|
||||
ctags -x $(CSOURCES) $(HSOURCES) > $@
|
||||
$(ETAGS) $(CSOURCES) $(HSOURCES)
|
||||
|
||||
readline: readline.h rldefs.h chardefs.h
|
||||
readline: $(OBJECTS)
|
||||
$(CC) $(CFLAGS) $(CPPFLAGS) $(READLINE_DEFINES) \
|
||||
$(LOCAL_INCLUDES) -DTEST -o readline readline.c vi_mode.o funmap.o \
|
||||
keymaps.o -ltermcap
|
||||
tags: force
|
||||
$(CTAGS) $(CSOURCES) $(HSOURCES)
|
||||
|
||||
clean: force
|
||||
$(RM) $(OBJECTS) *.a
|
||||
-( cd doc && $(MAKE) $(MFLAGS) $@ )
|
||||
|
||||
distclean realclean maintainer-clean: clean
|
||||
-( cd doc && $(MAKE) $(MFLAGS) $@ )
|
||||
$(RM) Makefile
|
||||
|
||||
mostlyclean: clean
|
||||
-( cd doc && $(MAKE) $(MFLAGS) $@ )
|
||||
|
||||
# Dependencies
|
||||
readline.o: readline.c readline.h rldefs.h rlconf.h chardefs.h tcap.h
|
||||
readline.o: keymaps.h history.h
|
||||
vi_mode.o: rldefs.h rlconf.h readline.h history.h
|
||||
funmap.o: funmap.c readline.h rlconf.h
|
||||
keymaps.o: keymaps.c emacs_keymap.c vi_keymap.c keymaps.h chardefs.h rlconf.h
|
||||
history.o: history.h histlib.h
|
||||
histexpand.o: history.h histlib.h
|
||||
histsearch.o: history.h histlib.h
|
||||
histfile.o: history.h histlib.h
|
||||
isearch.o: readline.h history.h
|
||||
search.o: readline.h history.h
|
||||
display.o: readline.h history.h rldefs.h rlconf.h tcap.h
|
||||
complete.o: readline.h rldefs.h rlconf.h posixdir.h posixstat.h
|
||||
rltty.o: rldefs.h rlconf.h readline.h rltty.h
|
||||
bind.o: rldefs.h rlconf.h readline.h history.h
|
||||
signals.o: rldefs.h rlconf.h readline.h history.h
|
||||
parens.o: readline.h
|
||||
kill.o: rldefs.h rlconf.h readline.h history.h
|
||||
macro.o: rldefs.h rlconf.h readline.h history.h
|
||||
undo.o: rldefs.h rlconf.h readline.h history.h
|
||||
input.o: rldefs.h rlconf.h readline.h history.h
|
||||
callback.o: rlconf.h rldefs.h readline.h
|
||||
terminal.o: rlconf.h rldefs.h readline.h tcap.h history.h
|
||||
distclean maintainer-clean: clean
|
||||
-( cd doc && $(MAKE) $(MFLAGS) $@ )
|
||||
$(RM) Makefile
|
||||
$(RM) TAGS tags
|
||||
|
||||
bind.o: $(BUILD_DIR)/config.h
|
||||
callback.o: $(BUILD_DIR)/config.h
|
||||
complete.o: $(BUILD_DIR)/config.h
|
||||
display.o: $(BUILD_DIR)/config.h
|
||||
funmap.o: $(BUILD_DIR)/config.h
|
||||
histexpand.o: $(BUILD_DIR)/config.h
|
||||
histfile.o: $(BUILD_DIR)/config.h
|
||||
history.o: $(BUILD_DIR)/config.h
|
||||
histsearch.o: $(BUILD_DIR)/config.h
|
||||
input.o: $(BUILD_DIR)/config.h
|
||||
isearch.o: $(BUILD_DIR)/config.h
|
||||
keymaps.o: $(BUILD_DIR)/config.h
|
||||
kill.o: $(BUILD_DIR)/config.h
|
||||
macro.o: $(BUILD_DIR)/config.h
|
||||
parens.o: $(BUILD_DIR)/config.h
|
||||
readline.o: $(BUILD_DIR)/config.h
|
||||
rltty.o: $(BUILD_DIR)/config.h
|
||||
search.o: $(BUILD_DIR)/config.h
|
||||
signals.o: $(BUILD_DIR)/config.h
|
||||
tilde.o: $(BUILD_DIR)/config.h
|
||||
undo.o: $(BUILD_DIR)/config.h
|
||||
util.o: $(BUILD_DIR)/config.h
|
||||
vi_mode.o: $(BUILD_DIR)/config.h
|
||||
xmalloc.o: $(BUILD_DIR)/config.h
|
||||
# Dependencies
|
||||
bind.o: ansi_stdlib.h posixstat.h
|
||||
bind.o: rldefs.h ${BUILD_DIR}/config.h rlconf.h
|
||||
bind.o: readline.h keymaps.h chardefs.h tilde.h
|
||||
bind.o: history.h
|
||||
callback.o: rlconf.h
|
||||
callback.o: rldefs.h ${BUILD_DIR}/config.h rlconf.h
|
||||
callback.o: readline.h keymaps.h chardefs.h tilde.h
|
||||
complete.o: ansi_stdlib.h posixdir.h posixstat.h
|
||||
complete.o: rldefs.h ${BUILD_DIR}/config.h rlconf.h
|
||||
complete.o: readline.h keymaps.h chardefs.h tilde.h
|
||||
display.o: ansi_stdlib.h posixstat.h
|
||||
display.o: rldefs.h ${BUILD_DIR}/config.h rlconf.h
|
||||
display.o: tcap.h
|
||||
display.o: readline.h keymaps.h chardefs.h tilde.h
|
||||
display.o: history.h
|
||||
funmap.o: readline.h keymaps.h chardefs.h tilde.h
|
||||
funmap.o: rlconf.h ansi_stdlib.h
|
||||
funmap.o: ${BUILD_DIR}/config.h
|
||||
histexpand.o: ansi_stdlib.h
|
||||
histexpand.o: history.h histlib.h
|
||||
histexpand.o: ${BUILD_DIR}/config.h
|
||||
histfile.o: ansi_stdlib.h
|
||||
histfile.o: history.h histlib.h
|
||||
histfile.o: ${BUILD_DIR}/config.h
|
||||
history.o: ansi_stdlib.h
|
||||
history.o: history.h histlib.h
|
||||
history.o: ${BUILD_DIR}/config.h
|
||||
histsearch.o: ansi_stdlib.h
|
||||
histsearch.o: history.h histlib.h
|
||||
histsearch.o: ${BUILD_DIR}/config.h
|
||||
input.o: ansi_stdlib.h
|
||||
input.o: rldefs.h ${BUILD_DIR}/config.h rlconf.h
|
||||
input.o: readline.h keymaps.h chardefs.h tilde.h
|
||||
isearch.o: rldefs.h ${BUILD_DIR}/config.h rlconf.h
|
||||
isearch.o: readline.h keymaps.h chardefs.h tilde.h
|
||||
isearch.o: ansi_stdlib.h history.h
|
||||
keymaps.o: emacs_keymap.c vi_keymap.c
|
||||
keymaps.o: keymaps.h chardefs.h rlconf.h ansi_stdlib.h
|
||||
keymaps.o: readline.h keymaps.h chardefs.h tilde.h
|
||||
keymaps.o: ${BUILD_DIR}/config.h
|
||||
kill.o: ansi_stdlib.h
|
||||
kill.o: rldefs.h ${BUILD_DIR}/config.h rlconf.h
|
||||
kill.o: readline.h keymaps.h chardefs.h tilde.h
|
||||
kill.o: history.h
|
||||
macro.o: ansi_stdlib.h
|
||||
macro.o: rldefs.h ${BUILD_DIR}/config.h rlconf.h
|
||||
macro.o: readline.h keymaps.h chardefs.h tilde.h
|
||||
macro.o: history.h
|
||||
nls.o: ansi_stdlib.h
|
||||
nls.o: rldefs.h ${BUILD_DIR}/config.h rlconf.h
|
||||
parens.o: rlconf.h
|
||||
parens.o: ${BUILD_DIR}/config.h
|
||||
parens.o: readline.h keymaps.h chardefs.h tilde.h
|
||||
readline.o: readline.h keymaps.h chardefs.h tilde.h
|
||||
readline.o: rldefs.h ${BUILD_DIR}/config.h rlconf.h
|
||||
readline.o: history.h
|
||||
readline.o: posixstat.h ansi_stdlib.h posixjmp.h
|
||||
rltty.o: rldefs.h ${BUILD_DIR}/config.h rlconf.h
|
||||
rltty.o: rltty.h
|
||||
rltty.o: readline.h keymaps.h chardefs.h tilde.h
|
||||
search.o: rldefs.h ${BUILD_DIR}/config.h rlconf.h
|
||||
search.o: readline.h keymaps.h chardefs.h tilde.h
|
||||
search.o: ansi_stdlib.h history.h
|
||||
signals.o: rldefs.h ${BUILD_DIR}/config.h rlconf.h
|
||||
signals.o: readline.h keymaps.h chardefs.h tilde.h
|
||||
signals.o: history.h
|
||||
terminal.o: rldefs.h ${BUILD_DIR}/config.h rlconf.h
|
||||
terminal.o: tcap.h
|
||||
terminal.o: readline.h keymaps.h chardefs.h tilde.h
|
||||
terminal.o: history.h
|
||||
tilde.o: ansi_stdlib.h
|
||||
tilde.o: ${BUILD_DIR}/config.h
|
||||
tilde.o: tilde.h
|
||||
undo.o: ansi_stdlib.h
|
||||
undo.o: rldefs.h ${BUILD_DIR}/config.h rlconf.h
|
||||
undo.o: readline.h keymaps.h chardefs.h tilde.h
|
||||
undo.o: history.h
|
||||
util.o: posixjmp.h ansi_stdlib.h
|
||||
util.o: rldefs.h ${BUILD_DIR}/config.h rlconf.h
|
||||
util.o: readline.h keymaps.h chardefs.h tilde.h
|
||||
vi_mode.o: rldefs.h ${BUILD_DIR}/config.h rlconf.h
|
||||
vi_mode.o: readline.h keymaps.h chardefs.h tilde.h
|
||||
vi_mode.o: history.h ansi_stdlib.h
|
||||
xmalloc.o: ${BUILD_DIR}/config.h
|
||||
xmalloc.o: ansi_stdlib.h
|
||||
|
|
|
|||
|
|
@ -89,11 +89,16 @@ extern Keymap _rl_keymap;
|
|||
|
||||
extern char *possible_control_prefixes[], *possible_meta_prefixes[];
|
||||
|
||||
/* Functions imported from funmap.c */
|
||||
extern char **rl_funmap_names ();
|
||||
extern int rl_add_funmap_entry ();
|
||||
|
||||
/* Functions imported from util.c */
|
||||
extern char *_rl_strindex ();
|
||||
|
||||
/* Functions imported from shell.c */
|
||||
extern char *get_env_value ();
|
||||
|
||||
/* Variables exported by this file. */
|
||||
Keymap rl_binding_keymap;
|
||||
|
||||
|
|
@ -202,7 +207,7 @@ rl_set_key (keyseq, function, map)
|
|||
Function *function;
|
||||
Keymap map;
|
||||
{
|
||||
return (rl_generic_bind (ISFUNC, keyseq, function, map));
|
||||
return (rl_generic_bind (ISFUNC, keyseq, (char *)function, map));
|
||||
}
|
||||
|
||||
/* Bind the key sequence represented by the string KEYSEQ to
|
||||
|
|
@ -381,7 +386,7 @@ rl_untranslate_keyseq (seq)
|
|||
kseq[i++] = '\\';
|
||||
kseq[i++] = 'C';
|
||||
kseq[i++] = '-';
|
||||
c = UNCTRL (c);
|
||||
c = _rl_to_lower (UNCTRL (c));
|
||||
}
|
||||
else if (c == RUBOUT)
|
||||
{
|
||||
|
|
@ -394,7 +399,7 @@ rl_untranslate_keyseq (seq)
|
|||
if (c == ESC)
|
||||
{
|
||||
kseq[i++] = '\\';
|
||||
kseq[i++] = 'e';
|
||||
c = 'e';
|
||||
}
|
||||
else if (c == '\\' || c == '"')
|
||||
{
|
||||
|
|
@ -406,6 +411,53 @@ rl_untranslate_keyseq (seq)
|
|||
return kseq;
|
||||
}
|
||||
|
||||
static char *
|
||||
_rl_untranslate_macro_value (seq)
|
||||
char *seq;
|
||||
{
|
||||
char *ret, *r, *s;
|
||||
int c;
|
||||
|
||||
r = ret = xmalloc (7 * strlen (seq) + 1);
|
||||
for (s = seq; *s; s++)
|
||||
{
|
||||
c = *s;
|
||||
if (META_CHAR (c))
|
||||
{
|
||||
*r++ = '\\';
|
||||
*r++ = 'M';
|
||||
*r++ = '-';
|
||||
c = UNMETA (c);
|
||||
}
|
||||
else if (CTRL_CHAR (c) && c != ESC)
|
||||
{
|
||||
*r++ = '\\';
|
||||
*r++ = 'C';
|
||||
*r++ = '-';
|
||||
c = _rl_to_lower (UNCTRL (c));
|
||||
}
|
||||
else if (c == RUBOUT)
|
||||
{
|
||||
*r++ = '\\';
|
||||
*r++ = 'C';
|
||||
*r++ = '-';
|
||||
c = '?';
|
||||
}
|
||||
|
||||
if (c == ESC)
|
||||
{
|
||||
*r++ = '\\';
|
||||
c = 'e';
|
||||
}
|
||||
else if (c == '\\' || c == '"')
|
||||
*r++ = '\\';
|
||||
|
||||
*r++ = (unsigned char)c;
|
||||
}
|
||||
*r = '\0';
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* Return a pointer to the function that STRING represents.
|
||||
If STRING doesn't have a matching function, then a NULL pointer
|
||||
is returned. */
|
||||
|
|
@ -523,7 +575,7 @@ rl_read_init_file (filename)
|
|||
{
|
||||
filename = last_readline_init_file;
|
||||
if (filename == 0)
|
||||
filename = getenv ("INPUTRC");
|
||||
filename = get_env_value ("INPUTRC");
|
||||
if (filename == 0)
|
||||
filename = DEFAULT_INPUTRC;
|
||||
}
|
||||
|
|
@ -990,14 +1042,14 @@ rl_parse_and_bind (string)
|
|||
/* Temporary. Handle old-style keyname with macro-binding. */
|
||||
if (*funname == '\'' || *funname == '"')
|
||||
{
|
||||
char seq[2];
|
||||
unsigned char useq[2];
|
||||
int fl = strlen (funname);
|
||||
|
||||
seq[0] = key; seq[1] = '\0';
|
||||
useq[0] = key; useq[1] = '\0';
|
||||
if (fl && funname[fl - 1] == *funname)
|
||||
funname[fl - 1] = '\0';
|
||||
|
||||
rl_macro_bind (seq, &funname[1], _rl_keymap);
|
||||
rl_macro_bind (useq, &funname[1], _rl_keymap);
|
||||
}
|
||||
#if defined (PREFIX_META_HACK)
|
||||
/* Ugly, but working hack to keep prefix-meta around. */
|
||||
|
|
@ -1528,6 +1580,8 @@ int
|
|||
rl_dump_functions (count, key)
|
||||
int count, key;
|
||||
{
|
||||
if (rl_dispatching)
|
||||
fprintf (rl_outstream, "\r\n");
|
||||
rl_function_dumper (rl_explicit_arg);
|
||||
rl_on_new_line ();
|
||||
return (0);
|
||||
|
|
@ -1549,7 +1603,11 @@ _rl_macro_dumper_internal (print_readably, map, prefix)
|
|||
{
|
||||
case ISMACR:
|
||||
keyname = _rl_get_keyname (key);
|
||||
#if 0
|
||||
out = (char *)map[key].function;
|
||||
#else
|
||||
out = _rl_untranslate_macro_value ((char *)map[key].function);
|
||||
#endif
|
||||
if (print_readably)
|
||||
fprintf (rl_outstream, "\"%s%s\": \"%s\"\n", prefix ? prefix : "",
|
||||
keyname,
|
||||
|
|
@ -1559,6 +1617,9 @@ _rl_macro_dumper_internal (print_readably, map, prefix)
|
|||
keyname,
|
||||
out ? out : "");
|
||||
free (keyname);
|
||||
#if 1
|
||||
free (out);
|
||||
#endif
|
||||
break;
|
||||
case ISFUNC:
|
||||
break;
|
||||
|
|
@ -1604,6 +1665,8 @@ int
|
|||
rl_dump_macros (count, key)
|
||||
int count, key;
|
||||
{
|
||||
if (rl_dispatching)
|
||||
fprintf (rl_outstream, "\r\n");
|
||||
rl_macro_dumper (rl_explicit_arg);
|
||||
rl_on_new_line ();
|
||||
return (0);
|
||||
|
|
@ -1674,6 +1737,8 @@ int
|
|||
rl_dump_variables (count, key)
|
||||
int count, key;
|
||||
{
|
||||
if (rl_dispatching)
|
||||
fprintf (rl_outstream, "\r\n");
|
||||
rl_variable_dumper (rl_explicit_arg);
|
||||
rl_on_new_line ();
|
||||
return (0);
|
||||
|
|
|
|||
|
|
@ -39,6 +39,7 @@
|
|||
extern void readline_internal_startup ();
|
||||
extern char *readline_internal_teardown ();
|
||||
extern int readline_internal_char ();
|
||||
extern void _rl_init_line_state ();
|
||||
|
||||
extern int _rl_meta_flag;
|
||||
extern char *rl_prompt;
|
||||
|
|
@ -120,6 +121,10 @@ rl_callback_read_char ()
|
|||
in_handler = 0;
|
||||
(*rl_linefunc) (line);
|
||||
|
||||
/* If the user did not clear out the line, do it for him. */
|
||||
if (rl_line_buffer[0])
|
||||
_rl_init_line_state ();
|
||||
|
||||
/* Redisplay the prompt if readline_handler_{install,remove} not called. */
|
||||
if (in_handler == 0 && rl_linefunc)
|
||||
_rl_callback_newline ();
|
||||
|
|
|
|||
|
|
@ -25,7 +25,6 @@
|
|||
# include <config.h>
|
||||
#endif
|
||||
|
||||
#include <stdio.h>
|
||||
#include <sys/types.h>
|
||||
#include <fcntl.h>
|
||||
#if defined (HAVE_SYS_FILE_H)
|
||||
|
|
@ -42,6 +41,8 @@
|
|||
# include "ansi_stdlib.h"
|
||||
#endif /* HAVE_STDLIB_H */
|
||||
|
||||
#include <stdio.h>
|
||||
|
||||
#include <errno.h>
|
||||
#if !defined (errno)
|
||||
extern int errno;
|
||||
|
|
@ -137,7 +138,7 @@ int rl_visible_stats = 0;
|
|||
static int completion_changed_buffer;
|
||||
|
||||
/* Pointer to the generator function for completion_matches ().
|
||||
NULL means to use filename_entry_function (), the default filename
|
||||
NULL means to use filename_completion_function (), the default filename
|
||||
completer. */
|
||||
Function *rl_completion_entry_function = (Function *)NULL;
|
||||
|
||||
|
|
@ -761,12 +762,13 @@ insert_text (text, start, end)
|
|||
}
|
||||
|
||||
static char *
|
||||
make_quoted_replacement (match, mtype, quote_char)
|
||||
make_quoted_replacement (match, mtype, qc)
|
||||
char *match;
|
||||
int mtype, quote_char;
|
||||
int mtype;
|
||||
char *qc; /* Pointer to quoting character, if any */
|
||||
{
|
||||
int should_quote, do_replace;
|
||||
char *replacement, qc;
|
||||
char *replacement;
|
||||
|
||||
/* If we are doing completion on quoted substrings, and any matches
|
||||
contain any of the completer_word_break_characters, then auto-
|
||||
|
|
@ -784,10 +786,10 @@ make_quoted_replacement (match, mtype, quote_char)
|
|||
|
||||
if (should_quote)
|
||||
#if defined (SHELL)
|
||||
should_quote = should_quote && (!quote_char || quote_char == '"' || quote_char == '\'');
|
||||
#else
|
||||
should_quote = should_quote && !quote_char;
|
||||
#endif
|
||||
should_quote = should_quote && (!qc || !*qc || *qc == '"' || *qc == '\'');
|
||||
#else /* !SHELL */
|
||||
should_quote = should_quote && (!qc || !*qc);
|
||||
#endif /* !SHELL */
|
||||
|
||||
if (should_quote)
|
||||
{
|
||||
|
|
@ -797,37 +799,37 @@ make_quoted_replacement (match, mtype, quote_char)
|
|||
should_quote = rl_strpbrk (match, rl_filename_quote_characters) != 0;
|
||||
|
||||
do_replace = should_quote ? mtype : NO_MATCH;
|
||||
if (do_replace != NO_MATCH)
|
||||
{
|
||||
/* Quote the replacement, since we found an embedded
|
||||
word break character in a potential match. */
|
||||
if (rl_filename_quoting_function)
|
||||
{
|
||||
qc = quote_char; /* must pass a (char *) to quoting function */
|
||||
replacement = (*rl_filename_quoting_function)
|
||||
(match, do_replace, &qc);
|
||||
quote_char = qc;
|
||||
}
|
||||
}
|
||||
/* Quote the replacement, since we found an embedded
|
||||
word break character in a potential match. */
|
||||
if (do_replace != NO_MATCH && rl_filename_quoting_function)
|
||||
replacement = (*rl_filename_quoting_function) (match, do_replace, qc);
|
||||
}
|
||||
return (replacement);
|
||||
}
|
||||
|
||||
static void
|
||||
insert_match (match, start, mtype, quote_char)
|
||||
insert_match (match, start, mtype, qc)
|
||||
char *match;
|
||||
int start, mtype, quote_char;
|
||||
int start, mtype;
|
||||
char *qc;
|
||||
{
|
||||
char *replacement;
|
||||
char oqc;
|
||||
|
||||
replacement = make_quoted_replacement (match, mtype, quote_char);
|
||||
oqc = qc ? *qc : '\0';
|
||||
replacement = make_quoted_replacement (match, mtype, qc);
|
||||
|
||||
/* Now insert the match. */
|
||||
if (replacement)
|
||||
{
|
||||
/* Don't double an opening quote character. */
|
||||
if (quote_char && start && rl_line_buffer[start - 1] == quote_char &&
|
||||
replacement[0] == quote_char)
|
||||
if (qc && *qc && start && rl_line_buffer[start - 1] == *qc &&
|
||||
replacement[0] == *qc)
|
||||
start--;
|
||||
/* If make_quoted_replacement changed the quoting character, remove
|
||||
the opening quote and insert the (fully-quoted) replacement. */
|
||||
else if (qc && (*qc != oqc) && start && rl_line_buffer[start - 1] == oqc &&
|
||||
replacement[0] != oqc)
|
||||
start--;
|
||||
insert_text (replacement, start, rl_point - 1);
|
||||
if (replacement != match)
|
||||
|
|
@ -882,9 +884,10 @@ append_to_match (text, delimiter, quote_char)
|
|||
}
|
||||
|
||||
static void
|
||||
insert_all_matches (matches, point, quote_char)
|
||||
insert_all_matches (matches, point, qc)
|
||||
char **matches;
|
||||
int point, quote_char;
|
||||
int point;
|
||||
char *qc;
|
||||
{
|
||||
int i;
|
||||
char *rp;
|
||||
|
|
@ -892,7 +895,7 @@ insert_all_matches (matches, point, quote_char)
|
|||
rl_begin_undo_group ();
|
||||
/* remove any opening quote character; make_quoted_replacement will add
|
||||
it back. */
|
||||
if (quote_char && point && rl_line_buffer[point - 1] == quote_char)
|
||||
if (qc && *qc && point && rl_line_buffer[point - 1] == *qc)
|
||||
point--;
|
||||
rl_delete_text (point, rl_point);
|
||||
rl_point = point;
|
||||
|
|
@ -901,7 +904,7 @@ insert_all_matches (matches, point, quote_char)
|
|||
{
|
||||
for (i = 1; matches[i]; i++)
|
||||
{
|
||||
rp = make_quoted_replacement (matches[i], SINGLE_MATCH, quote_char);
|
||||
rp = make_quoted_replacement (matches[i], SINGLE_MATCH, qc);
|
||||
rl_insert_text (rp);
|
||||
rl_insert_text (" ");
|
||||
if (rp != matches[i])
|
||||
|
|
@ -910,7 +913,7 @@ insert_all_matches (matches, point, quote_char)
|
|||
}
|
||||
else
|
||||
{
|
||||
rp = make_quoted_replacement (matches[0], SINGLE_MATCH, quote_char);
|
||||
rp = make_quoted_replacement (matches[0], SINGLE_MATCH, qc);
|
||||
rl_insert_text (rp);
|
||||
rl_insert_text (" ");
|
||||
if (rp != matches[0])
|
||||
|
|
@ -964,12 +967,12 @@ rl_complete_internal (what_to_do)
|
|||
|
||||
text = rl_copy_text (start, end);
|
||||
matches = gen_completion_matches (text, start, end, our_func, found_quote, quote_char);
|
||||
free (text);
|
||||
|
||||
if (matches == 0)
|
||||
{
|
||||
ding ();
|
||||
FREE (saved_line_buffer);
|
||||
free (text);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
@ -998,6 +1001,7 @@ rl_complete_internal (what_to_do)
|
|||
FREE (matches);
|
||||
ding ();
|
||||
FREE (saved_line_buffer);
|
||||
FREE (text);
|
||||
return 0;
|
||||
}
|
||||
else
|
||||
|
|
@ -1013,6 +1017,7 @@ rl_complete_internal (what_to_do)
|
|||
}
|
||||
}
|
||||
}
|
||||
free (text);
|
||||
|
||||
switch (what_to_do)
|
||||
{
|
||||
|
|
@ -1020,7 +1025,7 @@ rl_complete_internal (what_to_do)
|
|||
case '!':
|
||||
/* Insert the first match with proper quoting. */
|
||||
if (*matches[0])
|
||||
insert_match (matches[0], start, matches[1] ? MULT_MATCH : SINGLE_MATCH, quote_char);
|
||||
insert_match (matches[0], start, matches[1] ? MULT_MATCH : SINGLE_MATCH, "e_char);
|
||||
|
||||
/* If there are more matches, ring the bell to indicate.
|
||||
If we are in vi mode, Posix.2 says to not ring the bell.
|
||||
|
|
@ -1046,7 +1051,7 @@ rl_complete_internal (what_to_do)
|
|||
break;
|
||||
|
||||
case '*':
|
||||
insert_all_matches (matches, start, quote_char);
|
||||
insert_all_matches (matches, start, "e_char);
|
||||
break;
|
||||
|
||||
case '?':
|
||||
|
|
@ -1102,10 +1107,14 @@ stat_char (filename)
|
|||
character = 0;
|
||||
if (S_ISDIR (finfo.st_mode))
|
||||
character = '/';
|
||||
#if defined (S_ISCHR)
|
||||
else if (S_ISCHR (finfo.st_mode))
|
||||
character = '%';
|
||||
#endif /* S_ISCHR */
|
||||
#if defined (S_ISBLK)
|
||||
else if (S_ISBLK (finfo.st_mode))
|
||||
character = '#';
|
||||
#endif /* S_ISBLK */
|
||||
#if defined (S_ISLNK)
|
||||
else if (S_ISLNK (finfo.st_mode))
|
||||
character = '@';
|
||||
|
|
@ -1321,7 +1330,7 @@ filename_completion_function (text, state)
|
|||
int state;
|
||||
char *text;
|
||||
{
|
||||
static DIR *directory;
|
||||
static DIR *directory = (DIR *)NULL;
|
||||
static char *filename = (char *)NULL;
|
||||
static char *dirname = (char *)NULL;
|
||||
static char *users_dirname = (char *)NULL;
|
||||
|
|
@ -1333,6 +1342,13 @@ filename_completion_function (text, state)
|
|||
/* If we don't have any state, then do some initialization. */
|
||||
if (state == 0)
|
||||
{
|
||||
/* If we were interrupted before closing the directory or reading
|
||||
all of its contents, close it. */
|
||||
if (directory)
|
||||
{
|
||||
closedir (directory);
|
||||
directory = (DIR *)NULL;
|
||||
}
|
||||
FREE (dirname);
|
||||
FREE (filename);
|
||||
FREE (users_dirname);
|
||||
|
|
|
|||
|
|
@ -25,20 +25,26 @@
|
|||
# include <config.h>
|
||||
#endif
|
||||
|
||||
#include <stdio.h>
|
||||
#include <sys/types.h>
|
||||
|
||||
#if defined (HAVE_UNISTD_H)
|
||||
# include <unistd.h>
|
||||
#endif /* HAVE_UNISTD_H */
|
||||
|
||||
#include "posixstat.h"
|
||||
|
||||
#if defined (HAVE_STDLIB_H)
|
||||
# include <stdlib.h>
|
||||
#else
|
||||
# include "ansi_stdlib.h"
|
||||
#endif /* HAVE_STDLIB_H */
|
||||
|
||||
#include "posixstat.h"
|
||||
#include <stdio.h>
|
||||
|
||||
#if defined (__GO32__)
|
||||
# include <go32.h>
|
||||
# include <pc.h>
|
||||
#endif /* __GO32__ */
|
||||
|
||||
/* System-specific feature definitions and include files. */
|
||||
#include "rldefs.h"
|
||||
|
|
@ -69,7 +75,8 @@ extern void _rl_output_some_chars ();
|
|||
extern int _rl_output_character_function ();
|
||||
extern int _rl_backspace ();
|
||||
|
||||
extern char *term_clreol, *term_im, *term_ic, *term_ei, *term_DC;
|
||||
extern char *term_clreol, *term_clrpag;
|
||||
extern char *term_im, *term_ic, *term_ei, *term_DC;
|
||||
extern char *term_up, *term_dc, *term_cr, *term_IC;
|
||||
extern int screenheight, screenwidth, screenchars;
|
||||
extern int terminal_can_insert, _rl_term_autowrap;
|
||||
|
|
@ -78,8 +85,9 @@ extern int terminal_can_insert, _rl_term_autowrap;
|
|||
by this file. */
|
||||
void _rl_move_cursor_relative (), _rl_output_some_chars ();
|
||||
void _rl_move_vert ();
|
||||
void _rl_clear_to_eol (), _rl_clear_screen ();
|
||||
|
||||
static void update_line (), clear_to_eol (), space_to_eol ();
|
||||
static void update_line (), space_to_eol ();
|
||||
static void delete_chars (), insert_some_chars ();
|
||||
static void cr ();
|
||||
|
||||
|
|
@ -302,7 +310,7 @@ rl_redisplay ()
|
|||
register int in, out, c, linenum, cursor_linenum;
|
||||
register char *line;
|
||||
int c_pos, inv_botlin, lb_botlin, lb_linenum;
|
||||
int newlines, lpos;
|
||||
int newlines, lpos, temp;
|
||||
char *prompt_this_line;
|
||||
|
||||
if (!readline_echoing_p)
|
||||
|
|
@ -405,8 +413,19 @@ rl_redisplay ()
|
|||
|
||||
/* inv_lbreaks[i] is where line i starts in the buffer. */
|
||||
inv_lbreaks[newlines = 0] = 0;
|
||||
lpos = out - wrap_offset;
|
||||
|
||||
for (in = 0, lpos = out - wrap_offset; in < rl_end; in++)
|
||||
/* XXX - what if lpos is already >= screenwidth before we start drawing the
|
||||
contents of the command line? */
|
||||
while (lpos >= screenwidth)
|
||||
{
|
||||
temp = ((newlines + 1) * screenwidth) - ((newlines == 0) ? wrap_offset : 0);
|
||||
inv_lbreaks[++newlines] = temp;
|
||||
lpos -= screenwidth;
|
||||
}
|
||||
|
||||
lb_linenum = 0;
|
||||
for (in = 0; in < rl_end; in++)
|
||||
{
|
||||
c = (unsigned char)rl_line_buffer[in];
|
||||
|
||||
|
|
@ -432,8 +451,6 @@ rl_redisplay ()
|
|||
|
||||
if (lpos + 4 >= screenwidth)
|
||||
{
|
||||
register int temp;
|
||||
|
||||
temp = screenwidth - lpos;
|
||||
inv_lbreaks[++newlines] = out + temp;
|
||||
lpos = 4 - temp;
|
||||
|
|
@ -557,7 +574,7 @@ rl_redisplay ()
|
|||
{
|
||||
nleft = screenwidth + wrap_offset - _rl_last_c_pos;
|
||||
if (nleft)
|
||||
clear_to_eol (nleft);
|
||||
_rl_clear_to_eol (nleft);
|
||||
}
|
||||
|
||||
/* Since the new first line is now visible, save its length. */
|
||||
|
|
@ -575,7 +592,7 @@ rl_redisplay ()
|
|||
tt = VIS_CHARS (linenum);
|
||||
_rl_move_vert (linenum);
|
||||
_rl_move_cursor_relative (0, tt);
|
||||
clear_to_eol
|
||||
_rl_clear_to_eol
|
||||
((linenum == _rl_vis_botlin) ? strlen (tt) : screenwidth);
|
||||
}
|
||||
}
|
||||
|
|
@ -710,7 +727,7 @@ rl_redisplay ()
|
|||
t < visible_first_line_len)
|
||||
{
|
||||
nleft = screenwidth - t;
|
||||
clear_to_eol (nleft);
|
||||
_rl_clear_to_eol (nleft);
|
||||
}
|
||||
visible_first_line_len = out - lmargin - M_OFFSET (lmargin, wrap_offset);
|
||||
if (visible_first_line_len > screenwidth)
|
||||
|
|
@ -962,7 +979,7 @@ update_line (old, new, current_line, omax, nmax, inv_botlin)
|
|||
if (_rl_term_autowrap && current_line < inv_botlin)
|
||||
space_to_eol (lendiff);
|
||||
else
|
||||
clear_to_eol (lendiff);
|
||||
_rl_clear_to_eol (lendiff);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -1293,16 +1310,14 @@ _rl_erase_at_end_of_line (l)
|
|||
|
||||
/* Clear to the end of the line. COUNT is the minimum
|
||||
number of character spaces to clear, */
|
||||
static void
|
||||
clear_to_eol (count)
|
||||
void
|
||||
_rl_clear_to_eol (count)
|
||||
int count;
|
||||
{
|
||||
#if !defined (__GO32__)
|
||||
if (term_clreol)
|
||||
{
|
||||
tputs (term_clreol, 1, _rl_output_character_function);
|
||||
}
|
||||
else
|
||||
tputs (term_clreol, 1, _rl_output_character_function);
|
||||
else if (count)
|
||||
#endif /* !__GO32__ */
|
||||
space_to_eol (count);
|
||||
}
|
||||
|
|
@ -1321,6 +1336,17 @@ space_to_eol (count)
|
|||
_rl_last_c_pos += count;
|
||||
}
|
||||
|
||||
void
|
||||
_rl_clear_screen ()
|
||||
{
|
||||
#if !defined (__GO32__)
|
||||
if (term_clrpag)
|
||||
tputs (term_clrpag, 1, _rl_output_character_function);
|
||||
else
|
||||
#endif /* !__GO32__ */
|
||||
crlf ();
|
||||
}
|
||||
|
||||
/* Insert COUNT characters from STRING to the output stream. */
|
||||
static void
|
||||
insert_some_chars (string, count)
|
||||
|
|
@ -1420,7 +1446,7 @@ _rl_update_final ()
|
|||
/* If the cursor is the only thing on an otherwise-blank last line,
|
||||
compensate so we don't print an extra CRLF. */
|
||||
if (_rl_vis_botlin && _rl_last_c_pos == 0 &&
|
||||
visible_line[inv_lbreaks[_rl_vis_botlin]+1] == 0)
|
||||
visible_line[vis_lbreaks[_rl_vis_botlin]] == 0)
|
||||
{
|
||||
_rl_vis_botlin--;
|
||||
full_lines = 1;
|
||||
|
|
@ -1432,7 +1458,7 @@ _rl_update_final ()
|
|||
char *last_line;
|
||||
last_line = &visible_line[inv_lbreaks[_rl_vis_botlin]];
|
||||
_rl_move_cursor_relative (screenwidth - 1, last_line);
|
||||
clear_to_eol (0);
|
||||
_rl_clear_to_eol (0);
|
||||
putc (last_line[screenwidth - 1], rl_outstream);
|
||||
}
|
||||
_rl_vis_botlin = 0;
|
||||
|
|
|
|||
|
|
@ -1,9 +1,13 @@
|
|||
# This makefile for Readline library documentation is in -*- text -*- mode.
|
||||
# Emacs likes it that way.
|
||||
TEXI2DVI = texi2dvi
|
||||
|
||||
RM = rm -f
|
||||
|
||||
MAKEINFO = makeinfo
|
||||
TEXI2DVI = texi2dvi
|
||||
TEXI2HTML = texi2html
|
||||
QUIETPS = #set this to -q to shut up dvips
|
||||
DVIPS = dvips -D 300 $(QUIETPS) -o $@ # tricky
|
||||
|
||||
INSTALL_DATA = cp
|
||||
infodir = /usr/local/info
|
||||
|
||||
|
|
@ -15,39 +19,42 @@ INFOOBJ = readline.info history.info
|
|||
PSOBJ = readline.ps history.ps
|
||||
HTMLOBJ = readline.html history.html
|
||||
|
||||
all: info dvi html
|
||||
all: info dvi html ps
|
||||
nodvi: info html
|
||||
|
||||
readline.dvi: $(RLSRC)
|
||||
$(TEXI2DVI) rlman.texinfo
|
||||
mv rlman.dvi readline.dvi
|
||||
|
||||
readline.info: $(RLSRC)
|
||||
makeinfo --no-split -o $@ rlman.texinfo
|
||||
$(MAKEINFO) --no-split -o $@ rlman.texinfo
|
||||
|
||||
history.dvi: ${HISTSRC}
|
||||
$(TEXI2DVI) hist.texinfo
|
||||
mv hist.dvi history.dvi
|
||||
|
||||
history.info: ${HISTSRC}
|
||||
makeinfo --no-split -o $@ hist.texinfo
|
||||
$(MAKEINFO) --no-split -o $@ hist.texinfo
|
||||
|
||||
readline.ps: readline.dvi
|
||||
dvips -D 300 -o $@ readline.dvi
|
||||
$(RM) $@
|
||||
$(DVIPS) readline.dvi
|
||||
|
||||
history.ps: history.dvi
|
||||
dvips -D 300 -o $@ history.dvi
|
||||
$(RM) $@
|
||||
$(DVIPS) history.dvi
|
||||
|
||||
readline.html: ${RLSRC}
|
||||
texi2html rlman.texinfo
|
||||
$(TEXI2HTML) rlman.texinfo
|
||||
sed -e 's:rlman.html:readline.html:' -e 's:rlman_toc.html:readline_toc.html:' rlman.html > readline.html
|
||||
sed -e 's:rlman.html:readline.html:' -e 's:rlman_toc.html:readline_toc.html:' rlman_toc.html > readline_toc.html
|
||||
rm -f rlman.html rlman_toc.html
|
||||
$(RM) rlman.html rlman_toc.html
|
||||
|
||||
history.html: ${HISTSRC}
|
||||
texi2html hist.texinfo
|
||||
$(TEXI2HTML) hist.texinfo
|
||||
sed -e 's:hist.html:history.html:' -e 's:hist_toc.html:history_toc.html:' hist.html > history.html
|
||||
sed -e 's:hist.html:history.html:' -e 's:hist_toc.html:history_toc.html:' hist_toc.html > history_toc.html
|
||||
rm -f hist.html hist_toc.html
|
||||
$(RM) hist.html hist_toc.html
|
||||
|
||||
info: $(INFOOBJ)
|
||||
dvi: $(DVIOBJ)
|
||||
|
|
|
|||
|
|
@ -415,6 +415,17 @@ If non-zero, single-quoted words are not scanned for the history expansion
|
|||
character. The default value is 0.
|
||||
@end deftypevar
|
||||
|
||||
@deftypevar {Function *} history_inhibit_expansion_function
|
||||
This should be set to the address of a function that takes two arguments:
|
||||
a @code{char *} (@var{string}) and an integer index into that string (@var{i}).
|
||||
It should return a non-zero value if the history expansion starting at
|
||||
@var{string[i]} should not be performed; zero if the expansion should
|
||||
be done.
|
||||
It is intended for use by applications like Bash that use the history
|
||||
expansion character for additional purposes.
|
||||
By default, this variable is set to NULL.
|
||||
@end deftypevar
|
||||
|
||||
@node History Programming Example
|
||||
@section History Programming Example
|
||||
|
||||
|
|
|
|||
|
|
@ -312,7 +312,7 @@ to get a character from the input stream. By default, it is set to
|
|||
(@pxref{Utility Functions}).
|
||||
@end deftypevar
|
||||
|
||||
@deftypevar {Function *} rl_redisplay_function
|
||||
@deftypevar {VFunction *} rl_redisplay_function
|
||||
If non-zero, @code{readline} will call indirectly through this pointer
|
||||
to update the display with the current contents of the editing buffer.
|
||||
By default, it is set to @code{rl_redisplay}, the default @code{readline}
|
||||
|
|
@ -417,6 +417,11 @@ Return the keymap matching @var{name}. @var{name} is one which would
|
|||
be supplied in a @code{set keymap} inputrc line (@pxref{Readline Init File}).
|
||||
@end deftypefun
|
||||
|
||||
@deftypefun {char *} rl_get_keymap_name (Keymap keymap)
|
||||
Return the name matching @var{keymap}. @var{name} is one which would
|
||||
be supplied in a @code{set keymap} inputrc line (@pxref{Readline Init File}).
|
||||
@end deftypefun
|
||||
|
||||
@node Binding Keys
|
||||
@subsection Binding Keys
|
||||
|
||||
|
|
@ -576,7 +581,7 @@ that text.
|
|||
@node Redisplay
|
||||
@subsection Redisplay
|
||||
|
||||
@deftypefun int rl_redisplay ()
|
||||
@deftypefun void rl_redisplay ()
|
||||
Change what's displayed on the screen to reflect the current contents
|
||||
of @code{rl_line_buffer}.
|
||||
@end deftypefun
|
||||
|
|
@ -650,6 +655,11 @@ before Readline attempts to read characters from the terminal with
|
|||
@code{rl_read_key ()}.
|
||||
@end deftypefun
|
||||
|
||||
@deftypefun rl_extend_line_buffer (int len)
|
||||
Ensure that @code{rl_line_buffer} has enough space to hold @var{len}
|
||||
characters, possibly reallocating it if necessary.
|
||||
@end deftypefun
|
||||
|
||||
@deftypefun int rl_initialize ()
|
||||
Initialize or re-initialize Readline's internal state.
|
||||
@end deftypefun
|
||||
|
|
@ -870,7 +880,7 @@ that does the initial simple matching selection algorithm (see
|
|||
This is a pointer to the generator function for @code{completion_matches
|
||||
()}. If the value of @code{rl_completion_entry_function} is
|
||||
@code{(Function *)NULL} then the default filename generator function,
|
||||
@code{filename_entry_function ()}, is used.
|
||||
@code{filename_completion_function ()}, is used.
|
||||
@end deftypevar
|
||||
|
||||
@node Completion Functions
|
||||
|
|
@ -1069,7 +1079,7 @@ by @code{rl_filename_quoting_function}.
|
|||
@end deftypevar
|
||||
|
||||
@deftypevar int rl_inhibit_completion
|
||||
If this variable is non-zero, completion is inhibited. The completion
|
||||
If this variable is non-zero, completion is inhibit<ed. The completion
|
||||
character will be inserted as any other bound to @code{self-insert}.
|
||||
@end deftypevar
|
||||
|
||||
|
|
|
|||
|
|
@ -605,31 +605,31 @@ Meta-Control-h: backward-kill-word Text after the function name is ignored
|
|||
#
|
||||
# Arrow keys in keypad mode
|
||||
#
|
||||
#"\M-OD" backward-char
|
||||
#"\M-OC" forward-char
|
||||
#"\M-OA" previous-history
|
||||
#"\M-OB" next-history
|
||||
#"\M-OD": backward-char
|
||||
#"\M-OC": forward-char
|
||||
#"\M-OA": previous-history
|
||||
#"\M-OB": next-history
|
||||
#
|
||||
# Arrow keys in ANSI mode
|
||||
#
|
||||
"\M-[D" backward-char
|
||||
"\M-[C" forward-char
|
||||
"\M-[A" previous-history
|
||||
"\M-[B" next-history
|
||||
"\M-[D": backward-char
|
||||
"\M-[C": forward-char
|
||||
"\M-[A": previous-history
|
||||
"\M-[B": next-history
|
||||
#
|
||||
# Arrow keys in 8 bit keypad mode
|
||||
#
|
||||
#"\M-\C-OD" backward-char
|
||||
#"\M-\C-OC" forward-char
|
||||
#"\M-\C-OA" previous-history
|
||||
#"\M-\C-OB" next-history
|
||||
#"\M-\C-OD": backward-char
|
||||
#"\M-\C-OC": forward-char
|
||||
#"\M-\C-OA": previous-history
|
||||
#"\M-\C-OB": next-history
|
||||
#
|
||||
# Arrow keys in 8 bit ANSI mode
|
||||
#
|
||||
#"\M-\C-[D" backward-char
|
||||
#"\M-\C-[C" forward-char
|
||||
#"\M-\C-[A" previous-history
|
||||
#"\M-\C-[B" next-history
|
||||
#"\M-\C-[D": backward-char
|
||||
#"\M-\C-[C": forward-char
|
||||
#"\M-\C-[A": previous-history
|
||||
#"\M-\C-[B": next-history
|
||||
|
||||
C-q: quoted-insert
|
||||
|
||||
|
|
@ -921,10 +921,18 @@ Add this digit to the argument already accumulating, or start a new
|
|||
argument. @key{M--} starts a negative argument.
|
||||
|
||||
@item universal-argument ()
|
||||
Each time this is executed, the argument count is multiplied by four.
|
||||
This is another way to specify an argument.
|
||||
If this command is followed by one or more digits, optionally with a
|
||||
leading minus sign, those digits define the argument.
|
||||
If the command is followed by digits, executing @code{universal-argument}
|
||||
again ends the numeric argument, but is otherwise ignored.
|
||||
As a special case, if this command is immediately followed by a
|
||||
character that is neither a digit or minus sign, the argument count
|
||||
for the next command is multiplied by four.
|
||||
The argument count is initially one, so executing this function the
|
||||
first time makes the argument count four. By default, this is not
|
||||
bound to a key.
|
||||
first time makes the argument count four, a second time makes the
|
||||
argument count sixteen, and so on.
|
||||
By default, this is not bound to a key.
|
||||
@end ftable
|
||||
|
||||
@node Commands For Completion
|
||||
|
|
@ -1122,6 +1130,12 @@ word expansions.
|
|||
@item history-expand-line (M-^)
|
||||
Perform history expansion on the current line.
|
||||
|
||||
@item alias-expand-line
|
||||
Perform alias expansion on the current line (@pxref{Aliases}).
|
||||
|
||||
@item history-and-alias-expand-line
|
||||
Perform history and alias expansion on the current line.
|
||||
|
||||
@item insert-last-argument (M-., M-_)
|
||||
A synonym for @code{yank-last-arg}.
|
||||
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
# This is the Makefile for the examples subdirectory of readline. -*- text -*-
|
||||
#
|
||||
EXECUTABLES = fileman rltest
|
||||
EXECUTABLES = fileman rltest rl
|
||||
CFLAGS = -g -I../.. -I..
|
||||
LDFLAGS = -g -L..
|
||||
|
||||
|
|
@ -9,6 +9,10 @@ LDFLAGS = -g -L..
|
|||
|
||||
all: $(EXECUTABLES)
|
||||
|
||||
|
||||
rl: rl.o
|
||||
$(CC) $(LDFLAGS) -o $@ rl.o -lreadline -ltermcap
|
||||
|
||||
fileman: fileman.o
|
||||
$(CC) $(LDFLAGS) -o $@ fileman.o -lreadline -ltermcap
|
||||
|
||||
|
|
@ -17,3 +21,4 @@ rltest: rltest.o
|
|||
|
||||
fileman.o: fileman.c
|
||||
rltest.o: rltest.c
|
||||
rl.o: rl.c
|
||||
|
|
|
|||
|
|
@ -1,15 +1,38 @@
|
|||
/* fileman.c -- A tiny application which demonstrates how to use the
|
||||
GNU Readline library. This application interactively allows users
|
||||
to manipulate files and their modes. */
|
||||
/*
|
||||
* Remove the next line if you're compiling this against an installed
|
||||
* libreadline.a
|
||||
*/
|
||||
#define READLINE_LIBRARY
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include <config.h>
|
||||
#endif
|
||||
|
||||
#include <sys/types.h>
|
||||
#ifdef HAVE_SYS_FILE_H
|
||||
#include <sys/file.h>
|
||||
#endif
|
||||
#include <sys/stat.h>
|
||||
|
||||
#include <stdio.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/file.h>
|
||||
#include <sys/stat.h>
|
||||
#include <sys/errno.h>
|
||||
#include <errno.h>
|
||||
|
||||
#include <readline/readline.h>
|
||||
#include <readline/history.h>
|
||||
#if defined (HAVE_STRING_H)
|
||||
# include <string.h>
|
||||
#else /* !HAVE_STRING_H */
|
||||
# include <strings.h>
|
||||
#endif /* !HAVE_STRING_H */
|
||||
|
||||
#ifdef READLINE_LIBRARY
|
||||
# include "readline.h"
|
||||
# include "history.h"
|
||||
#else
|
||||
# include <readline/readline.h>
|
||||
# include <readline/history.h>
|
||||
#endif
|
||||
|
||||
extern char *getwd ();
|
||||
extern char *xmalloc ();
|
||||
|
|
@ -54,7 +77,7 @@ int done;
|
|||
|
||||
char *
|
||||
dupstr (s)
|
||||
int s;
|
||||
char *s;
|
||||
{
|
||||
char *r;
|
||||
|
||||
|
|
@ -304,7 +327,8 @@ com_stat (arg)
|
|||
|
||||
printf ("Statistics for `%s':\n", arg);
|
||||
|
||||
printf ("%s has %d link%s, and is %d byte%s in length.\n", arg,
|
||||
printf ("%s has %d link%s, and is %d byte%s in length.\n",
|
||||
arg,
|
||||
finfo.st_nlink,
|
||||
(finfo.st_nlink == 1) ? "" : "s",
|
||||
finfo.st_size,
|
||||
|
|
|
|||
115
lib/readline/examples/rl.c
Normal file
115
lib/readline/examples/rl.c
Normal file
|
|
@ -0,0 +1,115 @@
|
|||
/*
|
||||
* rl - command-line interface to read a line from the standard input
|
||||
* (or another fd) using readline.
|
||||
*
|
||||
* usage: rl [-p prompt] [-u unit] [-d default]
|
||||
*/
|
||||
|
||||
/*
|
||||
* Remove the next line if you're compiling this against an installed
|
||||
* libreadline.a
|
||||
*/
|
||||
#define READLINE_LIBRARY
|
||||
|
||||
#if defined (HAVE_CONFIG_H)
|
||||
#include <config.h>
|
||||
#endif
|
||||
|
||||
#include <stdio.h>
|
||||
#include <sys/types.h>
|
||||
#include "posixstat.h"
|
||||
#include "readline.h"
|
||||
#include "history.h"
|
||||
|
||||
extern int optind;
|
||||
extern char *optarg;
|
||||
|
||||
extern char *strrchr();
|
||||
|
||||
static char *progname;
|
||||
static char *deftext;
|
||||
|
||||
static int
|
||||
set_deftext ()
|
||||
{
|
||||
if (deftext)
|
||||
{
|
||||
rl_insert_text (deftext);
|
||||
deftext = (char *)NULL;
|
||||
rl_startup_hook = (Function *)NULL;
|
||||
}
|
||||
}
|
||||
|
||||
usage()
|
||||
{
|
||||
fprintf (stderr, "%s: usage: %s [-p prompt] [-u unit] [-d default]\n",
|
||||
progname, progname);
|
||||
}
|
||||
|
||||
main (argc, argv)
|
||||
int argc;
|
||||
char **argv;
|
||||
{
|
||||
char *temp, *prompt;
|
||||
struct stat sb;
|
||||
int done, opt, fd;
|
||||
FILE *ifp;
|
||||
|
||||
progname = strrchr(argv[0], '/');
|
||||
if (progname == 0)
|
||||
progname = argv[0];
|
||||
else
|
||||
progname++;
|
||||
|
||||
/* defaults */
|
||||
prompt = "readline$ ";
|
||||
fd = 0;
|
||||
deftext = (char *)0;
|
||||
|
||||
while ((opt = getopt(argc, argv, "p:u:d:")) != EOF)
|
||||
{
|
||||
switch (opt)
|
||||
{
|
||||
case 'p':
|
||||
prompt = optarg;
|
||||
break;
|
||||
case 'u':
|
||||
fd = atoi(optarg);
|
||||
if (fd < 0)
|
||||
{
|
||||
fprintf (stderr, "%s: bad file descriptor `%s'\n", progname, optarg);
|
||||
exit (2);
|
||||
}
|
||||
break;
|
||||
case 'd':
|
||||
deftext = optarg;
|
||||
break;
|
||||
default:
|
||||
usage ();
|
||||
exit (2);
|
||||
}
|
||||
}
|
||||
|
||||
if (fd != 0)
|
||||
{
|
||||
if (fstat (fd, &sb) < 0)
|
||||
{
|
||||
fprintf (stderr, "%s: %d: bad file descriptor\n", progname, fd);
|
||||
exit (1);
|
||||
}
|
||||
ifp = fdopen (fd, "r");
|
||||
rl_instream = ifp;
|
||||
}
|
||||
|
||||
if (deftext && *deftext)
|
||||
rl_startup_hook = set_deftext;
|
||||
|
||||
temp = readline (prompt);
|
||||
|
||||
/* Test for EOF. */
|
||||
if (temp == 0)
|
||||
exit (1);
|
||||
|
||||
puts (temp);
|
||||
exit (0);
|
||||
}
|
||||
|
|
@ -4,10 +4,20 @@
|
|||
/* */
|
||||
/* **************************************************************** */
|
||||
|
||||
/*
|
||||
* Remove the next line if you're compiling this against an installed
|
||||
* libreadline.a
|
||||
*/
|
||||
#define READLINE_LIBRARY
|
||||
|
||||
#if defined (HAVE_CONFIG_H)
|
||||
#include <config.h>
|
||||
#endif
|
||||
|
||||
#include <stdio.h>
|
||||
#include <sys/types.h>
|
||||
#include "../readline.h"
|
||||
#include "../history.h"
|
||||
#include "readline.h"
|
||||
#include "history.h"
|
||||
|
||||
main ()
|
||||
{
|
||||
|
|
|
|||
|
|
@ -76,6 +76,7 @@ static FUNMAP default_funmap[] = {
|
|||
{ "do-lowercase-version", rl_do_lowercase_version },
|
||||
{ "downcase-word", rl_downcase_word },
|
||||
{ "dump-functions", rl_dump_functions },
|
||||
{ "dump-macros", rl_dump_macros },
|
||||
{ "dump-variables", rl_dump_variables },
|
||||
{ "emacs-editing-mode", rl_emacs_editing_mode },
|
||||
{ "end-kbd-macro", rl_end_kbd_macro },
|
||||
|
|
|
|||
|
|
@ -59,11 +59,7 @@ static char *history_find_word ();
|
|||
|
||||
extern int history_offset;
|
||||
|
||||
#if defined (SHELL)
|
||||
extern char *single_quote ();
|
||||
#else
|
||||
static char *single_quote ();
|
||||
#endif /* !SHELL */
|
||||
static char *quote_breaks ();
|
||||
|
||||
extern char *xmalloc (), *xrealloc ();
|
||||
|
|
@ -91,6 +87,10 @@ char *history_no_expand_chars = " \t\n\r=";
|
|||
The default is 0. */
|
||||
int history_quotes_inhibit_expansion = 0;
|
||||
|
||||
/* If set, this points to a function that is called to verify that a
|
||||
particular history expansion should be performed. */
|
||||
Function *history_inhibit_expansion_function;
|
||||
|
||||
/* **************************************************************** */
|
||||
/* */
|
||||
/* History Expansion */
|
||||
|
|
@ -289,38 +289,6 @@ hist_string_extract_single_quoted (string, sindex)
|
|||
*sindex = i;
|
||||
}
|
||||
|
||||
#if !defined (SHELL)
|
||||
/* Does shell-like quoting using single quotes. */
|
||||
static char *
|
||||
single_quote (string)
|
||||
char *string;
|
||||
{
|
||||
register int c;
|
||||
char *result, *r, *s;
|
||||
|
||||
result = (char *)xmalloc (3 + (3 * strlen (string)));
|
||||
r = result;
|
||||
*r++ = '\'';
|
||||
|
||||
for (s = string; s && (c = *s); s++)
|
||||
{
|
||||
*r++ = c;
|
||||
|
||||
if (c == '\'')
|
||||
{
|
||||
*r++ = '\\'; /* insert escaped single quote */
|
||||
*r++ = '\'';
|
||||
*r++ = '\''; /* start new quoted string */
|
||||
}
|
||||
}
|
||||
|
||||
*r++ = '\'';
|
||||
*r = '\0';
|
||||
|
||||
return (result);
|
||||
}
|
||||
#endif /* !SHELL */
|
||||
|
||||
static char *
|
||||
quote_breaks (s)
|
||||
char *s;
|
||||
|
|
@ -888,19 +856,14 @@ history_expand (hstring, output)
|
|||
{
|
||||
if (!cc || member (cc, history_no_expand_chars))
|
||||
continue;
|
||||
#if defined (SHELL)
|
||||
/* The shell uses ! as a pattern negation character
|
||||
in globbing [...] expressions, so let those pass
|
||||
without expansion. */
|
||||
else if (i > 0 && (string[i - 1] == '[') &&
|
||||
member (']', string + i + 1))
|
||||
/* If the calling application has set
|
||||
history_inhibit_expansion_function to a function that checks
|
||||
for special cases that should not be history expanded,
|
||||
call the function and skip the expansion if it returns a
|
||||
non-zero value. */
|
||||
else if (history_inhibit_expansion_function &&
|
||||
(*history_inhibit_expansion_function) (string, i))
|
||||
continue;
|
||||
/* The shell uses ! as the indirect expansion character, so
|
||||
let those expansions pass as well. */
|
||||
else if (i > 1 && string[i - 1] == '{' && string[i - 2] == '$' &&
|
||||
member ('}', string + i + 1))
|
||||
continue;
|
||||
#endif /* SHELL */
|
||||
else
|
||||
break;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -52,6 +52,16 @@
|
|||
# include <strings.h>
|
||||
#endif /* !HAVE_STRING_H */
|
||||
|
||||
#if defined (__EMX__)
|
||||
# ifndef O_BINARY
|
||||
# define O_BINARY 0
|
||||
# endif
|
||||
#else /* !__EMX__ */
|
||||
/* If we're not compiling for __EMX__, we don't want this at all. Ever. */
|
||||
# undef O_BINARY
|
||||
# define O_BINARY 0
|
||||
#endif /* !__EMX__ */
|
||||
|
||||
#include <errno.h>
|
||||
#if !defined (errno)
|
||||
extern int errno;
|
||||
|
|
@ -60,6 +70,9 @@ extern int errno;
|
|||
#include "history.h"
|
||||
#include "histlib.h"
|
||||
|
||||
/* Functions imported from shell.c */
|
||||
extern char *get_env_value ();
|
||||
|
||||
extern char *xmalloc (), *xrealloc ();
|
||||
|
||||
/* Return the string that should be used in the place of this
|
||||
|
|
@ -77,7 +90,7 @@ history_filename (filename)
|
|||
if (return_val)
|
||||
return (return_val);
|
||||
|
||||
home = getenv ("HOME");
|
||||
home = get_env_value ("HOME");
|
||||
|
||||
if (home == 0)
|
||||
{
|
||||
|
|
@ -121,7 +134,7 @@ read_history_range (filename, from, to)
|
|||
struct stat finfo;
|
||||
|
||||
input = history_filename (filename);
|
||||
file = open (input, O_RDONLY, 0666);
|
||||
file = open (input, O_RDONLY|O_BINARY, 0666);
|
||||
|
||||
if ((file < 0) || (fstat (file, &finfo) == -1))
|
||||
goto error_and_exit;
|
||||
|
|
@ -194,11 +207,12 @@ history_truncate_file (fname, lines)
|
|||
{
|
||||
register int i;
|
||||
int file, chars_read;
|
||||
char *buffer = (char *)NULL, *filename;
|
||||
char *buffer, *filename;
|
||||
struct stat finfo;
|
||||
|
||||
buffer = (char *)NULL;
|
||||
filename = history_filename (fname);
|
||||
file = open (filename, O_RDONLY, 0666);
|
||||
file = open (filename, O_RDONLY|O_BINARY, 0666);
|
||||
|
||||
if (file == -1 || fstat (file, &finfo) == -1)
|
||||
goto truncate_exit;
|
||||
|
|
@ -232,7 +246,7 @@ history_truncate_file (fname, lines)
|
|||
|
||||
/* Write only if there are more lines in the file than we want to
|
||||
truncate to. */
|
||||
if (i && ((file = open (filename, O_WRONLY|O_TRUNC, 0666)) != -1))
|
||||
if (i && ((file = open (filename, O_WRONLY|O_TRUNC|O_BINARY, 0666)) != -1))
|
||||
{
|
||||
write (file, buffer + i, finfo.st_size - i);
|
||||
close (file);
|
||||
|
|
@ -255,10 +269,11 @@ history_do_write (filename, nelements, overwrite)
|
|||
int nelements, overwrite;
|
||||
{
|
||||
register int i;
|
||||
char *output = history_filename (filename);
|
||||
char *output;
|
||||
int file, mode;
|
||||
|
||||
mode = overwrite ? O_WRONLY | O_CREAT | O_TRUNC : O_WRONLY | O_APPEND;
|
||||
mode = overwrite ? O_WRONLY|O_CREAT|O_TRUNC|O_BINARY : O_WRONLY|O_APPEND|O_BINARY;
|
||||
output = history_filename (filename);
|
||||
|
||||
if ((file = open (output, mode, 0666)) == -1)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -22,6 +22,14 @@
|
|||
#ifndef _HISTORY_H_
|
||||
#define _HISTORY_H_
|
||||
|
||||
#if !defined (_FUNCTION_DEF)
|
||||
# define _FUNCTION_DEF
|
||||
typedef int Function ();
|
||||
typedef void VFunction ();
|
||||
typedef char *CPFunction ();
|
||||
typedef char **CPPFunction ();
|
||||
#endif
|
||||
|
||||
/* The structure used to store a history entry. */
|
||||
typedef struct _hist_entry {
|
||||
char *line;
|
||||
|
|
@ -207,4 +215,9 @@ extern char *history_no_expand_chars;
|
|||
extern char *history_search_delimiter_chars;
|
||||
extern int history_quotes_inhibit_expansion;
|
||||
|
||||
/* If set, this function is called to decide whether or not a particular
|
||||
history expansion should be treated as a special case for the calling
|
||||
application and not expanded. */
|
||||
extern Function *history_inhibit_expansion_function;
|
||||
|
||||
#endif /* !_HISTORY_H_ */
|
||||
|
|
|
|||
|
|
@ -30,13 +30,19 @@
|
|||
# include <config.h>
|
||||
#endif
|
||||
|
||||
#include <sys/types.h>
|
||||
|
||||
#include <stdio.h>
|
||||
|
||||
#if defined (HAVE_UNISTD_H)
|
||||
# include <unistd.h>
|
||||
#endif
|
||||
|
||||
#include <sys/types.h>
|
||||
#if defined (HAVE_STDLIB_H)
|
||||
# include <stdlib.h>
|
||||
#else
|
||||
# include "ansi_stdlib.h"
|
||||
#endif
|
||||
|
||||
#include "rldefs.h"
|
||||
#include "readline.h"
|
||||
|
|
@ -287,7 +293,8 @@ rl_search_history (direction, invoking_key)
|
|||
rl_end = strlen (rl_line_buffer);
|
||||
_rl_restore_prompt();
|
||||
rl_clear_message ();
|
||||
free (allocated_line);
|
||||
if (allocated_line)
|
||||
free (allocated_line);
|
||||
free (lines);
|
||||
return 0;
|
||||
|
||||
|
|
@ -403,7 +410,8 @@ rl_search_history (direction, invoking_key)
|
|||
rl_point = line_index;
|
||||
rl_clear_message ();
|
||||
|
||||
free (allocated_line);
|
||||
if (allocated_line)
|
||||
free (allocated_line);
|
||||
free (lines);
|
||||
|
||||
return 0;
|
||||
|
|
|
|||
|
|
@ -53,6 +53,7 @@ extern Function *rl_last_func;
|
|||
|
||||
extern void _rl_init_argument ();
|
||||
extern int _rl_set_mark_at_pos ();
|
||||
extern void _rl_fix_point ();
|
||||
extern void _rl_abort_internal ();
|
||||
|
||||
extern char *xmalloc (), *xrealloc ();
|
||||
|
|
@ -384,7 +385,11 @@ int
|
|||
rl_kill_region (count, ignore)
|
||||
int count, ignore;
|
||||
{
|
||||
return (region_kill_internal (1));
|
||||
int r;
|
||||
|
||||
r = region_kill_internal (1);
|
||||
_rl_fix_point (1);
|
||||
return r;
|
||||
}
|
||||
|
||||
/* Copy COUNT words to the kill ring. DIR says which direction we look
|
||||
|
|
@ -521,7 +526,7 @@ rl_yank_nth_arg (count, ignore)
|
|||
inserts it right *after* rl_point. */
|
||||
if (rl_editing_mode == vi_mode)
|
||||
{
|
||||
rl_vi_append_mode ();
|
||||
rl_vi_append_mode (1, ignore);
|
||||
rl_insert_text (" ");
|
||||
}
|
||||
#endif /* VI_MODE */
|
||||
|
|
|
|||
|
|
@ -25,6 +25,8 @@
|
|||
# include <config.h>
|
||||
#endif
|
||||
|
||||
#include <sys/types.h>
|
||||
|
||||
#if defined (HAVE_UNISTD_H)
|
||||
# include <unistd.h>
|
||||
#endif /* HAVE_UNISTD_H */
|
||||
|
|
@ -46,7 +48,11 @@
|
|||
extern int _rl_convert_meta_chars_to_ascii;
|
||||
extern int _rl_output_meta_chars;
|
||||
extern int _rl_meta_flag;
|
||||
|
||||
|
||||
/* Functions imported from shell.c */
|
||||
extern char *get_env_value ();
|
||||
|
||||
#if !defined (HAVE_SETLOCALE)
|
||||
/* A list of legal values for the LANG or LC_CTYPE environment variables.
|
||||
If a locale name in this list is the value for the LC_ALL, LC_CTYPE,
|
||||
or LANG environment variable (using the first of those with a value),
|
||||
|
|
@ -69,6 +75,7 @@ static char *legal_lang_values[] =
|
|||
|
||||
static char *normalize_codeset ();
|
||||
static char *find_codeset ();
|
||||
#endif /* !HAVE_SETLOCALE */
|
||||
|
||||
/* Check for LC_ALL, LC_CTYPE, and LANG and use the first with a value
|
||||
to decide the defaults for 8-bit character input and output. Returns
|
||||
|
|
@ -76,12 +83,33 @@ static char *find_codeset ();
|
|||
int
|
||||
_rl_init_eightbit ()
|
||||
{
|
||||
/* If we have setlocale(3), just check the current LC_CTYPE category
|
||||
value, and go into eight-bit mode if it's not C or POSIX. */
|
||||
#if defined (HAVE_SETLOCALE)
|
||||
char *t;
|
||||
|
||||
/* Set the LC_CTYPE locale category from environment variables. */
|
||||
t = setlocale (LC_CTYPE, "");
|
||||
if (t && *t && (t[0] != 'C' || t[1]) && (STREQ (t, "POSIX") == 0))
|
||||
{
|
||||
_rl_meta_flag = 1;
|
||||
_rl_convert_meta_chars_to_ascii = 0;
|
||||
_rl_output_meta_chars = 1;
|
||||
return (1);
|
||||
}
|
||||
else
|
||||
return (0);
|
||||
|
||||
#else /* !HAVE_SETLOCALE */
|
||||
char *lspec, *t;
|
||||
int i;
|
||||
|
||||
lspec = getenv ("LC_ALL");
|
||||
if (lspec == 0) lspec = getenv ("LC_CTYPE");
|
||||
if (lspec == 0) lspec = getenv ("LANG");
|
||||
/* We don't have setlocale. Finesse it. Check the environment for the
|
||||
appropriate variables and set eight-bit mode if they have the right
|
||||
values. */
|
||||
lspec = get_env_value ("LC_ALL");
|
||||
if (lspec == 0) lspec = get_env_value ("LC_CTYPE");
|
||||
if (lspec == 0) lspec = get_env_value ("LANG");
|
||||
if (lspec == 0 || (t = normalize_codeset (lspec)) == 0)
|
||||
return (0);
|
||||
for (i = 0; t && legal_lang_values[i]; i++)
|
||||
|
|
@ -90,15 +118,15 @@ _rl_init_eightbit ()
|
|||
_rl_meta_flag = 1;
|
||||
_rl_convert_meta_chars_to_ascii = 0;
|
||||
_rl_output_meta_chars = 1;
|
||||
#if defined (HAVE_SETLOCALE)
|
||||
setlocale (LC_CTYPE, lspec);
|
||||
#endif
|
||||
break;
|
||||
}
|
||||
free (t);
|
||||
return (legal_lang_values[i] ? 1 : 0);
|
||||
|
||||
#endif /* !HAVE_SETLOCALE */
|
||||
}
|
||||
|
||||
#if !defined (HAVE_SETLOCALE)
|
||||
static char *
|
||||
normalize_codeset (codeset)
|
||||
char *codeset;
|
||||
|
|
@ -196,3 +224,4 @@ find_codeset (name, lenp)
|
|||
|
||||
return result;
|
||||
}
|
||||
#endif /* !HAVE_SETLOCALE */
|
||||
|
|
|
|||
|
|
@ -42,7 +42,7 @@
|
|||
# define D_NAMLEN(d) ((d)->d_namlen)
|
||||
#endif /* !HAVE_DIRENT_H */
|
||||
|
||||
#if defined (STRUCT_DIRENT_HAS_D_INO)
|
||||
#if defined (STRUCT_DIRENT_HAS_D_INO) && !defined (STRUCT_DIRENT_HAS_D_FILENO)
|
||||
# define d_fileno d_ino
|
||||
#endif
|
||||
|
||||
|
|
|
|||
20
lib/readline/posixjmp.h
Normal file
20
lib/readline/posixjmp.h
Normal file
|
|
@ -0,0 +1,20 @@
|
|||
/* posixjmp.h -- wrapper for setjmp.h with changes for POSIX systems. */
|
||||
|
||||
#ifndef _POSIXJMP_H_
|
||||
#define _POSIXJMP_H_
|
||||
|
||||
#include <setjmp.h>
|
||||
|
||||
/* This *must* be included *after* config.h */
|
||||
|
||||
#if defined (HAVE_POSIX_SIGSETJMP)
|
||||
# define procenv_t sigjmp_buf
|
||||
# undef setjmp
|
||||
# define setjmp(x) sigsetjmp((x), 1)
|
||||
# undef longjmp
|
||||
# define longjmp(x, n) siglongjmp((x), (n))
|
||||
#else
|
||||
# define procenv_t jmp_buf
|
||||
#endif
|
||||
|
||||
#endif /* _POSIXJMP_H_ */
|
||||
|
|
@ -49,17 +49,25 @@
|
|||
|
||||
#include <signal.h>
|
||||
#include <stdio.h>
|
||||
#include <setjmp.h>
|
||||
#include "posixjmp.h"
|
||||
|
||||
/* System-specific feature definitions and include files. */
|
||||
#include "rldefs.h"
|
||||
|
||||
#include "tcap.h"
|
||||
#if defined (__EMX__)
|
||||
# define INCL_DOSPROCESS
|
||||
# include <os2.h>
|
||||
#endif /* __EMX__ */
|
||||
|
||||
/* Some standard library routines. */
|
||||
#include "readline.h"
|
||||
#include "history.h"
|
||||
|
||||
#ifndef RL_LIBRARY_VERSION
|
||||
# define RL_LIBRARY_VERSION "2.1-bash"
|
||||
#endif
|
||||
|
||||
/* Evaluates its arguments multiple times. */
|
||||
#define SWAP(s, e) do { int t; t = s; s = e; e = t; } while (0)
|
||||
|
||||
/* NOTE: Functions and variables prefixed with `_rl_' are
|
||||
|
|
@ -75,7 +83,6 @@ extern void _rl_get_screen_size ();
|
|||
|
||||
extern int _rl_enable_meta;
|
||||
extern int _rl_term_autowrap;
|
||||
extern char *term_backspace, *term_clreol, *term_clrpag;
|
||||
extern int screenwidth, screenheight, screenchars;
|
||||
|
||||
/* Variables and functions imported from rltty.c. */
|
||||
|
|
@ -99,9 +106,17 @@ extern int rl_read_key ();
|
|||
/* Functions imported from nls.c */
|
||||
extern int _rl_init_eightbit ();
|
||||
|
||||
/* Functions imported from shell.c */
|
||||
extern char *get_env_value ();
|
||||
|
||||
/* External redisplay functions and variables from display.c */
|
||||
extern void _rl_move_vert ();
|
||||
extern void _rl_update_final ();
|
||||
extern void _rl_clear_to_eol ();
|
||||
extern void _rl_clear_screen ();
|
||||
|
||||
extern void _rl_save_prompt ();
|
||||
extern void _rl_restore_prompt ();
|
||||
|
||||
extern void _rl_erase_at_end_of_line ();
|
||||
extern void _rl_move_cursor_relative ();
|
||||
|
|
@ -153,6 +168,7 @@ static void readline_default_bindings ();
|
|||
#endif /* !__GO32__ */
|
||||
|
||||
#if defined (__GO32__)
|
||||
# include <go32.h>
|
||||
# include <pc.h>
|
||||
# undef HANDLE_SIGNALS
|
||||
#endif /* __GO32__ */
|
||||
|
|
@ -165,7 +181,7 @@ extern char *xmalloc (), *xrealloc ();
|
|||
/* */
|
||||
/* **************************************************************** */
|
||||
|
||||
char *rl_library_version = "2.1";
|
||||
char *rl_library_version = RL_LIBRARY_VERSION;
|
||||
|
||||
/* A pointer to the keymap that is currently in use.
|
||||
By default, it is the standard emacs keymap. */
|
||||
|
|
@ -174,6 +190,11 @@ Keymap _rl_keymap = emacs_standard_keymap;
|
|||
/* The current style of editing. */
|
||||
int rl_editing_mode = emacs_mode;
|
||||
|
||||
/* Non-zero if we called this function from _rl_dispatch(). It's present
|
||||
so functions can find out whether they were called from a key binding
|
||||
or directly from an application. */
|
||||
int rl_dispatching;
|
||||
|
||||
/* Non-zero if the previous command was a kill command. */
|
||||
int _rl_last_command_was_kill = 0;
|
||||
|
||||
|
|
@ -208,7 +229,7 @@ int rl_done;
|
|||
Function *rl_last_func = (Function *)NULL;
|
||||
|
||||
/* Top level environment for readline_internal (). */
|
||||
jmp_buf readline_top_level;
|
||||
procenv_t readline_top_level;
|
||||
|
||||
/* The streams we interact with. */
|
||||
FILE *_rl_in_stream, *_rl_out_stream;
|
||||
|
|
@ -360,7 +381,7 @@ readline_internal_setup ()
|
|||
(*rl_redisplay_function) ();
|
||||
#if defined (VI_MODE)
|
||||
if (rl_editing_mode == vi_mode)
|
||||
rl_vi_insertion_mode ();
|
||||
rl_vi_insertion_mode (1, 0);
|
||||
#endif /* VI_MODE */
|
||||
}
|
||||
}
|
||||
|
|
@ -497,6 +518,14 @@ readline_internal ()
|
|||
return (readline_internal_teardown (eof));
|
||||
}
|
||||
|
||||
void
|
||||
_rl_init_line_state ()
|
||||
{
|
||||
rl_point = rl_end = 0;
|
||||
the_line = rl_line_buffer;
|
||||
the_line[0] = 0;
|
||||
}
|
||||
|
||||
void
|
||||
_rl_set_the_line ()
|
||||
{
|
||||
|
|
@ -551,12 +580,14 @@ _rl_dispatch (key, map)
|
|||
_rl_suppress_redisplay = (map[key].function == rl_insert) && _rl_input_available ();
|
||||
#endif
|
||||
|
||||
rl_dispatching = 1;
|
||||
r = (*map[key].function)(rl_numeric_arg * rl_arg_sign, key);
|
||||
rl_dispatching = 0;
|
||||
|
||||
/* If we have input pending, then the last command was a prefix
|
||||
command. Don't change the state of rl_last_func. Otherwise,
|
||||
remember the last command executed in this variable. */
|
||||
if (!rl_pending_input)
|
||||
if (!rl_pending_input && map[key].function != rl_digit_argument)
|
||||
rl_last_func = map[key].function;
|
||||
}
|
||||
else
|
||||
|
|
@ -603,7 +634,7 @@ _rl_dispatch (key, map)
|
|||
/* */
|
||||
/* **************************************************************** */
|
||||
|
||||
/* Initliaze readline (and terminal if not already). */
|
||||
/* Initialize readline (and terminal if not already). */
|
||||
int
|
||||
rl_initialize ()
|
||||
{
|
||||
|
|
@ -616,9 +647,7 @@ rl_initialize ()
|
|||
}
|
||||
|
||||
/* Initalize the current line information. */
|
||||
rl_point = rl_end = 0;
|
||||
the_line = rl_line_buffer;
|
||||
the_line[0] = 0;
|
||||
_rl_init_line_state ();
|
||||
|
||||
/* We aren't done yet. We haven't even gotten started yet! */
|
||||
rl_done = 0;
|
||||
|
|
@ -643,12 +672,41 @@ rl_initialize ()
|
|||
return 0;
|
||||
}
|
||||
|
||||
#if defined (__EMX__)
|
||||
static void
|
||||
_emx_build_environ ()
|
||||
{
|
||||
TIB *tibp;
|
||||
PIB *pibp;
|
||||
char *t, **tp;
|
||||
int c;
|
||||
|
||||
DosGetInfoBlocks (&tibp, &pibp);
|
||||
t = pibp->pib_pchenv;
|
||||
for (c = 1; *t; c++)
|
||||
t += strlen (t) + 1;
|
||||
tp = environ = (char **)xmalloc ((c + 1) * sizeof (char *));
|
||||
t = pibp->pib_pchenv;
|
||||
while (*t)
|
||||
{
|
||||
*tp++ = t;
|
||||
t += strlen (t) + 1;
|
||||
}
|
||||
*tp = 0;
|
||||
}
|
||||
#endif /* __EMX__ */
|
||||
|
||||
/* Initialize the entire state of the world. */
|
||||
static void
|
||||
readline_initialize_everything ()
|
||||
{
|
||||
#if defined (__EMX__)
|
||||
if (environ == 0)
|
||||
_emx_build_environ ();
|
||||
#endif
|
||||
|
||||
/* Find out if we are running in Emacs. */
|
||||
running_in_emacs = getenv ("EMACS") != (char *)0;
|
||||
running_in_emacs = get_env_value ("EMACS") != (char *)0;
|
||||
|
||||
/* Set up input and output if they are not already set up. */
|
||||
if (!rl_instream)
|
||||
|
|
@ -664,7 +722,7 @@ readline_initialize_everything ()
|
|||
_rl_out_stream = rl_outstream;
|
||||
|
||||
/* Allocate data structures. */
|
||||
if (!rl_line_buffer)
|
||||
if (rl_line_buffer == 0)
|
||||
rl_line_buffer = xmalloc (rl_line_buffer_len = DEFAULT_BUFFER_SIZE);
|
||||
|
||||
/* Initialize the terminal interface. */
|
||||
|
|
@ -773,45 +831,56 @@ bind_arrow_keys ()
|
|||
static int
|
||||
rl_digit_loop ()
|
||||
{
|
||||
int key, c, sawminus;
|
||||
int key, c, sawminus, sawdigits;
|
||||
|
||||
_rl_save_prompt ();
|
||||
|
||||
sawminus = 0;
|
||||
sawminus = sawdigits = 0;
|
||||
while (1)
|
||||
{
|
||||
rl_message ("(arg: %d) ", rl_arg_sign * rl_numeric_arg);
|
||||
key = c = rl_read_key ();
|
||||
|
||||
/* If we see a key bound to `universal-argument' after seeing digits,
|
||||
it ends the argument but is otherwise ignored. */
|
||||
if (_rl_keymap[c].type == ISFUNC &&
|
||||
_rl_keymap[c].function == rl_universal_argument)
|
||||
{
|
||||
rl_numeric_arg *= 4;
|
||||
continue;
|
||||
}
|
||||
c = UNMETA (c);
|
||||
if (_rl_digit_p (c))
|
||||
{
|
||||
rl_numeric_arg = rl_explicit_arg ? (rl_numeric_arg * 10) + c - '0' : c - '0';
|
||||
rl_explicit_arg = 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (c == '-' && rl_explicit_arg == 0)
|
||||
if (sawdigits == 0)
|
||||
{
|
||||
rl_numeric_arg = sawminus = 1;
|
||||
rl_arg_sign = -1;
|
||||
rl_numeric_arg *= 4;
|
||||
continue;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Make M-- command equivalent to M--1 command. */
|
||||
if (sawminus && rl_numeric_arg == 1 && rl_explicit_arg == 0)
|
||||
rl_explicit_arg = 1;
|
||||
key = rl_read_key ();
|
||||
_rl_restore_prompt ();
|
||||
rl_clear_message ();
|
||||
return (_rl_dispatch (key, _rl_keymap));
|
||||
}
|
||||
}
|
||||
|
||||
c = UNMETA (c);
|
||||
|
||||
if (_rl_digit_p (c))
|
||||
{
|
||||
rl_numeric_arg = rl_explicit_arg ? (rl_numeric_arg * 10) + c - '0' : c - '0';
|
||||
sawdigits = rl_explicit_arg = 1;
|
||||
}
|
||||
else if (c == '-' && rl_explicit_arg == 0)
|
||||
{
|
||||
rl_numeric_arg = sawminus = 1;
|
||||
rl_arg_sign = -1;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Make M-- command equivalent to M--1 command. */
|
||||
if (sawminus && rl_numeric_arg == 1 && rl_explicit_arg == 0)
|
||||
rl_explicit_arg = 1;
|
||||
_rl_restore_prompt ();
|
||||
rl_clear_message ();
|
||||
return (_rl_dispatch (key, _rl_keymap));
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
|
@ -936,6 +1005,28 @@ rl_delete_text (from, to)
|
|||
return (diff);
|
||||
}
|
||||
|
||||
/* Fix up point so that it is within the line boundaries after killing
|
||||
text. If FIX_MARK_TOO is non-zero, the mark is forced within line
|
||||
boundaries also. */
|
||||
|
||||
#define _RL_FIX_POINT(x) \
|
||||
do { \
|
||||
if (x > rl_end) \
|
||||
x = rl_end; \
|
||||
else if (x < 0) \
|
||||
x = 0; \
|
||||
} while (0)
|
||||
|
||||
void
|
||||
_rl_fix_point (fix_mark_too)
|
||||
int fix_mark_too;
|
||||
{
|
||||
_RL_FIX_POINT (rl_point);
|
||||
if (fix_mark_too)
|
||||
_RL_FIX_POINT (rl_mark);
|
||||
}
|
||||
#undef _RL_FIX_POINT
|
||||
|
||||
/* **************************************************************** */
|
||||
/* */
|
||||
/* Readline character functions */
|
||||
|
|
@ -1153,8 +1244,7 @@ rl_refresh_line ()
|
|||
memset (row_start + col, 0, (width - col) * 2);
|
||||
}
|
||||
#else /* !__GO32__ */
|
||||
if (term_clreol)
|
||||
tputs (term_clreol, 1, _rl_output_character_function);
|
||||
_rl_clear_to_eol (0); /* arg of 0 means to not use spaces */
|
||||
#endif /* !__GO32__ */
|
||||
|
||||
rl_forced_update_display ();
|
||||
|
|
@ -1176,13 +1266,7 @@ rl_clear_screen (count, key)
|
|||
return 0;
|
||||
}
|
||||
|
||||
#if !defined (__GO32__)
|
||||
if (term_clrpag)
|
||||
tputs (term_clrpag, 1, _rl_output_character_function);
|
||||
else
|
||||
#endif /* !__GO32__ */
|
||||
crlf ();
|
||||
|
||||
_rl_clear_screen (); /* calls termcap function to clear screen */
|
||||
rl_forced_update_display ();
|
||||
rl_display_fixed = 1;
|
||||
|
||||
|
|
@ -1321,8 +1405,11 @@ rl_newline (count, key)
|
|||
rl_done = 1;
|
||||
|
||||
#if defined (VI_MODE)
|
||||
_rl_vi_done_inserting ();
|
||||
_rl_vi_reset_last ();
|
||||
if (rl_editing_mode == vi_mode)
|
||||
{
|
||||
_rl_vi_done_inserting ();
|
||||
_rl_vi_reset_last ();
|
||||
}
|
||||
#endif /* VI_MODE */
|
||||
|
||||
if (readline_echoing_p)
|
||||
|
|
@ -1632,10 +1719,7 @@ rl_transpose_chars (count, key)
|
|||
rl_delete_text (rl_point, rl_point + 1);
|
||||
|
||||
rl_point += count;
|
||||
if (rl_point > rl_end)
|
||||
rl_point = rl_end;
|
||||
else if (rl_point < 0)
|
||||
rl_point = 0;
|
||||
_rl_fix_point (0);
|
||||
rl_insert_text (dummy);
|
||||
|
||||
rl_end_undo_group ();
|
||||
|
|
@ -1988,7 +2072,7 @@ rl_vi_editing_mode (count, key)
|
|||
{
|
||||
#if defined (VI_MODE)
|
||||
rl_editing_mode = vi_mode;
|
||||
rl_vi_insertion_mode ();
|
||||
rl_vi_insertion_mode (1, key);
|
||||
#endif /* VI_MODE */
|
||||
return 0;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -102,7 +102,7 @@ extern int
|
|||
rl_noninc_forward_search_again (), rl_noninc_reverse_search_again ();
|
||||
|
||||
/* Things for vi mode. Not available unless readline is compiled -DVI_MODE. */
|
||||
extern int rl_vi_check (), rl_vi_textmod_command ();
|
||||
extern int rl_vi_check ();
|
||||
extern int
|
||||
rl_vi_undo (), rl_vi_redo (), rl_vi_tilde_expand (),
|
||||
rl_vi_movement_mode (), rl_vi_insertion_mode (), rl_vi_arg_digit (),
|
||||
|
|
@ -236,6 +236,10 @@ extern char *rl_library_version;
|
|||
whatever was in argv[0]. It is used when parsing conditionals. */
|
||||
extern char *rl_readline_name;
|
||||
|
||||
/* The prompt readline uses. This is set from the argument to
|
||||
readline (), and should not be assigned to directly. */
|
||||
extern char *rl_prompt;
|
||||
|
||||
/* The line buffer that is in use. */
|
||||
extern char *rl_line_buffer;
|
||||
|
||||
|
|
@ -248,6 +252,11 @@ extern int rl_done;
|
|||
|
||||
extern int rl_pending_input;
|
||||
|
||||
/* Non-zero if we called this function from _rl_dispatch(). It's present
|
||||
so functions can find out whether they were called from a key binding
|
||||
or directly from an application. */
|
||||
int rl_dispatching;
|
||||
|
||||
/* The name of the terminal to use. */
|
||||
extern char *rl_terminal_name;
|
||||
|
||||
|
|
@ -370,6 +379,14 @@ extern int rl_completion_type;
|
|||
default is a space. Nothing is added if this is '\0'. */
|
||||
extern int rl_completion_append_character;
|
||||
|
||||
/* Up to this many items will be displayed in response to a
|
||||
possible-completions call. After that, we ask the user if she
|
||||
is sure she wants to see them all. The default value is 100. */
|
||||
extern int rl_completion_query_items;
|
||||
|
||||
/* If non-zero, then disallow duplicates in the matches. */
|
||||
extern int rl_ignore_completion_duplicates;
|
||||
|
||||
/* If this is non-zero, completion is (temporarily) inhibited, and the
|
||||
completion character will be inserted as any other. */
|
||||
extern int rl_inhibit_completion;
|
||||
|
|
|
|||
|
|
@ -40,17 +40,6 @@
|
|||
# endif
|
||||
#endif
|
||||
|
||||
#if defined (HAVE_SYS_STREAM_H)
|
||||
# include <sys/stream.h>
|
||||
#endif /* HAVE_SYS_STREAM_H */
|
||||
#if defined (HAVE_SYS_PTEM_H)
|
||||
# include <sys/ptem.h>
|
||||
# define _IO_PTEM_H /* work around SVR4.2 1.1.4 bug */
|
||||
#endif /* HAVE_SYS_PTEM_H */
|
||||
#if defined (HAVE_SYS_PTE_H)
|
||||
# include <sys/pte.h>
|
||||
#endif /* HAVE_SYS_PTE_H */
|
||||
|
||||
/* Posix macro to check file in statbuf for directory-ness.
|
||||
This requires that <sys/stat.h> be included before this test. */
|
||||
#if defined (S_IFDIR) && !defined (S_ISDIR)
|
||||
|
|
|
|||
|
|
@ -53,6 +53,8 @@ extern int _rl_eof_char;
|
|||
|
||||
extern int _rl_enable_keypad, _rl_enable_meta;
|
||||
|
||||
extern void _rl_control_keypad ();
|
||||
|
||||
#if defined (__GO32__)
|
||||
# include <pc.h>
|
||||
# undef HANDLE_SIGNALS
|
||||
|
|
|
|||
|
|
@ -42,6 +42,18 @@
|
|||
# include <sgtty.h>
|
||||
#endif
|
||||
|
||||
/* Stuff for `struct winsize' on various systems. */
|
||||
#if defined (HAVE_SYS_STREAM_H)
|
||||
# include <sys/stream.h>
|
||||
#endif /* HAVE_SYS_STREAM_H */
|
||||
#if defined (HAVE_SYS_PTEM_H)
|
||||
# include <sys/ptem.h>
|
||||
# define _IO_PTEM_H /* work around SVR4.2 1.1.4 bug */
|
||||
#endif /* HAVE_SYS_PTEM_H */
|
||||
#if defined (HAVE_SYS_PTE_H)
|
||||
# include <sys/pte.h>
|
||||
#endif /* HAVE_SYS_PTE_H */
|
||||
|
||||
/* Define _POSIX_VDISABLE if we are not using the `new' tty driver and
|
||||
it is not already defined. It is used both to determine if a
|
||||
special character is disabled and to disable certain special
|
||||
|
|
|
|||
|
|
@ -33,11 +33,20 @@
|
|||
# include <unistd.h>
|
||||
#endif
|
||||
|
||||
#if defined (HAVE_STDLIB_H)
|
||||
# include <stdlib.h>
|
||||
#else
|
||||
# include "ansi_stdlib.h"
|
||||
#endif
|
||||
|
||||
#include "rldefs.h"
|
||||
#include "readline.h"
|
||||
#include "history.h"
|
||||
|
||||
#define abs(x) (((x) > 0) ? (x) : -(x))
|
||||
#ifdef abs
|
||||
# undef abs
|
||||
#endif
|
||||
#define abs(x) (((x) >= 0) ? (x) : -(x))
|
||||
|
||||
extern char *xmalloc (), *xrealloc ();
|
||||
|
||||
|
|
|
|||
129
lib/readline/shell.c
Normal file
129
lib/readline/shell.c
Normal file
|
|
@ -0,0 +1,129 @@
|
|||
/* shell.c -- readline utility functions that are normally provided by
|
||||
bash when readline is linked as part of the shell. */
|
||||
|
||||
/* Copyright (C) 1997 Free Software Foundation, Inc.
|
||||
|
||||
This file is part of the GNU Readline Library, a library for
|
||||
reading lines of text with interactive input and history editing.
|
||||
|
||||
The GNU Readline 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 GNU Readline 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. */
|
||||
#define READLINE_LIBRARY
|
||||
|
||||
#if defined (HAVE_CONFIG_H)
|
||||
# include <config.h>
|
||||
#endif
|
||||
|
||||
#if defined (HAVE_UNISTD_H)
|
||||
# include <unistd.h>
|
||||
#endif /* HAVE_UNISTD_H */
|
||||
|
||||
#if defined (HAVE_STDLIB_H)
|
||||
# include <stdlib.h>
|
||||
#else
|
||||
# include "ansi_stdlib.h"
|
||||
#endif /* HAVE_STDLIB_H */
|
||||
|
||||
extern char *xmalloc (), *xrealloc ();
|
||||
|
||||
#if !defined (SHELL)
|
||||
|
||||
#ifdef savestring
|
||||
#undef savestring
|
||||
#endif
|
||||
|
||||
/* Backwards compatibility, now that savestring has been removed from
|
||||
all `public' readline header files. */
|
||||
char *
|
||||
savestring (s)
|
||||
char *s;
|
||||
{
|
||||
return ((char *)strcpy (xmalloc (1 + (int)strlen (s)), (s)));
|
||||
}
|
||||
|
||||
/* Does shell-like quoting using single quotes. */
|
||||
char *
|
||||
single_quote (string)
|
||||
char *string;
|
||||
{
|
||||
register int c;
|
||||
char *result, *r, *s;
|
||||
|
||||
result = (char *)xmalloc (3 + (3 * strlen (string)));
|
||||
r = result;
|
||||
*r++ = '\'';
|
||||
|
||||
for (s = string; s && (c = *s); s++)
|
||||
{
|
||||
*r++ = c;
|
||||
|
||||
if (c == '\'')
|
||||
{
|
||||
*r++ = '\\'; /* insert escaped single quote */
|
||||
*r++ = '\'';
|
||||
*r++ = '\''; /* start new quoted string */
|
||||
}
|
||||
}
|
||||
|
||||
*r++ = '\'';
|
||||
*r = '\0';
|
||||
|
||||
return (result);
|
||||
}
|
||||
|
||||
/* Set the environment variables LINES and COLUMNS to lines and cols,
|
||||
respectively. */
|
||||
void
|
||||
set_lines_and_columns (lines, cols)
|
||||
int lines, cols;
|
||||
{
|
||||
char *b;
|
||||
|
||||
#if defined (HAVE_PUTENV)
|
||||
b = xmalloc (24);
|
||||
sprintf (b, "LINES=%d", lines);
|
||||
putenv (b);
|
||||
b = xmalloc (24);
|
||||
sprintf (b, "COLUMNS=%d", cols);
|
||||
putenv (b);
|
||||
#else /* !HAVE_PUTENV */
|
||||
# if defined (HAVE_SETENV)
|
||||
b = xmalloc (8);
|
||||
sprintf (b, "%d", lines);
|
||||
setenv ("LINES", b, 1);
|
||||
b = xmalloc (8);
|
||||
sprintf (b, "%d", cols);
|
||||
setenv ("COLUMNS", b, 1);
|
||||
# endif /* HAVE_SETENV */
|
||||
#endif /* !HAVE_PUTENV */
|
||||
}
|
||||
|
||||
char *
|
||||
get_env_value (varname)
|
||||
char *varname;
|
||||
{
|
||||
return ((char *)getenv (varname));
|
||||
}
|
||||
|
||||
#else /* SHELL */
|
||||
extern char *get_string_value ();
|
||||
|
||||
char *
|
||||
get_env_value (varname)
|
||||
char *varname;
|
||||
{
|
||||
return get_string_value (varname);
|
||||
}
|
||||
#endif /* SHELL */
|
||||
|
|
@ -87,6 +87,14 @@ static SigHandler *rl_set_sighandler ();
|
|||
/* */
|
||||
/* **************************************************************** */
|
||||
|
||||
/* If we're not being compiled as part of bash, initialize handlers for
|
||||
and catch the job control signals (SIGTTIN, SIGTTOU, SIGTSTP) and
|
||||
SIGTERM. */
|
||||
#if !defined (SHELL)
|
||||
# define HANDLE_JOB_SIGNALS
|
||||
# define HANDLE_SIGTERM
|
||||
#endif /* !SHELL */
|
||||
|
||||
#if defined (HAVE_POSIX_SIGNALS)
|
||||
typedef struct sigaction sighandler_cxt;
|
||||
# define rl_sigaction(s, nh, oh) sigaction(s, nh, oh)
|
||||
|
|
@ -97,9 +105,13 @@ typedef struct { SigHandler *sa_handler; } sighandler_cxt;
|
|||
|
||||
static sighandler_cxt old_int, old_alrm;
|
||||
|
||||
#if !defined (SHELL)
|
||||
static sighandler_cxt old_tstp, old_ttou, old_ttin, old_term;
|
||||
#endif /* !SHELL */
|
||||
#if defined (HANDLE_JOB_SIGNALS)
|
||||
static sighandler_cxt old_tstp, old_ttou, old_ttin;
|
||||
#endif /* HANDLE_JOB_SIGNALS */
|
||||
|
||||
#if defined (HANDLE_SIGTERM)
|
||||
static sighandler_cxt old_term;
|
||||
#endif
|
||||
|
||||
#if defined (SIGWINCH)
|
||||
static sighandler_cxt old_winch;
|
||||
|
|
@ -116,14 +128,16 @@ rl_signal_handler (sig)
|
|||
#else /* !HAVE_POSIX_SIGNALS */
|
||||
# if defined (HAVE_BSD_SIGNALS)
|
||||
long omask;
|
||||
# endif /* HAVE_BSD_SIGNALS */
|
||||
# else /* !HAVE_BSD_SIGNALS */
|
||||
sighandler_cxt dummy_cxt; /* needed for rl_set_sighandler call */
|
||||
# endif /* !HAVE_BSD_SIGNALS */
|
||||
#endif /* !HAVE_POSIX_SIGNALS */
|
||||
|
||||
#if !defined (HAVE_BSD_SIGNALS) && !defined (HAVE_POSIX_SIGNALS)
|
||||
/* Since the signal will not be blocked while we are in the signal
|
||||
handler, ignore it until rl_clear_signals resets the catcher. */
|
||||
if (sig == SIGINT || sig == SIGALRM)
|
||||
rl_set_sighandler (sig, SIG_IGN, (sighandler_cxt *)NULL);
|
||||
rl_set_sighandler (sig, SIG_IGN, &dummy_cxt);
|
||||
#endif /* !HAVE_BSD_SIGNALS && !HAVE_POSIX_SIGNALS */
|
||||
|
||||
switch (sig)
|
||||
|
|
@ -188,6 +202,16 @@ rl_handle_sigwinch (sig)
|
|||
{
|
||||
SigHandler *oh;
|
||||
|
||||
#if defined (MUST_REINSTALL_SIGHANDLERS)
|
||||
sighandler_cxt dummy_winch;
|
||||
|
||||
/* We don't want to change old_winch -- it holds the state of SIGWINCH
|
||||
disposition set by the calling application. We need this state
|
||||
because we call the application's SIGWINCH handler after updating
|
||||
our own idea of the screen size. */
|
||||
rl_set_sighandler (SIGWINCH, rl_handle_sigwinch, &dummy_winch);
|
||||
#endif
|
||||
|
||||
if (readline_echoing_p)
|
||||
{
|
||||
_rl_get_screen_size (fileno (rl_instream), 1);
|
||||
|
|
@ -265,7 +289,7 @@ rl_set_signals ()
|
|||
rl_sigaction (SIGALRM, &old_alrm, &dummy);
|
||||
#endif /* HAVE_POSIX_SIGNALS */
|
||||
|
||||
#if !defined (SHELL)
|
||||
#if defined (HANDLE_JOB_SIGNALS)
|
||||
|
||||
#if defined (SIGTSTP)
|
||||
oh = rl_set_sighandler (SIGTSTP, rl_signal_handler, &old_tstp);
|
||||
|
|
@ -286,9 +310,12 @@ rl_set_signals ()
|
|||
}
|
||||
#endif /* SIGTTOU */
|
||||
|
||||
#endif /* HANDLE_JOB_SIGNALS */
|
||||
|
||||
#if defined (HANDLE_SIGTERM)
|
||||
/* Handle SIGTERM if we're not being compiled as part of bash. */
|
||||
rl_set_sighandler (SIGTERM, rl_signal_handler, &old_term);
|
||||
#endif /* !SHELL */
|
||||
#endif /* HANDLE_SIGTERM */
|
||||
|
||||
#if defined (SIGWINCH)
|
||||
rl_set_sighandler (SIGWINCH, rl_handle_sigwinch, &old_winch);
|
||||
|
|
@ -309,7 +336,7 @@ rl_clear_signals ()
|
|||
rl_sigaction (SIGINT, &old_int, &dummy);
|
||||
rl_sigaction (SIGALRM, &old_alrm, &dummy);
|
||||
|
||||
#if !defined (SHELL)
|
||||
#if defined (HANDLE_JOB_SIGNALS)
|
||||
|
||||
#if defined (SIGTSTP)
|
||||
rl_sigaction (SIGTSTP, &old_tstp, &dummy);
|
||||
|
|
@ -320,9 +347,11 @@ rl_clear_signals ()
|
|||
rl_sigaction (SIGTTIN, &old_ttin, &dummy);
|
||||
#endif /* SIGTTOU */
|
||||
|
||||
rl_sigaction (SIGTERM, &old_term, &dummy);
|
||||
#endif /* HANDLE_JOB_SIGNALS */
|
||||
|
||||
#endif /* !SHELL */
|
||||
#if defined (HANDLE_SIGTERM)
|
||||
rl_sigaction (SIGTERM, &old_term, &dummy);
|
||||
#endif /* HANDLE_SIGTERM */
|
||||
|
||||
#if defined (SIGWINCH)
|
||||
sigemptyset (&dummy.sa_mask);
|
||||
|
|
|
|||
|
|
@ -29,6 +29,9 @@
|
|||
#endif
|
||||
|
||||
#if defined (HAVE_TERMCAP_H)
|
||||
# if defined (__linux__) && !defined (SPEED_T_IN_SYS_TYPES)
|
||||
# include "rltty.h"
|
||||
# endif
|
||||
# include <termcap.h>
|
||||
#else
|
||||
|
||||
|
|
|
|||
|
|
@ -53,11 +53,12 @@
|
|||
/* System-specific feature definitions and include files. */
|
||||
#include "rldefs.h"
|
||||
|
||||
#include "tcap.h"
|
||||
|
||||
#if defined (GWINSZ_IN_SYS_IOCTL)
|
||||
#if defined (GWINSZ_IN_SYS_IOCTL) && !defined (TIOCGWINSZ)
|
||||
# include <sys/ioctl.h>
|
||||
#endif /* GWINSZ_IN_SYS_IOCTL */
|
||||
#endif /* GWINSZ_IN_SYS_IOCTL && !TIOCGWINSZ */
|
||||
|
||||
#include "rltty.h"
|
||||
#include "tcap.h"
|
||||
|
||||
/* Some standard library routines. */
|
||||
#include "readline.h"
|
||||
|
|
@ -69,6 +70,13 @@ extern int readline_echoing_p;
|
|||
extern int _rl_bell_preference;
|
||||
extern Keymap _rl_keymap;
|
||||
|
||||
/* Functions imported from bind.c */
|
||||
extern void _rl_bind_if_unbound ();
|
||||
|
||||
/* Functions imported from shell.c */
|
||||
extern void set_lines_and_columns ();
|
||||
extern char *get_env_value ();
|
||||
|
||||
/* **************************************************************** */
|
||||
/* */
|
||||
/* Terminal and Termcap */
|
||||
|
|
@ -84,8 +92,10 @@ static int tcap_initialized;
|
|||
static int dumb_term;
|
||||
|
||||
#if !defined (__linux__)
|
||||
/* If this causes problems, add back the `extern'. */
|
||||
/*extern*/ char PC, *BC, *UP;
|
||||
# if defined (__EMX__) || defined (NEED_EXTERN_PC)
|
||||
extern
|
||||
# endif /* __EMX__ || NEED_EXTERN_PC */
|
||||
char PC, *BC, *UP;
|
||||
#endif /* __linux__ */
|
||||
|
||||
/* Some strings to control terminal actions. These are output by tputs (). */
|
||||
|
|
@ -139,45 +149,6 @@ int _rl_enable_keypad;
|
|||
/* Non-zero means the user wants to enable a meta key. */
|
||||
int _rl_enable_meta = 1;
|
||||
|
||||
/* Re-initialize the terminal considering that the TERM/TERMCAP variable
|
||||
has changed. */
|
||||
int
|
||||
rl_reset_terminal (terminal_name)
|
||||
char *terminal_name;
|
||||
{
|
||||
_rl_init_terminal_io (terminal_name);
|
||||
return 0;
|
||||
}
|
||||
|
||||
#if !defined (SHELL)
|
||||
static void
|
||||
set_lines_and_columns (lines, cols)
|
||||
int lines, cols;
|
||||
{
|
||||
char *b;
|
||||
|
||||
#if defined (HAVE_PUTENV)
|
||||
b = xmalloc (24);
|
||||
sprintf (b, "LINES=%d", lines);
|
||||
putenv (b);
|
||||
b = xmalloc (24);
|
||||
sprintf (b, "COLUMNS=%d", cols);
|
||||
putenv (b);
|
||||
#else /* !HAVE_PUTENV */
|
||||
# if defined (HAVE_SETENV)
|
||||
b = xmalloc (8);
|
||||
sprintf (b, "%d", lines);
|
||||
setenv ("LINES", b, 1);
|
||||
b = xmalloc (8);
|
||||
sprintf (b, "%d", cols);
|
||||
setenv ("COLUMNS", b, 1);
|
||||
# endif /* HAVE_SETENV */
|
||||
#endif /* !HAVE_PUTENV */
|
||||
}
|
||||
#else /* SHELL */
|
||||
extern void set_lines_and_columns ();
|
||||
#endif /* SHELL */
|
||||
|
||||
/* Get readline's idea of the screen size. TTY is a file descriptor open
|
||||
to the terminal. If IGNORE_ENV is true, we do not pay attention to the
|
||||
values of $LINES and $COLUMNS. The tests for TERM_STRING_BUFFER being
|
||||
|
|
@ -190,6 +161,9 @@ _rl_get_screen_size (tty, ignore_env)
|
|||
#if defined (TIOCGWINSZ)
|
||||
struct winsize window_size;
|
||||
#endif /* TIOCGWINSZ */
|
||||
#if defined (__EMX__)
|
||||
int sz[2];
|
||||
#endif
|
||||
|
||||
#if defined (TIOCGWINSZ)
|
||||
if (ioctl (tty, TIOCGWINSZ, &window_size) == 0)
|
||||
|
|
@ -199,11 +173,17 @@ _rl_get_screen_size (tty, ignore_env)
|
|||
}
|
||||
#endif /* TIOCGWINSZ */
|
||||
|
||||
#if defined (__EMX__)
|
||||
_scrsize (sz);
|
||||
screenwidth = sz[0];
|
||||
screenheight = sz[1];
|
||||
#endif
|
||||
|
||||
/* Environment variable COLUMNS overrides setting of "co" if IGNORE_ENV
|
||||
is unset. */
|
||||
if (screenwidth <= 0)
|
||||
{
|
||||
if (ignore_env == 0 && (ss = getenv ("COLUMNS")))
|
||||
if (ignore_env == 0 && (ss = get_env_value ("COLUMNS")))
|
||||
screenwidth = atoi (ss);
|
||||
|
||||
if (screenwidth <= 0 && term_string_buffer)
|
||||
|
|
@ -214,7 +194,7 @@ _rl_get_screen_size (tty, ignore_env)
|
|||
is unset. */
|
||||
if (screenheight <= 0)
|
||||
{
|
||||
if (ignore_env == 0 && (ss = getenv ("LINES")))
|
||||
if (ignore_env == 0 && (ss = get_env_value ("LINES")))
|
||||
screenheight = atoi (ss);
|
||||
|
||||
if (screenheight <= 0 && term_string_buffer)
|
||||
|
|
@ -334,7 +314,7 @@ _rl_init_terminal_io (terminal_name)
|
|||
int tty;
|
||||
Keymap xkeymap;
|
||||
|
||||
term = terminal_name ? terminal_name : getenv ("TERM");
|
||||
term = terminal_name ? terminal_name : get_env_value ("TERM");
|
||||
|
||||
if (term_string_buffer == 0)
|
||||
term_string_buffer = xmalloc (2032);
|
||||
|
|
@ -443,6 +423,16 @@ rl_get_termcap (cap)
|
|||
return ((char *)NULL);
|
||||
}
|
||||
|
||||
/* Re-initialize the terminal considering that the TERM/TERMCAP variable
|
||||
has changed. */
|
||||
int
|
||||
rl_reset_terminal (terminal_name)
|
||||
char *terminal_name;
|
||||
{
|
||||
_rl_init_terminal_io (terminal_name);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* A function for the use of tputs () */
|
||||
int
|
||||
_rl_output_character_function (c)
|
||||
|
|
@ -536,7 +526,7 @@ outchar (c)
|
|||
return putc (c, rl_outstream);
|
||||
}
|
||||
|
||||
int
|
||||
void
|
||||
_rl_enable_meta_key ()
|
||||
{
|
||||
if (term_has_meta && term_mm)
|
||||
|
|
|
|||
|
|
@ -23,6 +23,10 @@
|
|||
# include <config.h>
|
||||
#endif
|
||||
|
||||
#if defined (HAVE_UNISTD_H)
|
||||
# include <unistd.h>
|
||||
#endif
|
||||
|
||||
#if defined (HAVE_STRING_H)
|
||||
# include <string.h>
|
||||
#else /* !HAVE_STRING_H */
|
||||
|
|
@ -40,6 +44,10 @@
|
|||
|
||||
#include "tilde.h"
|
||||
|
||||
#ifdef SHELL
|
||||
#include "shell.h"
|
||||
#endif
|
||||
|
||||
#if !defined (HAVE_GETPW_DECLS)
|
||||
extern struct passwd *getpwuid (), *getpwnam ();
|
||||
#endif /* !HAVE_GETPW_DECLS */
|
||||
|
|
@ -78,6 +86,12 @@ static char *default_prefixes[] =
|
|||
static char *default_suffixes[] =
|
||||
{ " ", "\n", (char *)NULL };
|
||||
|
||||
/* If non-null, this contains the address of a function that the application
|
||||
wants called before trying the standard tilde expansions. The function
|
||||
is called with the text sans tilde, and returns a malloc()'ed string
|
||||
which is the expansion, or a NULL pointer if the expansion fails. */
|
||||
CPFunction *tilde_expansion_preexpansion_hook = (CPFunction *)NULL;
|
||||
|
||||
/* If non-null, this contains the address of a function to call if the
|
||||
standard meaning for expanding a tilde fails. The function is called
|
||||
with the text (sans tilde, as in "foo"), and returns a malloc()'ed string
|
||||
|
|
@ -108,7 +122,7 @@ tilde_find_prefix (string, len)
|
|||
string_len = strlen (string);
|
||||
*len = 0;
|
||||
|
||||
if (!*string || *string == '~')
|
||||
if (*string == '\0' || *string == '~')
|
||||
return (0);
|
||||
|
||||
if (prefixes)
|
||||
|
|
@ -135,13 +149,14 @@ tilde_find_suffix (string)
|
|||
char *string;
|
||||
{
|
||||
register int i, j, string_len;
|
||||
register char **suffixes = tilde_additional_suffixes;
|
||||
register char **suffixes;
|
||||
|
||||
suffixes = tilde_additional_suffixes;
|
||||
string_len = strlen (string);
|
||||
|
||||
for (i = 0; i < string_len; i++)
|
||||
{
|
||||
if (string[i] == '/' || !string[i])
|
||||
if (string[i] == '/' /* || !string[i] */)
|
||||
break;
|
||||
|
||||
for (j = 0; suffixes && suffixes[j]; j++)
|
||||
|
|
@ -153,16 +168,28 @@ tilde_find_suffix (string)
|
|||
return (i);
|
||||
}
|
||||
|
||||
#if !defined (SHELL)
|
||||
static char *
|
||||
get_string_value (varname)
|
||||
char *varname;
|
||||
{
|
||||
return ((char *)getenv (varname));
|
||||
}
|
||||
#endif
|
||||
|
||||
/* Return a new string which is the result of tilde expanding STRING. */
|
||||
char *
|
||||
tilde_expand (string)
|
||||
char *string;
|
||||
{
|
||||
char *result, *tilde_expand_word ();
|
||||
char *result;
|
||||
int result_size, result_index;
|
||||
|
||||
result_size = result_index = 0;
|
||||
result = (char *)NULL;
|
||||
result_index = result_size = 0;
|
||||
if (result = strchr (string, '~'))
|
||||
result = xmalloc (result_size = (strlen (string) + 16));
|
||||
else
|
||||
result = xmalloc (result_size = strlen (string));
|
||||
|
||||
/* Scan through STRING expanding tildes as we come to them. */
|
||||
while (1)
|
||||
|
|
@ -215,97 +242,143 @@ tilde_expand (string)
|
|||
return (result);
|
||||
}
|
||||
|
||||
/* Take FNAME and return the tilde prefix we want expanded. If LENP is
|
||||
non-null, the index of the end of the prefix into FNAME is returned in
|
||||
the location it points to. */
|
||||
static char *
|
||||
isolate_tilde_prefix (fname, lenp)
|
||||
char *fname;
|
||||
int *lenp;
|
||||
{
|
||||
char *ret;
|
||||
int i;
|
||||
|
||||
ret = xmalloc (strlen (fname));
|
||||
for (i = 1; fname[i] && fname[i] != '/'; i++)
|
||||
ret[i - 1] = fname[i];
|
||||
ret[i - 1] = '\0';
|
||||
if (lenp)
|
||||
*lenp = i;
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* Return a string that is PREFIX concatenated with SUFFIX starting at
|
||||
SUFFIND. */
|
||||
static char *
|
||||
glue_prefix_and_suffix (prefix, suffix, suffind)
|
||||
char *prefix, *suffix;
|
||||
int suffind;
|
||||
{
|
||||
char *ret;
|
||||
int plen, slen;
|
||||
|
||||
plen = (prefix && *prefix) ? strlen (prefix) : 0;
|
||||
slen = strlen (suffix + suffind);
|
||||
ret = xmalloc (plen + slen + 1);
|
||||
if (prefix && *prefix)
|
||||
strcpy (ret, prefix);
|
||||
strcpy (ret + plen, suffix + suffind);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static char *
|
||||
get_home_dir ()
|
||||
{
|
||||
char *home_dir;
|
||||
|
||||
#ifdef SHELL
|
||||
home_dir = (char *)NULL;
|
||||
if (current_user.home_dir == 0)
|
||||
get_current_user_info ();
|
||||
home_dir = current_user.home_dir;
|
||||
#else
|
||||
struct passwd *entry;
|
||||
|
||||
home_dir = (char *)NULL;
|
||||
entry = getpwuid (getuid ());
|
||||
if (entry)
|
||||
home_dir = entry->pw_dir;
|
||||
#endif
|
||||
return (home_dir);
|
||||
}
|
||||
|
||||
/* Do the work of tilde expansion on FILENAME. FILENAME starts with a
|
||||
tilde. If there is no expansion, call tilde_expansion_failure_hook. */
|
||||
tilde. If there is no expansion, call tilde_expansion_failure_hook.
|
||||
This always returns a newly-allocated string, never static storage. */
|
||||
char *
|
||||
tilde_expand_word (filename)
|
||||
char *filename;
|
||||
{
|
||||
char *dirname;
|
||||
char *temp_name;
|
||||
char *dirname, *expansion, *username;
|
||||
int user_len;
|
||||
struct passwd *user_entry;
|
||||
|
||||
if (filename == (char *)0)
|
||||
if (filename == 0)
|
||||
return ((char *)NULL);
|
||||
|
||||
dirname = savestring (filename);
|
||||
if (*filename != '~')
|
||||
return (savestring (filename));
|
||||
|
||||
if (*dirname != '~')
|
||||
return (dirname);
|
||||
|
||||
if (!dirname[1] || dirname[1] == '/')
|
||||
/* A leading `~/' or a bare `~' is *always* translated to the value of
|
||||
$HOME or the home directory of the current user, regardless of any
|
||||
preexpansion hook. */
|
||||
if (filename[1] == '\0' || filename[1] == '/')
|
||||
{
|
||||
/* Prepend $HOME to the rest of the string. */
|
||||
char *temp_home = (char *)getenv ("HOME");
|
||||
int home_len;
|
||||
/* Prefix $HOME to the rest of the string. */
|
||||
expansion = get_string_value ("HOME");
|
||||
|
||||
/* If there is no HOME variable, look up the directory in
|
||||
the password database. */
|
||||
if (!temp_home)
|
||||
if (expansion == 0)
|
||||
expansion = get_home_dir ();
|
||||
|
||||
return (glue_prefix_and_suffix (expansion, filename, 1));
|
||||
}
|
||||
|
||||
username = isolate_tilde_prefix (filename, &user_len);
|
||||
|
||||
if (tilde_expansion_preexpansion_hook)
|
||||
{
|
||||
expansion = (*tilde_expansion_preexpansion_hook) (username);
|
||||
if (expansion)
|
||||
{
|
||||
struct passwd *entry;
|
||||
|
||||
entry = getpwuid (getuid ());
|
||||
if (entry)
|
||||
temp_home = entry->pw_dir;
|
||||
dirname = glue_prefix_and_suffix (expansion, filename, user_len);
|
||||
free (username);
|
||||
free (expansion);
|
||||
return (dirname);
|
||||
}
|
||||
}
|
||||
|
||||
home_len = temp_home ? strlen (temp_home) : 0;
|
||||
temp_name = xmalloc (1 + strlen (dirname + 1) + home_len);
|
||||
|
||||
if (temp_home)
|
||||
strcpy (temp_name, temp_home);
|
||||
strcpy (temp_name + home_len, dirname + 1);
|
||||
free (dirname);
|
||||
dirname = temp_name;
|
||||
/* No preexpansion hook, or the preexpansion hook failed. Look in the
|
||||
password database. */
|
||||
dirname = (char *)NULL;
|
||||
user_entry = getpwnam (username);
|
||||
if (user_entry == 0)
|
||||
{
|
||||
/* If the calling program has a special syntax for expanding tildes,
|
||||
and we couldn't find a standard expansion, then let them try. */
|
||||
if (tilde_expansion_failure_hook)
|
||||
{
|
||||
expansion = (*tilde_expansion_failure_hook) (username);
|
||||
if (expansion)
|
||||
{
|
||||
dirname = glue_prefix_and_suffix (expansion, filename, user_len);
|
||||
free (expansion);
|
||||
}
|
||||
}
|
||||
free (username);
|
||||
/* If we don't have a failure hook, or if the failure hook did not
|
||||
expand the tilde, return a copy of what we were passed. */
|
||||
if (dirname == 0)
|
||||
dirname = savestring (filename);
|
||||
}
|
||||
else
|
||||
{
|
||||
char *username;
|
||||
struct passwd *user_entry;
|
||||
int i, len;
|
||||
|
||||
username = xmalloc (strlen (dirname));
|
||||
for (i = 1; dirname[i] && dirname[i] != '/'; i++)
|
||||
username[i - 1] = dirname[i];
|
||||
username[i - 1] = '\0';
|
||||
|
||||
if ((user_entry = getpwnam (username)) == (struct passwd *)0)
|
||||
{
|
||||
/* If the calling program has a special syntax for
|
||||
expanding tildes, and we couldn't find a standard
|
||||
expansion, then let them try. */
|
||||
if (tilde_expansion_failure_hook)
|
||||
{
|
||||
char *expansion;
|
||||
|
||||
expansion = (*tilde_expansion_failure_hook) (username);
|
||||
|
||||
if (expansion)
|
||||
{
|
||||
len = strlen (expansion);
|
||||
temp_name = xmalloc (1 + len + strlen (dirname + i));
|
||||
strcpy (temp_name, expansion);
|
||||
strcpy (temp_name + len, dirname + i);
|
||||
free (expansion);
|
||||
free (dirname);
|
||||
dirname = temp_name;
|
||||
}
|
||||
}
|
||||
/* We shouldn't report errors. */
|
||||
}
|
||||
else
|
||||
{
|
||||
len = strlen (user_entry->pw_dir);
|
||||
temp_name = xmalloc (1 + len + strlen (dirname + i));
|
||||
strcpy (temp_name, user_entry->pw_dir);
|
||||
strcpy (temp_name + len, dirname + i);
|
||||
free (dirname);
|
||||
dirname = temp_name;
|
||||
}
|
||||
endpwent ();
|
||||
free (username);
|
||||
dirname = glue_prefix_and_suffix (user_entry->pw_dir, filename, user_len);
|
||||
}
|
||||
|
||||
endpwent ();
|
||||
return (dirname);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -33,6 +33,12 @@ typedef char *CPFunction ();
|
|||
typedef char **CPPFunction ();
|
||||
#endif /* _FUNCTION_DEF */
|
||||
|
||||
/* If non-null, this contains the address of a function that the application
|
||||
wants called before trying the standard tilde expansions. The function
|
||||
is called with the text sans tilde, and returns a malloc()'ed string
|
||||
which is the expansion, or a NULL pointer if the expansion fails. */
|
||||
extern CPFunction *tilde_expansion_preexpansion_hook;
|
||||
|
||||
/* If non-null, this contains the address of a function to call if the
|
||||
standard meaning for expanding a tilde fails. The function is called
|
||||
with the text (sans tilde, as in "foo"), and returns a malloc()'ed string
|
||||
|
|
|
|||
|
|
@ -38,7 +38,6 @@
|
|||
# include "ansi_stdlib.h"
|
||||
#endif /* HAVE_STDLIB_H */
|
||||
|
||||
#include <setjmp.h>
|
||||
#include <stdio.h>
|
||||
|
||||
/* System-specific feature definitions and include files. */
|
||||
|
|
|
|||
|
|
@ -25,11 +25,9 @@
|
|||
# include <config.h>
|
||||
#endif
|
||||
|
||||
#include <stdio.h>
|
||||
#include <sys/types.h>
|
||||
#include <fcntl.h>
|
||||
#include <setjmp.h>
|
||||
#include <ctype.h>
|
||||
#include "posixjmp.h"
|
||||
|
||||
#if defined (HAVE_UNISTD_H)
|
||||
# include <unistd.h> /* for _POSIX_VERSION */
|
||||
|
|
@ -41,6 +39,9 @@
|
|||
# include "ansi_stdlib.h"
|
||||
#endif /* HAVE_STDLIB_H */
|
||||
|
||||
#include <stdio.h>
|
||||
#include <ctype.h>
|
||||
|
||||
/* System-specific feature definitions and include files. */
|
||||
#include "rldefs.h"
|
||||
|
||||
|
|
@ -55,7 +56,7 @@
|
|||
|
||||
/* Pseudo-globals imported from readline.c */
|
||||
extern int readline_echoing_p;
|
||||
extern jmp_buf readline_top_level;
|
||||
extern procenv_t readline_top_level;
|
||||
extern int rl_line_buffer_len;
|
||||
extern Function *rl_last_func;
|
||||
|
||||
|
|
@ -243,20 +244,6 @@ _rl_qsort_string_compare (s1, s2)
|
|||
#endif
|
||||
}
|
||||
|
||||
#if !defined (SHELL)
|
||||
#ifdef savestring
|
||||
#undef savestring
|
||||
#endif
|
||||
/* Backwards compatibility, now that savestring has been removed from
|
||||
all `public' readline header files. */
|
||||
char *
|
||||
savestring (s)
|
||||
char *s;
|
||||
{
|
||||
return ((char *)strcpy (xmalloc (1 + (int)strlen (s)), (s)));
|
||||
}
|
||||
#endif /* !SHELL */
|
||||
|
||||
/* Function equivalents for the macros defined in chartypes.h. */
|
||||
#undef _rl_uppercase_p
|
||||
int
|
||||
|
|
|
|||
|
|
@ -20,15 +20,17 @@ RM = rm
|
|||
CP = cp
|
||||
MV = mv
|
||||
|
||||
CFLAGS = @CFLAGS@ @LOCAL_CFLAGS@
|
||||
CFLAGS = @CFLAGS@
|
||||
LOCAL_CFLAGS = @LOCAL_CFLAGS@
|
||||
CPPFLAGS = @CPPFLAGS@
|
||||
LDFLAGS = @LDFLAGS@ @LOCAL_LDFLAGS@
|
||||
|
||||
DEFS = @DEFS@
|
||||
LOCAL_DEFS = @LOCAL_DEFS@
|
||||
|
||||
INCLUDES = -I. -I../.. -I$(topdir) -I$(topdir)/lib
|
||||
|
||||
CCFLAGS = $(CFLAGS) $(DEFS) $(CPPFLAGS) ${INCLUDES}
|
||||
CCFLAGS = $(DEFS) $(LOCAL_DEFS) $(CPPFLAGS) ${INCLUDES} $(LOCAL_CFLAGS) $(CFLAGS)
|
||||
|
||||
.c.o:
|
||||
$(CC) -c $(CCFLAGS) $<
|
||||
|
|
@ -94,5 +96,5 @@ mostlyclean: clean
|
|||
# #
|
||||
######################################################################
|
||||
|
||||
tilde.o: tilde.h tilde.c
|
||||
tilde.o: tilde.h $(topdir)/ansi_stdlib.h
|
||||
tilde.o: $(BUILD_DIR)/config.h
|
||||
|
|
|
|||
|
|
@ -23,6 +23,10 @@
|
|||
# include <config.h>
|
||||
#endif
|
||||
|
||||
#if defined (HAVE_UNISTD_H)
|
||||
# include <unistd.h>
|
||||
#endif
|
||||
|
||||
#if defined (HAVE_STRING_H)
|
||||
# include <string.h>
|
||||
#else /* !HAVE_STRING_H */
|
||||
|
|
@ -40,6 +44,10 @@
|
|||
|
||||
#include "tilde.h"
|
||||
|
||||
#ifdef SHELL
|
||||
#include "shell.h"
|
||||
#endif
|
||||
|
||||
#if !defined (HAVE_GETPW_DECLS)
|
||||
extern struct passwd *getpwuid (), *getpwnam ();
|
||||
#endif /* !HAVE_GETPW_DECLS */
|
||||
|
|
@ -78,6 +86,12 @@ static char *default_prefixes[] =
|
|||
static char *default_suffixes[] =
|
||||
{ " ", "\n", (char *)NULL };
|
||||
|
||||
/* If non-null, this contains the address of a function that the application
|
||||
wants called before trying the standard tilde expansions. The function
|
||||
is called with the text sans tilde, and returns a malloc()'ed string
|
||||
which is the expansion, or a NULL pointer if the expansion fails. */
|
||||
CPFunction *tilde_expansion_preexpansion_hook = (CPFunction *)NULL;
|
||||
|
||||
/* If non-null, this contains the address of a function to call if the
|
||||
standard meaning for expanding a tilde fails. The function is called
|
||||
with the text (sans tilde, as in "foo"), and returns a malloc()'ed string
|
||||
|
|
@ -108,7 +122,7 @@ tilde_find_prefix (string, len)
|
|||
string_len = strlen (string);
|
||||
*len = 0;
|
||||
|
||||
if (!*string || *string == '~')
|
||||
if (*string == '\0' || *string == '~')
|
||||
return (0);
|
||||
|
||||
if (prefixes)
|
||||
|
|
@ -135,13 +149,14 @@ tilde_find_suffix (string)
|
|||
char *string;
|
||||
{
|
||||
register int i, j, string_len;
|
||||
register char **suffixes = tilde_additional_suffixes;
|
||||
register char **suffixes;
|
||||
|
||||
suffixes = tilde_additional_suffixes;
|
||||
string_len = strlen (string);
|
||||
|
||||
for (i = 0; i < string_len; i++)
|
||||
{
|
||||
if (string[i] == '/' || !string[i])
|
||||
if (string[i] == '/' /* || !string[i] */)
|
||||
break;
|
||||
|
||||
for (j = 0; suffixes && suffixes[j]; j++)
|
||||
|
|
@ -153,16 +168,28 @@ tilde_find_suffix (string)
|
|||
return (i);
|
||||
}
|
||||
|
||||
#if !defined (SHELL)
|
||||
static char *
|
||||
get_string_value (varname)
|
||||
char *varname;
|
||||
{
|
||||
return ((char *)getenv (varname));
|
||||
}
|
||||
#endif
|
||||
|
||||
/* Return a new string which is the result of tilde expanding STRING. */
|
||||
char *
|
||||
tilde_expand (string)
|
||||
char *string;
|
||||
{
|
||||
char *result, *tilde_expand_word ();
|
||||
char *result;
|
||||
int result_size, result_index;
|
||||
|
||||
result_size = result_index = 0;
|
||||
result = (char *)NULL;
|
||||
result_index = result_size = 0;
|
||||
if (result = strchr (string, '~'))
|
||||
result = xmalloc (result_size = (strlen (string) + 16));
|
||||
else
|
||||
result = xmalloc (result_size = strlen (string));
|
||||
|
||||
/* Scan through STRING expanding tildes as we come to them. */
|
||||
while (1)
|
||||
|
|
@ -215,97 +242,143 @@ tilde_expand (string)
|
|||
return (result);
|
||||
}
|
||||
|
||||
/* Take FNAME and return the tilde prefix we want expanded. If LENP is
|
||||
non-null, the index of the end of the prefix into FNAME is returned in
|
||||
the location it points to. */
|
||||
static char *
|
||||
isolate_tilde_prefix (fname, lenp)
|
||||
char *fname;
|
||||
int *lenp;
|
||||
{
|
||||
char *ret;
|
||||
int i;
|
||||
|
||||
ret = xmalloc (strlen (fname));
|
||||
for (i = 1; fname[i] && fname[i] != '/'; i++)
|
||||
ret[i - 1] = fname[i];
|
||||
ret[i - 1] = '\0';
|
||||
if (lenp)
|
||||
*lenp = i;
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* Return a string that is PREFIX concatenated with SUFFIX starting at
|
||||
SUFFIND. */
|
||||
static char *
|
||||
glue_prefix_and_suffix (prefix, suffix, suffind)
|
||||
char *prefix, *suffix;
|
||||
int suffind;
|
||||
{
|
||||
char *ret;
|
||||
int plen, slen;
|
||||
|
||||
plen = (prefix && *prefix) ? strlen (prefix) : 0;
|
||||
slen = strlen (suffix + suffind);
|
||||
ret = xmalloc (plen + slen + 1);
|
||||
if (prefix && *prefix)
|
||||
strcpy (ret, prefix);
|
||||
strcpy (ret + plen, suffix + suffind);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static char *
|
||||
get_home_dir ()
|
||||
{
|
||||
char *home_dir;
|
||||
|
||||
#ifdef SHELL
|
||||
home_dir = (char *)NULL;
|
||||
if (current_user.home_dir == 0)
|
||||
get_current_user_info ();
|
||||
home_dir = current_user.home_dir;
|
||||
#else
|
||||
struct passwd *entry;
|
||||
|
||||
home_dir = (char *)NULL;
|
||||
entry = getpwuid (getuid ());
|
||||
if (entry)
|
||||
home_dir = entry->pw_dir;
|
||||
#endif
|
||||
return (home_dir);
|
||||
}
|
||||
|
||||
/* Do the work of tilde expansion on FILENAME. FILENAME starts with a
|
||||
tilde. If there is no expansion, call tilde_expansion_failure_hook. */
|
||||
tilde. If there is no expansion, call tilde_expansion_failure_hook.
|
||||
This always returns a newly-allocated string, never static storage. */
|
||||
char *
|
||||
tilde_expand_word (filename)
|
||||
char *filename;
|
||||
{
|
||||
char *dirname;
|
||||
char *temp_name;
|
||||
char *dirname, *expansion, *username;
|
||||
int user_len;
|
||||
struct passwd *user_entry;
|
||||
|
||||
if (filename == (char *)0)
|
||||
if (filename == 0)
|
||||
return ((char *)NULL);
|
||||
|
||||
dirname = savestring (filename);
|
||||
if (*filename != '~')
|
||||
return (savestring (filename));
|
||||
|
||||
if (*dirname != '~')
|
||||
return (dirname);
|
||||
|
||||
if (!dirname[1] || dirname[1] == '/')
|
||||
/* A leading `~/' or a bare `~' is *always* translated to the value of
|
||||
$HOME or the home directory of the current user, regardless of any
|
||||
preexpansion hook. */
|
||||
if (filename[1] == '\0' || filename[1] == '/')
|
||||
{
|
||||
/* Prepend $HOME to the rest of the string. */
|
||||
char *temp_home = (char *)getenv ("HOME");
|
||||
int home_len;
|
||||
/* Prefix $HOME to the rest of the string. */
|
||||
expansion = get_string_value ("HOME");
|
||||
|
||||
/* If there is no HOME variable, look up the directory in
|
||||
the password database. */
|
||||
if (!temp_home)
|
||||
if (expansion == 0)
|
||||
expansion = get_home_dir ();
|
||||
|
||||
return (glue_prefix_and_suffix (expansion, filename, 1));
|
||||
}
|
||||
|
||||
username = isolate_tilde_prefix (filename, &user_len);
|
||||
|
||||
if (tilde_expansion_preexpansion_hook)
|
||||
{
|
||||
expansion = (*tilde_expansion_preexpansion_hook) (username);
|
||||
if (expansion)
|
||||
{
|
||||
struct passwd *entry;
|
||||
|
||||
entry = getpwuid (getuid ());
|
||||
if (entry)
|
||||
temp_home = entry->pw_dir;
|
||||
dirname = glue_prefix_and_suffix (expansion, filename, user_len);
|
||||
free (username);
|
||||
free (expansion);
|
||||
return (dirname);
|
||||
}
|
||||
}
|
||||
|
||||
home_len = temp_home ? strlen (temp_home) : 0;
|
||||
temp_name = xmalloc (1 + strlen (dirname + 1) + home_len);
|
||||
|
||||
if (temp_home)
|
||||
strcpy (temp_name, temp_home);
|
||||
strcpy (temp_name + home_len, dirname + 1);
|
||||
free (dirname);
|
||||
dirname = temp_name;
|
||||
/* No preexpansion hook, or the preexpansion hook failed. Look in the
|
||||
password database. */
|
||||
dirname = (char *)NULL;
|
||||
user_entry = getpwnam (username);
|
||||
if (user_entry == 0)
|
||||
{
|
||||
/* If the calling program has a special syntax for expanding tildes,
|
||||
and we couldn't find a standard expansion, then let them try. */
|
||||
if (tilde_expansion_failure_hook)
|
||||
{
|
||||
expansion = (*tilde_expansion_failure_hook) (username);
|
||||
if (expansion)
|
||||
{
|
||||
dirname = glue_prefix_and_suffix (expansion, filename, user_len);
|
||||
free (expansion);
|
||||
}
|
||||
}
|
||||
free (username);
|
||||
/* If we don't have a failure hook, or if the failure hook did not
|
||||
expand the tilde, return a copy of what we were passed. */
|
||||
if (dirname == 0)
|
||||
dirname = savestring (filename);
|
||||
}
|
||||
else
|
||||
{
|
||||
char *username;
|
||||
struct passwd *user_entry;
|
||||
int i, len;
|
||||
|
||||
username = xmalloc (strlen (dirname));
|
||||
for (i = 1; dirname[i] && dirname[i] != '/'; i++)
|
||||
username[i - 1] = dirname[i];
|
||||
username[i - 1] = '\0';
|
||||
|
||||
if ((user_entry = getpwnam (username)) == (struct passwd *)0)
|
||||
{
|
||||
/* If the calling program has a special syntax for
|
||||
expanding tildes, and we couldn't find a standard
|
||||
expansion, then let them try. */
|
||||
if (tilde_expansion_failure_hook)
|
||||
{
|
||||
char *expansion;
|
||||
|
||||
expansion = (*tilde_expansion_failure_hook) (username);
|
||||
|
||||
if (expansion)
|
||||
{
|
||||
len = strlen (expansion);
|
||||
temp_name = xmalloc (1 + len + strlen (dirname + i));
|
||||
strcpy (temp_name, expansion);
|
||||
strcpy (temp_name + len, dirname + i);
|
||||
free (expansion);
|
||||
free (dirname);
|
||||
dirname = temp_name;
|
||||
}
|
||||
}
|
||||
/* We shouldn't report errors. */
|
||||
}
|
||||
else
|
||||
{
|
||||
len = strlen (user_entry->pw_dir);
|
||||
temp_name = xmalloc (1 + len + strlen (dirname + i));
|
||||
strcpy (temp_name, user_entry->pw_dir);
|
||||
strcpy (temp_name + len, dirname + i);
|
||||
free (dirname);
|
||||
dirname = temp_name;
|
||||
}
|
||||
endpwent ();
|
||||
free (username);
|
||||
dirname = glue_prefix_and_suffix (user_entry->pw_dir, filename, user_len);
|
||||
}
|
||||
|
||||
endpwent ();
|
||||
return (dirname);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -33,6 +33,12 @@ typedef char *CPFunction ();
|
|||
typedef char **CPPFunction ();
|
||||
#endif /* _FUNCTION_DEF */
|
||||
|
||||
/* If non-null, this contains the address of a function that the application
|
||||
wants called before trying the standard tilde expansions. The function
|
||||
is called with the text sans tilde, and returns a malloc()'ed string
|
||||
which is the expansion, or a NULL pointer if the expansion fails. */
|
||||
extern CPFunction *tilde_expansion_preexpansion_hook;
|
||||
|
||||
/* If non-null, this contains the address of a function to call if the
|
||||
standard meaning for expanding a tilde fails. The function is called
|
||||
with the text (sans tilde, as in "foo"), and returns a malloc()'ed string
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue