Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
M
mariadb
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Kirill Smelkov
mariadb
Commits
fab053cc
Commit
fab053cc
authored
Feb 10, 2009
by
Georgi Kodinov
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
From jperkin : Merge libedit 2.11 and related files,
based on NetBSD CVS as of 2009/02/06 20:09:00.
parent
6c6fc097
Changes
56
Hide whitespace changes
Inline
Side-by-side
Showing
56 changed files
with
2268 additions
and
3918 deletions
+2268
-3918
client/mysql.cc
client/mysql.cc
+3
-1
cmd-line-utils/libedit/Makefile.am
cmd-line-utils/libedit/Makefile.am
+7
-21
cmd-line-utils/libedit/README
cmd-line-utils/libedit/README
+50
-0
cmd-line-utils/libedit/TEST/test.c
cmd-line-utils/libedit/TEST/test.c
+0
-269
cmd-line-utils/libedit/chared.c
cmd-line-utils/libedit/chared.c
+32
-13
cmd-line-utils/libedit/chared.h
cmd-line-utils/libedit/chared.h
+4
-5
cmd-line-utils/libedit/common.c
cmd-line-utils/libedit/common.c
+16
-11
cmd-line-utils/libedit/compat.h
cmd-line-utils/libedit/compat.h
+0
-43
cmd-line-utils/libedit/compat_conf.h
cmd-line-utils/libedit/compat_conf.h
+0
-2
cmd-line-utils/libedit/config.h
cmd-line-utils/libedit/config.h
+0
-14
cmd-line-utils/libedit/editline.3
cmd-line-utils/libedit/editline.3
+0
-619
cmd-line-utils/libedit/editrc.5
cmd-line-utils/libedit/editrc.5
+0
-491
cmd-line-utils/libedit/el.c
cmd-line-utils/libedit/el.c
+131
-73
cmd-line-utils/libedit/el.h
cmd-line-utils/libedit/el.h
+4
-2
cmd-line-utils/libedit/el_term.h
cmd-line-utils/libedit/el_term.h
+6
-22
cmd-line-utils/libedit/emacs.c
cmd-line-utils/libedit/emacs.c
+10
-5
cmd-line-utils/libedit/fgetln.h
cmd-line-utils/libedit/fgetln.h
+0
-3
cmd-line-utils/libedit/filecomplete.c
cmd-line-utils/libedit/filecomplete.c
+558
-0
cmd-line-utils/libedit/filecomplete.h
cmd-line-utils/libedit/filecomplete.h
+14
-58
cmd-line-utils/libedit/hist.c
cmd-line-utils/libedit/hist.c
+7
-1
cmd-line-utils/libedit/histedit.h
cmd-line-utils/libedit/histedit.h
+19
-5
cmd-line-utils/libedit/history.c
cmd-line-utils/libedit/history.c
+53
-9
cmd-line-utils/libedit/key.c
cmd-line-utils/libedit/key.c
+88
-60
cmd-line-utils/libedit/key.h
cmd-line-utils/libedit/key.h
+4
-2
cmd-line-utils/libedit/libedit_term.h
cmd-line-utils/libedit/libedit_term.h
+0
-124
cmd-line-utils/libedit/makelist.sh
cmd-line-utils/libedit/makelist.sh
+10
-10
cmd-line-utils/libedit/map.c
cmd-line-utils/libedit/map.c
+39
-25
cmd-line-utils/libedit/np/fgetln.c
cmd-line-utils/libedit/np/fgetln.c
+35
-15
cmd-line-utils/libedit/np/strlcat.c
cmd-line-utils/libedit/np/strlcat.c
+45
-35
cmd-line-utils/libedit/np/strlcpy.c
cmd-line-utils/libedit/np/strlcpy.c
+41
-36
cmd-line-utils/libedit/np/unvis.c
cmd-line-utils/libedit/np/unvis.c
+43
-56
cmd-line-utils/libedit/np/vis.c
cmd-line-utils/libedit/np/vis.c
+221
-188
cmd-line-utils/libedit/np/vis.h
cmd-line-utils/libedit/np/vis.h
+5
-14
cmd-line-utils/libedit/parse.c
cmd-line-utils/libedit/parse.c
+9
-3
cmd-line-utils/libedit/parse.h
cmd-line-utils/libedit/parse.h
+2
-2
cmd-line-utils/libedit/prompt.c
cmd-line-utils/libedit/prompt.c
+7
-1
cmd-line-utils/libedit/read.c
cmd-line-utils/libedit/read.c
+41
-19
cmd-line-utils/libedit/read.h
cmd-line-utils/libedit/read.h
+1
-8
cmd-line-utils/libedit/readline.c
cmd-line-utils/libedit/readline.c
+320
-523
cmd-line-utils/libedit/readline/readline.h
cmd-line-utils/libedit/readline/readline.h
+23
-15
cmd-line-utils/libedit/refresh.c
cmd-line-utils/libedit/refresh.c
+52
-24
cmd-line-utils/libedit/search.c
cmd-line-utils/libedit/search.c
+7
-2
cmd-line-utils/libedit/sig.c
cmd-line-utils/libedit/sig.c
+13
-7
cmd-line-utils/libedit/sig.h
cmd-line-utils/libedit/sig.h
+1
-2
cmd-line-utils/libedit/strlcpy.c
cmd-line-utils/libedit/strlcpy.c
+0
-73
cmd-line-utils/libedit/strlcpy.h
cmd-line-utils/libedit/strlcpy.h
+0
-2
cmd-line-utils/libedit/sys.h
cmd-line-utils/libedit/sys.h
+23
-4
cmd-line-utils/libedit/term.c
cmd-line-utils/libedit/term.c
+223
-111
cmd-line-utils/libedit/tokenizer.c
cmd-line-utils/libedit/tokenizer.c
+7
-1
cmd-line-utils/libedit/tokenizer.h
cmd-line-utils/libedit/tokenizer.h
+0
-54
cmd-line-utils/libedit/tty.c
cmd-line-utils/libedit/tty.c
+68
-21
cmd-line-utils/libedit/tty.h
cmd-line-utils/libedit/tty.h
+3
-3
cmd-line-utils/libedit/unvis.c
cmd-line-utils/libedit/unvis.c
+0
-311
cmd-line-utils/libedit/vi.c
cmd-line-utils/libedit/vi.c
+23
-16
cmd-line-utils/libedit/vis.c
cmd-line-utils/libedit/vis.c
+0
-392
cmd-line-utils/libedit/vis.h
cmd-line-utils/libedit/vis.h
+0
-92
No files found.
client/mysql.cc
View file @
fab053cc
...
...
@@ -2247,8 +2247,10 @@ static char **new_mysql_completion (const char *text, int start, int end);
if not.
*/
#if defined(USE_NEW_READLINE_INTERFACE)
|| defined(USE_LIBEDIT_INTERFACE)
#if defined(USE_NEW_READLINE_INTERFACE)
char
*
no_completion
(
const
char
*
,
int
)
#elif defined(USE_LIBEDIT_INTERFACE)
int
no_completion
(
const
char
*
,
int
)
#else
char
*
no_completion
()
#endif
...
...
cmd-line-utils/libedit/Makefile.am
View file @
fab053cc
## Process this file with automake to create Makefile.in
# Makefile for the GNU readline library.
# Copyright (C) 1994,1996,1997 Free Software Foundation, Inc.
ASRC
=
$(srcdir)
/vi.c
$(srcdir)
/emacs.c
$(srcdir)
/common.c
AHDR
=
vi.h emacs.h common.h
...
...
@@ -12,10 +10,9 @@ noinst_LIBRARIES = libedit.a
libedit_a_SOURCES
=
chared.c el.c history.c map.c prompt.c readline.c
\
search.c tokenizer.c vi.c common.c emacs.c
\
hist.c key.c parse.c read.c refresh.c sig.c term.c
\
tty.c help.c fcns.c
EXTRA_libedit_a_SOURCES
=
np/unvis.c np/strlcpy.c np/vis.c np/strlcat.c
\
np/fgetln.c
tty.c help.c fcns.c filecomplete.c
\
np/unvis.c np/strlcpy.c np/vis.c np/strlcat.c
\
np/fgetln.c
libedit_a_LIBADD
=
@LIBEDIT_LOBJECTS@
libedit_a_DEPENDENCIES
=
@LIBEDIT_LOBJECTS@
...
...
@@ -23,22 +20,13 @@ libedit_a_DEPENDENCIES = @LIBEDIT_LOBJECTS@
pkginclude_HEADERS
=
readline/readline.h
noinst_HEADERS
=
chared.h el.h el_term.h histedit.h key.h parse.h refresh.h sig.h
\
sys.h
tokenizer.h
config.h hist.h map.h prompt.h read.h
\
search.h tty.h
libedit_term.h vis
.h
sys.h config.h hist.h map.h prompt.h read.h
\
search.h tty.h
filecomplete
.h
EXTRA_DIST
=
makelist.sh
np/unvis.c np/strlcpy.c np/vis.c np/vis.h np/strlcat.c np/fgetln.c
EXTRA_DIST
=
makelist.sh
CLEANFILES
=
makelist common.h emacs.h vi.h fcns.h help.h fcns.c help.c
# Make sure to include stuff from this directory first, to get right "config.h"
# Automake puts into DEFAULT_INCLUDES this source and corresponding
# build directory together with ../../include to let all make files
# find the central "config.h". This variable is used before INCLUDES
# above. But in automake 1.10 the order of these are changed. Put the
# includes of this directory into DEFS to always be sure it is first
# before DEFAULT_INCLUDES on the compile line.
DEFS
=
-DUNDEF_THREADS_HACK
-DHAVE_CONFIG_H
-DNO_KILL_INTR
-I
.
-I
$(srcdir)
SUFFIXES
=
.sh
.sh
:
...
...
@@ -101,6 +89,4 @@ term.o: vi.h emacs.h common.h help.h fcns.h
tty.o
:
vi.h emacs.h common.h help.h fcns.h
help.o
:
vi.h emacs.h common.h help.h fcns.h
fcns.o
:
vi.h emacs.h common.h help.h fcns.h
# Don't update the files from bitkeeper
%
::
SCCS/s.%
filecomplete.o
:
vi.h emacs.h common.h help.h fcns.h
cmd-line-utils/libedit/README
0 → 100644
View file @
fab053cc
An approximate method to merge from upstream is:
# Fetch latest from upstream (we also include some compat stuff)
$ CVS_RSH=ssh; export CVS_RSH
$ CVSROOT="anoncvs@stripped:/cvsroot"
$ cvs co -d libedit -P src/lib/libedit
$ mkdir libedit/np
$ for f in src/common/lib/libc/string/strlcat.c \
> src/common/lib/libc/string/strlcpy.c \
> src/include/vis.h \
> src/lib/libc/gen/unvis.c \
> src/lib/libc/gen/vis.c \
> src/tools/compat/fgetln.c
> do
> cvs co -P ${f}
> mv ${f} libedit/np
> done
$ rm -rf src
$ cd libedit
# Remove files we don't need/use
$ rm -rf CVS TEST Makefile shlib_version *.[0-9]
$ (cd readline; rm -rf CVS Makefile)
# Rename files to match our naming
$ mv makelist makelist.sh
$ mv term.h el_term.h
# Remove NetBSD-specific bits
$ for file in $(find . -type f)
> do
> cp ${file} ${file}.orig
> sed -e 's/#include "term.h"/#include "el_term.h"/g' \
> -e 's/sig_handler/el_sig_handler/g' \
> -e 's/isprint/el_isprint/g' \
> -e '/^__RCSID/d' \
> ${file}.orig >${file}
> rm ${file}.orig
> done
then merge remaining bits by hand. All MySQL-specific changes should be
marked with XXXMYSQL to make them easier to identify and merge. To generate
a 'clean' diff against upstream you can use the above commands but use
cvs co -D "2009/02/06 20:09:00" [..]
to fetch the baseline of most recent merge.
Please feed any fixes to Jonathan Perkin <jperkin@stripped> who will endeavour
to merge them upstream and keep diffs minimal.
cmd-line-utils/libedit/TEST/test.c
deleted
100644 → 0
View file @
6c6fc097
/* $NetBSD: test.c,v 1.9 2000/09/04 23:36:41 lukem Exp $ */
/*-
* Copyright (c) 1992, 1993
* The Regents of the University of California. All rights reserved.
*
* This code is derived from software contributed to Berkeley by
* Christos Zoulas of Cornell University.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. All advertising materials mentioning features or use of this software
* must display the following acknowledgement:
* This product includes software developed by the University of
* California, Berkeley and its contributors.
* 4. Neither the name of the University nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*/
#include <sys/cdefs.h>
#include "compat.h"
#ifndef lint
__COPYRIGHT
(
"@(#) Copyright (c) 1992, 1993
\n
\
The Regents of the University of California. All rights reserved.
\n
"
);
#endif
/* not lint */
#if !defined(lint) && !defined(SCCSID)
#if 0
static char sccsid[] = "@(#)test.c 8.1 (Berkeley) 6/4/93";
#else
__RCSID
(
"$NetBSD: test.c,v 1.9 2000/09/04 23:36:41 lukem Exp $"
);
#endif
#endif
/* not lint && not SCCSID */
/*
* test.c: A little test program
*/
#include "sys.h"
#include <stdio.h>
#include <string.h>
#include <signal.h>
#include <sys/wait.h>
#include <ctype.h>
#include <stdlib.h>
#include <unistd.h>
#include <dirent.h>
#include "histedit.h"
#include "tokenizer.h"
static
int
continuation
=
0
;
static
EditLine
*
el
=
NULL
;
static
u_char
complete
(
EditLine
*
,
int
);
int
main
(
int
,
char
**
);
static
char
*
prompt
(
EditLine
*
);
static
void
sig
(
int
);
static
char
*
prompt
(
EditLine
*
el
)
{
static
char
a
[]
=
"Edit$"
;
static
char
b
[]
=
"Edit>"
;
return
(
continuation
?
b
:
a
);
}
static
void
sig
(
int
i
)
{
(
void
)
fprintf
(
stderr
,
"Got signal %d.
\n
"
,
i
);
el_reset
(
el
);
}
static
unsigned
char
complete
(
EditLine
*
el
,
int
ch
)
{
DIR
*
dd
=
opendir
(
"."
);
struct
dirent
*
dp
;
const
char
*
ptr
;
const
LineInfo
*
lf
=
el_line
(
el
);
int
len
;
/*
* Find the last word
*/
for
(
ptr
=
lf
->
cursor
-
1
;
!
isspace
(
*
ptr
)
&&
ptr
>
lf
->
buffer
;
ptr
--
)
continue
;
len
=
lf
->
cursor
-
++
ptr
;
for
(
dp
=
readdir
(
dd
);
dp
!=
NULL
;
dp
=
readdir
(
dd
))
{
if
(
len
>
strlen
(
dp
->
d_name
))
continue
;
if
(
strncmp
(
dp
->
d_name
,
ptr
,
len
)
==
0
)
{
closedir
(
dd
);
if
(
el_insertstr
(
el
,
&
dp
->
d_name
[
len
])
==
-
1
)
return
(
CC_ERROR
);
else
return
(
CC_REFRESH
);
}
}
closedir
(
dd
);
return
(
CC_ERROR
);
}
int
main
(
int
argc
,
char
*
argv
[])
{
int
num
;
const
char
*
buf
;
Tokenizer
*
tok
;
int
lastevent
=
0
,
ncontinuation
;
History
*
hist
;
HistEvent
ev
;
(
void
)
signal
(
SIGINT
,
sig
);
(
void
)
signal
(
SIGQUIT
,
sig
);
(
void
)
signal
(
SIGHUP
,
sig
);
(
void
)
signal
(
SIGTERM
,
sig
);
hist
=
history_init
();
/* Init the builtin history */
/* Remember 100 events */
history
(
hist
,
&
ev
,
H_SETSIZE
,
100
);
tok
=
tok_init
(
NULL
);
/* Initialize the tokenizer */
/* Initialize editline */
el
=
el_init
(
*
argv
,
stdin
,
stdout
,
stderr
);
el_set
(
el
,
EL_EDITOR
,
"vi"
);
/* Default editor is vi */
el_set
(
el
,
EL_SIGNAL
,
1
);
/* Handle signals gracefully */
el_set
(
el
,
EL_PROMPT
,
prompt
);
/* Set the prompt function */
/* Tell editline to use this history interface */
el_set
(
el
,
EL_HIST
,
history
,
hist
);
/* Add a user-defined function */
el_set
(
el
,
EL_ADDFN
,
"ed-complete"
,
"Complete argument"
,
complete
);
/* Bind tab to it */
el_set
(
el
,
EL_BIND
,
"^I"
,
"ed-complete"
,
NULL
);
/*
* Bind j, k in vi command mode to previous and next line, instead
* of previous and next history.
*/
el_set
(
el
,
EL_BIND
,
"-a"
,
"k"
,
"ed-prev-line"
,
NULL
);
el_set
(
el
,
EL_BIND
,
"-a"
,
"j"
,
"ed-next-line"
,
NULL
);
/*
* Source the user's defaults file.
*/
el_source
(
el
,
NULL
);
while
((
buf
=
el_gets
(
el
,
&
num
))
!=
NULL
&&
num
!=
0
)
{
int
ac
;
char
**
av
;
#ifdef DEBUG
(
void
)
fprintf
(
stderr
,
"got %d %s"
,
num
,
buf
);
#endif
if
(
!
continuation
&&
num
==
1
)
continue
;
if
(
tok_line
(
tok
,
buf
,
&
ac
,
&
av
)
>
0
)
ncontinuation
=
1
;
#if 0
if (continuation) {
/*
* Append to the right event in case the user
* moved around in history.
*/
if (history(hist, &ev, H_SET, lastevent) == -1)
err(1, "%d: %s\n", lastevent, ev.str);
history(hist, &ev, H_ADD , buf);
} else {
history(hist, &ev, H_ENTER, buf);
lastevent = ev.num;
}
#else
/* Simpler */
history
(
hist
,
&
ev
,
continuation
?
H_APPEND
:
H_ENTER
,
buf
);
#endif
continuation
=
ncontinuation
;
ncontinuation
=
0
;
if
(
strcmp
(
av
[
0
],
"history"
)
==
0
)
{
int
rv
;
switch
(
ac
)
{
case
1
:
for
(
rv
=
history
(
hist
,
&
ev
,
H_LAST
);
rv
!=
-
1
;
rv
=
history
(
hist
,
&
ev
,
H_PREV
))
(
void
)
fprintf
(
stdout
,
"%4d %s"
,
ev
.
num
,
ev
.
str
);
break
;
case
2
:
if
(
strcmp
(
av
[
1
],
"clear"
)
==
0
)
history
(
hist
,
&
ev
,
H_CLEAR
);
else
goto
badhist
;
break
;
case
3
:
if
(
strcmp
(
av
[
1
],
"load"
)
==
0
)
history
(
hist
,
&
ev
,
H_LOAD
,
av
[
2
]);
else
if
(
strcmp
(
av
[
1
],
"save"
)
==
0
)
history
(
hist
,
&
ev
,
H_SAVE
,
av
[
2
]);
break
;
badhist:
default:
(
void
)
fprintf
(
stderr
,
"Bad history arguments
\n
"
);
break
;
}
}
else
if
(
el_parse
(
el
,
ac
,
av
)
==
-
1
)
{
switch
(
fork
())
{
case
0
:
execvp
(
av
[
0
],
av
);
perror
(
av
[
0
]);
_exit
(
1
);
/*NOTREACHED*/
break
;
case
-
1
:
perror
(
"fork"
);
break
;
default:
if
(
wait
(
&
num
)
==
-
1
)
perror
(
"wait"
);
(
void
)
fprintf
(
stderr
,
"Exit %x
\n
"
,
num
);
break
;
}
}
tok_reset
(
tok
);
}
el_end
(
el
);
tok_end
(
tok
);
history_end
(
hist
);
return
(
0
);
}
cmd-line-utils/libedit/chared.c
View file @
fab053cc
/* $NetBSD: chared.c,v 1.2
2 2004/08/13 12:10:38 mycroft
Exp $ */
/* $NetBSD: chared.c,v 1.2
6 2009/02/06 12:45:25 sketch
Exp $ */
/*-
* Copyright (c) 1992, 1993
...
...
@@ -32,7 +32,13 @@
* SUCH DAMAGE.
*/
#include <config.h>
#include "config.h"
#if !defined(lint) && !defined(SCCSID)
#if 0
static char sccsid[] = "@(#)chared.c 8.1 (Berkeley) 6/4/93";
#else
#endif
#endif
/* not lint && not SCCSID */
/*
* chared.c: Character editor utilities
...
...
@@ -40,6 +46,8 @@
#include <stdlib.h>
#include "el.h"
private
void
ch__clearmacro
(
EditLine
*
);
/* value to leave unused in line buffer */
#define EL_LEAVE 2
...
...
@@ -51,13 +59,13 @@ cv_undo(EditLine *el)
{
c_undo_t
*
vu
=
&
el
->
el_chared
.
c_undo
;
c_redo_t
*
r
=
&
el
->
el_chared
.
c_redo
;
int
size
;
unsigned
int
size
;
/* Save entire line for undo */
size
=
el
->
el_line
.
lastchar
-
el
->
el_line
.
buffer
;
vu
->
len
=
size
;
vu
->
cursor
=
el
->
el_line
.
cursor
-
el
->
el_line
.
buffer
;
memcpy
(
vu
->
buf
,
el
->
el_line
.
buffer
,
(
size_t
)
size
);
memcpy
(
vu
->
buf
,
el
->
el_line
.
buffer
,
size
);
/* save command info for redo */
r
->
count
=
el
->
el_state
.
doingarg
?
el
->
el_state
.
argument
:
0
;
...
...
@@ -439,6 +447,8 @@ cv__endword(char *p, char *high, int n, int (*wtest)(int))
protected
int
ch_init
(
EditLine
*
el
)
{
c_macro_t
*
ma
=
&
el
->
el_chared
.
c_macro
;
el
->
el_line
.
buffer
=
(
char
*
)
el_malloc
(
EL_BUFSIZ
);
if
(
el
->
el_line
.
buffer
==
NULL
)
return
(
-
1
);
...
...
@@ -479,11 +489,10 @@ ch_init(EditLine *el)
el
->
el_state
.
argument
=
1
;
el
->
el_state
.
lastcmd
=
ED_UNASSIGNED
;
el
->
el_chared
.
c_macro
.
level
=
-
1
;
el
->
el_chared
.
c_macro
.
offset
=
0
;
el
->
el_chared
.
c_macro
.
macro
=
(
char
**
)
el_malloc
(
EL_MAXMACRO
*
sizeof
(
char
*
));
if
(
el
->
el_chared
.
c_macro
.
macro
==
NULL
)
ma
->
level
=
-
1
;
ma
->
offset
=
0
;
ma
->
macro
=
(
char
**
)
el_malloc
(
EL_MAXMACRO
*
sizeof
(
char
*
));
if
(
ma
->
macro
==
NULL
)
return
(
-
1
);
return
(
0
);
}
...
...
@@ -492,7 +501,7 @@ ch_init(EditLine *el)
* Reset the character editor
*/
protected
void
ch_reset
(
EditLine
*
el
)
ch_reset
(
EditLine
*
el
,
int
mclear
)
{
el
->
el_line
.
cursor
=
el
->
el_line
.
buffer
;
el
->
el_line
.
lastchar
=
el
->
el_line
.
buffer
;
...
...
@@ -513,9 +522,19 @@ ch_reset(EditLine *el)
el
->
el_state
.
argument
=
1
;
el
->
el_state
.
lastcmd
=
ED_UNASSIGNED
;
el
->
el_chared
.
c_macro
.
level
=
-
1
;
el
->
el_history
.
eventno
=
0
;
if
(
mclear
)
ch__clearmacro
(
el
);
}
private
void
ch__clearmacro
(
el
)
EditLine
*
el
;
{
c_macro_t
*
ma
=
&
el
->
el_chared
.
c_macro
;
while
(
ma
->
level
>=
0
)
el_free
((
ptr_t
)
ma
->
macro
[
ma
->
level
--
]);
}
/* ch_enlargebufs():
...
...
@@ -623,9 +642,9 @@ ch_end(EditLine *el)
el
->
el_chared
.
c_redo
.
cmd
=
ED_UNASSIGNED
;
el_free
((
ptr_t
)
el
->
el_chared
.
c_kill
.
buf
);
el
->
el_chared
.
c_kill
.
buf
=
NULL
;
ch_reset
(
el
,
1
);
el_free
((
ptr_t
)
el
->
el_chared
.
c_macro
.
macro
);
el
->
el_chared
.
c_macro
.
macro
=
NULL
;
ch_reset
(
el
);
}
...
...
cmd-line-utils/libedit/chared.h
View file @
fab053cc
/* $NetBSD: chared.h,v 1.1
4 2004/08/13 12:10:39 mycroft
Exp $ */
/* $NetBSD: chared.h,v 1.1
7 2006/03/06 21:11:56 christos
Exp $ */
/*-
* Copyright (c) 1992, 1993
...
...
@@ -48,7 +48,7 @@
#define EL_MAXMACRO 10
/*
* This is a issue of basic "vi" look-and-feel. Defining VI_MOVE works
* This is a
n
issue of basic "vi" look-and-feel. Defining VI_MOVE works
* like real vi: i.e. the transition from command<->insert modes moves
* the cursor.
*
...
...
@@ -116,11 +116,10 @@ typedef struct el_chared_t {
}
el_chared_t
;
#define STReof "^D\b\b"
#define STRQQ "\"\""
#define isglob(a) (strchr("*[]?", (a)) != NULL)
#define isword(a) (isprint(a))
#define isword(a) (
el_
isprint(a))
#define NOP 0x00
#define DELETE 0x01
...
...
@@ -161,7 +160,7 @@ protected int c_gets(EditLine *, char *, const char *);
protected
int
c_hpos
(
EditLine
*
);
protected
int
ch_init
(
EditLine
*
);
protected
void
ch_reset
(
EditLine
*
);
protected
void
ch_reset
(
EditLine
*
,
int
);
protected
int
ch_enlargebufs
(
EditLine
*
,
size_t
);
protected
void
ch_end
(
EditLine
*
);
...
...
cmd-line-utils/libedit/common.c
View file @
fab053cc
/* $NetBSD: common.c,v 1.
16 2003/08/07 16:44:30 ag
c Exp $ */
/* $NetBSD: common.c,v 1.
21 2008/09/30 08:37:42 aymeri
c Exp $ */
/*-
* Copyright (c) 1992, 1993
...
...
@@ -32,7 +32,13 @@
* SUCH DAMAGE.
*/
#include <config.h>
#include "config.h"
#if !defined(lint) && !defined(SCCSID)
#if 0
static char sccsid[] = "@(#)common.c 8.1 (Berkeley) 6/4/93";
#else
#endif
#endif
/* not lint && not SCCSID */
/*
* common.c: Common Editor functions
...
...
@@ -130,7 +136,7 @@ ed_delete_prev_word(EditLine *el, int c __attribute__((__unused__)))
*/
protected
el_action_t
/*ARGSUSED*/
ed_delete_next_char
(
EditLine
*
el
,
int
c
__attribute__
((
__unused__
))
)
ed_delete_next_char
(
EditLine
*
el
,
int
c
)
{
#ifdef notdef
/* XXX */
#define EL el->el_line
...
...
@@ -147,9 +153,8 @@ ed_delete_next_char(EditLine *el, int c __attribute__((__unused__)))
#ifdef KSHVI
return
(
CC_ERROR
);
#else
term_overwrite
(
el
,
STReof
,
4
);
/* then do a EOF */
term__flush
();
/* then do an EOF */
term_writechar
(
el
,
c
);
return
(
CC_EOF
);
#endif
}
else
{
...
...
@@ -207,13 +212,13 @@ ed_move_to_end(EditLine *el, int c __attribute__((__unused__)))
el
->
el_line
.
cursor
=
el
->
el_line
.
lastchar
;
if
(
el
->
el_map
.
type
==
MAP_VI
)
{
#ifdef VI_MOVE
el
->
el_line
.
cursor
--
;
#endif
if
(
el
->
el_chared
.
c_vcmd
.
action
!=
NOP
)
{
cv_delfini
(
el
);
return
(
CC_REFRESH
);
}
#ifdef VI_MOVE
el
->
el_line
.
cursor
--
;
#endif
}
return
(
CC_CURSOR
);
}
...
...
@@ -609,7 +614,7 @@ protected el_action_t
ed_start_over
(
EditLine
*
el
,
int
c
__attribute__
((
__unused__
)))
{
ch_reset
(
el
);
ch_reset
(
el
,
0
);
return
(
CC_REFRESH
);
}
...
...
@@ -904,7 +909,7 @@ ed_command(EditLine *el, int c __attribute__((__unused__)))
int
tmplen
;
tmplen
=
c_gets
(
el
,
tmpbuf
,
"
\n
: "
);
term__putc
(
'\n'
);
term__putc
(
el
,
'\n'
);
if
(
tmplen
<
0
||
(
tmpbuf
[
tmplen
]
=
0
,
parse_line
(
el
,
tmpbuf
))
==
-
1
)
term_beep
(
el
);
...
...
cmd-line-utils/libedit/compat.h
deleted
100644 → 0
View file @
6c6fc097
#ifndef __LIBEDIT_COMPATH_H
#define __LIBEDIT_COMPATH_H
#define __RCSID(x)
#define __COPYRIGHT(x)
#include "compat_conf.h"
#ifndef HAVE_VIS_H
/* string visual representation - may want to reimplement */
#define strvis(d,s,m) strcpy(d,s)
#define strunvis(d,s) strcpy(d,s)
#endif
#ifndef HAVE_FGETLN
#include "fgetln.h"
#endif
#ifndef HAVE_ISSETUGID
#define issetugid() (getuid()!=geteuid() || getegid()!=getgid())
#endif
#ifndef HAVE_STRLCPY
#include "strlcpy.h"
#endif
#if HAVE_SYS_CDEFS_H
#include <sys/cdefs.h>
#endif
#ifndef __P
#ifdef __STDC__
#define __P(x) x
#else
#define __P(x) ()
#endif
#endif
#if !defined(__attribute__) && (defined(__cplusplus) || !defined(__GNUC__) || __GNUC__ == 2 && __GNUC_MINOR__ < 8)
#define __attribute__(A)
#endif
#endif
cmd-line-utils/libedit/compat_conf.h
deleted
100644 → 0
View file @
6c6fc097
#include "my_config.h"
cmd-line-utils/libedit/config.h
View file @
fab053cc
#include "my_config.h"
#include "sys.h"
#if defined(LIBC_SCCS) && !defined(lint)
#define __RCSID(x)
#define __COPYRIGHT(x)
#endif
#define __RENAME(x)
#define _DIAGASSERT(x)
#if !defined(__attribute__) && (defined(__cplusplus) || !defined(__GNUC__) || __GNUC__ == 2 && __GNUC_MINOR__ < 8)
#define __attribute__(A)
#endif
cmd-line-utils/libedit/editline.3
deleted
100644 → 0
View file @
6c6fc097
.\" $NetBSD: editline.3,v 1.21 2001/04/02 18:29:49 wiz Exp $
.\"
.\" Copyright (c) 1997-1999 The NetBSD Foundation, Inc.
.\" All rights reserved.
.\"
.\" This file was contributed to The NetBSD Foundation by Luke Mewburn.
.\"
.\" Redistribution and use in source and binary forms, with or without
.\" modification, are permitted provided that the following conditions
.\" are met:
.\" 1. Redistributions of source code must retain the above copyright
.\" notice, this list of conditions and the following disclaimer.
.\" 2. Redistributions in binary form must reproduce the above copyright
.\" notice, this list of conditions and the following disclaimer in the
.\" documentation and/or other materials provided with the distribution.
.\" 3. All advertising materials mentioning features or use of this software
.\" must display the following acknowledgement:
.\" This product includes software developed by the NetBSD
.\" Foundation, Inc. and its contributors.
.\" 4. Neither the name of The NetBSD Foundation nor the names of its
.\" contributors may be used to endorse or promote products derived
.\" from this software without specific prior written permission.
.\"
.\" THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
.\" ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
.\" TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
.\" PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
.\" BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
.\" CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
.\" SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
.\" CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
.\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
.\" POSSIBILITY OF SUCH DAMAGE.
.\"
.Dd November 12, 1999
.Os
.Dt EDITLINE 3
.Sh NAME
.Nm editline ,
.Nm el_init ,
.Nm el_end ,
.Nm el_reset ,
.Nm el_gets ,
.Nm el_getc ,
.Nm el_push ,
.Nm el_parse ,
.Nm el_set ,
.Nm el_source ,
.Nm el_resize ,
.Nm el_line ,
.Nm el_insertstr ,
.Nm el_deletestr ,
.Nm history_init ,
.Nm history_end ,
.Nm history
.Nd line editor and history functions
.Sh LIBRARY
.Lb libedit
.Sh SYNOPSIS
.Fd #include <histedit.h>
.Ft EditLine *
.Fn el_init "const char *prog" "FILE *fin" "FILE *fout" "FILE *ferr"
.Ft void
.Fn el_end "EditLine *e"
.Ft void
.Fn el_reset "EditLine *e"
.Ft const char *
.Fn el_gets "EditLine *e" "int *count"
.Ft int
.Fn el_getc "EditLine *e" "char *ch"
.Ft void
.Fn el_push "EditLine *e" "const char *str"
.Ft int
.Fn el_parse "EditLine *e" "int argc" "char *argv[]"
.Ft int
.Fn el_set "EditLine *e" "int op" "..."
.Ft int
.Fn el_get "EditLine *e" "int op" "void *result"
.Ft int
.Fn el_source "EditLine *e" "const char *file"
.Ft void
.Fn el_resize "EditLine *e"
.Ft const LineInfo *
.Fn el_line "EditLine *e"
.Ft int
.Fn el_insertstr "EditLine *e" "const char *str"
.Ft void
.Fn el_deletestr "EditLine *e" "int count"
.Ft History *
.Fn history_init
.Ft void
.Fn history_end "History *h"
.Ft int
.Fn history "History *h" "HistEvent *ev" "int op" "..."
.Sh DESCRIPTION
The
.Nm
library provides generic line editing and history functions,
similar to those found in
.Xr sh 1 .
.Pp
These functions are available in the
.Nm libedit
library (which needs the
.Nm libtermcap
library).
Programs should be linked with
.Fl ledit ltermcap .
.Sh LINE EDITING FUNCTIONS
The line editing functions use a common data structure,
.Fa EditLine ,
which is created by
.Fn el_init
and freed by
.Fn el_end .
.Pp
The following functions are available:
.Bl -tag -width 4n
.It Fn el_init
Initialise the line editor, and return a data structure
to be used by all other line editing functions.
.Fa prog
is the name of the invoking program, used when reading the
.Xr editrc 5
file to determine which settings to use.
.Fa fin ,
.Fa fout
and
.Fa ferr
are the input, output, and error streams (respectively) to use.
In this documentation, references to
.Dq the tty
are actually to this input/output stream combination.
.It Fn el_end
Clean up and finish with
.Fa e ,
assumed to have been created with
.Fn el_init .
.It Fn el_reset
Reset the tty and the parser.
This should be called after an error which may have upset the tty's
state.
.It Fn el_gets
Read a line from the tty.
.Fa count
is modified to contain the number of characters read.
Returns the line read if successful, or
.Dv NULL
if no characters were read or if an error occurred.
.It Fn el_getc
Read a character from the tty.
.Fa ch
is modified to contain the character read.
Returns the number of characters read if successful, -1 otherwise.
.It Fn el_push
Pushes
.Fa str
back onto the input stream.
This is used by the macro expansion mechanism.
Refer to the description of
.Ic bind
.Fl s
in
.Xr editrc 5
for more information.
.It Fn el_parse
Parses the
.Fa argv
array (which is
.Fa argc
elements in size)
to execute builtin
.Nm
commands.
If the command is prefixed with
.Dq prog:
then
.Fn el_parse
will only execute the command if
.Dq prog
matches the
.Fa prog
argument supplied to
.Fn el_init .
The return value is
-1 if the command is unknown,
0 if there was no error or
.Dq prog
didn't match, or
1 if the command returned an error.
Refer to
.Xr editrc 5
for more information.
.It Fn el_set
Set
.Nm
parameters.
.Fa op
determines which parameter to set, and each operation has its
own parameter list.
.Pp
The following values for
.Fa op
are supported, along with the required argument list:
.Bl -tag -width 4n
.It Dv EL_PROMPT , Fa "char *(*f)(EditLine *)"
Define prompt printing function as
.Fa f ,
which is to return a string that contains the prompt.
.It Dv EL_RPROMPT , Fa "char *(*f)(EditLine *)"
Define right side prompt printing function as
.Fa f ,
which is to return a string that contains the prompt.
.It Dv EL_TERMINAL , Fa "const char *type"
Define terminal type of the tty to be
.Fa type ,
or to
.Ev TERM
if
.Fa type
is
.Dv NULL .
.It Dv EL_EDITOR , Fa "const char *mode"
Set editing mode to
.Fa mode ,
which must be one of
.Dq emacs
or
.Dq vi .
.It Dv EL_SIGNAL , Fa "int flag"
If
.Fa flag
is non-zero,
.Nm
will install its own signal handler for the following signals when
reading command input:
.Dv SIGCONT ,
.Dv SIGHUP ,
.Dv SIGINT ,
.Dv SIGQUIT ,
.Dv SIGSTOP ,
.Dv SIGTERM ,
.Dv SIGTSTP ,
and
.Dv SIGWINCH .
Otherwise, the current signal handlers will be used.
.It Dv EL_BIND , Xo
.Fa "const char *" ,
.Fa "..." ,
.Dv NULL
.Xc
Perform the
.Ic bind
builtin command.
Refer to
.Xr editrc 5
for more information.
.It Dv EL_ECHOTC , Xo
.Fa "const char *" ,
.Fa "..." ,
.Dv NULL
.Xc
Perform the
.Ic echotc
builtin command.
Refer to
.Xr editrc 5
for more information.
.It Dv EL_SETTC , Xo
.Fa "const char *" ,
.Fa "..." ,
.Dv NULL
.Xc
Perform the
.Ic settc
builtin command.
Refer to
.Xr editrc 5
for more information.
.It Dv EL_SETTY , Xo
.Fa "const char *" ,
.Fa "..." ,
.Dv NULL
.Xc
Perform the
.Ic setty
builtin command.
Refer to
.Xr editrc 5
for more information.
.It Dv EL_TELLTC , Xo
.Fa "const char *" ,
.Fa "..." ,
.Dv NULL
.Xc
Perform the
.Ic telltc
builtin command.
Refer to
.Xr editrc 5
for more information.
.It Dv EL_ADDFN , Xo
.Fa "const char *name" ,
.Fa "const char *help" ,
.Fa "unsigned char (*func)(EditLine *e, int ch)
.Xc
Add a user defined function,
.Fn func ,
referred to as
.Fa name
which is invoked when a key which is bound to
.Fa name
is entered.
.Fa help
is a description of
.Fa name .
At invocation time,
.Fa ch
is the key which caused the invocation.
The return value of
.Fn func
should be one of:
.Bl -tag -width "CC_REDISPLAY"
.It Dv CC_NORM
Add a normal character.
.It Dv CC_NEWLINE
End of line was entered.
.It Dv CC_EOF
EOF was entered.
.It Dv CC_ARGHACK
Expecting further command input as arguments, do nothing visually.
.It Dv CC_REFRESH
Refresh display.
.It Dv CC_REFRESH_BEEP
Refresh display, and beep.
.It Dv CC_CURSOR
Cursor moved, so update and perform
.Dv CC_REFRESH.
.It Dv CC_REDISPLAY
Redisplay entire input line.
This is useful if a key binding outputs extra information.
.It Dv CC_ERROR
An error occurred.
Beep, and flush tty.
.It Dv CC_FATAL
Fatal error, reset tty to known state.
.El
.It Dv EL_HIST , Xo
.Fa "History *(*func)(History *, int op, ...)" ,
.Fa "const char *ptr"
.Xc
Defines which history function to use, which is usually
.Fn history .
.Fa ptr
should be the value returned by
.Fn history_init .
.It Dv EL_EDITMODE , Fa "int flag"
If
.Fa flag
is non-zero,
editing is enabled (the default).
Note that this is only an indication, and does not
affect the operation of
.Nm "" .
At this time, it is the caller's responsibility to
check this
(using
.Fn el_get )
to determine if editing should be enabled or not.
.El
.It Fn el_get
Get
.Nm
parameters.
.Fa op
determines which parameter to retrieve into
.Fa result .
.Pp
The following values for
.Fa op
are supported, along with actual type of
.Fa result :
.Bl -tag -width 4n
.It Dv EL_PROMPT , Fa "char *(*f)(EditLine *)"
Return a pointer to the function that displays the prompt.
.It Dv EL_RPROMPT , Fa "char *(*f)(EditLine *)"
Return a pointer to the function that displays the rightside prompt.
.It Dv EL_EDITOR , Fa "const char *"
Return the name of the editor, which will be one of
.Dq emacs
or
.Dq vi .
.It Dv EL_SIGNAL , Fa "int *"
Return non-zero if
.Nm
has installed private signal handlers (see
.Fn el_get
above).
.It Dv EL_EDITMODE, Fa "int *"
Return non-zero if editing is enabled.
.El
.It Fn el_source
Initialise
.Nm
by reading the contents of
.Fa file .
.Fn el_parse
is called for each line in
.Fa file .
If
.Fa file
is
.Dv NULL ,
try
.Pa $PWD/.editrc
then
.Pa $HOME/.editrc .
Refer to
.Xr editrc 5
for details on the format of
.Fa file .
.It Fn el_resize
Must be called if the terminal size changes.
If
.Dv EL_SIGNAL
has been set with
.Fn el_set ,
then this is done automatically.
Otherwise, it's the responsibility of the application to call
.Fn el_resize
on the appropriate occasions.
.It Fn el_line
Return the editing information for the current line in a
.Fa LineInfo
structure, which is defined as follows:
.Bd -literal
typedef struct lineinfo {
const char *buffer; /* address of buffer */
const char *cursor; /* address of cursor */
const char *lastchar; /* address of last character */
} LineInfo;
.Ed
.It Fn el_insertstr
Insert
.Fa str
into the line at the cursor.
Returns -1 if
.Fa str
is empty or won't fit, and 0 otherwise.
.It Fn el_deletestr
Delete
.Fa num
characters before the cursor.
.El
.Sh HISTORY LIST FUNCTIONS
The history functions use a common data structure,
.Fa History ,
which is created by
.Fn history_init
and freed by
.Fn history_end .
.Pp
The following functions are available:
.Bl -tag -width 4n
.It Fn history_init
Initialise the history list, and return a data structure
to be used by all other history list functions.
.It Fn history_end
Clean up and finish with
.Fa h ,
assumed to have been created with
.Fn history_init .
.It Fn history
Perform operation
.Fa op
on the history list, with optional arguments as needed by the
operation.
.Fa ev
is changed accordingly to operation.
The following values for
.Fa op
are supported, along with the required argument list:
.Bl -tag -width 4n
.It Dv H_SETSIZE , Fa "int size"
Set size of history to
.Fa size
elements.
.It Dv H_GETSIZE
Get number of events currently in history.
.It Dv H_END
Cleans up and finishes with
.Fa h ,
assumed to be created with
.Fn history_init .
.It Dv H_CLEAR
Clear the history.
.It Dv H_FUNC , Xo
.Fa "void *ptr" ,
.Fa "history_gfun_t first" ,
.Fa "history_gfun_t next" ,
.Fa "history_gfun_t last" ,
.Fa "history_gfun_t prev" ,
.Fa "history_gfun_t curr" ,
.Fa "history_sfun_t set" ,
.Fa "history_vfun_t clear" ,
.Fa "history_efun_t enter" ,
.Fa "history_efun_t add"
.Xc
Define functions to perform various history operations.
.Fa ptr
is the argument given to a function when it's invoked.
.It Dv H_FIRST
Return the first element in the history.
.It Dv H_LAST
Return the last element in the history.
.It Dv H_PREV
Return the previous element in the history.
.It Dv H_NEXT
Return the next element in the history.
.It Dv H_CURR
Return the current element in the history.
.It Dv H_SET
Set the cursor to point to the requested element.
.It Dv H_ADD , Fa "const char *str"
Append
.Fa str
to the current element of the history, or create an element with
.It Dv H_APPEND , Fa "const char *str"
Append
.Fa str
to the last new element of the history.
.It Dv H_ENTER , Fa "const char *str"
Add
.Fa str
as a new element to the history, and, if necessary,
removing the oldest entry to keep the list to the created size.
.It Dv H_PREV_STR , Fa "const char *str"
Return the closest previous event that starts with
.Fa str .
.It Dv H_NEXT_STR , Fa "const char *str"
Return the closest next event that starts with
.Fa str .
.It Dv H_PREV_EVENT , Fa "int e"
Return the previous event numbered
.Fa e .
.It Dv H_NEXT_EVENT , Fa "int e"
Return the next event numbered
.Fa e .
.It Dv H_LOAD , Fa "const char *file"
Load the history list stored in
.Fa file .
.It Dv H_SAVE , Fa "const char *file"
Save the history list to
.Fa file .
.El
.Pp
.Fn history
returns 0 if the operation
.Fa op
succeeds. Otherwise, -1 is returned and
.Fa ev
is updated to contain more details about the error.
.El
.\"XXX.Sh EXAMPLES
.\"XXX: provide some examples
.Sh SEE ALSO
.Xr editrc 5 ,
.Xr sh 1 ,
.Xr signal 3 ,
.Xr termcap 3
.Sh HISTORY
The
.Nm
library first appeared in
.Bx 4.4 .
.Dv CC_REDISPLAY
appeared in
.Nx 1.3 .
.Dv CC_REFRESH_BEEP ,
.Dv EL_EDITMODE
and the readline emulation appeared in
.Nx 1.4 .
.Dv EL_RPROMPT
appeared in
.Nx 1.5 .
.Sh AUTHORS
The
.Nm
library was written by Christos Zoulas.
Luke Mewburn wrote this manual and implemented
.Dv CC_REDISPLAY ,
.Dv CC_REFRESH_BEEP ,
.Dv EL_EDITMODE ,
and
.Dv EL_RPROMPT .
Jaromir Dolecek implemented the readline emulation.
.Sh BUGS
The tokenization functions are not publically defined in
.Fd <histedit.h>.
.Pp
At this time, it is the responsibility of the caller to
check the result of the
.Dv EL_EDITMODE
operation of
.Fn el_get
(after an
.Fn el_source
or
.Fn el_parse )
to determine if
.Nm
should be used for further input.
I.e.,
.Dv EL_EDITMODE
is purely an indication of the result of the most recent
.Xr editrc 5
.Ic edit
command.
cmd-line-utils/libedit/editrc.5
deleted
100644 → 0
View file @
6c6fc097
.\" $NetBSD: editrc.5,v 1.11 2001/06/19 13:42:09 wiz Exp $
.\"
.\" Copyright (c) 1997-2000 The NetBSD Foundation, Inc.
.\" All rights reserved.
.\"
.\" This file was contributed to The NetBSD Foundation by Luke Mewburn.
.\"
.\" Redistribution and use in source and binary forms, with or without
.\" modification, are permitted provided that the following conditions
.\" are met:
.\" 1. Redistributions of source code must retain the above copyright
.\" notice, this list of conditions and the following disclaimer.
.\" 2. Redistributions in binary form must reproduce the above copyright
.\" notice, this list of conditions and the following disclaimer in the
.\" documentation and/or other materials provided with the distribution.
.\" 3. All advertising materials mentioning features or use of this software
.\" must display the following acknowledgement:
.\" This product includes software developed by the NetBSD
.\" Foundation, Inc. and its contributors.
.\" 4. Neither the name of The NetBSD Foundation nor the names of its
.\" contributors may be used to endorse or promote products derived
.\" from this software without specific prior written permission.
.\"
.\" THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
.\" ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
.\" TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
.\" PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
.\" BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
.\" CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
.\" SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
.\" CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
.\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
.\" POSSIBILITY OF SUCH DAMAGE.
.\"
.Dd November 8, 2000
.Os
.Dt EDITRC 5
.Sh NAME
.Nm editrc
.Nd configuration file for editline library
.Sh SYNOPSIS
.Nm
.Sh DESCRIPTION
The
.Nm
file defines various settings to be used by the
.Xr editline 3
library.
.Pp
The format of each line is:
.Dl [prog:]command [arg [...]]
.Pp
.Ar command
is one of the
.Xr editline 3
builtin commands.
Refer to
.Sx BUILTIN COMMANDS
for more information.
.Pp
.Ar prog
is the program name string that a program defines when it calls
.Xr el_init 3
to setup
.Xr editline 3 ,
which is usually
.Va argv[0] .
.Ar command
will be executed for any program which matches
.Ar prog .
.Pp
.Ar prog
may also be a
.Xr regex 3
style
regular expression, in which case
.Ar command
will be executed for any program that matches the regular expression.
.Pp
If
.Ar prog
is absent,
.Ar command
is executed for all programs.
.Sh BUILTIN COMMANDS
The
.Nm editline
library has some builtin commands, which affect the way
that the line editing and history functions operate.
These are based on similar named builtins present in the
.Xr tcsh 1
shell.
.Pp
The following builtin commands are available:
.Bl -tag -width 4n
.It Ic bind Xo
.Op Fl a
.Op Fl e
.Op Fl k
.Op Fl l
.Op Fl r
.Op Fl s
.Op Fl v
.Op Ar key Op Ar command
.Xc
Without options, list all bound keys, and the editor command to which
each is bound.
If
.Ar key
is supplied, show the bindings for
.Ar key .
If
.Ar key command
is supplied, bind
.Ar command
to
.Ar key .
Options include:
.Bl -tag -width 4n
.It Fl e
Bind all keys to the standard GNU Emacs-like bindings.
.It Fl v
Bind all keys to the standard
.Xr vi 1 -like
bindings.
.It Fl a
List or change key bindings in the
.Xr vi 1
mode alternate (command mode) key map.
.It Fl k
.Ar key
is interpreted as a symbolic arrow key name, which may be one of
.Sq up ,
.Sq down ,
.Sq left
or
.Sq right .
.It Fl l
List all editor commands and a short description of each.
.It Fl r
Remove a key's binding.
.It Fl s
.Ar command
is taken as a literal string and treated as terminal input when
.Ar key
is typed.
Bound keys in
.Ar command
are themselves reinterpreted, and this continues for ten levels of
interpretation.
.El
.Pp
.Ar command
may be one of the commands documented in
.Sx "EDITOR COMMANDS"
below, or another key.
.Pp
.Ar key
and
.Ar command
can contain control characters of the form
.Sm off
.Sq No ^ Ar character
.Sm on
.Po
e.g.
.Sq ^A
.Pc ,
and the following backslashed escape sequences:
.Pp
.Bl -tag -compact -offset indent -width 4n
.It Ic \ea
Bell
.It Ic \eb
Backspace
.It Ic \ee
Escape
.It Ic \ef
Formfeed
.It Ic \en
Newline
.It Ic \er
Carriage return
.It Ic \et
Horizontal tab
.It Ic \ev
Vertical tab
.Sm off
.It Sy \e Ar nnn
.Sm on
The ASCII character corresponding to the octal number
.Ar nnn .
.El
.Pp
.Sq \e
nullifies the special meaning of the following character,
if it has any, notably
.Sq \e
and
.Sq ^ .
.It Ic echotc Xo
.Op Fl sv
.Ar arg
.Ar ...
.Xc
Exercise terminal capabilities given in
.Ar arg Ar ... .
If
.Ar arg
is
.Sq baud ,
.Sq cols ,
.Sq lines ,
.Sq rows ,
.Sq meta or
.Sq tabs ,
the value of that capability is printed, with
.Dq yes
or
.Dq no
indicating that the terminal does or does not have that capability.
.Pp
.Fl s
returns an emptry string for non-existent capabilities, rather than
causing an error.
.Fl v
causes messages to be verbose.
.It Ic edit Op Li on | Li off
Enable or disable the
.Nm editline
functionality in a program.
.It Ic history
List the history.
.It Ic telltc
List the values of all the terminal capabilities (see
.Xr termcap 5 ).
.It Ic settc Ar cap Ar val
Set the terminal capability
.Ar cap
to
.Ar val ,
as defined in
.Xr termcap 5 .
No sanity checking is done.
.It Ic setty Xo
.Op Fl a
.Op Fl d
.Op Fl q
.Op Fl x
.Op Ar +mode
.Op Ar -mode
.Op Ar mode
.Xc
Control which tty modes that
.Nm
won't allow the user to change.
.Fl d ,
.Fl q
or
.Fl x
tells
.Ic setty
to act on the
.Sq edit ,
.Sq quote
or
.Sq execute
set of tty modes respectively; defaulting to
.Fl x .
.Pp
Without other arguments,
.Ic setty
lists the modes in the chosen set which are fixed on
.Po
.Sq +mode
.Pc
or off
.Po
.Sq -mode
.Pc .
.Fl a
lists all tty modes in the chosen set regardless of the setting.
With
.Ar +mode ,
.Ar -mode
or
.Ar mode ,
fixes
.Ar mode
on or off or removes control of
.Ar mode
in the chosen set.
.El
.Sh EDITOR COMMANDS
The following editor commands are available for use in key bindings:
.\" Section automatically generated with makelist
.Bl -tag -width 4n
.It Ic vi-paste-next
Vi paste previous deletion to the right of the cursor.
.It Ic vi-paste-prev
Vi paste previous deletion to the left of the cursor.
.It Ic vi-prev-space-word
Vi move to the previous space delimited word.
.It Ic vi-prev-word
Vi move to the previous word.
.It Ic vi-next-space-word
Vi move to the next space delimited word.
.It Ic vi-next-word
Vi move to the next word.
.It Ic vi-change-case
Vi change case of character under the cursor and advance one character.
.It Ic vi-change-meta
Vi change prefix command.
.It Ic vi-insert-at-bol
Vi enter insert mode at the beginning of line.
.It Ic vi-replace-char
Vi replace character under the cursor with the next character typed.
.It Ic vi-replace-mode
Vi enter replace mode.
.It Ic vi-substitute-char
Vi replace character under the cursor and enter insert mode.
.It Ic vi-substitute-line
Vi substitute entire line.
.It Ic vi-change-to-eol
Vi change to end of line.
.It Ic vi-insert
Vi enter insert mode.
.It Ic vi-add
Vi enter insert mode after the cursor.
.It Ic vi-add-at-eol
Vi enter insert mode at end of line.
.It Ic vi-delete-meta
Vi delete prefix command.
.It Ic vi-end-word
Vi move to the end of the current space delimited word.
.It Ic vi-to-end-word
Vi move to the end of the current word.
.It Ic vi-undo
Vi undo last change.
.It Ic vi-command-mode
Vi enter command mode (use alternative key bindings).
.It Ic vi-zero
Vi move to the beginning of line.
.It Ic vi-delete-prev-char
Vi move to previous character (backspace).
.It Ic vi-list-or-eof
Vi list choices for completion or indicate end of file if empty line.
.It Ic vi-kill-line-prev
Vi cut from beginning of line to cursor.
.It Ic vi-search-prev
Vi search history previous.
.It Ic vi-search-next
Vi search history next.
.It Ic vi-repeat-search-next
Vi repeat current search in the same search direction.
.It Ic vi-repeat-search-prev
Vi repeat current search in the opposite search direction.
.It Ic vi-next-char
Vi move to the character specified next.
.It Ic vi-prev-char
Vi move to the character specified previous.
.It Ic vi-to-next-char
Vi move up to the character specified next.
.It Ic vi-to-prev-char
Vi move up to the character specified previous.
.It Ic vi-repeat-next-char
Vi repeat current character search in the same search direction.
.It Ic vi-repeat-prev-char
Vi repeat current character search in the opposite search direction.
.It Ic em-delete-or-list
Delete character under cursor or list completions if at end of line.
.It Ic em-delete-next-word
Cut from cursor to end of current word.
.It Ic em-yank
Paste cut buffer at cursor position.
.It Ic em-kill-line
Cut the entire line and save in cut buffer.
.It Ic em-kill-region
Cut area between mark and cursor and save in cut buffer.
.It Ic em-copy-region
Copy area between mark and cursor to cut buffer.
.It Ic em-gosmacs-traspose
Exchange the two characters before the cursor.
.It Ic em-next-word
Move next to end of current word.
.It Ic em-upper-case
Uppercase the characters from cursor to end of current word.
.It Ic em-capitol-case
Capitalize the characters from cursor to end of current word.
.It Ic em-lower-case
Lowercase the characters from cursor to end of current word.
.It Ic em-set-mark
Set the mark at cursor.
.It Ic em-exchange-mark
Exchange the cursor and mark.
.It Ic em-universal-argument
Universal argument (argument times 4).
.It Ic em-meta-next
Add 8th bit to next character typed.
.It Ic em-toggle-overwrite
Switch from insert to overwrite mode or vice versa.
.It Ic em-copy-prev-word
Copy current word to cursor.
.It Ic em-inc-search-next
Emacs incremental next search.
.It Ic em-inc-search-prev
Emacs incremental reverse search.
.It Ic ed-end-of-file
Indicate end of file.
.It Ic ed-insert
Add character to the line.
.It Ic ed-delete-prev-word
Delete from beginning of current word to cursor.
.It Ic ed-delete-next-char
Delete character under cursor.
.It Ic ed-kill-line
Cut to the end of line.
.It Ic ed-move-to-end
Move cursor to the end of line.
.It Ic ed-move-to-beg
Move cursor to the beginning of line.
.It Ic ed-transpose-chars
Exchange the character to the left of the cursor with the one under it.
.It Ic ed-next-char
Move to the right one character.
.It Ic ed-prev-word
Move to the beginning of the current word.
.It Ic ed-prev-char
Move to the left one character.
.It Ic ed-quoted-insert
Add the next character typed verbatim.
.It Ic ed-digit
Adds to argument or enters a digit.
.It Ic ed-argument-digit
Digit that starts argument.
.It Ic ed-unassigned
Indicates unbound character.
.It Ic ed-tty-sigint
Tty interrupt character.
.It Ic ed-tty-dsusp
Tty delayed suspend character.
.It Ic ed-tty-flush-output
Tty flush output characters.
.It Ic ed-tty-sigquit
Tty quit character.
.It Ic ed-tty-sigtstp
Tty suspend character.
.It Ic ed-tty-stop-output
Tty disallow output characters.
.It Ic ed-tty-start-output
Tty allow output characters.
.It Ic ed-newline
Execute command.
.It Ic ed-delete-prev-char
Delete the character to the left of the cursor.
.It Ic ed-clear-screen
Clear screen leaving current line at the top.
.It Ic ed-redisplay
Redisplay everything.
.It Ic ed-start-over
Erase current line and start from scratch.
.It Ic ed-sequence-lead-in
First character in a bound sequence.
.It Ic ed-prev-history
Move to the previous history line.
.It Ic ed-next-history
Move to the next history line.
.It Ic ed-search-prev-history
Search previous in history for a line matching the current.
.It Ic ed-search-next-history
Search next in history for a line matching the current.
.It Ic ed-prev-line
Move up one line.
.It Ic ed-next-line
Move down one line.
.It Ic ed-command
Editline extended command.
.El
.\" End of section automatically generated with makelist
.Sh SEE ALSO
.Xr editline 3 ,
.Xr regex 3 ,
.Xr termcap 5
.Sh AUTHORS
The
.Nm editline
library was written by Christos Zoulas,
and this manual was written by Luke Mewburn,
with some sections inspired by
.Xr tcsh 1 .
cmd-line-utils/libedit/el.c
View file @
fab053cc
/* $NetBSD: el.c,v 1.
39 2004/07/08 00:51:36 christos
Exp $ */
/* $NetBSD: el.c,v 1.
47 2009/01/18 12:17:24 lukem
Exp $ */
/*-
* Copyright (c) 1992, 1993
...
...
@@ -32,7 +32,13 @@
* SUCH DAMAGE.
*/
#include <config.h>
#include "config.h"
#if !defined(lint) && !defined(SCCSID)
#if 0
static char sccsid[] = "@(#)el.c 8.2 (Berkeley) 1/3/94";
#else
#endif
#endif
/* not lint && not SCCSID */
/*
* el.c: EditLine interface functions
...
...
@@ -58,9 +64,12 @@ el_init(const char *prog, FILE *fin, FILE *fout, FILE *ferr)
memset
(
el
,
0
,
sizeof
(
EditLine
));
el
->
el_inf
d
=
fileno
(
fin
)
;
el
->
el_inf
ile
=
fin
;
el
->
el_outfile
=
fout
;
el
->
el_errfile
=
ferr
;
el
->
el_infd
=
fileno
(
fin
);
if
((
el
->
el_prog
=
el_strdup
(
prog
))
==
NULL
)
{
el_free
(
el
);
return
NULL
;
...
...
@@ -126,7 +135,7 @@ el_reset(EditLine *el)
{
tty_cookedmode
(
el
);
ch_reset
(
el
);
/* XXX: Do we want that? */
ch_reset
(
el
,
0
);
/* XXX: Do we want that? */
}
...
...
@@ -136,29 +145,29 @@ el_reset(EditLine *el)
public
int
el_set
(
EditLine
*
el
,
int
op
,
...)
{
va_list
va
;
va_list
ap
;
int
rv
=
0
;
if
(
el
==
NULL
)
return
(
-
1
);
va_start
(
va
,
op
);
va_start
(
ap
,
op
);
switch
(
op
)
{
case
EL_PROMPT
:
case
EL_RPROMPT
:
rv
=
prompt_set
(
el
,
va_arg
(
va
,
el_pfunc_t
),
op
);
rv
=
prompt_set
(
el
,
va_arg
(
ap
,
el_pfunc_t
),
op
);
break
;
case
EL_TERMINAL
:
rv
=
term_set
(
el
,
va_arg
(
va
,
char
*
));
rv
=
term_set
(
el
,
va_arg
(
ap
,
char
*
));
break
;
case
EL_EDITOR
:
rv
=
map_set_editor
(
el
,
va_arg
(
va
,
char
*
));
rv
=
map_set_editor
(
el
,
va_arg
(
ap
,
char
*
));
break
;
case
EL_SIGNAL
:
if
(
va_arg
(
va
,
int
))
if
(
va_arg
(
ap
,
int
))
el
->
el_flags
|=
HANDLE_SIGNALS
;
else
el
->
el_flags
&=
~
HANDLE_SIGNALS
;
...
...
@@ -167,6 +176,7 @@ el_set(EditLine *el, int op, ...)
case
EL_BIND
:
case
EL_TELLTC
:
case
EL_SETTC
:
case
EL_GETTC
:
case
EL_ECHOTC
:
case
EL_SETTY
:
{
...
...
@@ -174,7 +184,7 @@ el_set(EditLine *el, int op, ...)
int
i
;
for
(
i
=
1
;
i
<
20
;
i
++
)
if
((
argv
[
i
]
=
va_arg
(
va
,
char
*
))
==
NULL
)
if
((
argv
[
i
]
=
va_arg
(
ap
,
char
*
))
==
NULL
)
break
;
switch
(
op
)
{
...
...
@@ -213,9 +223,9 @@ el_set(EditLine *el, int op, ...)
case
EL_ADDFN
:
{
char
*
name
=
va_arg
(
va
,
char
*
);
char
*
help
=
va_arg
(
va
,
char
*
);
el_func_t
func
=
va_arg
(
va
,
el_func_t
);
char
*
name
=
va_arg
(
ap
,
char
*
);
char
*
help
=
va_arg
(
ap
,
char
*
);
el_func_t
func
=
va_arg
(
ap
,
el_func_t
);
rv
=
map_addfunc
(
el
,
name
,
help
,
func
);
break
;
...
...
@@ -223,15 +233,15 @@ el_set(EditLine *el, int op, ...)
case
EL_HIST
:
{
hist_fun_t
func
=
va_arg
(
va
,
hist_fun_t
);
ptr_t
ptr
=
va_arg
(
va
,
char
*
);
hist_fun_t
func
=
va_arg
(
ap
,
hist_fun_t
);
ptr_t
ptr
=
va_arg
(
ap
,
char
*
);
rv
=
hist_set
(
el
,
func
,
ptr
);
break
;
}
case
EL_EDITMODE
:
if
(
va_arg
(
va
,
int
))
if
(
va_arg
(
ap
,
int
))
el
->
el_flags
&=
~
EDIT_DISABLED
;
else
el
->
el_flags
|=
EDIT_DISABLED
;
...
...
@@ -240,17 +250,17 @@ el_set(EditLine *el, int op, ...)
case
EL_GETCFN
:
{
el_rfunc_t
rc
=
va_arg
(
va
,
el_rfunc_t
);
el_rfunc_t
rc
=
va_arg
(
ap
,
el_rfunc_t
);
rv
=
el_read_setfn
(
el
,
rc
);
break
;
}
case
EL_CLIENTDATA
:
el
->
el_data
=
va_arg
(
va
,
void
*
);
el
->
el_data
=
va_arg
(
ap
,
void
*
);
break
;
case
EL_UNBUFFERED
:
rv
=
va_arg
(
va
,
int
);
rv
=
va_arg
(
ap
,
int
);
if
(
rv
&&
!
(
el
->
el_flags
&
UNBUFFERED
))
{
el
->
el_flags
|=
UNBUFFERED
;
read_prepare
(
el
);
...
...
@@ -262,7 +272,7 @@ el_set(EditLine *el, int op, ...)
break
;
case
EL_PREP_TERM
:
rv
=
va_arg
(
va
,
int
);
rv
=
va_arg
(
ap
,
int
);
if
(
rv
)
(
void
)
tty_rawmode
(
el
);
else
...
...
@@ -270,12 +280,45 @@ el_set(EditLine *el, int op, ...)
rv
=
0
;
break
;
case
EL_SETFP
:
{
FILE
*
fp
;
int
what
;
what
=
va_arg
(
ap
,
int
);
fp
=
va_arg
(
ap
,
FILE
*
);
rv
=
0
;
switch
(
what
)
{
case
0
:
el
->
el_infile
=
fp
;
el
->
el_infd
=
fileno
(
fp
);
break
;
case
1
:
el
->
el_outfile
=
fp
;
break
;
case
2
:
el
->
el_errfile
=
fp
;
break
;
default:
rv
=
-
1
;
break
;
}
break
;
}
case
EL_REFRESH
:
re_clear_display
(
el
);
re_refresh
(
el
);
term__flush
(
el
);
break
;
default:
rv
=
-
1
;
break
;
}
va_end
(
va
);
va_end
(
ap
);
return
(
rv
);
}
...
...
@@ -284,90 +327,71 @@ el_set(EditLine *el, int op, ...)
* retrieve the editline parameters
*/
public
int
el_get
(
EditLine
*
el
,
int
op
,
void
*
ret
)
el_get
(
EditLine
*
el
,
int
op
,
...
)
{
va_list
ap
;
int
rv
;
if
(
el
==
NULL
||
ret
==
NULL
)
return
(
-
1
);
if
(
el
==
NULL
)
return
-
1
;
va_start
(
ap
,
op
);
switch
(
op
)
{
case
EL_PROMPT
:
case
EL_RPROMPT
:
rv
=
prompt_get
(
el
,
(
void
*
)
&
ret
,
op
);
rv
=
prompt_get
(
el
,
va_arg
(
ap
,
el_pfunc_t
*
)
,
op
);
break
;
case
EL_EDITOR
:
rv
=
map_get_editor
(
el
,
(
void
*
)
&
ret
);
rv
=
map_get_editor
(
el
,
va_arg
(
ap
,
const
char
**
)
);
break
;
case
EL_SIGNAL
:
*
((
int
*
)
ret
)
=
(
el
->
el_flags
&
HANDLE_SIGNALS
);
*
va_arg
(
ap
,
int
*
)
=
(
el
->
el_flags
&
HANDLE_SIGNALS
);
rv
=
0
;
break
;
case
EL_EDITMODE
:
*
((
int
*
)
ret
)
=
(
!
(
el
->
el_flags
&
EDIT_DISABLED
)
);
*
va_arg
(
ap
,
int
*
)
=
!
(
el
->
el_flags
&
EDIT_DISABLED
);
rv
=
0
;
break
;
case
EL_TERMINAL
:
term_get
(
el
,
(
const
char
**
)
ret
);
term_get
(
el
,
va_arg
(
ap
,
const
char
**
)
);
rv
=
0
;
break
;
#if 0 /* XXX */
case EL_BIND:
case EL_TELLTC:
case EL_SETTC:
case EL_ECHOTC:
case EL_SETTY:
case
EL_GETTC
:
{
const char *argv[20];
static
char
name
[]
=
"gettc"
;
char
*
argv
[
20
];
int
i
;
for (i = 1; i <
sizeof(argv) / sizeof(argv[0]
); i++)
if ((argv[i] = va_arg(
va
, char *)) == NULL)
for
(
i
=
1
;
i
<
(
int
)(
sizeof
(
argv
)
/
sizeof
(
argv
[
0
])
);
i
++
)
if
((
argv
[
i
]
=
va_arg
(
ap
,
char
*
))
==
NULL
)
break
;
switch
(
op
)
{
case EL_BIND:
argv[0] = "bind";
rv = map_bind(el, i, argv);
break;
case EL_TELLTC:
argv[0] = "telltc";
rv = term_telltc(el, i, argv);
break;
case EL_SETTC:
argv[0] = "settc";
rv = term_settc(el, i, argv);
break;
case EL_ECHOTC:
argv[0] = "echotc";
rv = term_echotc(el, i, argv);
break;
case EL_SETTY:
argv[0] = "setty";
rv = tty_stty(el, i, argv);
case
EL_GETTC
:
argv
[
0
]
=
name
;
rv
=
term_gettc
(
el
,
i
,
argv
);
break
;
default:
rv
=
-
1
;
EL_ABORT((el->errfile, "Bad op %d\n", op));
EL_ABORT
((
el
->
e
l_e
rrfile
,
"Bad op %d
\n
"
,
op
));
break
;
}
break
;
}
#if 0 /* XXX */
case EL_ADDFN:
{
char *name = va_arg(
va
, char *);
char *help = va_arg(
va
, char *);
el_func_t func = va_arg(
va
, el_func_t);
char *name = va_arg(
ap
, char *);
char *help = va_arg(
ap
, char *);
el_func_t func = va_arg(
ap
, el_func_t);
rv = map_addfunc(el, name, help, func);
break;
...
...
@@ -375,31 +399,57 @@ el_get(EditLine *el, int op, void *ret)
case EL_HIST:
{
hist_fun_t func = va_arg(
va
, hist_fun_t);
ptr_t ptr = va_arg(
va
, char *);
hist_fun_t func = va_arg(
ap
, hist_fun_t);
ptr_t ptr = va_arg(
ap
, char *);
rv = hist_set(el, func, ptr);
}
break;
#endif /* XXX */
case
EL_GETCFN
:
*
((
el_rfunc_t
*
)
ret
)
=
el_read_getfn
(
el
);
*
va_arg
(
ap
,
el_rfunc_t
*
)
=
el_read_getfn
(
el
);
rv
=
0
;
break
;
case
EL_CLIENTDATA
:
*
((
void
**
)
ret
)
=
el
->
el_data
;
*
va_arg
(
ap
,
void
**
)
=
el
->
el_data
;
rv
=
0
;
break
;
case
EL_UNBUFFERED
:
*
((
int
*
)
ret
)
=
(
!
(
el
->
el_flags
&
UNBUFFERED
));
*
va_arg
(
ap
,
int
*
)
=
(
!
(
el
->
el_flags
&
UNBUFFERED
));
rv
=
0
;
break
;
case
EL_GETFP
:
{
int
what
;
FILE
**
fpp
;
what
=
va_arg
(
ap
,
int
);
fpp
=
va_arg
(
ap
,
FILE
**
);
rv
=
0
;
switch
(
what
)
{
case
0
:
*
fpp
=
el
->
el_infile
;
break
;
case
1
:
*
fpp
=
el
->
el_outfile
;
break
;
case
2
:
*
fpp
=
el
->
el_errfile
;
break
;
default:
rv
=
-
1
;
break
;
}
break
;
}
default:
rv
=
-
1
;
break
;
}
va_end
(
ap
);
return
(
rv
);
}
...
...
@@ -428,17 +478,17 @@ el_source(EditLine *el, const char *fname)
fp
=
NULL
;
if
(
fname
==
NULL
)
{
#ifdef HAVE_ISSETUGID
static
const
char
elpath
[]
=
"/.editrc"
;
/* XXXMYSQL: Portability fix (for which platforms?) */
#ifdef MAXPATHLEN
char
path
[
MAXPATHLEN
];
#else
char
path
[
4096
];
#endif
#ifdef HAVE_ISSETUGID
if
(
issetugid
())
return
(
-
1
);
#endif
if
((
ptr
=
getenv
(
"HOME"
))
==
NULL
)
return
(
-
1
);
if
(
strlcpy
(
path
,
ptr
,
sizeof
(
path
))
>=
sizeof
(
path
))
...
...
@@ -446,6 +496,14 @@ el_source(EditLine *el, const char *fname)
if
(
strlcat
(
path
,
elpath
,
sizeof
(
path
))
>=
sizeof
(
path
))
return
(
-
1
);
fname
=
path
;
#else
/*
* If issetugid() is missing, always return an error, in order
* to keep from inadvertently opening up the user to a security
* hole.
*/
return
(
-
1
);
#endif
}
if
(
fp
==
NULL
)
fp
=
fopen
(
fname
,
"r"
);
...
...
cmd-line-utils/libedit/el.h
View file @
fab053cc
/* $NetBSD: el.h,v 1.1
6 2003/10/18 23:48:42
christos Exp $ */
/* $NetBSD: el.h,v 1.1
7 2006/12/15 22:13:33
christos Exp $ */
/*-
* Copyright (c) 1992, 1993
...
...
@@ -110,6 +110,7 @@ typedef struct el_state_t {
struct
editline
{
char
*
el_prog
;
/* the program name */
FILE
*
el_infile
;
/* Stdio stuff */
FILE
*
el_outfile
;
/* Stdio stuff */
FILE
*
el_errfile
;
/* Stdio stuff */
int
el_infd
;
/* Input file descriptor */
...
...
@@ -136,7 +137,8 @@ struct editline {
protected
int
el_editmode
(
EditLine
*
,
int
,
const
char
**
);
#define el_isprint(x) ((unsigned char) (x) < 0x80 ? isprint(x) : 1)
/* XXXMYSQL: Bug#23097 mysql can't insert korean on mysql prompt. */
#define el_isprint(x) ((unsigned char) (x) < 0x80 ? isprint(x) : 1)
#ifdef DEBUG
#define EL_ABORT(a) do { \
...
...
cmd-line-utils/libedit/el_term.h
View file @
fab053cc
/* $NetBSD: term.h,v 1.1
5 2003/09/14 21:48:55
christos Exp $ */
/* $NetBSD: term.h,v 1.1
9 2008/09/10 15:45:37
christos Exp $ */
/*-
* Copyright (c) 1992, 1993
...
...
@@ -81,25 +81,6 @@ typedef struct {
#define A_K_EN 5
#define A_K_NKEYS 6
#ifdef _SUNOS
extern
int
tgetent
(
char
*
,
const
char
*
);
extern
int
tgetflag
(
char
*
);
extern
int
tgetnum
(
char
*
);
extern
int
tputs
(
const
char
*
,
int
,
int
(
*
)(
int
));
extern
char
*
tgoto
(
const
char
*
,
int
,
int
);
extern
char
*
tgetstr
(
char
*
,
char
**
);
#endif
#if !HAVE_DECL_TGOTO
/*
'tgoto' is not declared in the system header files, this causes
problems on 64-bit systems. The function returns a 64 bit pointer
but caller see it as "int" and it's thus truncated to 32-bit
*/
extern
char
*
tgoto
(
const
char
*
,
int
,
int
);
#endif
protected
void
term_move_to_line
(
EditLine
*
,
int
);
protected
void
term_move_to_char
(
EditLine
*
,
int
);
protected
void
term_clear_EOL
(
EditLine
*
,
int
);
...
...
@@ -119,10 +100,12 @@ protected void term_end(EditLine *);
protected
void
term_get
(
EditLine
*
,
const
char
**
);
protected
int
term_set
(
EditLine
*
,
const
char
*
);
protected
int
term_settc
(
EditLine
*
,
int
,
const
char
**
);
protected
int
term_gettc
(
EditLine
*
,
int
,
char
**
);
protected
int
term_telltc
(
EditLine
*
,
int
,
const
char
**
);
protected
int
term_echotc
(
EditLine
*
,
int
,
const
char
**
);
protected
int
term__putc
(
int
);
protected
void
term__flush
(
void
);
protected
void
term_writec
(
EditLine
*
,
int
);
protected
int
term__putc
(
EditLine
*
,
int
);
protected
void
term__flush
(
EditLine
*
);
/*
* Easy access macros
...
...
@@ -134,6 +117,7 @@ protected void term__flush(void);
#define EL_CAN_CEOL (EL_FLAGS & TERM_CAN_CEOL)
#define EL_CAN_TAB (EL_FLAGS & TERM_CAN_TAB)
#define EL_CAN_ME (EL_FLAGS & TERM_CAN_ME)
#define EL_CAN_UP (EL_FLAGS & TERM_CAN_UP)
#define EL_HAS_META (EL_FLAGS & TERM_HAS_META)
#define EL_HAS_AUTO_MARGINS (EL_FLAGS & TERM_HAS_AUTO_MARGINS)
#define EL_HAS_MAGIC_MARGINS (EL_FLAGS & TERM_HAS_MAGIC_MARGINS)
...
...
cmd-line-utils/libedit/emacs.c
View file @
fab053cc
/* $NetBSD: emacs.c,v 1.
19 2004/10/28 21:14:52 dsl
Exp $ */
/* $NetBSD: emacs.c,v 1.
21 2006/03/06 21:11:56 christos
Exp $ */
/*-
* Copyright (c) 1992, 1993
...
...
@@ -32,7 +32,13 @@
* SUCH DAMAGE.
*/
#include <config.h>
#include "config.h"
#if !defined(lint) && !defined(SCCSID)
#if 0
static char sccsid[] = "@(#)emacs.c 8.1 (Berkeley) 6/4/93";
#else
#endif
#endif
/* not lint && not SCCSID */
/*
* emacs.c: Emacs functions
...
...
@@ -45,15 +51,14 @@
*/
protected
el_action_t
/*ARGSUSED*/
em_delete_or_list
(
EditLine
*
el
,
int
c
__attribute__
((
__unused__
))
)
em_delete_or_list
(
EditLine
*
el
,
int
c
)
{
if
(
el
->
el_line
.
cursor
==
el
->
el_line
.
lastchar
)
{
/* if I'm at the end */
if
(
el
->
el_line
.
cursor
==
el
->
el_line
.
buffer
)
{
/* and the beginning */
term_overwrite
(
el
,
STReof
,
4
);
/* then do a EOF */
term__flush
();
term_writec
(
el
,
c
);
/* then do an EOF */
return
(
CC_EOF
);
}
else
{
/*
...
...
cmd-line-utils/libedit/fgetln.h
deleted
100644 → 0
View file @
6c6fc097
#include <stdio.h>
char
*
fgetln
(
FILE
*
stream
,
size_t
*
len
);
cmd-line-utils/libedit/filecomplete.c
0 → 100644
View file @
fab053cc
/* $NetBSD: filecomplete.c,v 1.13 2009/01/26 17:32:41 apb Exp $ */
/*-
* Copyright (c) 1997 The NetBSD Foundation, Inc.
* All rights reserved.
*
* This code is derived from software contributed to The NetBSD Foundation
* by Jaromir Dolecek.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
* ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
/* AIX requires this to be the first thing in the file. */
#if defined (_AIX) && !defined (__GNUC__)
#pragma alloca
#endif
#include "config.h"
/* XXXMYSQL */
#ifdef __GNUC__
# undef alloca
# define alloca(n) __builtin_alloca (n)
#else
# ifdef HAVE_ALLOCA_H
# include <alloca.h>
# else
# ifndef _AIX
extern
char
*
alloca
();
# endif
# endif
#endif
#if !defined(lint) && !defined(SCCSID)
#endif
/* not lint && not SCCSID */
#include <sys/types.h>
#include <sys/stat.h>
#include <stdio.h>
#include <dirent.h>
#include <string.h>
#include <pwd.h>
#include <ctype.h>
#include <stdlib.h>
#include <unistd.h>
#include <limits.h>
#include <errno.h>
#include <fcntl.h>
#ifdef HAVE_VIS_H
#include <vis.h>
#else
#include "np/vis.h"
#endif
#ifdef HAVE_ALLOCA_H
#include <alloca.h>
#endif
#include "el.h"
#include "fcns.h"
/* for EL_NUM_FCNS */
#include "histedit.h"
#include "filecomplete.h"
static
char
break_chars
[]
=
{
' '
,
'\t'
,
'\n'
,
'"'
,
'\\'
,
'\''
,
'`'
,
'@'
,
'$'
,
'>'
,
'<'
,
'='
,
';'
,
'|'
,
'&'
,
'{'
,
'('
,
'\0'
};
/********************************/
/* completion functions */
/*
* does tilde expansion of strings of type ``~user/foo''
* if ``user'' isn't valid user name or ``txt'' doesn't start
* w/ '~', returns pointer to strdup()ed copy of ``txt''
*
* it's callers's responsibility to free() returned string
*/
char
*
fn_tilde_expand
(
const
char
*
txt
)
{
struct
passwd
pwres
,
*
pass
;
char
*
temp
;
size_t
len
=
0
;
char
pwbuf
[
1024
];
if
(
txt
[
0
]
!=
'~'
)
return
(
strdup
(
txt
));
temp
=
strchr
(
txt
+
1
,
'/'
);
if
(
temp
==
NULL
)
{
temp
=
strdup
(
txt
+
1
);
if
(
temp
==
NULL
)
return
NULL
;
}
else
{
len
=
temp
-
txt
+
1
;
/* text until string after slash */
temp
=
malloc
(
len
);
if
(
temp
==
NULL
)
return
NULL
;
(
void
)
strncpy
(
temp
,
txt
+
1
,
len
-
2
);
temp
[
len
-
2
]
=
'\0'
;
}
/* XXXMYSQL: use non-_r functions for now */
if
(
temp
[
0
]
==
0
)
{
pass
=
getpwuid
(
getuid
());
}
else
{
pass
=
getpwnam
(
temp
);
}
free
(
temp
);
/* value no more needed */
if
(
pass
==
NULL
)
return
(
strdup
(
txt
));
/* update pointer txt to point at string immedially following */
/* first slash */
txt
+=
len
;
temp
=
malloc
(
strlen
(
pass
->
pw_dir
)
+
1
+
strlen
(
txt
)
+
1
);
if
(
temp
==
NULL
)
return
NULL
;
(
void
)
sprintf
(
temp
,
"%s/%s"
,
pass
->
pw_dir
,
txt
);
return
(
temp
);
}
/*
* return first found file name starting by the ``text'' or NULL if no
* such file can be found
* value of ``state'' is ignored
*
* it's caller's responsibility to free returned string
*/
char
*
fn_filename_completion_function
(
const
char
*
text
,
int
state
)
{
static
DIR
*
dir
=
NULL
;
static
char
*
filename
=
NULL
,
*
dirname
=
NULL
,
*
dirpath
=
NULL
;
static
size_t
filename_len
=
0
;
struct
dirent
*
entry
;
char
*
temp
;
size_t
len
;
if
(
state
==
0
||
dir
==
NULL
)
{
temp
=
strrchr
(
text
,
'/'
);
if
(
temp
)
{
char
*
nptr
;
temp
++
;
nptr
=
realloc
(
filename
,
strlen
(
temp
)
+
1
);
if
(
nptr
==
NULL
)
{
free
(
filename
);
return
NULL
;
}
filename
=
nptr
;
(
void
)
strcpy
(
filename
,
temp
);
len
=
temp
-
text
;
/* including last slash */
nptr
=
realloc
(
dirname
,
len
+
1
);
if
(
nptr
==
NULL
)
{
free
(
filename
);
return
NULL
;
}
dirname
=
nptr
;
(
void
)
strncpy
(
dirname
,
text
,
len
);
dirname
[
len
]
=
'\0'
;
}
else
{
if
(
*
text
==
0
)
filename
=
NULL
;
else
{
filename
=
strdup
(
text
);
if
(
filename
==
NULL
)
return
NULL
;
}
dirname
=
NULL
;
}
if
(
dir
!=
NULL
)
{
(
void
)
closedir
(
dir
);
dir
=
NULL
;
}
/* support for ``~user'' syntax */
free
(
dirpath
);
if
(
dirname
==
NULL
&&
(
dirname
=
strdup
(
"./"
))
==
NULL
)
return
NULL
;
if
(
*
dirname
==
'~'
)
dirpath
=
fn_tilde_expand
(
dirname
);
else
dirpath
=
strdup
(
dirname
);
if
(
dirpath
==
NULL
)
return
NULL
;
dir
=
opendir
(
dirpath
);
if
(
!
dir
)
return
(
NULL
);
/* cannot open the directory */
/* will be used in cycle */
filename_len
=
filename
?
strlen
(
filename
)
:
0
;
}
/* find the match */
while
((
entry
=
readdir
(
dir
))
!=
NULL
)
{
/* skip . and .. */
if
(
entry
->
d_name
[
0
]
==
'.'
&&
(
!
entry
->
d_name
[
1
]
||
(
entry
->
d_name
[
1
]
==
'.'
&&
!
entry
->
d_name
[
2
])))
continue
;
if
(
filename_len
==
0
)
break
;
/* otherwise, get first entry where first */
/* filename_len characters are equal */
if
(
entry
->
d_name
[
0
]
==
filename
[
0
]
#if HAVE_STRUCT_DIRENT_D_NAMLEN
&&
entry
->
d_namlen
>=
filename_len
#else
&&
strlen
(
entry
->
d_name
)
>=
filename_len
#endif
&&
strncmp
(
entry
->
d_name
,
filename
,
filename_len
)
==
0
)
break
;
}
if
(
entry
)
{
/* match found */
#if HAVE_STRUCT_DIRENT_D_NAMLEN
len
=
entry
->
d_namlen
;
#else
len
=
strlen
(
entry
->
d_name
);
#endif
temp
=
malloc
(
strlen
(
dirname
)
+
len
+
1
);
if
(
temp
==
NULL
)
return
NULL
;
(
void
)
sprintf
(
temp
,
"%s%s"
,
dirname
,
entry
->
d_name
);
}
else
{
(
void
)
closedir
(
dir
);
dir
=
NULL
;
temp
=
NULL
;
}
return
(
temp
);
}
static
const
char
*
append_char_function
(
const
char
*
name
)
{
struct
stat
stbuf
;
char
*
expname
=
*
name
==
'~'
?
fn_tilde_expand
(
name
)
:
NULL
;
const
char
*
rs
=
" "
;
if
(
stat
(
expname
?
expname
:
name
,
&
stbuf
)
==
-
1
)
goto
out
;
if
(
S_ISDIR
(
stbuf
.
st_mode
))
rs
=
"/"
;
out:
if
(
expname
)
free
(
expname
);
return
rs
;
}
/*
* returns list of completions for text given
* non-static for readline.
*/
char
**
completion_matches
(
const
char
*
,
char
*
(
*
)(
const
char
*
,
int
));
char
**
completion_matches
(
const
char
*
text
,
char
*
(
*
genfunc
)(
const
char
*
,
int
))
{
char
**
match_list
=
NULL
,
*
retstr
,
*
prevstr
;
size_t
match_list_len
,
max_equal
,
which
,
i
;
size_t
matches
;
matches
=
0
;
match_list_len
=
1
;
while
((
retstr
=
(
*
genfunc
)
(
text
,
(
int
)
matches
))
!=
NULL
)
{
/* allow for list terminator here */
if
(
matches
+
3
>=
match_list_len
)
{
char
**
nmatch_list
;
while
(
matches
+
3
>=
match_list_len
)
match_list_len
<<=
1
;
nmatch_list
=
realloc
(
match_list
,
match_list_len
*
sizeof
(
char
*
));
if
(
nmatch_list
==
NULL
)
{
free
(
match_list
);
return
NULL
;
}
match_list
=
nmatch_list
;
}
match_list
[
++
matches
]
=
retstr
;
}
if
(
!
match_list
)
return
NULL
;
/* nothing found */
/* find least denominator and insert it to match_list[0] */
which
=
2
;
prevstr
=
match_list
[
1
];
max_equal
=
strlen
(
prevstr
);
for
(;
which
<=
matches
;
which
++
)
{
for
(
i
=
0
;
i
<
max_equal
&&
prevstr
[
i
]
==
match_list
[
which
][
i
];
i
++
)
continue
;
max_equal
=
i
;
}
retstr
=
malloc
(
max_equal
+
1
);
if
(
retstr
==
NULL
)
{
free
(
match_list
);
return
NULL
;
}
(
void
)
strncpy
(
retstr
,
match_list
[
1
],
max_equal
);
retstr
[
max_equal
]
=
'\0'
;
match_list
[
0
]
=
retstr
;
/* add NULL as last pointer to the array */
match_list
[
matches
+
1
]
=
(
char
*
)
NULL
;
return
(
match_list
);
}
/*
* Sort function for qsort(). Just wrapper around strcasecmp().
*/
static
int
_fn_qsort_string_compare
(
const
void
*
i1
,
const
void
*
i2
)
{
const
char
*
s1
=
((
const
char
*
const
*
)
i1
)[
0
];
const
char
*
s2
=
((
const
char
*
const
*
)
i2
)[
0
];
return
strcasecmp
(
s1
,
s2
);
}
/*
* Display list of strings in columnar format on readline's output stream.
* 'matches' is list of strings, 'len' is number of strings in 'matches',
* 'max' is maximum length of string in 'matches'.
*/
void
fn_display_match_list
(
EditLine
*
el
,
char
**
matches
,
int
len
,
int
max
)
{
int
i
,
idx
,
limit
,
count
;
int
screenwidth
=
el
->
el_term
.
t_size
.
h
;
/*
* Find out how many entries can be put on one line, count
* with two spaces between strings.
*/
limit
=
screenwidth
/
(
max
+
2
);
if
(
limit
==
0
)
limit
=
1
;
/* how many lines of output */
count
=
len
/
limit
;
if
(
count
*
limit
<
len
)
count
++
;
/* Sort the items if they are not already sorted. */
qsort
(
&
matches
[
1
],
(
size_t
)(
len
-
1
),
sizeof
(
char
*
),
_fn_qsort_string_compare
);
idx
=
1
;
for
(;
count
>
0
;
count
--
)
{
for
(
i
=
0
;
i
<
limit
&&
matches
[
idx
];
i
++
,
idx
++
)
(
void
)
fprintf
(
el
->
el_outfile
,
"%-*s "
,
max
,
matches
[
idx
]);
(
void
)
fprintf
(
el
->
el_outfile
,
"
\n
"
);
}
}
/*
* Complete the word at or before point,
* 'what_to_do' says what to do with the completion.
* \t means do standard completion.
* `?' means list the possible completions.
* `*' means insert all of the possible completions.
* `!' means to do standard completion, and list all possible completions if
* there is more than one.
*
* Note: '*' support is not implemented
* '!' could never be invoked
*/
int
fn_complete
(
EditLine
*
el
,
char
*
(
*
complet_func
)(
const
char
*
,
int
),
char
**
(
*
attempted_completion_function
)(
const
char
*
,
int
,
int
),
const
char
*
word_break
,
const
char
*
special_prefixes
,
const
char
*
(
*
app_func
)(
const
char
*
),
int
query_items
,
int
*
completion_type
,
int
*
over
,
int
*
point
,
int
*
end
)
{
const
LineInfo
*
li
;
char
*
temp
,
**
matches
;
const
char
*
ctemp
;
size_t
len
;
int
what_to_do
=
'\t'
;
int
retval
=
CC_NORM
;
if
(
el
->
el_state
.
lastcmd
==
el
->
el_state
.
thiscmd
)
what_to_do
=
'?'
;
/* readline's rl_complete() has to be told what we did... */
if
(
completion_type
!=
NULL
)
*
completion_type
=
what_to_do
;
if
(
!
complet_func
)
complet_func
=
fn_filename_completion_function
;
if
(
!
app_func
)
app_func
=
append_char_function
;
/* We now look backwards for the start of a filename/variable word */
li
=
el_line
(
el
);
ctemp
=
(
const
char
*
)
li
->
cursor
;
while
(
ctemp
>
li
->
buffer
&&
!
strchr
(
word_break
,
ctemp
[
-
1
])
&&
(
!
special_prefixes
||
!
strchr
(
special_prefixes
,
ctemp
[
-
1
])
)
)
ctemp
--
;
len
=
li
->
cursor
-
ctemp
;
#if defined(__SSP__) || defined(__SSP_ALL__)
temp
=
malloc
(
len
+
1
);
#else
temp
=
alloca
(
len
+
1
);
#endif
(
void
)
strncpy
(
temp
,
ctemp
,
len
);
temp
[
len
]
=
'\0'
;
/* these can be used by function called in completion_matches() */
/* or (*attempted_completion_function)() */
if
(
point
!=
0
)
*
point
=
li
->
cursor
-
li
->
buffer
;
if
(
end
!=
NULL
)
*
end
=
li
->
lastchar
-
li
->
buffer
;
if
(
attempted_completion_function
)
{
int
cur_off
=
li
->
cursor
-
li
->
buffer
;
matches
=
(
*
attempted_completion_function
)
(
temp
,
(
int
)(
cur_off
-
len
),
cur_off
);
}
else
matches
=
0
;
if
(
!
attempted_completion_function
||
(
over
!=
NULL
&&
!*
over
&&
!
matches
))
matches
=
completion_matches
(
temp
,
complet_func
);
if
(
over
!=
NULL
)
*
over
=
0
;
if
(
matches
)
{
int
i
;
int
matches_num
,
maxlen
,
match_len
,
match_display
=
1
;
retval
=
CC_REFRESH
;
/*
* Only replace the completed string with common part of
* possible matches if there is possible completion.
*/
if
(
matches
[
0
][
0
]
!=
'\0'
)
{
el_deletestr
(
el
,
(
int
)
len
);
el_insertstr
(
el
,
matches
[
0
]);
}
if
(
what_to_do
==
'?'
)
goto
display_matches
;
if
(
matches
[
2
]
==
NULL
&&
strcmp
(
matches
[
0
],
matches
[
1
])
==
0
)
{
/*
* We found exact match. Add a space after
* it, unless we do filename completion and the
* object is a directory.
*/
el_insertstr
(
el
,
(
*
app_func
)(
matches
[
0
]));
}
else
if
(
what_to_do
==
'!'
)
{
display_matches:
/*
* More than one match and requested to list possible
* matches.
*/
for
(
i
=
1
,
maxlen
=
0
;
matches
[
i
];
i
++
)
{
match_len
=
strlen
(
matches
[
i
]);
if
(
match_len
>
maxlen
)
maxlen
=
match_len
;
}
matches_num
=
i
-
1
;
/* newline to get on next line from command line */
(
void
)
fprintf
(
el
->
el_outfile
,
"
\n
"
);
/*
* If there are too many items, ask user for display
* confirmation.
*/
if
(
matches_num
>
query_items
)
{
(
void
)
fprintf
(
el
->
el_outfile
,
"Display all %d possibilities? (y or n) "
,
matches_num
);
(
void
)
fflush
(
el
->
el_outfile
);
if
(
getc
(
stdin
)
!=
'y'
)
match_display
=
0
;
(
void
)
fprintf
(
el
->
el_outfile
,
"
\n
"
);
}
if
(
match_display
)
fn_display_match_list
(
el
,
matches
,
matches_num
,
maxlen
);
retval
=
CC_REDISPLAY
;
}
else
if
(
matches
[
0
][
0
])
{
/*
* There was some common match, but the name was
* not complete enough. Next tab will print possible
* completions.
*/
el_beep
(
el
);
}
else
{
/* lcd is not a valid object - further specification */
/* is needed */
el_beep
(
el
);
retval
=
CC_NORM
;
}
/* free elements of array and the array itself */
for
(
i
=
0
;
matches
[
i
];
i
++
)
free
(
matches
[
i
]);
free
(
matches
);
matches
=
NULL
;
}
#if defined(__SSP__) || defined(__SSP_ALL__)
free
(
temp
);
#endif
return
retval
;
}
/*
* el-compatible wrapper around rl_complete; needed for key binding
*/
/* ARGSUSED */
unsigned
char
_el_fn_complete
(
EditLine
*
el
,
int
ch
__attribute__
((
__unused__
)))
{
return
(
unsigned
char
)
fn_complete
(
el
,
NULL
,
NULL
,
break_chars
,
NULL
,
NULL
,
100
,
NULL
,
NULL
,
NULL
,
NULL
);
}
cmd-line-utils/libedit/f
getln.c
→
cmd-line-utils/libedit/f
ilecomplete.h
View file @
fab053cc
/* $NetBSD: f
getln.c,v 1.2 2003/12/10 01:30:27 lukem
Exp $ */
/* $NetBSD: f
ilecomplete.h,v 1.6 2008/04/29 06:53:01 martin
Exp $ */
/*-
* Copyright (c) 199
8
The NetBSD Foundation, Inc.
* Copyright (c) 199
7
The NetBSD Foundation, Inc.
* All rights reserved.
*
* This code is derived from software contributed to The NetBSD Foundation
* by
Christos Zoulas
.
* by
Jaromir Dolecek
.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
...
...
@@ -15,13 +15,6 @@
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. All advertising materials mentioning features or use of this software
* must display the following acknowledgement:
* This product includes software developed by the NetBSD
* Foundation, Inc. and its contributors.
* 4. Neither the name of The NetBSD Foundation nor the names of its
* contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
* ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
...
...
@@ -35,54 +28,17 @@
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
#ifndef _FILECOMPLETE_H_
#define _FILECOMPLETE_H_
#include <config.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
int
fn_complete
(
EditLine
*
,
char
*
(
*
)(
const
char
*
,
int
),
char
**
(
*
)(
const
char
*
,
int
,
int
),
const
char
*
,
const
char
*
,
const
char
*
(
*
)(
const
char
*
),
int
,
int
*
,
int
*
,
int
*
,
int
*
);
void
fn_display_match_list
(
EditLine
*
,
char
**
,
int
,
int
);
char
*
fn_tilde_expand
(
const
char
*
);
char
*
fn_filename_completion_function
(
const
char
*
,
int
);
char
*
fgetln
(
FILE
*
fp
,
size_t
*
len
)
{
static
char
*
buf
=
NULL
;
static
size_t
bufsiz
=
0
;
char
*
ptr
;
if
(
buf
==
NULL
)
{
bufsiz
=
BUFSIZ
;
if
((
buf
=
malloc
(
bufsiz
))
==
NULL
)
return
NULL
;
}
if
(
fgets
(
buf
,
bufsiz
,
fp
)
==
NULL
)
return
NULL
;
*
len
=
0
;
while
((
ptr
=
strchr
(
&
buf
[
*
len
],
'\n'
))
==
NULL
)
{
size_t
nbufsiz
=
bufsiz
+
BUFSIZ
;
char
*
nbuf
=
realloc
(
buf
,
nbufsiz
);
if
(
nbuf
==
NULL
)
{
int
oerrno
=
errno
;
free
(
buf
);
errno
=
oerrno
;
buf
=
NULL
;
return
NULL
;
}
else
buf
=
nbuf
;
*
len
=
bufsiz
;
if
(
fgets
(
&
buf
[
bufsiz
],
BUFSIZ
,
fp
)
==
NULL
)
return
buf
;
bufsiz
=
nbufsiz
;
}
*
len
=
(
ptr
-
buf
)
+
1
;
return
buf
;
}
#endif
cmd-line-utils/libedit/hist.c
View file @
fab053cc
...
...
@@ -32,7 +32,13 @@
* SUCH DAMAGE.
*/
#include <config.h>
#include "config.h"
#if !defined(lint) && !defined(SCCSID)
#if 0
static char sccsid[] = "@(#)hist.c 8.1 (Berkeley) 6/4/93";
#else
#endif
#endif
/* not lint && not SCCSID */
/*
* hist.c: History access functions
...
...
cmd-line-utils/libedit/histedit.h
View file @
fab053cc
/* $NetBSD: histedit.h,v 1.
25 2003/12/05 13:37:48 lukem
Exp $ */
/* $NetBSD: histedit.h,v 1.
35 2009/02/05 19:15:44 christos
Exp $ */
/*-
* Copyright (c) 1992, 1993
...
...
@@ -41,11 +41,15 @@
#define _HISTEDIT_H_
#define LIBEDIT_MAJOR 2
#define LIBEDIT_MINOR
9
#define LIBEDIT_MINOR
11
#include <sys/types.h>
#include <stdio.h>
#ifdef __cplusplus
extern
"C"
{
#endif
/*
* ==== Editing ====
*/
...
...
@@ -88,7 +92,7 @@ void el_reset(EditLine *);
*/
const
char
*
el_gets
(
EditLine
*
,
int
*
);
int
el_getc
(
EditLine
*
,
char
*
);
void
el_push
(
EditLine
*
,
char
*
);
void
el_push
(
EditLine
*
,
c
onst
c
har
*
);
/*
* Beep!
...
...
@@ -105,7 +109,8 @@ int el_parse(EditLine *, int, const char **);
* Low level editline access functions
*/
int
el_set
(
EditLine
*
,
int
,
...);
int
el_get
(
EditLine
*
,
int
,
void
*
);
int
el_get
(
EditLine
*
,
int
,
...);
unsigned
char
_el_fn_complete
(
EditLine
*
,
int
);
/*
* el_set/el_get parameters
...
...
@@ -128,8 +133,12 @@ int el_get(EditLine *, int, void *);
#define EL_CLIENTDATA 14
/* , void *); */
#define EL_UNBUFFERED 15
/* , int); */
#define EL_PREP_TERM 16
/* , int); */
#define EL_GETTC 17
/* , const char *, ..., NULL); */
#define EL_GETFP 18
/* , int, FILE **); */
#define EL_SETFP 19
/* , int, FILE *); */
#define EL_REFRESH 20
/* , void); */
#define
EL_BUILTIN_GETCFN (NULL)
#define
EL_BUILTIN_GETCFN (NULL)
/*
* Source named file or $PWD/.editrc or $HOME/.editrc
...
...
@@ -192,6 +201,7 @@ int history(History *, HistEvent *, int, ...);
#define H_CLEAR 19
/* , void); */
#define H_SETUNIQUE 20
/* , int); */
#define H_GETUNIQUE 21
/* , void); */
#define H_DEL 22
/* , int); */
/*
...
...
@@ -211,4 +221,8 @@ int tok_line(Tokenizer *, const LineInfo *,
int
tok_str
(
Tokenizer
*
,
const
char
*
,
int
*
,
const
char
***
);
#ifdef __cplusplus
}
#endif
#endif
/* _HISTEDIT_H_ */
cmd-line-utils/libedit/history.c
View file @
fab053cc
/* $NetBSD: history.c,v 1.
28 2004/11/27 18:31:45 christos
Exp $ */
/* $NetBSD: history.c,v 1.
33 2009/02/06 14:40:32 sketch
Exp $ */
/*-
* Copyright (c) 1992, 1993
...
...
@@ -32,7 +32,13 @@
* SUCH DAMAGE.
*/
#include <config.h>
#include "config.h"
#if !defined(lint) && !defined(SCCSID)
#if 0
static char sccsid[] = "@(#)history.c 8.1 (Berkeley) 6/4/93";
#else
#endif
#endif
/* not lint && not SCCSID */
/*
* hist.c: History access functions
...
...
@@ -40,7 +46,11 @@
#include <string.h>
#include <stdlib.h>
#include <stdarg.h>
#ifdef HAVE_VIS_H
#include <vis.h>
#else
#include "np/vis.h"
#endif
#include <sys/stat.h>
static
const
char
hist_cookie
[]
=
"_HiStOrY_V2_
\n
"
;
...
...
@@ -61,6 +71,7 @@ struct history {
history_gfun_t
h_prev
;
/* Get the previous element */
history_gfun_t
h_curr
;
/* Get the current element */
history_sfun_t
h_set
;
/* Set the current element */
history_sfun_t
h_del
;
/* Set the given element */
history_vfun_t
h_clear
;
/* Clear the history list */
history_efun_t
h_enter
;
/* Add an element */
history_efun_t
h_add
;
/* Append to an element */
...
...
@@ -75,6 +86,7 @@ struct history {
#define HCLEAR(h, ev) (*(h)->h_clear)((h)->h_ref, ev)
#define HENTER(h, ev, str) (*(h)->h_enter)((h)->h_ref, ev, str)
#define HADD(h, ev, str) (*(h)->h_add)((h)->h_ref, ev, str)
#define HDEL(h, ev, n) (*(h)->h_del)((h)->h_ref, ev, n)
#define h_strdup(a) strdup(a)
#define h_malloc(a) malloc(a)
...
...
@@ -122,16 +134,18 @@ typedef struct history_t {
#define H_UNIQUE 1
/* Store only unique elements */
}
history_t
;
private
int
history_def_first
(
ptr_t
,
HistEvent
*
);
private
int
history_def_last
(
ptr_t
,
HistEvent
*
);
private
int
history_def_next
(
ptr_t
,
HistEvent
*
);
private
int
history_def_first
(
ptr_t
,
HistEvent
*
);
private
int
history_def_prev
(
ptr_t
,
HistEvent
*
);
private
int
history_def_last
(
ptr_t
,
HistEvent
*
);
private
int
history_def_curr
(
ptr_t
,
HistEvent
*
);
private
int
history_def_set
(
ptr_t
,
HistEvent
*
,
const
int
n
);
private
int
history_def_set
(
ptr_t
,
HistEvent
*
,
const
int
);
private
void
history_def_clear
(
ptr_t
,
HistEvent
*
);
private
int
history_def_enter
(
ptr_t
,
HistEvent
*
,
const
char
*
);
private
int
history_def_add
(
ptr_t
,
HistEvent
*
,
const
char
*
);
private
int
history_def_del
(
ptr_t
,
HistEvent
*
,
const
int
);
private
int
history_def_init
(
ptr_t
*
,
HistEvent
*
,
int
);
private
void
history_def_clear
(
ptr_t
,
HistEvent
*
);
private
int
history_def_insert
(
history_t
*
,
HistEvent
*
,
const
char
*
);
private
void
history_def_delete
(
history_t
*
,
HistEvent
*
,
hentry_t
*
);
...
...
@@ -353,6 +367,24 @@ history_def_add(ptr_t p, HistEvent *ev, const char *str)
}
/* history_def_del():
* Delete element hp of the h list
*/
/* ARGSUSED */
private
int
history_def_del
(
ptr_t
p
,
HistEvent
*
ev
__attribute__
((
__unused__
)),
const
int
num
)
{
history_t
*
h
=
(
history_t
*
)
p
;
if
(
history_def_set
(
h
,
ev
,
num
)
!=
0
)
return
(
-
1
);
ev
->
str
=
strdup
(
h
->
cursor
->
ev
.
str
);
ev
->
num
=
h
->
cursor
->
ev
.
num
;
history_def_delete
(
h
,
ev
,
h
->
cursor
);
return
(
0
);
}
/* history_def_delete():
* Delete element hp of the h list
*/
...
...
@@ -364,6 +396,8 @@ history_def_delete(history_t *h,
HistEventPrivate
*
evp
=
(
void
*
)
&
hp
->
ev
;
if
(
hp
==
&
h
->
list
)
abort
();
if
(
h
->
cursor
==
hp
)
h
->
cursor
=
hp
->
prev
;
hp
->
prev
->
next
=
hp
->
next
;
hp
->
next
->
prev
=
hp
->
prev
;
h_free
((
ptr_t
)
evp
->
str
);
...
...
@@ -497,6 +531,7 @@ history_init(void)
h
->
h_clear
=
history_def_clear
;
h
->
h_enter
=
history_def_enter
;
h
->
h_add
=
history_def_add
;
h
->
h_del
=
history_def_del
;
return
(
h
);
}
...
...
@@ -512,6 +547,8 @@ history_end(History *h)
if
(
h
->
h_next
==
history_def_next
)
history_def_clear
(
h
->
h_ref
,
&
ev
);
h_free
(
h
->
h_ref
);
h_free
(
h
);
}
...
...
@@ -597,7 +634,7 @@ history_set_fun(History *h, History *nh)
if
(
nh
->
h_first
==
NULL
||
nh
->
h_next
==
NULL
||
nh
->
h_last
==
NULL
||
nh
->
h_prev
==
NULL
||
nh
->
h_curr
==
NULL
||
nh
->
h_set
==
NULL
||
nh
->
h_enter
==
NULL
||
nh
->
h_add
==
NULL
||
nh
->
h_clear
==
NULL
||
nh
->
h_ref
==
NULL
)
{
nh
->
h_
del
==
NULL
||
nh
->
h_
ref
==
NULL
)
{
if
(
h
->
h_next
!=
history_def_next
)
{
history_def_init
(
&
h
->
h_ref
,
&
ev
,
0
);
h
->
h_first
=
history_def_first
;
...
...
@@ -609,6 +646,7 @@ history_set_fun(History *h, History *nh)
h
->
h_clear
=
history_def_clear
;
h
->
h_enter
=
history_def_enter
;
h
->
h_add
=
history_def_add
;
h
->
h_del
=
history_def_del
;
}
return
(
-
1
);
}
...
...
@@ -625,6 +663,7 @@ history_set_fun(History *h, History *nh)
h
->
h_clear
=
nh
->
h_clear
;
h
->
h_enter
=
nh
->
h_enter
;
h
->
h_add
=
nh
->
h_add
;
h
->
h_del
=
nh
->
h_del
;
return
(
0
);
}
...
...
@@ -676,8 +715,8 @@ history_load(History *h, const char *fname)
(
void
)
strunvis
(
ptr
,
line
);
line
[
sz
]
=
c
;
if
(
HENTER
(
h
,
&
ev
,
ptr
)
==
-
1
)
{
i
=
-
1
;
goto
oomem
;
i
=
-
1
;
goto
oomem
;
}
}
oomem:
...
...
@@ -841,6 +880,10 @@ history(History *h, HistEvent *ev, int fun, ...)
retval
=
HADD
(
h
,
ev
,
str
);
break
;
case
H_DEL
:
retval
=
HDEL
(
h
,
ev
,
va_arg
(
va
,
const
int
));
break
;
case
H_ENTER
:
str
=
va_arg
(
va
,
const
char
*
);
if
((
retval
=
HENTER
(
h
,
ev
,
str
))
!=
-
1
)
...
...
@@ -925,6 +968,7 @@ history(History *h, HistEvent *ev, int fun, ...)
hf
.
h_clear
=
va_arg
(
va
,
history_vfun_t
);
hf
.
h_enter
=
va_arg
(
va
,
history_efun_t
);
hf
.
h_add
=
va_arg
(
va
,
history_efun_t
);
hf
.
h_del
=
va_arg
(
va
,
history_sfun_t
);
if
((
retval
=
history_set_fun
(
h
,
&
hf
))
==
-
1
)
he_seterrev
(
ev
,
_HE_PARAM_MISSING
);
...
...
cmd-line-utils/libedit/key.c
View file @
fab053cc
/* $NetBSD: key.c,v 1.1
5 2003/10/18 23:48:42
christos Exp $ */
/* $NetBSD: key.c,v 1.1
9 2006/03/23 20:22:51
christos Exp $ */
/*-
* Copyright (c) 1992, 1993
...
...
@@ -32,14 +32,20 @@
* SUCH DAMAGE.
*/
#include <config.h>
#include "config.h"
#if !defined(lint) && !defined(SCCSID)
#if 0
static char sccsid[] = "@(#)key.c 8.1 (Berkeley) 6/4/93";
#else
#endif
#endif
/* not lint && not SCCSID */
/*
* key.c: This module contains the procedures for maintaining
* the extended-key map.
*
* An extended-key (key) is a sequence of keystrokes introduced
* with a
n
sequence introducer and consisting of an arbitrary
* with a sequence introducer and consisting of an arbitrary
* number of characters. This module maintains a map (the el->el_key.map)
* to convert these extended-key sequences into input strs
* (XK_STR), editor functions (XK_CMD), or unix commands (XK_EXE).
...
...
@@ -78,12 +84,12 @@ private int node_trav(EditLine *, key_node_t *, char *,
private
int
node__try
(
EditLine
*
,
key_node_t
*
,
const
char
*
,
key_value_t
*
,
int
);
private
key_node_t
*
node__get
(
int
);
private
void
node__free
(
key_node_t
*
);
private
void
node__put
(
EditLine
*
,
key_node_t
*
);
private
int
node__delete
(
EditLine
*
,
key_node_t
**
,
const
char
*
);
private
int
node_lookup
(
EditLine
*
,
const
char
*
,
key_node_t
*
,
int
);
private
int
node_enum
(
EditLine
*
,
key_node_t
*
,
int
);
private
int
key__decode_char
(
char
*
,
int
,
int
);
#define KEY_BUFSIZ EL_BUFSIZ
...
...
@@ -103,7 +109,6 @@ key_init(EditLine *el)
return
(
0
);
}
/* key_end():
* Free the key maps
*/
...
...
@@ -113,8 +118,7 @@ key_end(EditLine *el)
el_free
((
ptr_t
)
el
->
el_key
.
buf
);
el
->
el_key
.
buf
=
NULL
;
/* XXX: provide a function to clear the keys */
el
->
el_key
.
map
=
NULL
;
node__free
(
el
->
el_key
.
map
);
}
...
...
@@ -443,7 +447,7 @@ node__put(EditLine *el, key_node_t *ptr)
/* node__get():
* Returns pointer to a
n
key_node_t for ch.
* Returns pointer to a key_node_t for ch.
*/
private
key_node_t
*
node__get
(
int
ch
)
...
...
@@ -461,7 +465,15 @@ node__get(int ch)
return
(
ptr
);
}
private
void
node__free
(
key_node_t
*
k
)
{
if
(
k
==
NULL
)
return
;
node__free
(
k
->
sibling
);
node__free
(
k
->
next
);
el_free
((
ptr_t
)
k
);
}
/* node_lookup():
* look for the str starting at node ptr.
...
...
@@ -483,7 +495,7 @@ node_lookup(EditLine *el, const char *str, key_node_t *ptr, int cnt)
/* If match put this char into el->el_key.buf. Recurse */
if
(
ptr
->
ch
==
*
str
)
{
/* match found */
ncnt
=
key__decode_char
(
el
->
el_key
.
buf
,
cnt
,
ncnt
=
key__decode_char
(
el
->
el_key
.
buf
,
KEY_BUFSIZ
,
cnt
,
(
unsigned
char
)
ptr
->
ch
);
if
(
ptr
->
next
!=
NULL
)
/* not yet at leaf */
...
...
@@ -537,7 +549,8 @@ node_enum(EditLine *el, key_node_t *ptr, int cnt)
return
(
-
1
);
}
/* put this char at end of str */
ncnt
=
key__decode_char
(
el
->
el_key
.
buf
,
cnt
,
(
unsigned
char
)
ptr
->
ch
);
ncnt
=
key__decode_char
(
el
->
el_key
.
buf
,
KEY_BUFSIZ
,
cnt
,
(
unsigned
char
)
ptr
->
ch
);
if
(
ptr
->
next
==
NULL
)
{
/* print this key and function */
el
->
el_key
.
buf
[
ncnt
+
1
]
=
'"'
;
...
...
@@ -568,9 +581,10 @@ key_kprint(EditLine *el, const char *key, key_value_t *val, int ntype)
switch
(
ntype
)
{
case
XK_STR
:
case
XK_EXE
:
(
void
)
fprintf
(
el
->
el_outfile
,
fmt
,
key
,
key__decode_str
(
val
->
str
,
unparsbuf
,
ntype
==
XK_STR
?
"
\"\"
"
:
"[]"
));
(
void
)
key__decode_str
(
val
->
str
,
unparsbuf
,
sizeof
(
unparsbuf
),
ntype
==
XK_STR
?
"
\"\"
"
:
"[]"
);
(
void
)
fprintf
(
el
->
el_outfile
,
fmt
,
key
,
unparsbuf
);
break
;
case
XK_CMD
:
for
(
fp
=
el
->
el_map
.
help
;
fp
->
name
;
fp
++
)
...
...
@@ -595,83 +609,97 @@ key_kprint(EditLine *el, const char *key, key_value_t *val, int ntype)
}
#define ADDC(c) \
if (b < eb) \
*b++ = c; \
else \
b++
/* key__decode_char():
* Put a printable form of char in buf.
*/
pr
ivate
int
key__decode_char
(
char
*
buf
,
int
cnt
,
int
ch
)
pr
otected
int
key__decode_char
(
char
*
buf
,
int
cnt
,
int
off
,
int
ch
)
{
char
*
sb
=
buf
+
off
;
char
*
eb
=
buf
+
cnt
;
char
*
b
=
sb
;
if
(
ch
==
0
)
{
buf
[
cnt
++
]
=
'^'
;
buf
[
cnt
]
=
'@'
;
return
(
cnt
)
;
ADDC
(
'^'
)
;
ADDC
(
'@'
)
;
return
b
-
sb
;
}
if
(
iscntrl
(
ch
))
{
buf
[
cnt
++
]
=
'^'
;
ADDC
(
'^'
)
;
if
(
ch
==
'\177'
)
buf
[
cnt
]
=
'?'
;
ADDC
(
'?'
)
;
else
buf
[
cnt
]
=
ch
|
0100
;
ADDC
(
ch
|
0100
)
;
}
else
if
(
ch
==
'^'
)
{
buf
[
cnt
++
]
=
'\\'
;
buf
[
cnt
]
=
'^'
;
ADDC
(
'\\'
)
;
ADDC
(
'^'
)
;
}
else
if
(
ch
==
'\\'
)
{
buf
[
cnt
++
]
=
'\\'
;
buf
[
cnt
]
=
'\\'
;
ADDC
(
'\\'
)
;
ADDC
(
'\\'
)
;
}
else
if
(
ch
==
' '
||
(
el_isprint
(
ch
)
&&
!
isspace
(
ch
)))
{
buf
[
cnt
]
=
ch
;
ADDC
(
ch
)
;
}
else
{
buf
[
cnt
++
]
=
'\\'
;
buf
[
cnt
++
]
=
(((
unsigned
int
)
ch
>>
6
)
&
7
)
+
'0'
;
buf
[
cnt
++
]
=
(((
unsigned
int
)
ch
>>
3
)
&
7
)
+
'0'
;
buf
[
cnt
]
=
(
ch
&
7
)
+
'0'
;
ADDC
(
'\\'
)
;
ADDC
((((
unsigned
int
)
ch
>>
6
)
&
7
)
+
'0'
)
;
ADDC
((((
unsigned
int
)
ch
>>
3
)
&
7
)
+
'0'
)
;
ADDC
((
ch
&
7
)
+
'0'
)
;
}
return
(
cnt
)
;
return
b
-
sb
;
}
/* key__decode_str():
* Make a printable version of the ey
*/
protected
char
*
key__decode_str
(
const
char
*
str
,
char
*
buf
,
const
char
*
sep
)
protected
int
key__decode_str
(
const
char
*
str
,
char
*
buf
,
int
len
,
const
char
*
sep
)
{
char
*
b
;
char
*
b
=
buf
,
*
eb
=
b
+
len
;
const
char
*
p
;
b
=
buf
;
if
(
sep
[
0
]
!=
'\0'
)
*
b
++
=
sep
[
0
];
if
(
*
str
==
0
)
{
*
b
++
=
'^'
;
*
b
++
=
'@'
;
if
(
sep
[
0
]
!=
'\0'
&&
sep
[
1
]
!=
'\0'
)
*
b
++
=
sep
[
1
];
*
b
++
=
0
;
return
(
buf
);
if
(
sep
[
0
]
!=
'\0'
)
{
ADDC
(
sep
[
0
]);
}
if
(
*
str
==
'\0'
)
{
ADDC
(
'^'
);
ADDC
(
'@'
);
if
(
sep
[
0
]
!=
'\0'
&&
sep
[
1
]
!=
'\0'
)
{
ADDC
(
sep
[
1
]);
}
goto
done
;
}
for
(
p
=
str
;
*
p
!=
0
;
p
++
)
{
if
(
iscntrl
((
unsigned
char
)
*
p
))
{
*
b
++
=
'^'
;
if
(
*
p
==
'\177'
)
*
b
++
=
'?'
;
else
*
b
++
=
*
p
|
0100
;
ADDC
(
'^'
);
if
(
*
p
==
'\177'
)
{
ADDC
(
'?'
);
}
else
{
ADDC
(
*
p
|
0100
);
}
}
else
if
(
*
p
==
'^'
||
*
p
==
'\\'
)
{
*
b
++
=
'\\'
;
*
b
++
=
*
p
;
ADDC
(
'\\'
)
;
ADDC
(
*
p
)
;
}
else
if
(
*
p
==
' '
||
(
el_isprint
((
unsigned
char
)
*
p
)
&&
!
isspace
((
unsigned
char
)
*
p
)))
{
*
b
++
=
*
p
;
ADDC
(
*
p
)
;
}
else
{
*
b
++
=
'\\'
;
*
b
++
=
(((
unsigned
int
)
*
p
>>
6
)
&
7
)
+
'0'
;
*
b
++
=
(((
unsigned
int
)
*
p
>>
3
)
&
7
)
+
'0'
;
*
b
++
=
(
*
p
&
7
)
+
'0'
;
ADDC
(
'\\'
)
;
ADDC
((((
unsigned
int
)
*
p
>>
6
)
&
7
)
+
'0'
)
;
ADDC
((((
unsigned
int
)
*
p
>>
3
)
&
7
)
+
'0'
)
;
ADDC
((
*
p
&
7
)
+
'0'
)
;
}
}
if
(
sep
[
0
]
!=
'\0'
&&
sep
[
1
]
!=
'\0'
)
*
b
++
=
sep
[
1
];
*
b
++
=
0
;
return
(
buf
);
/* should check for overflow */
if
(
sep
[
0
]
!=
'\0'
&&
sep
[
1
]
!=
'\0'
)
{
ADDC
(
sep
[
1
]);
}
done:
ADDC
(
'\0'
);
if
(
b
-
buf
>=
len
)
buf
[
len
-
1
]
=
'\0'
;
return
b
-
buf
;
}
cmd-line-utils/libedit/key.h
View file @
fab053cc
/* $NetBSD: key.h,v 1.
8 2003/08/07 16:44:32 agc
Exp $ */
/* $NetBSD: key.h,v 1.
10 2006/03/23 20:22:51 christos
Exp $ */
/*-
* Copyright (c) 1992, 1993
...
...
@@ -74,6 +74,8 @@ protected int key_delete(EditLine *, const char *);
protected
void
key_print
(
EditLine
*
,
const
char
*
);
protected
void
key_kprint
(
EditLine
*
,
const
char
*
,
key_value_t
*
,
int
);
protected
char
*
key__decode_str
(
const
char
*
,
char
*
,
const
char
*
);
protected
int
key__decode_str
(
const
char
*
,
char
*
,
int
,
const
char
*
);
protected
int
key__decode_char
(
char
*
,
int
,
int
,
int
);
#endif
/* _h_el_key */
cmd-line-utils/libedit/libedit_term.h
deleted
100644 → 0
View file @
6c6fc097
/* $NetBSD: term.h,v 1.12 2001/01/04 15:56:32 christos Exp $ */
/*-
* Copyright (c) 1992, 1993
* The Regents of the University of California. All rights reserved.
*
* This code is derived from software contributed to Berkeley by
* Christos Zoulas of Cornell University.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. All advertising materials mentioning features or use of this software
* must display the following acknowledgement:
* This product includes software developed by the University of
* California, Berkeley and its contributors.
* 4. Neither the name of the University nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
* @(#)term.h 8.1 (Berkeley) 6/4/93
*/
/*
* el.term.h: Termcap header
*/
#ifndef _h_el_term
#define _h_el_term
#include "histedit.h"
typedef
struct
{
/* Symbolic function key bindings */
const
char
*
name
;
/* name of the key */
int
key
;
/* Index in termcap table */
key_value_t
fun
;
/* Function bound to it */
int
type
;
/* Type of function */
}
fkey_t
;
typedef
struct
{
coord_t
t_size
;
/* # lines and cols */
int
t_flags
;
#define TERM_CAN_INSERT 0x001
/* Has insert cap */
#define TERM_CAN_DELETE 0x002
/* Has delete cap */
#define TERM_CAN_CEOL 0x004
/* Has CEOL cap */
#define TERM_CAN_TAB 0x008
/* Can use tabs */
#define TERM_CAN_ME 0x010
/* Can turn all attrs. */
#define TERM_CAN_UP 0x020
/* Can move up */
#define TERM_HAS_META 0x040
/* Has a meta key */
#define TERM_HAS_AUTO_MARGINS 0x080
/* Has auto margins */
#define TERM_HAS_MAGIC_MARGINS 0x100
/* Has magic margins */
char
*
t_buf
;
/* Termcap buffer */
int
t_loc
;
/* location used */
char
**
t_str
;
/* termcap strings */
int
*
t_val
;
/* termcap values */
char
*
t_cap
;
/* Termcap buffer */
fkey_t
*
t_fkey
;
/* Array of keys */
}
el_term_t
;
/*
* fKey indexes
*/
#define A_K_DN 0
#define A_K_UP 1
#define A_K_LT 2
#define A_K_RT 3
#define A_K_HO 4
#define A_K_EN 5
#define A_K_NKEYS 6
protected
void
term_move_to_line
(
EditLine
*
,
int
);
protected
void
term_move_to_char
(
EditLine
*
,
int
);
protected
void
term_clear_EOL
(
EditLine
*
,
int
);
protected
void
term_overwrite
(
EditLine
*
,
const
char
*
,
int
);
protected
void
term_insertwrite
(
EditLine
*
,
char
*
,
int
);
protected
void
term_deletechars
(
EditLine
*
,
int
);
protected
void
term_clear_screen
(
EditLine
*
);
protected
void
term_beep
(
EditLine
*
);
protected
int
term_change_size
(
EditLine
*
,
int
,
int
);
protected
int
term_get_size
(
EditLine
*
,
int
*
,
int
*
);
protected
int
term_init
(
EditLine
*
);
protected
void
term_bind_arrow
(
EditLine
*
);
protected
void
term_print_arrow
(
EditLine
*
,
const
char
*
);
protected
int
term_clear_arrow
(
EditLine
*
,
const
char
*
);
protected
int
term_set_arrow
(
EditLine
*
,
const
char
*
,
key_value_t
*
,
int
);
protected
void
term_end
(
EditLine
*
);
protected
int
term_set
(
EditLine
*
,
const
char
*
);
protected
int
term_settc
(
EditLine
*
,
int
,
const
char
**
);
protected
int
term_telltc
(
EditLine
*
,
int
,
const
char
**
);
protected
int
term_echotc
(
EditLine
*
,
int
,
const
char
**
);
protected
int
term__putc
(
int
);
protected
void
term__flush
(
void
);
/*
* Easy access macros
*/
#define EL_FLAGS (el)->el_term.t_flags
#define EL_CAN_INSERT (EL_FLAGS & TERM_CAN_INSERT)
#define EL_CAN_DELETE (EL_FLAGS & TERM_CAN_DELETE)
#define EL_CAN_CEOL (EL_FLAGS & TERM_CAN_CEOL)
#define EL_CAN_TAB (EL_FLAGS & TERM_CAN_TAB)
#define EL_CAN_ME (EL_FLAGS & TERM_CAN_ME)
#define EL_HAS_META (EL_FLAGS & TERM_HAS_META)
#define EL_HAS_AUTO_MARGINS (EL_FLAGS & TERM_HAS_AUTO_MARGINS)
#define EL_HAS_MAGIC_MARGINS (EL_FLAGS & TERM_HAS_MAGIC_MARGINS)
#endif
/* _h_el_term */
cmd-line-utils/libedit/makelist.sh
View file @
fab053cc
#!/bin/sh -
# $NetBSD: makelist,v 1.
8 2003/03/10 21:21:10
christos Exp $
# $NetBSD: makelist,v 1.
11 2005/10/22 16:45:03
christos Exp $
#
# Copyright (c) 1992, 1993
# The Regents of the University of California. All rights reserved.
...
...
@@ -15,11 +15,7 @@
# 2. Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions and the following disclaimer in the
# documentation and/or other materials provided with the distribution.
# 3. All advertising materials mentioning features or use of this software
# must display the following acknowledgement:
# This product includes software developed by the University of
# California, Berkeley and its contributors.
# 4. Neither the name of the University nor the names of its contributors
# 3. Neither the name of the University nor the names of its contributors
# may be used to endorse or promote products derived from this software
# without specific prior written permission.
#
...
...
@@ -68,6 +64,7 @@ case $FLAG in
/\(\):/ {
pr = substr($2, 1, 2);
if (pr == "vi" || pr == "em" || pr == "ed") {
# XXXMYSQL: support CRLF
name = substr($2, 1, index($2,"(") - 1);
#
# XXX: need a space between name and prototype so that -fc and -fh
...
...
@@ -87,7 +84,7 @@ case $FLAG in
cat
$FILES
|
$AWK
'
BEGIN {
printf("/* Automatically generated file, do not edit */\n");
printf("#include \"
config
.h\"\n#include \"el.h\"\n");
printf("#include \"
sys
.h\"\n#include \"el.h\"\n");
printf("private const struct el_bindings_t el_func_help[] = {\n");
low = "abcdefghijklmnopqrstuvwxyz_";
high = "ABCDEFGHIJKLMNOPQRSTUVWXYZ_";
...
...
@@ -97,6 +94,7 @@ case $FLAG in
/\(\):/ {
pr = substr($2, 1, 2);
if (pr == "vi" || pr == "em" || pr == "ed") {
# XXXMYSQL: support CRLF
name = substr($2, 1, index($2,"(") - 1);
uname = "";
fname = "";
...
...
@@ -117,13 +115,13 @@ case $FLAG in
printf(" \"");
for (i = 2; i < NF; i++)
printf("%s ", $i);
sub("\r", "", $i);
# XXXMYSQL: support CRLF
sub("\r", "", $i);
printf("%s\" },\n", $i);
ok = 0;
}
}
END {
printf(" { NULL, 0, NULL }\n");
printf("};\n");
printf("\nprotected const el_bindings_t* help__get()");
printf("{ return el_func_help; }\n");
...
...
@@ -144,6 +142,7 @@ case $FLAG in
# generate fcns.h from various .h files
#
# XXXMYSQL: use portable tr syntax
-fh
)
cat
$FILES
|
$AWK
'/el_action_t/ { print $3 }'
|
\
sort
|
tr
abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ |
$AWK
'
...
...
@@ -170,7 +169,7 @@ case $FLAG in
cat
$FILES
|
$AWK
'/el_action_t/ { print $3 }'
|
sort
|
$AWK
'
BEGIN {
printf("/* Automatically generated file, do not edit */\n");
printf("#include \"
config
.h\"\n#include \"el.h\"\n");
printf("#include \"
sys
.h\"\n#include \"el.h\"\n");
printf("private const el_func_t el_func[] = {");
maxlen = 80;
needn = 1;
...
...
@@ -220,6 +219,7 @@ case $FLAG in
/\(\):/ {
pr = substr($2, 1, 2);
if (pr == "vi" || pr == "em" || pr == "ed") {
# XXXMYSQL: support CRLF
name = substr($2, 1, index($2, "(") - 1);
fname = "";
for (i = 1; i <= length(name); i++) {
...
...
cmd-line-utils/libedit/map.c
View file @
fab053cc
/* $NetBSD: map.c,v 1.2
0 2004/08/13 12:10:39 mycroft
Exp $ */
/* $NetBSD: map.c,v 1.2
4 2006/04/09 01:36:51 christos
Exp $ */
/*-
* Copyright (c) 1992, 1993
...
...
@@ -32,7 +32,13 @@
* SUCH DAMAGE.
*/
#include <config.h>
#include "config.h"
#if !defined(lint) && !defined(SCCSID)
#if 0
static char sccsid[] = "@(#)map.c 8.1 (Berkeley) 6/4/93";
#else
#endif
#endif
/* not lint && not SCCSID */
/*
* map.c: Editor function definitions
...
...
@@ -1118,11 +1124,12 @@ private void
map_print_key
(
EditLine
*
el
,
el_action_t
*
map
,
const
char
*
in
)
{
char
outbuf
[
EL_BUFSIZ
];
el_bindings_t
*
bp
;
el_bindings_t
*
bp
,
*
ep
;
if
(
in
[
0
]
==
'\0'
||
in
[
1
]
==
'\0'
)
{
(
void
)
key__decode_str
(
in
,
outbuf
,
""
);
for
(
bp
=
el
->
el_map
.
help
;
bp
->
name
!=
NULL
;
bp
++
)
(
void
)
key__decode_str
(
in
,
outbuf
,
sizeof
(
outbuf
),
""
);
ep
=
&
el
->
el_map
.
help
[
el
->
el_map
.
nfunc
];
for
(
bp
=
el
->
el_map
.
help
;
bp
<
ep
;
bp
++
)
if
(
bp
->
func
==
map
[(
unsigned
char
)
*
in
])
{
(
void
)
fprintf
(
el
->
el_outfile
,
"%s
\t
->
\t
%s
\n
"
,
outbuf
,
bp
->
name
);
...
...
@@ -1139,7 +1146,7 @@ map_print_key(EditLine *el, el_action_t *map, const char *in)
private
void
map_print_some_keys
(
EditLine
*
el
,
el_action_t
*
map
,
int
first
,
int
last
)
{
el_bindings_t
*
bp
;
el_bindings_t
*
bp
,
*
ep
;
char
firstbuf
[
2
],
lastbuf
[
2
];
char
unparsbuf
[
EL_BUFSIZ
],
extrabuf
[
EL_BUFSIZ
];
...
...
@@ -1148,39 +1155,47 @@ map_print_some_keys(EditLine *el, el_action_t *map, int first, int last)
lastbuf
[
0
]
=
last
;
lastbuf
[
1
]
=
0
;
if
(
map
[
first
]
==
ED_UNASSIGNED
)
{
if
(
first
==
last
)
if
(
first
==
last
)
{
(
void
)
key__decode_str
(
firstbuf
,
unparsbuf
,
sizeof
(
unparsbuf
),
STRQQ
);
(
void
)
fprintf
(
el
->
el_outfile
,
"%-15s-> is undefined
\n
"
,
key__decode_str
(
firstbuf
,
unparsbuf
,
STRQQ
));
"%-15s-> is undefined
\n
"
,
unparsbuf
);
}
return
;
}
for
(
bp
=
el
->
el_map
.
help
;
bp
->
name
!=
NULL
;
bp
++
)
{
ep
=
&
el
->
el_map
.
help
[
el
->
el_map
.
nfunc
];
for
(
bp
=
el
->
el_map
.
help
;
bp
<
ep
;
bp
++
)
{
if
(
bp
->
func
==
map
[
first
])
{
if
(
first
==
last
)
{
(
void
)
key__decode_str
(
firstbuf
,
unparsbuf
,
sizeof
(
unparsbuf
),
STRQQ
);
(
void
)
fprintf
(
el
->
el_outfile
,
"%-15s-> %s
\n
"
,
key__decode_str
(
firstbuf
,
unparsbuf
,
STRQQ
),
bp
->
name
);
unparsbuf
,
bp
->
name
);
}
else
{
(
void
)
key__decode_str
(
firstbuf
,
unparsbuf
,
sizeof
(
unparsbuf
),
STRQQ
);
(
void
)
key__decode_str
(
lastbuf
,
extrabuf
,
sizeof
(
extrabuf
),
STRQQ
);
(
void
)
fprintf
(
el
->
el_outfile
,
"%-4s to %-7s-> %s
\n
"
,
key__decode_str
(
firstbuf
,
unparsbuf
,
STRQQ
),
key__decode_str
(
lastbuf
,
extrabuf
,
STRQQ
),
bp
->
name
);
unparsbuf
,
extrabuf
,
bp
->
name
);
}
return
;
}
}
#ifdef MAP_DEBUG
if
(
map
==
el
->
el_map
.
key
)
{
(
void
)
key__decode_str
(
firstbuf
,
unparsbuf
,
sizeof
(
unparsbuf
),
STRQQ
);
(
void
)
fprintf
(
el
->
el_outfile
,
"BUG!!! %s isn't bound to anything.
\n
"
,
key__decode_str
(
firstbuf
,
unparsbuf
,
STRQQ
));
"BUG!!! %s isn't bound to anything.
\n
"
,
unparsbuf
);
(
void
)
fprintf
(
el
->
el_outfile
,
"el->el_map.key[%d] == %d
\n
"
,
first
,
el
->
el_map
.
key
[
first
]);
}
else
{
(
void
)
key__decode_str
(
firstbuf
,
unparsbuf
,
sizeof
(
unparsbuf
),
STRQQ
);
(
void
)
fprintf
(
el
->
el_outfile
,
"BUG!!! %s isn't bound to anything.
\n
"
,
key__decode_str
(
firstbuf
,
unparsbuf
,
STRQQ
));
"BUG!!! %s isn't bound to anything.
\n
"
,
unparsbuf
);
(
void
)
fprintf
(
el
->
el_outfile
,
"el->el_map.alt[%d] == %d
\n
"
,
first
,
el
->
el_map
.
alt
[
first
]);
}
...
...
@@ -1237,7 +1252,7 @@ map_bind(EditLine *el, int argc, const char **argv)
char
outbuf
[
EL_BUFSIZ
];
const
char
*
in
=
NULL
;
char
*
out
=
NULL
;
el_bindings_t
*
bp
;
el_bindings_t
*
bp
,
*
ep
;
int
cmd
;
int
key
;
...
...
@@ -1279,8 +1294,8 @@ map_bind(EditLine *el, int argc, const char **argv)
return
(
0
);
case
'l'
:
for
(
bp
=
el
->
el_map
.
help
;
bp
->
name
!=
NULL
;
bp
++
)
ep
=
&
el
->
el_map
.
help
[
el
->
el_map
.
nfunc
]
;
for
(
bp
=
el
->
el_map
.
help
;
bp
<
ep
;
bp
++
)
(
void
)
fprintf
(
el
->
el_outfile
,
"%s
\n\t
%s
\n
"
,
bp
->
name
,
bp
->
description
);
...
...
@@ -1367,7 +1382,7 @@ map_bind(EditLine *el, int argc, const char **argv)
break
;
default:
EL_ABORT
((
el
->
el_errfile
,
"Bad XK_ type
\n
"
,
ntype
));
EL_ABORT
((
el
->
el_errfile
,
"Bad XK_ type
%d
\n
"
,
ntype
));
break
;
}
return
(
0
);
...
...
@@ -1381,7 +1396,7 @@ protected int
map_addfunc
(
EditLine
*
el
,
const
char
*
name
,
const
char
*
help
,
el_func_t
func
)
{
void
*
p
;
int
nf
=
el
->
el_map
.
nfunc
+
2
;
int
nf
=
el
->
el_map
.
nfunc
+
1
;
if
(
name
==
NULL
||
help
==
NULL
||
func
==
NULL
)
return
(
-
1
);
...
...
@@ -1400,7 +1415,6 @@ map_addfunc(EditLine *el, const char *name, const char *help, el_func_t func)
el
->
el_map
.
help
[
nf
].
name
=
name
;
el
->
el_map
.
help
[
nf
].
func
=
nf
;
el
->
el_map
.
help
[
nf
].
description
=
help
;
el
->
el_map
.
help
[
++
nf
].
name
=
NULL
;
el
->
el_map
.
nfunc
++
;
return
(
0
);
...
...
cmd-line-utils/libedit/np/fgetln.c
View file @
fab053cc
/* $NetBSD: fgetln.c,v 1.
1.1.1 1999/04/12 07:43:21 crooksa
Exp $ */
/* $NetBSD: fgetln.c,v 1.
9 2008/04/29 06:53:03 martin
Exp $ */
/*-
* Copyright (c) 1998 The NetBSD Foundation, Inc.
...
...
@@ -15,13 +15,6 @@
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. All advertising materials mentioning features or use of this software
* must display the following acknowledgement:
* This product includes software developed by the NetBSD
* Foundation, Inc. and its contributors.
* 4. Neither the name of The NetBSD Foundation nor the names of its
* contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
* ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
...
...
@@ -36,17 +29,24 @@
* POSSIBILITY OF SUCH DAMAGE.
*/
#ifdef HAVE_NBTOOL_CONFIG_H
#include "nbtool_config.h"
#else
#include "config.h"
#include <stdio.h>
#endif
#if !HAVE_FGETLN
#include <stdlib.h>
#ifndef HAVE_NBTOOL_CONFIG_H
/* These headers are required, but included from nbtool_config.h */
#include <stdio.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
#endif
char
*
fgetln
(
fp
,
len
)
FILE
*
fp
;
size_t
*
len
;
fgetln
(
FILE
*
fp
,
size_t
*
len
)
{
static
char
*
buf
=
NULL
;
static
size_t
bufsiz
=
0
;
...
...
@@ -61,8 +61,8 @@ fgetln(fp, len)
if
(
fgets
(
buf
,
bufsiz
,
fp
)
==
NULL
)
return
NULL
;
*
len
=
0
;
*
len
=
0
;
while
((
ptr
=
strchr
(
&
buf
[
*
len
],
'\n'
))
==
NULL
)
{
size_t
nbufsiz
=
bufsiz
+
BUFSIZ
;
char
*
nbuf
=
realloc
(
buf
,
nbufsiz
);
...
...
@@ -76,13 +76,33 @@ fgetln(fp, len)
}
else
buf
=
nbuf
;
*
len
=
bufsiz
;
if
(
fgets
(
&
buf
[
bufsiz
],
BUFSIZ
,
fp
)
==
NULL
)
if
(
fgets
(
&
buf
[
bufsiz
],
BUFSIZ
,
fp
)
==
NULL
)
{
buf
[
bufsiz
]
=
'\0'
;
*
len
=
strlen
(
buf
);
return
buf
;
}
*
len
=
bufsiz
;
bufsiz
=
nbufsiz
;
}
*
len
=
(
ptr
-
buf
)
+
1
;
return
buf
;
}
#endif
#ifdef TEST
int
main
(
int
argc
,
char
*
argv
[])
{
char
*
p
;
size_t
len
;
while
((
p
=
fgetln
(
stdin
,
&
len
))
!=
NULL
)
{
(
void
)
printf
(
"%zu %s"
,
len
,
p
);
free
(
p
);
}
return
0
;
}
#endif
cmd-line-utils/libedit/np/strlcat.c
View file @
fab053cc
/* $NetBSD: strlcat.c,v 1.3 2007/06/04 18:19:27 christos Exp $ */
/* $OpenBSD: strlcat.c,v 1.10 2003/04/12 21:56:39 millert Exp $ */
/*
* Copyright (c) 1998 Todd C. Miller <Todd.Miller@courtesan.com>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. The name of the author may not be used to endorse or promote products
* derived from this software without specific prior written permission.
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
* AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
* THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
* THE SOFTWARE IS PROVIDED "AS IS" AND TODD C. MILLER DISCLAIMS ALL
* WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL TODD C. MILLER BE LIABLE
* FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
* OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
* CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
#if !defined(_KERNEL) && !defined(_STANDALONE)
#if HAVE_NBTOOL_CONFIG_H
#include "nbtool_config.h"
#else
#include "config.h"
#endif
#if defined(LIBC_SCCS) && !defined(lint)
static
char
*
rcsid
=
"$OpenBSD: strlcat.c,v 1.2 1999/06/17 16:28:58 millert Exp $"
;
#endif
/* LIBC_SCCS and not lint */
#ifndef lint
static
const
char
rcsid
[]
=
"$FreeBSD: src/lib/libc/string/strlcat.c,v 1.2.4.2 2001/07/09 23:30:06 obrien Exp $"
;
#endif
#ifdef _LIBC
#include "namespace.h"
#endif
#include <sys/types.h>
#include <assert.h>
#include <string.h>
#ifdef _LIBC
# ifdef __weak_alias
__weak_alias
(
strlcat
,
_strlcat
)
# endif
#endif
#else
#include <lib/libkern/libkern.h>
#endif
/* !_KERNEL && !_STANDALONE */
#if !HAVE_STRLCAT
/*
* Appends src to string dst of size siz (unlike strncat, siz is the
* full size of dst, not space left). At most siz-1 characters
* will be copied. Always NUL terminates (unless siz <= strlen(dst)).
* Returns strlen(
initial dst) + strlen(src); if retval >= siz,
* truncation occurred.
* Returns strlen(
src) + MIN(siz, strlen(initial dst)).
*
If retval >= siz,
truncation occurred.
*/
size_t
strlcat
(
dst
,
src
,
siz
)
char
*
dst
;
const
char
*
src
;
size_t
siz
;
size_t
strlcat
(
char
*
dst
,
const
char
*
src
,
size_t
siz
)
{
register
char
*
d
=
dst
;
register
const
char
*
s
=
src
;
register
size_t
n
=
siz
;
char
*
d
=
dst
;
const
char
*
s
=
src
;
size_t
n
=
siz
;
size_t
dlen
;
_DIAGASSERT
(
dst
!=
NULL
);
_DIAGASSERT
(
src
!=
NULL
);
/* Find the end of dst and adjust bytes left but don't go past end */
while
(
n
--
!=
0
&&
*
d
!=
'\0'
)
d
++
;
...
...
@@ -73,3 +82,4 @@ size_t strlcat(dst, src, siz)
return
(
dlen
+
(
s
-
src
));
/* count does not include NUL */
}
#endif
cmd-line-utils/libedit/np/strlcpy.c
View file @
fab053cc
/* $OpenBSD: strlcpy.c,v 1.4 1999/05/01 18:56:41 millert Exp $ */
/* $NetBSD: strlcpy.c,v 1.3 2007/06/04 18:19:27 christos Exp $ */
/* $OpenBSD: strlcpy.c,v 1.7 2003/04/12 21:56:39 millert Exp $ */
/*
* Copyright (c) 1998 Todd C. Miller <Todd.Miller@courtesan.com>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. The name of the author may not be used to endorse or promote products
* derived from this software without specific prior written permission.
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
* AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
* THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
* THE SOFTWARE IS PROVIDED "AS IS" AND TODD C. MILLER DISCLAIMS ALL
* WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL TODD C. MILLER BE LIABLE
* FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
* OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
* CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
#if !defined(_KERNEL) && !defined(_STANDALONE)
#if HAVE_NBTOOL_CONFIG_H
#include "nbtool_config.h"
#else
#include "config.h"
#if defined(LIBC_SCCS) && !defined(lint)
#if 0
static char *rcsid = "$OpenBSD: strlcpy.c,v 1.4 1999/05/01 18:56:41 millert Exp $";
#endif
#if defined(LIBC_SCCS) && !defined(lint)
#endif
/* LIBC_SCCS and not lint */
#ifndef lint
static
const
char
rcsid
[]
=
"$FreeBSD: src/lib/libc/string/strlcpy.c,v 1.2.4.1 2001/07/09 23:30:06 obrien Exp $"
;
#endif
#ifdef _LIBC
#include "namespace.h"
#endif
#include <sys/types.h>
#include <assert.h>
#include <string.h>
#ifdef _LIBC
# ifdef __weak_alias
__weak_alias
(
strlcpy
,
_strlcpy
)
# endif
#endif
#else
#include <lib/libkern/libkern.h>
#endif
/* !_KERNEL && !_STANDALONE */
#if !HAVE_STRLCPY
/*
* Copy src to string dst of size siz. At most siz-1 characters
* will be copied. Always NUL terminates (unless siz == 0).
* Returns strlen(src); if retval >= siz, truncation occurred.
*/
size_t
strlcpy
(
dst
,
src
,
siz
)
char
*
dst
;
const
char
*
src
;
size_t
siz
;
size_t
strlcpy
(
char
*
dst
,
const
char
*
src
,
size_t
siz
)
{
register
char
*
d
=
dst
;
register
const
char
*
s
=
src
;
register
size_t
n
=
siz
;
char
*
d
=
dst
;
const
char
*
s
=
src
;
size_t
n
=
siz
;
_DIAGASSERT
(
dst
!=
NULL
);
_DIAGASSERT
(
src
!=
NULL
);
/* Copy as many bytes as will fit */
if
(
n
!=
0
&&
--
n
!=
0
)
{
...
...
@@ -73,3 +77,4 @@ size_t strlcpy(dst, src, siz)
return
(
s
-
src
-
1
);
/* count does not include NUL */
}
#endif
cmd-line-utils/libedit/np/unvis.c
View file @
fab053cc
/* $NetBSD: unvis.c,v 1.2
2 2002/03/23 17:38:27
christos Exp $ */
/* $NetBSD: unvis.c,v 1.2
8 2005/09/13 01:44:09
christos Exp $ */
/*-
* Copyright (c) 1989, 1993
...
...
@@ -12,11 +12,7 @@
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. All advertising materials mentioning features or use of this software
* must display the following acknowledgement:
* This product includes software developed by the University of
* California, Berkeley and its contributors.
* 4. Neither the name of the University nor the names of its contributors
* 3. Neither the name of the University nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
...
...
@@ -34,34 +30,30 @@
*/
#include "config.h"
#if defined(LIBC_SCCS) && !defined(lint)
#if 0
static char sccsid[] = "@(#)unvis.c 8.1 (Berkeley) 6/4/93";
#else
__RCSID
(
"$NetBSD: unvis.c,v 1.22 2002/03/23 17:38:27 christos Exp $"
);
#endif
#endif
/* LIBC_SCCS and not lint */
#define __LIBC12_SOURCE__
#include <sys/types.h>
#include <assert.h>
#include <ctype.h>
#include <stdio.h>
#ifdef HAVE_VIS_H
#include <vis.h>
#else
#include "np/vis.h"
#endif
#ifdef __weak_alias
__weak_alias
(
strunvis
,
_strunvis
)
__weak_alias
(
unvis
,
_unvis
)
#endif
#ifdef __warn_references
__warn_references
(
unvis
,
"warning: reference to compatibility unvis(); include <vis.h> for correct reference"
)
#endif
#if !HAVE_VIS_H
#if !HAVE_VIS
/*
* decode driven by state machine
*/
...
...
@@ -72,30 +64,22 @@ __warn_references(unvis,
#define S_CTRL 4
/* control char started (^) */
#define S_OCTAL2 5
/* octal digit 2 */
#define S_OCTAL3 6
/* octal digit 3 */
#define
S_HEX1 7
/* hex digit */
#define
S_HEX2 8
/* hex digit 2 */
#define
S_HEX1 7
/* hex digit */
#define
S_HEX2 8
/* hex digit 2 */
#define isoctal(c) (((u_char)(c)) >= '0' && ((u_char)(c)) <= '7')
#define xtod(c) (isdigit(c) ? (c - '0') : ((tolower(c) - 'a') + 10))
int
unvis
(
cp
,
c
,
astate
,
flag
)
char
*
cp
;
int
c
;
int
*
astate
,
flag
;
{
return
__unvis13
(
cp
,
(
int
)
c
,
astate
,
flag
);
}
/*
* unvis - decode characters previously encoded by vis
*/
int
__unvis13
(
cp
,
c
,
astate
,
flag
)
unvis
(
cp
,
c
,
astate
,
flag
)
char
*
cp
;
int
c
;
int
*
astate
,
flag
;
{
unsigned
char
uc
=
(
unsigned
char
)
c
;
_DIAGASSERT
(
cp
!=
NULL
);
_DIAGASSERT
(
astate
!=
NULL
);
...
...
@@ -105,7 +89,7 @@ __unvis13(cp, c, astate, flag)
||
*
astate
==
S_HEX2
)
{
*
astate
=
S_GROUND
;
return
(
UNVIS_VALID
);
}
}
return
(
*
astate
==
S_GROUND
?
UNVIS_NOCHAR
:
UNVIS_SYNBAD
);
}
...
...
@@ -116,7 +100,7 @@ __unvis13(cp, c, astate, flag)
if
(
c
==
'\\'
)
{
*
astate
=
S_START
;
return
(
0
);
}
}
if
((
flag
&
VIS_HTTPSTYLE
)
&&
c
==
'%'
)
{
*
astate
=
S_HEX1
;
return
(
0
);
...
...
@@ -193,7 +177,7 @@ __unvis13(cp, c, astate, flag)
}
*
astate
=
S_GROUND
;
return
(
UNVIS_SYNBAD
);
case
S_META
:
if
(
c
==
'-'
)
*
astate
=
S_META1
;
...
...
@@ -204,12 +188,12 @@ __unvis13(cp, c, astate, flag)
return
(
UNVIS_SYNBAD
);
}
return
(
0
);
case
S_META1
:
*
astate
=
S_GROUND
;
*
cp
|=
c
;
return
(
UNVIS_VALID
);
case
S_CTRL
:
if
(
c
==
'?'
)
*
cp
|=
0177
;
...
...
@@ -219,23 +203,23 @@ __unvis13(cp, c, astate, flag)
return
(
UNVIS_VALID
);
case
S_OCTAL2
:
/* second possible octal digit */
if
(
isoctal
(
c
))
{
/*
* yes - and maybe a third
if
(
isoctal
(
u
c
))
{
/*
* yes - and maybe a third
*/
*
cp
=
(
*
cp
<<
3
)
+
(
c
-
'0'
);
*
astate
=
S_OCTAL3
;
*
astate
=
S_OCTAL3
;
return
(
0
);
}
/*
* no - done with current sequence, push back passed char
}
/*
* no - done with current sequence, push back passed char
*/
*
astate
=
S_GROUND
;
return
(
UNVIS_VALIDPUSH
);
case
S_OCTAL3
:
/* third possible octal digit */
*
astate
=
S_GROUND
;
if
(
isoctal
(
c
))
{
if
(
isoctal
(
u
c
))
{
*
cp
=
(
*
cp
<<
3
)
+
(
c
-
'0'
);
return
(
UNVIS_VALID
);
}
...
...
@@ -243,27 +227,30 @@ __unvis13(cp, c, astate, flag)
* we were done, push back passed char
*/
return
(
UNVIS_VALIDPUSH
);
case
S_HEX1
:
if
(
isxdigit
(
c
))
{
*
cp
=
xtod
(
c
);
if
(
isxdigit
(
u
c
))
{
*
cp
=
xtod
(
u
c
);
*
astate
=
S_HEX2
;
return
(
0
);
}
/*
* no - done with current sequence, push back passed char
/*
* no - done with current sequence, push back passed char
*/
*
astate
=
S_GROUND
;
return
(
UNVIS_VALIDPUSH
);
case
S_HEX2
:
*
astate
=
S_GROUND
;
if
(
isxdigit
(
c
))
{
*
cp
=
xtod
(
c
)
|
(
*
cp
<<
4
);
*
astate
=
S_GROUND
;
if
(
isxdigit
(
u
c
))
{
*
cp
=
xtod
(
u
c
)
|
(
*
cp
<<
4
);
return
(
UNVIS_VALID
);
}
return
(
UNVIS_VALIDPUSH
);
default:
/*
* decoder in unknown state - (probably uninitialized)
return
(
UNVIS_VALIDPUSH
);
default:
/*
* decoder in unknown state - (probably uninitialized)
*/
*
astate
=
S_GROUND
;
return
(
UNVIS_SYNBAD
);
...
...
@@ -271,7 +258,7 @@ __unvis13(cp, c, astate, flag)
}
/*
* strunvis - decode src into dst
* strunvis - decode src into dst
*
* Number of chars decoded into dst is returned, -1 on error.
* Dst is null terminated.
...
...
@@ -291,8 +278,8 @@ strunvisx(dst, src, flag)
_DIAGASSERT
(
dst
!=
NULL
);
while
((
c
=
*
src
++
)
!=
'\0'
)
{
again:
switch
(
__unvis13
(
dst
,
c
,
&
state
,
flag
))
{
again:
switch
(
unvis
(
dst
,
c
,
&
state
,
flag
))
{
case
UNVIS_VALID
:
dst
++
;
break
;
...
...
@@ -306,7 +293,7 @@ strunvisx(dst, src, flag)
return
(
-
1
);
}
}
if
(
__unvis13
(
dst
,
c
,
&
state
,
UNVIS_END
)
==
UNVIS_VALID
)
if
(
unvis
(
dst
,
c
,
&
state
,
UNVIS_END
)
==
UNVIS_VALID
)
dst
++
;
*
dst
=
'\0'
;
return
(
dst
-
start
);
...
...
cmd-line-utils/libedit/np/vis.c
View file @
fab053cc
/* $NetBSD: vis.c,v 1.
22 2002/03/23 17:38:27 christos
Exp $ */
/* $NetBSD: vis.c,v 1.
38 2008/09/04 09:41:44 lukem
Exp $ */
/*-
* Copyright (c) 1999 The NetBSD Foundation, Inc.
* Copyright (c) 1989, 1993
* The Regents of the University of California. All rights reserved.
*
...
...
@@ -13,11 +12,7 @@
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. All advertising materials mentioning features or use of this software
* must display the following acknowledgement:
* This product includes software developed by the University of
* California, Berkeley and its contributors.
* 4. Neither the name of the University nor the names of its contributors
* 3. Neither the name of the University nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
...
...
@@ -34,21 +29,47 @@
* SUCH DAMAGE.
*/
/*-
* Copyright (c) 1999, 2005 The NetBSD Foundation, Inc.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
* ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
#include "config.h"
#if defined(LIBC_SCCS) && !defined(lint)
__RCSID
(
"$NetBSD: vis.c,v 1.22 2002/03/23 17:38:27 christos Exp $"
);
#endif
/* LIBC_SCCS and not lint */
#include <sys/types.h>
#include <assert.h>
#ifdef HAVE_ALLOCA_H
#include <alloca.h>
#ifdef HAVE_VIS_H
#include <vis.h>
#else
#include "np/vis.h"
#endif
#include <stdlib.h>
#include "np/vis.h"
#ifdef __weak_alias
__weak_alias
(
strsvis
,
_strsvis
)
__weak_alias
(
strsvisx
,
_strsvisx
)
...
...
@@ -58,63 +79,61 @@ __weak_alias(svis,_svis)
__weak_alias
(
vis
,
_vis
)
#endif
#if !HAVE_VIS
_H
#if !HAVE_VIS
|| !HAVE_SVIS
#include <ctype.h>
#include <limits.h>
#include <stdio.h>
#include <string.h>
#include <assert.h>
static
char
*
do_svis
(
char
*
,
int
,
int
,
int
,
const
char
*
);
#undef BELL
#if defined(__STDC__)
#define BELL '\a'
#else
#define BELL '\007'
#endif
#define isoctal(c) (((u
nsigned char)(c)) >= '0' && ((unsigned
char)(c)) <= '7')
#define isoctal(c) (((u
_char)(c)) >= '0' && ((u_
char)(c)) <= '7')
#define iswhite(c) (c == ' ' || c == '\t' || c == '\n')
#define issafe(c) (c == '\b' || c == BELL || c == '\r')
#define xtoa(c) "0123456789abcdef"[c]
#define MAXEXTRAS 5
char
*
MAKEEXTRALIST
(
unsigned
int
flag
,
const
char
*
orig
)
{
const
char
*
o
=
orig
;
char
*
e
,
*
extra
;
while
(
*
o
++
)
continue
;
extra
=
(
char
*
)
malloc
((
size_t
)((
o
-
orig
)
+
MAXEXTRAS
));
assert
(
extra
);
for
(
o
=
orig
,
e
=
extra
;
(
*
e
++
=
*
o
++
)
!=
'\0'
;)
continue
;
e
--
;
if
(
flag
&
VIS_SP
)
*
e
++
=
' '
;
if
(
flag
&
VIS_TAB
)
*
e
++
=
'\t'
;
if
(
flag
&
VIS_NL
)
*
e
++
=
'\n'
;
if
((
flag
&
VIS_NOSLASH
)
==
0
)
*
e
++
=
'\\'
;
*
e
=
'\0'
;
return
extra
;
}
#define MAXEXTRAS 5
#define MAKEEXTRALIST(flag, extra, orig_str) \
do { \
const char *orig = orig_str; \
const char *o = orig; \
char *e; \
while (*o++) \
continue; \
extra = malloc((size_t)((o - orig) + MAXEXTRAS)); \
if (!extra) break; \
for (o = orig, e = extra; (*e++ = *o++) != '\0';) \
continue; \
e--; \
if (flag & VIS_SP) *e++ = ' '; \
if (flag & VIS_TAB) *e++ = '\t'; \
if (flag & VIS_NL) *e++ = '\n'; \
if ((flag & VIS_NOSLASH) == 0) *e++ = '\\'; \
*e = '\0'; \
} while (
/*CONSTCOND*/
0)
/*
* This is
HVIS, the macro of vis used to
HTTP style (RFC 1808)
* This is
do_hvis, for
HTTP style (RFC 1808)
*/
#define HVIS(dst, c, flag, nextc, extra) \
do \
if (!isascii(c) || !isalnum(c) || strchr("$-_.+!*'(),", c) != NULL) { \
*dst++ = '%'; \
*dst++ = xtoa(((unsigned int)c >> 4) & 0xf); \
*dst++ = xtoa((unsigned int)c & 0xf); \
} else { \
SVIS(dst, c, flag, nextc, extra); \
} \
while (
/*CONSTCOND*/
0)
static
char
*
do_hvis
(
char
*
dst
,
int
c
,
int
flag
,
int
nextc
,
const
char
*
extra
)
{
if
(
!
isascii
(
c
)
||
!
isalnum
(
c
)
||
strchr
(
"$-_.+!*'(),"
,
c
)
!=
NULL
)
{
*
dst
++
=
'%'
;
*
dst
++
=
xtoa
(((
unsigned
int
)
c
>>
4
)
&
0xf
);
*
dst
++
=
xtoa
((
unsigned
int
)
c
&
0xf
);
}
else
{
dst
=
do_svis
(
dst
,
c
,
flag
,
nextc
,
extra
);
}
return
dst
;
}
/*
* This is
SVIS, the central macro
of vis.
* This is
do_vis, the central code
of vis.
* dst: Pointer to the destination buffer
* c: Character to encode
* flag: Flag word
...
...
@@ -122,95 +141,103 @@ while (/*CONSTCOND*/0)
* extra: Pointer to the list of extra characters to be
* backslash-protected.
*/
#define SVIS(dst, c, flag, nextc, extra) \
do { \
int isextra, isc; \
isextra = strchr(extra, c) != NULL; \
if (!isextra && isascii(c) && (isgraph(c) || iswhite(c) || \
((flag & VIS_SAFE) && issafe(c)))) { \
*dst++ = c; \
break; \
} \
isc = 0; \
if (flag & VIS_CSTYLE) { \
switch (c) { \
case '\n': \
isc = 1; *dst++ = '\\'; *dst++ = 'n'; \
break; \
case '\r': \
isc = 1; *dst++ = '\\'; *dst++ = 'r'; \
break; \
case '\b': \
isc = 1; *dst++ = '\\'; *dst++ = 'b'; \
break; \
case BELL: \
isc = 1; *dst++ = '\\'; *dst++ = 'a'; \
break; \
case '\v': \
isc = 1; *dst++ = '\\'; *dst++ = 'v'; \
break; \
case '\t': \
isc = 1; *dst++ = '\\'; *dst++ = 't'; \
break; \
case '\f': \
isc = 1; *dst++ = '\\'; *dst++ = 'f'; \
break; \
case ' ': \
isc = 1; *dst++ = '\\'; *dst++ = 's'; \
break; \
case '\0': \
isc = 1; *dst++ = '\\'; *dst++ = '0'; \
if (isoctal(nextc)) { \
*dst++ = '0'; \
*dst++ = '0'; \
} \
} \
} \
if (isc) break; \
if (isextra || ((c & 0177) == ' ') || (flag & VIS_OCTAL)) { \
*dst++ = '\\'; \
*dst++ = (unsigned char)(((unsigned int)(unsigned char)c >> 6) & 03) + '0'; \
*dst++ = (unsigned char)(((unsigned int)(unsigned char)c >> 3) & 07) + '0'; \
*dst++ = (c & 07) + '0'; \
} else { \
if ((flag & VIS_NOSLASH) == 0) *dst++ = '\\'; \
if (c & 0200) { \
c &= 0177; *dst++ = 'M'; \
} \
if (iscntrl(c)) { \
*dst++ = '^'; \
if (c == 0177) \
*dst++ = '?'; \
else \
*dst++ = c + '@'; \
} else { \
*dst++ = '-'; *dst++ = c; \
} \
} \
} while (
/*CONSTCOND*/
0)
static
char
*
do_svis
(
char
*
dst
,
int
c
,
int
flag
,
int
nextc
,
const
char
*
extra
)
{
int
isextra
;
isextra
=
strchr
(
extra
,
c
)
!=
NULL
;
if
(
!
isextra
&&
isascii
(
c
)
&&
(
isgraph
(
c
)
||
iswhite
(
c
)
||
((
flag
&
VIS_SAFE
)
&&
issafe
(
c
))))
{
*
dst
++
=
c
;
return
dst
;
}
if
(
flag
&
VIS_CSTYLE
)
{
switch
(
c
)
{
case
'\n'
:
*
dst
++
=
'\\'
;
*
dst
++
=
'n'
;
return
dst
;
case
'\r'
:
*
dst
++
=
'\\'
;
*
dst
++
=
'r'
;
return
dst
;
case
'\b'
:
*
dst
++
=
'\\'
;
*
dst
++
=
'b'
;
return
dst
;
case
BELL
:
*
dst
++
=
'\\'
;
*
dst
++
=
'a'
;
return
dst
;
case
'\v'
:
*
dst
++
=
'\\'
;
*
dst
++
=
'v'
;
return
dst
;
case
'\t'
:
*
dst
++
=
'\\'
;
*
dst
++
=
't'
;
return
dst
;
case
'\f'
:
*
dst
++
=
'\\'
;
*
dst
++
=
'f'
;
return
dst
;
case
' '
:
*
dst
++
=
'\\'
;
*
dst
++
=
's'
;
return
dst
;
case
'\0'
:
*
dst
++
=
'\\'
;
*
dst
++
=
'0'
;
if
(
isoctal
(
nextc
))
{
*
dst
++
=
'0'
;
*
dst
++
=
'0'
;
}
return
dst
;
default:
if
(
isgraph
(
c
))
{
*
dst
++
=
'\\'
;
*
dst
++
=
c
;
return
dst
;
}
}
}
if
(
isextra
||
((
c
&
0177
)
==
' '
)
||
(
flag
&
VIS_OCTAL
))
{
*
dst
++
=
'\\'
;
*
dst
++
=
(
u_char
)(((
u_int32_t
)(
u_char
)
c
>>
6
)
&
03
)
+
'0'
;
*
dst
++
=
(
u_char
)(((
u_int32_t
)(
u_char
)
c
>>
3
)
&
07
)
+
'0'
;
*
dst
++
=
(
c
&
07
)
+
'0'
;
}
else
{
if
((
flag
&
VIS_NOSLASH
)
==
0
)
*
dst
++
=
'\\'
;
if
(
c
&
0200
)
{
c
&=
0177
;
*
dst
++
=
'M'
;
}
if
(
iscntrl
(
c
))
{
*
dst
++
=
'^'
;
if
(
c
==
0177
)
*
dst
++
=
'?'
;
else
*
dst
++
=
c
+
'@'
;
}
else
{
*
dst
++
=
'-'
;
*
dst
++
=
c
;
}
}
return
dst
;
}
/*
* svis - visually encode characters, also encoding the characters
*
pointed to by `extra'
* pointed to by `extra'
*/
char
*
svis
(
dst
,
c
,
flag
,
nextc
,
extra
)
char
*
dst
;
int
c
,
flag
,
nextc
;
const
char
*
extra
;
svis
(
char
*
dst
,
int
c
,
int
flag
,
int
nextc
,
const
char
*
extra
)
{
char
*
nextra
,
*
to_be_freed
;
char
*
nextra
=
NULL
;
_DIAGASSERT
(
dst
!=
NULL
);
_DIAGASSERT
(
extra
!=
NULL
);
nextra
=
to_be_freed
=
MAKEEXTRALIST
(
flag
,
extra
);
MAKEEXTRALIST
(
flag
,
nextra
,
extra
);
if
(
!
nextra
)
{
*
dst
=
'\0'
;
/* can't create nextra, return "" */
return
dst
;
}
if
(
flag
&
VIS_HTTPSTYLE
)
HVIS
(
dst
,
c
,
flag
,
nextc
,
nextra
);
dst
=
do_hvis
(
dst
,
c
,
flag
,
nextc
,
nextra
);
else
SVIS
(
dst
,
c
,
flag
,
nextc
,
nextra
);
dst
=
do_svis
(
dst
,
c
,
flag
,
nextc
,
nextra
);
free
(
nextra
);
*
dst
=
'\0'
;
free
(
to_be_freed
);
return
(
dst
);
return
dst
;
}
...
...
@@ -221,140 +248,146 @@ svis(dst, c, flag, nextc, extra)
* be encoded, too. These functions are useful e. g. to
* encode strings in such a way so that they are not interpreted
* by a shell.
*
*
* Dst must be 4 times the size of src to account for possible
* expansion. The length of dst, not including the trailing NULL,
* is returned.
* is returned.
*
* Strsvisx encodes exactly len bytes from src into dst.
* This is useful for encoding a block of data.
*/
int
strsvis
(
dst
,
src
,
flag
,
extra
)
char
*
dst
;
const
char
*
src
;
int
flag
;
const
char
*
extra
;
strsvis
(
char
*
dst
,
const
char
*
csrc
,
int
flag
,
const
char
*
extra
)
{
char
c
;
int
c
;
char
*
start
;
char
*
nextra
,
*
to_be_freed
;
char
*
nextra
=
NULL
;
const
unsigned
char
*
src
=
(
const
unsigned
char
*
)
csrc
;
_DIAGASSERT
(
dst
!=
NULL
);
_DIAGASSERT
(
src
!=
NULL
);
_DIAGASSERT
(
extra
!=
NULL
);
nextra
=
to_be_freed
=
MAKEEXTRALIST
(
flag
,
extra
);
MAKEEXTRALIST
(
flag
,
nextra
,
extra
);
if
(
!
nextra
)
{
*
dst
=
'\0'
;
/* can't create nextra, return "" */
return
0
;
}
if
(
flag
&
VIS_HTTPSTYLE
)
{
for
(
start
=
dst
;
(
c
=
*
src
++
)
!=
'\0'
;
/* empty */
)
HVIS
(
dst
,
c
,
flag
,
*
src
,
nextra
);
dst
=
do_hvis
(
dst
,
c
,
flag
,
*
src
,
nextra
);
}
else
{
for
(
start
=
dst
;
(
c
=
*
src
++
)
!=
'\0'
;
/* empty */
)
SVIS
(
dst
,
c
,
flag
,
*
src
,
nextra
);
dst
=
do_svis
(
dst
,
c
,
flag
,
*
src
,
nextra
);
}
free
(
nextra
);
*
dst
=
'\0'
;
free
(
to_be_freed
);
return
(
dst
-
start
);
}
int
strsvisx
(
dst
,
src
,
len
,
flag
,
extra
)
char
*
dst
;
const
char
*
src
;
size_t
len
;
int
flag
;
const
char
*
extra
;
strsvisx
(
char
*
dst
,
const
char
*
csrc
,
size_t
len
,
int
flag
,
const
char
*
extra
)
{
char
c
;
unsigned
char
c
;
char
*
start
;
char
*
nextra
,
*
to_be_freed
;
char
*
nextra
=
NULL
;
const
unsigned
char
*
src
=
(
const
unsigned
char
*
)
csrc
;
_DIAGASSERT
(
dst
!=
NULL
);
_DIAGASSERT
(
src
!=
NULL
);
_DIAGASSERT
(
extra
!=
NULL
);
nextra
=
to_be_freed
=
MAKEEXTRALIST
(
flag
,
extra
);
MAKEEXTRALIST
(
flag
,
nextra
,
extra
);
if
(
!
nextra
)
{
*
dst
=
'\0'
;
/* can't create nextra, return "" */
return
0
;
}
if
(
flag
&
VIS_HTTPSTYLE
)
{
for
(
start
=
dst
;
len
>
0
;
len
--
)
{
c
=
*
src
++
;
HVIS
(
dst
,
c
,
flag
,
len
?
*
src
:
'\0'
,
nextra
);
dst
=
do_hvis
(
dst
,
c
,
flag
,
len
>
1
?
*
src
:
'\0'
,
nextra
);
}
}
else
{
for
(
start
=
dst
;
len
>
0
;
len
--
)
{
c
=
*
src
++
;
SVIS
(
dst
,
c
,
flag
,
len
?
*
src
:
'\0'
,
nextra
);
dst
=
do_svis
(
dst
,
c
,
flag
,
len
>
1
?
*
src
:
'\0'
,
nextra
);
}
}
free
(
nextra
);
*
dst
=
'\0'
;
free
(
to_be_freed
);
return
(
dst
-
start
);
}
#endif
#if !HAVE_VIS
/*
* vis - visually encode characters
*/
char
*
vis
(
dst
,
c
,
flag
,
nextc
)
char
*
dst
;
int
c
,
flag
,
nextc
;
vis
(
char
*
dst
,
int
c
,
int
flag
,
int
nextc
)
{
char
*
extra
,
*
to_be_freed
;
char
*
extra
=
NULL
;
unsigned
char
uc
=
(
unsigned
char
)
c
;
_DIAGASSERT
(
dst
!=
NULL
);
extra
=
to_be_freed
=
MAKEEXTRALIST
(
flag
,
""
);
MAKEEXTRALIST
(
flag
,
extra
,
""
);
if
(
!
extra
)
{
*
dst
=
'\0'
;
/* can't create extra, return "" */
return
dst
;
}
if
(
flag
&
VIS_HTTPSTYLE
)
HVIS
(
dst
,
c
,
flag
,
nextc
,
extra
);
dst
=
do_hvis
(
dst
,
u
c
,
flag
,
nextc
,
extra
);
else
SVIS
(
dst
,
c
,
flag
,
nextc
,
extra
);
dst
=
do_svis
(
dst
,
uc
,
flag
,
nextc
,
extra
);
free
(
extra
);
*
dst
=
'\0'
;
free
(
to_be_freed
);
return
(
dst
);
return
dst
;
}
/*
* strvis, strvisx - visually encode characters from src into dst
*
*
* Dst must be 4 times the size of src to account for possible
* expansion. The length of dst, not including the trailing NULL,
* is returned.
* is returned.
*
* Strvisx encodes exactly len bytes from src into dst.
* This is useful for encoding a block of data.
*/
int
strvis
(
dst
,
src
,
flag
)
char
*
dst
;
const
char
*
src
;
int
flag
;
strvis
(
char
*
dst
,
const
char
*
src
,
int
flag
)
{
char
*
extra
;
int
tmp
;
char
*
extra
=
NULL
;
int
rv
;
extra
=
MAKEEXTRALIST
(
flag
,
""
);
tmp
=
strsvis
(
dst
,
src
,
flag
,
extra
);
MAKEEXTRALIST
(
flag
,
extra
,
""
);
if
(
!
extra
)
{
*
dst
=
'\0'
;
/* can't create extra, return "" */
return
0
;
}
rv
=
strsvis
(
dst
,
src
,
flag
,
extra
);
free
(
extra
);
return
tmp
;
return
rv
;
}
int
strvisx
(
dst
,
src
,
len
,
flag
)
char
*
dst
;
const
char
*
src
;
size_t
len
;
int
flag
;
strvisx
(
char
*
dst
,
const
char
*
src
,
size_t
len
,
int
flag
)
{
char
*
extra
;
int
tmp
;
char
*
extra
=
NULL
;
int
rv
;
extra
=
MAKEEXTRALIST
(
flag
,
""
);
tmp
=
strsvisx
(
dst
,
src
,
len
,
flag
,
extra
);
MAKEEXTRALIST
(
flag
,
extra
,
""
);
if
(
!
extra
)
{
*
dst
=
'\0'
;
/* can't create extra, return "" */
return
0
;
}
rv
=
strsvisx
(
dst
,
src
,
len
,
flag
,
extra
);
free
(
extra
);
return
tmp
;
return
rv
;
}
#endif
cmd-line-utils/libedit/np/vis.h
View file @
fab053cc
/* $NetBSD: vis.h,v 1.1
2 2002/03/23 17:39:05
christos Exp $ */
/* $NetBSD: vis.h,v 1.1
6 2005/09/13 01:44:32
christos Exp $ */
/*-
* Copyright (c) 1990, 1993
...
...
@@ -12,11 +12,7 @@
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. All advertising materials mentioning features or use of this software
* must display the following acknowledgement:
* This product includes software developed by the University of
* California, Berkeley and its contributors.
* 4. Neither the name of the University nor the names of its contributors
* 3. Neither the name of the University nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
...
...
@@ -38,9 +34,7 @@
#ifndef _VIS_H_
#define _VIS_H_
#ifdef HAVE_SYS_CDEFS_H
#include <sys/cdefs.h>
#endif
#include <sys/types.h>
/*
* to select alternate encoding format
...
...
@@ -78,6 +72,7 @@
*/
#define UNVIS_END 1
/* no more characters */
__BEGIN_DECLS
char
*
vis
(
char
*
,
int
,
int
,
int
);
char
*
svis
(
char
*
,
int
,
int
,
int
,
const
char
*
);
int
strvis
(
char
*
,
const
char
*
,
int
);
...
...
@@ -86,11 +81,7 @@ int strvisx(char *, const char *, size_t, int);
int
strsvisx
(
char
*
,
const
char
*
,
size_t
,
int
,
const
char
*
);
int
strunvis
(
char
*
,
const
char
*
);
int
strunvisx
(
char
*
,
const
char
*
,
int
);
#ifdef __LIBC12_SOURCE__
int
unvis
(
char
*
,
int
,
int
*
,
int
);
int
__unvis13
(
char
*
,
int
,
int
*
,
int
);
#else
int
unvis
(
char
*
,
int
,
int
*
,
int
)
__RENAME
(
__unvis13
);
#endif
__END_DECLS
#endif
/* !_VIS_H_ */
cmd-line-utils/libedit/parse.c
View file @
fab053cc
/* $NetBSD: parse.c,v 1.2
0 2003/12/05 13:37:48
lukem Exp $ */
/* $NetBSD: parse.c,v 1.2
2 2005/05/29 04:58:15
lukem Exp $ */
/*-
* Copyright (c) 1992, 1993
...
...
@@ -32,7 +32,13 @@
* SUCH DAMAGE.
*/
#include <config.h>
#include "config.h"
#if !defined(lint) && !defined(SCCSID)
#if 0
static char sccsid[] = "@(#)parse.c 8.1 (Berkeley) 6/4/93";
#else
#endif
#endif
/* not lint && not SCCSID */
/*
* parse.c: parse an editline extended command
...
...
@@ -129,7 +135,7 @@ el_parse(EditLine *el, int argc, const char *argv[])
* the appropriate character or -1 if the escape is not valid
*/
protected
int
parse__escape
(
const
char
**
const
ptr
)
parse__escape
(
const
char
**
ptr
)
{
const
char
*
p
;
int
c
;
...
...
cmd-line-utils/libedit/parse.h
View file @
fab053cc
/* $NetBSD: parse.h,v 1.
5 2003/08/07 16:44:32 agc
Exp $ */
/* $NetBSD: parse.h,v 1.
6 2005/05/29 04:58:15 lukem
Exp $ */
/*-
* Copyright (c) 1992, 1993
...
...
@@ -41,7 +41,7 @@
#define _h_el_parse
protected
int
parse_line
(
EditLine
*
,
const
char
*
);
protected
int
parse__escape
(
const
char
**
const
);
protected
int
parse__escape
(
const
char
**
);
protected
char
*
parse__string
(
char
*
,
const
char
*
);
protected
int
parse_cmd
(
EditLine
*
,
const
char
*
);
...
...
cmd-line-utils/libedit/prompt.c
View file @
fab053cc
...
...
@@ -32,7 +32,13 @@
* SUCH DAMAGE.
*/
#include <config.h>
#include "config.h"
#if !defined(lint) && !defined(SCCSID)
#if 0
static char sccsid[] = "@(#)prompt.c 8.1 (Berkeley) 6/4/93";
#else
#endif
#endif
/* not lint && not SCCSID */
/*
* prompt.c: Prompt printing functions
...
...
cmd-line-utils/libedit/read.c
View file @
fab053cc
/* $NetBSD: read.c,v 1.
35 2005/03/09 23:55:02
christos Exp $ */
/* $NetBSD: read.c,v 1.
43 2009/02/05 19:15:44
christos Exp $ */
/*-
* Copyright (c) 1992, 1993
...
...
@@ -32,7 +32,13 @@
* SUCH DAMAGE.
*/
#include <config.h>
#include "config.h"
#if !defined(lint) && !defined(SCCSID)
#if 0
static char sccsid[] = "@(#)read.c 8.1 (Berkeley) 6/4/93";
#else
#endif
#endif
/* not lint && not SCCSID */
/*
* read.c: Clean this junk up! This is horrible code.
...
...
@@ -50,6 +56,7 @@ private int read__fixio(int, int);
private
int
read_preread
(
EditLine
*
);
private
int
read_char
(
EditLine
*
,
char
*
);
private
int
read_getcmd
(
EditLine
*
,
el_action_t
*
,
char
*
);
private
void
read_pop
(
c_macro_t
*
);
/* read_init():
* Initialize the read stuff
...
...
@@ -205,7 +212,7 @@ read_preread(EditLine *el)
* Push a macro
*/
public
void
el_push
(
EditLine
*
el
,
char
*
str
)
el_push
(
EditLine
*
el
,
c
onst
c
har
*
str
)
{
c_macro_t
*
ma
=
&
el
->
el_chared
.
c_macro
;
...
...
@@ -216,7 +223,7 @@ el_push(EditLine *el, char *str)
ma
->
level
--
;
}
term_beep
(
el
);
term__flush
();
term__flush
(
el
);
}
...
...
@@ -294,6 +301,19 @@ read_char(EditLine *el, char *cp)
return
(
num_read
);
}
/* read_pop():
* Pop a macro from the stack
*/
private
void
read_pop
(
c_macro_t
*
ma
)
{
int
i
;
el_free
(
ma
->
macro
[
0
]);
for
(
i
=
ma
->
level
--
;
i
>
0
;
i
--
)
ma
->
macro
[
i
-
1
]
=
ma
->
macro
[
i
];
ma
->
offset
=
0
;
}
/* el_getc():
* Read a character
...
...
@@ -304,26 +324,28 @@ el_getc(EditLine *el, char *cp)
int
num_read
;
c_macro_t
*
ma
=
&
el
->
el_chared
.
c_macro
;
term__flush
();
term__flush
(
el
);
for
(;;)
{
if
(
ma
->
level
<
0
)
{
if
(
!
read_preread
(
el
))
break
;
}
if
(
ma
->
level
<
0
)
break
;
if
(
ma
->
macro
[
ma
->
level
][
ma
->
offset
]
==
'\0'
)
{
el_free
(
ma
->
macro
[
ma
->
level
--
]);
ma
->
offset
=
0
;
if
(
ma
->
macro
[
0
][
ma
->
offset
]
==
'\0'
)
{
read_pop
(
ma
);
continue
;
}
*
cp
=
ma
->
macro
[
ma
->
level
][
ma
->
offset
++
]
&
0377
;
if
(
ma
->
macro
[
ma
->
level
][
ma
->
offset
]
==
'\0'
)
{
*
cp
=
ma
->
macro
[
0
][
ma
->
offset
++
]
&
0377
;
if
(
ma
->
macro
[
0
][
ma
->
offset
]
==
'\0'
)
{
/* Needed for QuoteMode On */
el_free
(
ma
->
macro
[
ma
->
level
--
]);
ma
->
offset
=
0
;
read_pop
(
ma
);
}
return
(
1
);
}
...
...
@@ -357,11 +379,11 @@ read_prepare(EditLine *el)
we have the wrong size. */
el_resize
(
el
);
re_clear_display
(
el
);
/* reset the display stuff */
ch_reset
(
el
);
ch_reset
(
el
,
0
);
re_refresh
(
el
);
/* print the prompt */
if
(
el
->
el_flags
&
UNBUFFERED
)
term__flush
();
term__flush
(
el
);
}
protected
void
...
...
@@ -438,7 +460,7 @@ el_gets(EditLine *el, int *nread)
else
cp
=
el
->
el_line
.
lastchar
;
term__flush
();
term__flush
(
el
);
while
((
*
el
->
el_read
.
read_char
)(
el
,
cp
)
==
1
)
{
/* make sure there is space next character */
...
...
@@ -478,7 +500,7 @@ el_gets(EditLine *el, int *nread)
#endif
/* DEBUG_READ */
break
;
}
if
((
unsigned
int
)
cmdnum
>=
el
->
el_map
.
nfunc
)
{
/* BUG CHECK command */
if
((
unsigned
int
)
cmdnum
>=
(
unsigned
int
)
el
->
el_map
.
nfunc
)
{
/* BUG CHECK command */
#ifdef DEBUG_EDIT
(
void
)
fprintf
(
el
->
el_errfile
,
"ERROR: illegal command from key 0%o
\r\n
"
,
ch
);
...
...
@@ -570,7 +592,7 @@ el_gets(EditLine *el, int *nread)
#endif
/* DEBUG_READ */
/* put (real) cursor in a known place */
re_clear_display
(
el
);
/* reset the display stuff */
ch_reset
(
el
);
/* reset the input pointers */
ch_reset
(
el
,
1
);
/* reset the input pointers */
re_refresh
(
el
);
/* print the prompt again */
break
;
...
...
@@ -581,7 +603,7 @@ el_gets(EditLine *el, int *nread)
"*** editor ERROR ***
\r\n\n
"
);
#endif
/* DEBUG_READ */
term_beep
(
el
);
term__flush
();
term__flush
(
el
);
break
;
}
el
->
el_state
.
argument
=
1
;
...
...
@@ -591,7 +613,7 @@ el_gets(EditLine *el, int *nread)
break
;
}
term__flush
();
/* flush any buffered output */
term__flush
(
el
);
/* flush any buffered output */
/* make sure the tty is set up correctly */
if
((
el
->
el_flags
&
UNBUFFERED
)
==
0
)
{
read_finish
(
el
);
...
...
cmd-line-utils/libedit/read.h
View file @
fab053cc
/* $NetBSD: read.h,v 1.
4 2004/02/27 14:52:18 christos
Exp $ */
/* $NetBSD: read.h,v 1.
6 2008/04/29 06:53:01 martin
Exp $ */
/*-
* Copyright (c) 2001 The NetBSD Foundation, Inc.
...
...
@@ -15,13 +15,6 @@
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. All advertising materials mentioning features or use of this software
* must display the following acknowledgement:
* This product includes software developed by the NetBSD
* Foundation, Inc. and its contributors.
* 4. Neither the name of The NetBSD Foundation nor the names of its
* contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
* ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
...
...
cmd-line-utils/libedit/readline.c
View file @
fab053cc
/* $NetBSD: readline.c,v 1.
49 2005/03/10 19:34:4
6 christos Exp $ */
/* $NetBSD: readline.c,v 1.
78 2009/02/05 19:15:2
6 christos Exp $ */
/*-
* Copyright (c) 1997 The NetBSD Foundation, Inc.
...
...
@@ -15,13 +15,6 @@
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. All advertising materials mentioning features or use of this software
* must display the following acknowledgement:
* This product includes software developed by the NetBSD
* Foundation, Inc. and its contributors.
* 4. Neither the name of The NetBSD Foundation nor the names of its
* contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
* ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
...
...
@@ -36,25 +29,9 @@
* POSSIBILITY OF SUCH DAMAGE.
*/
/* AIX requires this to be the first thing in the file. */
#if defined (_AIX) && !defined (__GNUC__)
#pragma alloca
#endif
#include <config.h>
#ifdef __GNUC__
# undef alloca
# define alloca(n) __builtin_alloca (n)
#else
# ifdef HAVE_ALLOCA_H
# include <alloca.h>
# else
# ifndef _AIX
extern
char
*
alloca
();
# endif
# endif
#endif
#include "config.h"
#if !defined(lint) && !defined(SCCSID)
#endif
/* not lint && not SCCSID */
#include <sys/types.h>
#include <sys/stat.h>
...
...
@@ -68,12 +45,23 @@ extern char *alloca ();
#include <limits.h>
#include <errno.h>
#include <fcntl.h>
#include <setjmp.h>
#ifdef HAVE_VIS_H
#include <vis.h>
#include "readline/readline.h"
#else
#include "np/vis.h"
#endif
#ifdef HAVE_ALLOCA_H
#include <alloca.h>
#endif
#include "el.h"
#include "fcns.h"
/* for EL_NUM_FCNS */
#include "histedit.h"
#include "readline/readline.h"
#include "filecomplete.h"
void
rl_prep_terminal
(
int
);
void
rl_deprep_terminal
(
void
);
/* for rl_complete() */
#define TAB '\r'
...
...
@@ -94,9 +82,12 @@ FILE *rl_outstream = NULL;
int
rl_point
=
0
;
int
rl_end
=
0
;
char
*
rl_line_buffer
=
NULL
;
VFunction
*
rl_linefunc
=
NULL
;
V
CP
Function
*
rl_linefunc
=
NULL
;
int
rl_done
=
0
;
VFunction
*
rl_event_hook
=
NULL
;
KEYMAP_ENTRY_ARRAY
emacs_standard_keymap
,
emacs_meta_keymap
,
emacs_ctlx_keymap
;
int
history_base
=
1
;
/* probably never subject to change */
int
history_length
=
0
;
...
...
@@ -112,21 +103,23 @@ int rl_attempted_completion_over = 0;
char
*
rl_basic_word_break_characters
=
break_chars
;
char
*
rl_completer_word_break_characters
=
NULL
;
char
*
rl_completer_quote_characters
=
NULL
;
CP
Function
*
rl_completion_entry_function
=
NULL
;
Function
*
rl_completion_entry_function
=
NULL
;
CPPFunction
*
rl_attempted_completion_function
=
NULL
;
Function
*
rl_pre_input_hook
=
NULL
;
Function
*
rl_startup1_hook
=
NULL
;
Function
*
rl_getc_function
=
NULL
;
int
(
*
rl_getc_function
)(
FILE
*
)
=
NULL
;
char
*
rl_terminal_name
=
NULL
;
int
rl_already_prompted
=
0
;
int
rl_filename_completion_desired
=
0
;
int
rl_ignore_completion_duplicates
=
0
;
int
rl_catch_signals
=
1
;
int
readline_echoing_p
=
1
;
int
_rl_print_completions_horizontally
=
0
;
VFunction
*
rl_redisplay_function
=
NULL
;
Function
*
rl_startup_hook
=
NULL
;
VFunction
*
rl_completion_display_matches_hook
=
NULL
;
VFunction
*
rl_prep_term_function
=
NULL
;
VFunction
*
rl_deprep_term_function
=
NULL
;
VFunction
*
rl_prep_term_function
=
(
VFunction
*
)
rl_prep_terminal
;
VFunction
*
rl_deprep_term_function
=
(
VFunction
*
)
rl_deprep_terminal
;
/*
* The current prompt string.
...
...
@@ -150,7 +143,7 @@ int rl_completion_query_items = 100;
* in the parsed text when it is passed to the completion function.
* Shell uses this to help determine what kind of completing to do.
*/
char
*
rl_special_prefixes
=
(
char
*
)
NULL
;
char
*
rl_special_prefixes
=
NULL
;
/*
* This is the character appended to the completed words if at the end of
...
...
@@ -160,25 +153,21 @@ int rl_completion_append_character = ' ';
/* stuff below is used internally by libedit for readline emulation */
/* if not zero, non-unique completions always show list of possible matches */
static
int
_rl_complete_show_all
=
0
;
static
History
*
h
=
NULL
;
static
EditLine
*
e
=
NULL
;
static
Function
*
map
[
256
];
static
int
el_rl_complete_cmdnum
=
0
;
static
jmp_buf
topbuf
;
/* internal functions */
static
unsigned
char
_el_rl_complete
(
EditLine
*
,
int
);
static
unsigned
char
_el_rl_tstp
(
EditLine
*
,
int
);
static
char
*
_get_prompt
(
EditLine
*
);
static
int
_getc_function
(
EditLine
*
,
char
*
);
static
HIST_ENTRY
*
_move_history
(
int
);
static
int
_history_expand_command
(
const
char
*
,
size_t
,
size_t
,
char
**
);
static
char
*
_rl_compat_sub
(
const
char
*
,
const
char
*
,
const
char
*
,
int
);
static
int
_rl_complete_internal
(
int
);
static
int
_rl_qsort_string_compare
(
const
void
*
,
const
void
*
);
static
int
_rl_event_read_char
(
EditLine
*
,
char
*
);
static
void
_rl_update_pos
(
void
);
...
...
@@ -205,16 +194,49 @@ _move_history(int op)
return
(
HIST_ENTRY
*
)
NULL
;
rl_he
.
line
=
ev
.
str
;
rl_he
.
data
=
(
histdata_t
)
&
(
ev
.
num
)
;
rl_he
.
data
=
NULL
;
return
(
&
rl_he
);
}
/*
* read one key from user defined input function
*/
static
int
/*ARGSUSED*/
_getc_function
(
EditLine
*
el
,
char
*
c
)
{
int
i
;
i
=
(
*
rl_getc_function
)(
NULL
);
if
(
i
==
-
1
)
return
0
;
*
c
=
i
;
return
1
;
}
/*
* READLINE compatibility stuff
*/
/*
* Set the prompt
*/
int
rl_set_prompt
(
const
char
*
prompt
)
{
if
(
!
prompt
)
prompt
=
""
;
if
(
rl_prompt
!=
NULL
&&
strcmp
(
rl_prompt
,
prompt
)
==
0
)
return
0
;
if
(
rl_prompt
)
free
(
rl_prompt
);
rl_prompt
=
strdup
(
prompt
);
return
rl_prompt
==
NULL
?
-
1
:
0
;
}
/*
* initialize rl compat stuff
*/
...
...
@@ -223,7 +245,6 @@ rl_initialize(void)
{
HistEvent
ev
;
const
LineInfo
*
li
;
int
i
;
int
editmode
=
1
;
struct
termios
t
;
...
...
@@ -257,9 +278,12 @@ rl_initialize(void)
max_input_history
=
INT_MAX
;
el_set
(
e
,
EL_HIST
,
history
,
h
);
/* setup getc function if valid */
if
(
rl_getc_function
)
el_set
(
e
,
EL_GETCFN
,
_getc_function
);
/* for proper prompt printing in readline() */
rl_prompt
=
strdup
(
""
);
if
(
rl_prompt
==
NULL
)
{
if
(
rl_set_prompt
(
""
)
==
-
1
)
{
history_end
(
h
);
el_end
(
e
);
return
-
1
;
...
...
@@ -291,17 +315,6 @@ rl_initialize(void)
"ReadLine compatible suspend function"
,
_el_rl_tstp
);
el_set
(
e
,
EL_BIND
,
"^Z"
,
"rl_tstp"
,
NULL
);
/*
* Find out where the rl_complete function was added; this is
* used later to detect that lastcmd was also rl_complete.
*/
for
(
i
=
EL_NUM_FCNS
;
i
<
e
->
el_map
.
nfunc
;
i
++
)
{
if
(
e
->
el_map
.
func
[
i
]
==
_el_rl_complete
)
{
el_rl_complete_cmdnum
=
i
;
break
;
}
}
/* read settings from configuration file */
el_source
(
e
,
NULL
);
...
...
@@ -327,9 +340,10 @@ rl_initialize(void)
* trailing newline (if there is any)
*/
char
*
readline
(
const
char
*
p
rompt
)
readline
(
const
char
*
p
)
{
HistEvent
ev
;
const
char
*
volatile
prompt
=
p
;
int
count
;
const
char
*
ret
;
char
*
buf
;
...
...
@@ -340,15 +354,11 @@ readline(const char *prompt)
rl_done
=
0
;
(
void
)
setjmp
(
topbuf
);
/* update prompt accordingly to what has been passed */
if
(
!
prompt
)
prompt
=
""
;
if
(
strcmp
(
rl_prompt
,
prompt
)
!=
0
)
{
free
(
rl_prompt
);
rl_prompt
=
strdup
(
prompt
);
if
(
rl_prompt
==
NULL
)
return
NULL
;
}
if
(
rl_set_prompt
(
prompt
)
==
-
1
)
return
NULL
;
if
(
rl_pre_input_hook
)
(
*
rl_pre_input_hook
)(
NULL
,
0
);
...
...
@@ -446,7 +456,7 @@ _rl_compat_sub(const char *str, const char *what, const char *with,
}
else
*
r
++
=
*
s
++
;
}
*
r
=
0
;
*
r
=
'\0'
;
return
(
result
);
}
...
...
@@ -467,7 +477,7 @@ get_history_event(const char *cmd, int *cindex, int qchar)
return
(
NULL
);
/* find out which event to take */
if
(
cmd
[
idx
]
==
history_expansion_char
||
cmd
[
idx
]
==
0
)
{
if
(
cmd
[
idx
]
==
history_expansion_char
||
cmd
[
idx
]
==
'\0'
)
{
if
(
history
(
h
,
&
ev
,
H_FIRST
)
!=
0
)
return
(
NULL
);
*
cindex
=
cmd
[
idx
]
?
(
idx
+
1
)
:
idx
;
...
...
@@ -689,7 +699,7 @@ _history_expand_command(const char *command, size_t offs, size_t cmdlen,
if
(
aptr
)
free
(
aptr
);
if
(
*
cmd
==
0
||
(
cmd
-
(
command
+
offs
)
>=
cmdlen
))
{
if
(
*
cmd
==
'\0'
||
((
size_t
)(
cmd
-
(
command
+
offs
)
)
>=
cmdlen
))
{
*
result
=
tmp
;
return
(
1
);
}
...
...
@@ -699,7 +709,7 @@ _history_expand_command(const char *command, size_t offs, size_t cmdlen,
continue
;
else
if
(
*
cmd
==
'h'
)
{
/* remove trailing path */
if
((
aptr
=
strrchr
(
tmp
,
'/'
))
!=
NULL
)
*
aptr
=
0
;
*
aptr
=
'\0'
;
}
else
if
(
*
cmd
==
't'
)
{
/* remove leading path */
if
((
aptr
=
strrchr
(
tmp
,
'/'
))
!=
NULL
)
{
aptr
=
strdup
(
aptr
+
1
);
...
...
@@ -708,7 +718,7 @@ _history_expand_command(const char *command, size_t offs, size_t cmdlen,
}
}
else
if
(
*
cmd
==
'r'
)
{
/* remove trailing suffix */
if
((
aptr
=
strrchr
(
tmp
,
'.'
))
!=
NULL
)
*
aptr
=
0
;
*
aptr
=
'\0'
;
}
else
if
(
*
cmd
==
'e'
)
{
/* remove all but suffix */
if
((
aptr
=
strrchr
(
tmp
,
'.'
))
!=
NULL
)
{
aptr
=
strdup
(
aptr
);
...
...
@@ -732,6 +742,7 @@ _history_expand_command(const char *command, size_t offs, size_t cmdlen,
what
=
realloc
(
from
,
size
);
if
(
what
==
NULL
)
{
free
(
from
);
free
(
tmp
);
return
0
;
}
len
=
0
;
...
...
@@ -744,6 +755,7 @@ _history_expand_command(const char *command, size_t offs, size_t cmdlen,
(
size
<<=
1
));
if
(
nwhat
==
NULL
)
{
free
(
what
);
free
(
tmp
);
return
0
;
}
what
=
nwhat
;
...
...
@@ -756,10 +768,13 @@ _history_expand_command(const char *command, size_t offs, size_t cmdlen,
free
(
what
);
if
(
search
)
{
from
=
strdup
(
search
);
if
(
from
==
NULL
)
if
(
from
==
NULL
)
{
free
(
tmp
);
return
0
;
}
}
else
{
from
=
NULL
;
free
(
tmp
);
return
(
-
1
);
}
}
...
...
@@ -771,6 +786,7 @@ _history_expand_command(const char *command, size_t offs, size_t cmdlen,
with
=
realloc
(
to
,
size
);
if
(
with
==
NULL
)
{
free
(
to
);
free
(
tmp
);
return
-
1
;
}
len
=
0
;
...
...
@@ -782,6 +798,7 @@ _history_expand_command(const char *command, size_t offs, size_t cmdlen,
nwith
=
realloc
(
with
,
size
);
if
(
nwith
==
NULL
)
{
free
(
with
);
free
(
tmp
);
return
-
1
;
}
with
=
nwith
;
...
...
@@ -850,12 +867,14 @@ history_expand(char *str, char **output)
return
0
;
}
#define ADD_STRING(what, len
)
\
#define ADD_STRING(what, len
, fr)
\
{ \
if (idx + len + 1 > size) { \
char *nresult = realloc(result, (size += len + 1));\
if (nresult == NULL) { \
free(*output); \
if (
/*CONSTCOND*/
fr) \
free(tmp); \
return 0; \
} \
result = nresult; \
...
...
@@ -867,6 +886,7 @@ history_expand(char *str, char **output)
result
=
NULL
;
size
=
idx
=
0
;
tmp
=
NULL
;
for
(
i
=
0
;
str
[
i
];)
{
int
qchar
,
loop_again
;
size_t
len
,
start
,
j
;
...
...
@@ -904,13 +924,11 @@ loop:
goto
loop
;
}
len
=
i
-
start
;
tmp
=
&
str
[
start
];
ADD_STRING
(
tmp
,
len
);
ADD_STRING
(
&
str
[
start
],
len
,
0
);
if
(
str
[
i
]
==
'\0'
||
str
[
i
]
!=
history_expansion_char
)
{
len
=
j
-
i
;
tmp
=
&
str
[
i
];
ADD_STRING
(
tmp
,
len
);
ADD_STRING
(
&
str
[
i
],
len
,
0
);
if
(
start
==
0
)
ret
=
0
;
else
...
...
@@ -920,8 +938,11 @@ loop:
ret
=
_history_expand_command
(
str
,
i
,
(
j
-
i
),
&
tmp
);
if
(
ret
>
0
&&
tmp
)
{
len
=
strlen
(
tmp
);
ADD_STRING
(
tmp
,
len
);
ADD_STRING
(
tmp
,
len
,
1
);
}
if
(
tmp
)
{
free
(
tmp
);
tmp
=
NULL
;
}
i
=
j
;
}
...
...
@@ -973,23 +994,23 @@ history_arg_extract(int start, int end, const char *str)
if
(
start
<
0
)
start
=
end
;
if
(
start
<
0
||
end
<
0
||
start
>
max
||
end
>
max
||
start
>
end
)
if
(
start
<
0
||
end
<
0
||
(
size_t
)
start
>
max
||
(
size_t
)
end
>
max
||
start
>
end
)
return
(
NULL
);
for
(
i
=
start
,
len
=
0
;
i
<=
end
;
i
++
)
for
(
i
=
start
,
len
=
0
;
i
<=
(
size_t
)
end
;
i
++
)
len
+=
strlen
(
arr
[
i
])
+
1
;
len
++
;
result
=
malloc
(
len
);
if
(
result
==
NULL
)
return
NULL
;
for
(
i
=
start
,
len
=
0
;
i
<=
end
;
i
++
)
{
for
(
i
=
start
,
len
=
0
;
i
<=
(
size_t
)
end
;
i
++
)
{
(
void
)
strcpy
(
result
+
len
,
arr
[
i
]);
len
+=
strlen
(
arr
[
i
]);
if
(
i
<
end
)
if
(
i
<
(
size_t
)
end
)
result
[
len
++
]
=
' '
;
}
result
[
len
]
=
0
;
result
[
len
]
=
'\0'
;
for
(
i
=
0
;
arr
[
i
];
i
++
)
free
(
arr
[
i
]);
...
...
@@ -1152,7 +1173,7 @@ history_get(int num)
return
(
NULL
);
/* error */
/* look backwards for event matching specified offset */
if
(
history
(
h
,
&
ev
,
H_NEXT_EVENT
,
num
))
if
(
history
(
h
,
&
ev
,
H_NEXT_EVENT
,
num
+
1
))
return
(
NULL
);
she
.
line
=
ev
.
str
;
...
...
@@ -1184,6 +1205,31 @@ add_history(const char *line)
}
/*
* remove the specified entry from the history list and return it.
*/
HIST_ENTRY
*
remove_history
(
int
num
)
{
HIST_ENTRY
*
she
;
HistEvent
ev
;
if
(
h
==
NULL
||
e
==
NULL
)
rl_initialize
();
if
(
history
(
h
,
&
ev
,
H_DEL
,
num
)
!=
0
)
return
NULL
;
if
((
she
=
malloc
(
sizeof
(
*
she
)))
==
NULL
)
return
NULL
;
she
->
line
=
ev
.
str
;
she
->
data
=
NULL
;
return
she
;
}
/*
* clear the history list - delete all entries
*/
...
...
@@ -1377,172 +1423,18 @@ history_search_pos(const char *str,
/********************************/
/* completion functions */
/*
* does tilde expansion of strings of type ``~user/foo''
* if ``user'' isn't valid user name or ``txt'' doesn't start
* w/ '~', returns pointer to strdup()ed copy of ``txt''
*
* it's callers's responsibility to free() returned string
*/
char
*
tilde_expand
(
char
*
txt
)
tilde_expand
(
char
*
name
)
{
struct
passwd
*
pass
;
char
*
temp
;
size_t
len
=
0
;
if
(
txt
[
0
]
!=
'~'
)
return
(
strdup
(
txt
));
temp
=
strchr
(
txt
+
1
,
'/'
);
if
(
temp
==
NULL
)
{
temp
=
strdup
(
txt
+
1
);
if
(
temp
==
NULL
)
return
NULL
;
}
else
{
len
=
temp
-
txt
+
1
;
/* text until string after slash */
temp
=
malloc
(
len
);
if
(
temp
==
NULL
)
return
NULL
;
(
void
)
strncpy
(
temp
,
txt
+
1
,
len
-
2
);
temp
[
len
-
2
]
=
'\0'
;
}
pass
=
getpwnam
(
temp
);
free
(
temp
);
/* value no more needed */
if
(
pass
==
NULL
)
return
(
strdup
(
txt
));
/* update pointer txt to point at string immedially following */
/* first slash */
txt
+=
len
;
temp
=
malloc
(
strlen
(
pass
->
pw_dir
)
+
1
+
strlen
(
txt
)
+
1
);
if
(
temp
==
NULL
)
return
NULL
;
(
void
)
sprintf
(
temp
,
"%s/%s"
,
pass
->
pw_dir
,
txt
);
return
(
temp
);
return
fn_tilde_expand
(
name
);
}
/*
* return first found file name starting by the ``text'' or NULL if no
* such file can be found
* value of ``state'' is ignored
*
* it's caller's responsibility to free returned string
*/
char
*
filename_completion_function
(
const
char
*
text
,
int
state
)
filename_completion_function
(
const
char
*
name
,
int
state
)
{
static
DIR
*
dir
=
NULL
;
static
char
*
filename
=
NULL
,
*
dirname
=
NULL
;
static
size_t
filename_len
=
0
;
struct
dirent
*
entry
;
char
*
temp
;
size_t
len
;
if
(
state
==
0
||
dir
==
NULL
)
{
temp
=
strrchr
(
text
,
'/'
);
if
(
temp
)
{
char
*
nptr
;
temp
++
;
nptr
=
realloc
(
filename
,
strlen
(
temp
)
+
1
);
if
(
nptr
==
NULL
)
{
free
(
filename
);
return
NULL
;
}
filename
=
nptr
;
(
void
)
strcpy
(
filename
,
temp
);
len
=
temp
-
text
;
/* including last slash */
nptr
=
realloc
(
dirname
,
len
+
1
);
if
(
nptr
==
NULL
)
{
free
(
filename
);
return
NULL
;
}
dirname
=
nptr
;
(
void
)
strncpy
(
dirname
,
text
,
len
);
dirname
[
len
]
=
'\0'
;
}
else
{
if
(
*
text
==
0
)
filename
=
NULL
;
else
{
filename
=
strdup
(
text
);
if
(
filename
==
NULL
)
return
NULL
;
}
dirname
=
NULL
;
}
/* support for ``~user'' syntax */
if
(
dirname
&&
*
dirname
==
'~'
)
{
char
*
nptr
;
temp
=
tilde_expand
(
dirname
);
if
(
temp
==
NULL
)
return
NULL
;
nptr
=
realloc
(
dirname
,
strlen
(
temp
)
+
1
);
if
(
nptr
==
NULL
)
{
free
(
dirname
);
return
NULL
;
}
dirname
=
nptr
;
(
void
)
strcpy
(
dirname
,
temp
);
/* safe */
free
(
temp
);
/* no longer needed */
}
/* will be used in cycle */
filename_len
=
filename
?
strlen
(
filename
)
:
0
;
if
(
dir
!=
NULL
)
{
(
void
)
closedir
(
dir
);
dir
=
NULL
;
}
dir
=
opendir
(
dirname
?
dirname
:
"."
);
if
(
!
dir
)
return
(
NULL
);
/* cannot open the directory */
}
/* find the match */
while
((
entry
=
readdir
(
dir
))
!=
NULL
)
{
/* skip . and .. */
if
(
entry
->
d_name
[
0
]
==
'.'
&&
(
!
entry
->
d_name
[
1
]
||
(
entry
->
d_name
[
1
]
==
'.'
&&
!
entry
->
d_name
[
2
])))
continue
;
if
(
filename_len
==
0
)
break
;
/* otherwise, get first entry where first */
/* filename_len characters are equal */
if
(
entry
->
d_name
[
0
]
==
filename
[
0
]
/* Some dirents have d_namlen, but it is not portable. */
&&
strlen
(
entry
->
d_name
)
>=
filename_len
&&
strncmp
(
entry
->
d_name
,
filename
,
filename_len
)
==
0
)
break
;
}
if
(
entry
)
{
/* match found */
struct
stat
stbuf
;
/* Some dirents have d_namlen, but it is not portable. */
len
=
strlen
(
entry
->
d_name
)
+
((
dirname
)
?
strlen
(
dirname
)
:
0
)
+
1
+
1
;
temp
=
malloc
(
len
);
if
(
temp
==
NULL
)
return
NULL
;
(
void
)
sprintf
(
temp
,
"%s%s"
,
dirname
?
dirname
:
""
,
entry
->
d_name
);
/* safe */
/* test, if it's directory */
if
(
stat
(
temp
,
&
stbuf
)
==
0
&&
S_ISDIR
(
stbuf
.
st_mode
))
strcat
(
temp
,
"/"
);
/* safe */
}
else
{
(
void
)
closedir
(
dir
);
dir
=
NULL
;
temp
=
NULL
;
}
return
(
temp
);
return
fn_filename_completion_function
(
name
,
state
);
}
/*
* a completion generator for usernames; returns _first_ username
* which starts with supplied text
...
...
@@ -1564,6 +1456,7 @@ username_completion_function(const char *text, int state)
if
(
state
==
0
)
setpwent
();
/* XXXMYSQL: just use non-_r functions for now */
while
((
pwd
=
getpwent
())
&&
text
[
0
]
==
pwd
->
pw_name
[
0
]
&&
strcmp
(
text
,
pwd
->
pw_name
)
==
0
);
...
...
@@ -1575,16 +1468,6 @@ username_completion_function(const char *text, int state)
}
/*
* el-compatible wrapper around rl_complete; needed for key binding
*/
/* ARGSUSED */
static
unsigned
char
_el_rl_complete
(
EditLine
*
el
__attribute__
((
__unused__
)),
int
ch
)
{
return
(
unsigned
char
)
rl_complete
(
0
,
ch
);
}
/*
* el-compatible wrapper to send TSTP on ^Z
*/
...
...
@@ -1596,273 +1479,36 @@ _el_rl_tstp(EditLine *el __attribute__((__unused__)), int ch __attribute__((__un
return
CC_NORM
;
}
/*
* returns list of completions for text given
*/
char
**
completion_matches
(
const
char
*
text
,
CPFunction
*
genfunc
)
{
char
**
match_list
=
NULL
,
*
retstr
,
*
prevstr
;
size_t
match_list_len
,
max_equal
,
which
,
i
;
size_t
matches
;
if
(
h
==
NULL
||
e
==
NULL
)
rl_initialize
();
matches
=
0
;
match_list_len
=
1
;
while
((
retstr
=
(
*
genfunc
)
(
text
,
(
int
)
matches
))
!=
NULL
)
{
/* allow for list terminator here */
if
(
matches
+
3
>=
match_list_len
)
{
char
**
nmatch_list
;
while
(
matches
+
3
>=
match_list_len
)
match_list_len
<<=
1
;
nmatch_list
=
realloc
(
match_list
,
match_list_len
*
sizeof
(
char
*
));
if
(
nmatch_list
==
NULL
)
{
free
(
match_list
);
return
NULL
;
}
match_list
=
nmatch_list
;
}
match_list
[
++
matches
]
=
retstr
;
}
if
(
!
match_list
)
return
NULL
;
/* nothing found */
/* find least denominator and insert it to match_list[0] */
which
=
2
;
prevstr
=
match_list
[
1
];
max_equal
=
strlen
(
prevstr
);
for
(;
which
<=
matches
;
which
++
)
{
for
(
i
=
0
;
i
<
max_equal
&&
prevstr
[
i
]
==
match_list
[
which
][
i
];
i
++
)
continue
;
max_equal
=
i
;
}
retstr
=
malloc
(
max_equal
+
1
);
if
(
retstr
==
NULL
)
{
free
(
match_list
);
return
NULL
;
}
(
void
)
strncpy
(
retstr
,
match_list
[
1
],
max_equal
);
retstr
[
max_equal
]
=
'\0'
;
match_list
[
0
]
=
retstr
;
/* add NULL as last pointer to the array */
match_list
[
matches
+
1
]
=
(
char
*
)
NULL
;
return
(
match_list
);
}
/*
* Sort function for qsort(). Just wrapper around strcasecmp().
*/
static
int
_rl_qsort_string_compare
(
i1
,
i2
)
const
void
*
i1
,
*
i2
;
{
const
char
*
s1
=
((
const
char
*
const
*
)
i1
)[
0
];
const
char
*
s2
=
((
const
char
*
const
*
)
i2
)[
0
];
return
strcasecmp
(
s1
,
s2
);
}
/*
* Display list of strings in columnar format on readline's output stream.
* 'matches' is list of strings, 'len' is number of strings in 'matches',
* 'max' is maximum length of string in 'matches'.
*/
void
rl_display_match_list
(
matches
,
len
,
max
)
char
**
matches
;
int
len
,
max
;
rl_display_match_list
(
char
**
matches
,
int
len
,
int
max
)
{
int
i
,
idx
,
limit
,
count
;
int
screenwidth
=
e
->
el_term
.
t_size
.
h
;
/*
* Find out how many entries can be put on one line, count
* with two spaces between strings.
*/
limit
=
screenwidth
/
(
max
+
2
);
if
(
limit
==
0
)
limit
=
1
;
/* how many lines of output */
count
=
len
/
limit
;
if
(
count
*
limit
<
len
)
count
++
;
/* Sort the items if they are not already sorted. */
qsort
(
&
matches
[
1
],
(
size_t
)(
len
-
1
),
sizeof
(
char
*
),
_rl_qsort_string_compare
);
idx
=
1
;
for
(;
count
>
0
;
count
--
)
{
for
(
i
=
0
;
i
<
limit
&&
matches
[
idx
];
i
++
,
idx
++
)
(
void
)
fprintf
(
e
->
el_outfile
,
"%-*s "
,
max
,
matches
[
idx
]);
(
void
)
fprintf
(
e
->
el_outfile
,
"
\n
"
);
}
fn_display_match_list
(
e
,
matches
,
len
,
max
);
}
/*
* Complete the word at or before point, called by rl_complete()
* 'what_to_do' says what to do with the completion.
* `?' means list the possible completions.
* TAB means do standard completion.
* `*' means insert all of the possible completions.
* `!' means to do standard completion, and list all possible completions if
* there is more than one.
*
* Note: '*' support is not implemented
*/
static
int
_rl_complete_internal
(
int
what_to_do
)
static
const
char
*
/*ARGSUSED*/
_rl_completion_append_character_function
(
const
char
*
dummy
__attribute__
((
__unused__
)))
{
CPFunction
*
complet_func
;
const
LineInfo
*
li
;
char
*
temp
,
**
matches
;
const
char
*
ctemp
;
size_t
len
;
rl_completion_type
=
what_to_do
;
if
(
h
==
NULL
||
e
==
NULL
)
rl_initialize
();
complet_func
=
rl_completion_entry_function
;
if
(
!
complet_func
)
complet_func
=
filename_completion_function
;
/* We now look backwards for the start of a filename/variable word */
li
=
el_line
(
e
);
ctemp
=
(
const
char
*
)
li
->
cursor
;
while
(
ctemp
>
li
->
buffer
&&
!
strchr
(
rl_basic_word_break_characters
,
ctemp
[
-
1
])
&&
(
!
rl_special_prefixes
||
!
strchr
(
rl_special_prefixes
,
ctemp
[
-
1
])
)
)
ctemp
--
;
len
=
li
->
cursor
-
ctemp
;
temp
=
alloca
(
len
+
1
);
(
void
)
strncpy
(
temp
,
ctemp
,
len
);
temp
[
len
]
=
'\0'
;
/* these can be used by function called in completion_matches() */
/* or (*rl_attempted_completion_function)() */
_rl_update_pos
();
if
(
rl_attempted_completion_function
)
{
int
end
=
li
->
cursor
-
li
->
buffer
;
matches
=
(
*
rl_attempted_completion_function
)
(
temp
,
(
int
)
(
end
-
len
),
end
);
}
else
matches
=
0
;
if
(
!
rl_attempted_completion_function
||
!
matches
)
matches
=
completion_matches
(
temp
,
complet_func
);
if
(
matches
)
{
int
i
,
retval
=
CC_REFRESH
;
int
matches_num
,
maxlen
,
match_len
,
match_display
=
1
;
/*
* Only replace the completed string with common part of
* possible matches if there is possible completion.
*/
if
(
matches
[
0
][
0
]
!=
'\0'
)
{
el_deletestr
(
e
,
(
int
)
len
);
el_insertstr
(
e
,
matches
[
0
]);
}
if
(
what_to_do
==
'?'
)
goto
display_matches
;
if
(
matches
[
2
]
==
NULL
&&
strcmp
(
matches
[
0
],
matches
[
1
])
==
0
)
{
/*
* We found exact match. Add a space after
* it, unless we do filename completion and the
* object is a directory.
*/
size_t
alen
=
strlen
(
matches
[
0
]);
if
((
complet_func
!=
filename_completion_function
||
(
alen
>
0
&&
(
matches
[
0
])[
alen
-
1
]
!=
'/'
))
&&
rl_completion_append_character
)
{
char
buf
[
2
];
buf
[
0
]
=
rl_completion_append_character
;
buf
[
1
]
=
'\0'
;
el_insertstr
(
e
,
buf
);
}
}
else
if
(
what_to_do
==
'!'
)
{
display_matches:
/*
* More than one match and requested to list possible
* matches.
*/
for
(
i
=
1
,
maxlen
=
0
;
matches
[
i
];
i
++
)
{
match_len
=
strlen
(
matches
[
i
]);
if
(
match_len
>
maxlen
)
maxlen
=
match_len
;
}
matches_num
=
i
-
1
;
/* newline to get on next line from command line */
(
void
)
fprintf
(
e
->
el_outfile
,
"
\n
"
);
/*
* If there are too many items, ask user for display
* confirmation.
*/
if
(
matches_num
>
rl_completion_query_items
)
{
(
void
)
fprintf
(
e
->
el_outfile
,
"Display all %d possibilities? (y or n) "
,
matches_num
);
(
void
)
fflush
(
e
->
el_outfile
);
if
(
getc
(
stdin
)
!=
'y'
)
match_display
=
0
;
(
void
)
fprintf
(
e
->
el_outfile
,
"
\n
"
);
}
if
(
match_display
)
rl_display_match_list
(
matches
,
matches_num
,
maxlen
);
retval
=
CC_REDISPLAY
;
}
else
if
(
matches
[
0
][
0
])
{
/*
* There was some common match, but the name was
* not complete enough. Next tab will print possible
* completions.
*/
el_beep
(
e
);
}
else
{
/* lcd is not a valid object - further specification */
/* is needed */
el_beep
(
e
);
retval
=
CC_NORM
;
}
/* free elements of array and the array itself */
for
(
i
=
0
;
matches
[
i
];
i
++
)
free
(
matches
[
i
]);
free
(
matches
),
matches
=
NULL
;
return
(
retval
);
}
return
(
CC_NORM
);
static
char
buf
[
2
];
buf
[
0
]
=
rl_completion_append_character
;
buf
[
1
]
=
'\0'
;
return
buf
;
}
/*
* complete word at current point
*/
/* ARGSUSED */
int
/*ARGSUSED*/
rl_complete
(
int
ignore
,
int
invoking_key
)
rl_complete
(
int
ignore
__attribute__
((
__unused__
)),
int
invoking_key
)
{
if
(
h
==
NULL
||
e
==
NULL
)
rl_initialize
();
...
...
@@ -1873,15 +1519,26 @@ rl_complete(int ignore, int invoking_key)
arr
[
1
]
=
'\0'
;
el_insertstr
(
e
,
arr
);
return
(
CC_REFRESH
);
}
else
if
(
e
->
el_state
.
lastcmd
==
el_rl_complete_cmdnum
)
return
_rl_complete_internal
(
'?'
);
else
if
(
_rl_complete_show_all
)
return
_rl_complete_internal
(
'!'
);
else
return
_rl_complete_internal
(
TAB
);
}
/* Just look at how many global variables modify this operation! */
return
fn_complete
(
e
,
(
CPFunction
*
)
rl_completion_entry_function
,
rl_attempted_completion_function
,
rl_basic_word_break_characters
,
rl_special_prefixes
,
_rl_completion_append_character_function
,
rl_completion_query_items
,
&
rl_completion_type
,
&
rl_attempted_completion_over
,
&
rl_point
,
&
rl_end
);
}
/* ARGSUSED */
static
unsigned
char
_el_rl_complete
(
EditLine
*
el
__attribute__
((
__unused__
)),
int
ch
)
{
return
(
unsigned
char
)
rl_complete
(
0
,
ch
);
}
/*
* misc other functions
*/
...
...
@@ -1989,7 +1646,7 @@ int
rl_add_defun
(
const
char
*
name
,
Function
*
fun
,
int
c
)
{
char
dest
[
8
];
if
(
c
>=
sizeof
(
map
)
/
sizeof
(
map
[
0
])
||
c
<
0
)
if
(
(
size_t
)
c
>=
sizeof
(
map
)
/
sizeof
(
map
[
0
])
||
c
<
0
)
return
-
1
;
map
[(
unsigned
char
)
c
]
=
fun
;
el_set
(
e
,
EL_ADDFN
,
name
,
name
,
rl_bind_wrapper
);
...
...
@@ -2007,11 +1664,7 @@ rl_callback_read_char()
if
(
buf
==
NULL
||
count
--
<=
0
)
return
;
#ifdef CTRL2
/* _AIX */
if
(
count
==
0
&&
buf
[
0
]
==
CTRL2
(
'd'
))
#else
if
(
count
==
0
&&
buf
[
0
]
==
CTRL
(
'd'
))
#endif
if
(
count
==
0
&&
buf
[
0
]
==
e
->
el_tty
.
t_c
[
TS_IO
][
C_EOF
])
done
=
1
;
if
(
buf
[
count
]
==
'\n'
||
buf
[
count
]
==
'\r'
)
done
=
2
;
...
...
@@ -2029,14 +1682,12 @@ rl_callback_read_char()
}
void
rl_callback_handler_install
(
const
char
*
prompt
,
V
Function
*
linefunc
)
rl_callback_handler_install
(
const
char
*
prompt
,
VCP
Function
*
linefunc
)
{
if
(
e
==
NULL
)
{
rl_initialize
();
}
if
(
rl_prompt
)
free
(
rl_prompt
);
rl_prompt
=
prompt
?
strdup
(
strchr
(
prompt
,
*
prompt
))
:
NULL
;
(
void
)
rl_set_prompt
(
prompt
);
rl_linefunc
=
linefunc
;
el_set
(
e
,
EL_UNBUFFERED
,
1
);
}
...
...
@@ -2045,17 +1696,14 @@ void
rl_callback_handler_remove
(
void
)
{
el_set
(
e
,
EL_UNBUFFERED
,
0
);
rl_linefunc
=
NULL
;
}
void
rl_redisplay
(
void
)
{
char
a
[
2
];
#ifdef CTRL2
/* _AIX */
a
[
0
]
=
CTRL2
(
'r'
);
#else
a
[
0
]
=
CTRL
(
'r'
);
#endif
a
[
0
]
=
e
->
el_tty
.
t_c
[
TS_IO
][
C_REPRINT
];
a
[
1
]
=
'\0'
;
el_push
(
e
,
a
);
}
...
...
@@ -2079,7 +1727,7 @@ rl_prep_terminal(int meta_flag)
}
void
rl_deprep_terminal
()
rl_deprep_terminal
(
void
)
{
el_set
(
e
,
EL_PREP_TERM
,
0
);
}
...
...
@@ -2104,6 +1752,16 @@ rl_parse_and_bind(const char *line)
return
(
argc
?
1
:
0
);
}
int
rl_variable_bind
(
const
char
*
var
,
const
char
*
value
)
{
/*
* The proper return value is undocument, but this is what the
* readline source seems to do.
*/
return
((
el_set
(
e
,
EL_BIND
,
""
,
var
,
value
)
==
-
1
)
?
1
:
0
);
}
void
rl_stuff_char
(
int
c
)
{
...
...
@@ -2119,7 +1777,7 @@ _rl_event_read_char(EditLine *el, char *cp)
{
int
n
,
num_read
=
0
;
*
cp
=
0
;
*
cp
=
'\0'
;
while
(
rl_event_hook
)
{
(
*
rl_event_hook
)();
...
...
@@ -2164,3 +1822,142 @@ _rl_update_pos(void)
rl_point
=
li
->
cursor
-
li
->
buffer
;
rl_end
=
li
->
lastchar
-
li
->
buffer
;
}
void
rl_get_screen_size
(
int
*
rows
,
int
*
cols
)
{
if
(
rows
)
el_get
(
e
,
EL_GETTC
,
"li"
,
rows
);
if
(
cols
)
el_get
(
e
,
EL_GETTC
,
"co"
,
cols
);
}
void
rl_set_screen_size
(
int
rows
,
int
cols
)
{
char
buf
[
64
];
(
void
)
snprintf
(
buf
,
sizeof
(
buf
),
"%d"
,
rows
);
el_set
(
e
,
EL_SETTC
,
"li"
,
buf
);
(
void
)
snprintf
(
buf
,
sizeof
(
buf
),
"%d"
,
cols
);
el_set
(
e
,
EL_SETTC
,
"co"
,
buf
);
}
char
**
rl_completion_matches
(
const
char
*
str
,
rl_compentry_func_t
*
fun
)
{
size_t
len
,
max
,
i
,
j
,
min
;
char
**
list
,
*
match
,
*
a
,
*
b
;
len
=
1
;
max
=
10
;
if
((
list
=
malloc
(
max
*
sizeof
(
*
list
)))
==
NULL
)
return
NULL
;
while
((
match
=
(
*
fun
)(
str
,
(
int
)(
len
-
1
)))
!=
NULL
)
{
if
(
len
==
max
)
{
char
**
nl
;
max
+=
10
;
if
((
nl
=
realloc
(
list
,
max
*
sizeof
(
*
nl
)))
==
NULL
)
goto
out
;
list
=
nl
;
}
list
[
len
++
]
=
match
;
}
if
(
len
==
1
)
goto
out
;
list
[
len
]
=
NULL
;
if
(
len
==
2
)
{
if
((
list
[
0
]
=
strdup
(
list
[
1
]))
==
NULL
)
goto
out
;
return
list
;
}
qsort
(
&
list
[
1
],
len
-
1
,
sizeof
(
*
list
),
(
int
(
*
)(
const
void
*
,
const
void
*
))
strcmp
);
min
=
SIZE_T_MAX
;
for
(
i
=
1
,
a
=
list
[
i
];
i
<
len
-
1
;
i
++
,
a
=
b
)
{
b
=
list
[
i
+
1
];
for
(
j
=
0
;
a
[
j
]
&&
a
[
j
]
==
b
[
j
];
j
++
)
continue
;
if
(
min
>
j
)
min
=
j
;
}
if
(
min
==
0
&&
*
str
)
{
if
((
list
[
0
]
=
strdup
(
str
))
==
NULL
)
goto
out
;
}
else
{
if
((
list
[
0
]
=
malloc
(
min
+
1
))
==
NULL
)
goto
out
;
(
void
)
memcpy
(
list
[
0
],
list
[
1
],
min
);
list
[
0
][
min
]
=
'\0'
;
}
return
list
;
out:
free
(
list
);
return
NULL
;
}
char
*
rl_filename_completion_function
(
const
char
*
text
,
int
state
)
{
return
fn_filename_completion_function
(
text
,
state
);
}
void
rl_forced_update_display
(
void
)
{
el_set
(
e
,
EL_REFRESH
);
}
int
_rl_abort_internal
(
void
)
{
el_beep
(
e
);
longjmp
(
topbuf
,
1
);
/*NOTREACHED*/
}
int
_rl_qsort_string_compare
(
char
**
s1
,
char
**
s2
)
{
return
strcoll
(
*
s1
,
*
s2
);
}
int
/*ARGSUSED*/
rl_kill_text
(
int
from
,
int
to
)
{
return
0
;
}
Keymap
rl_make_bare_keymap
(
void
)
{
return
NULL
;
}
Keymap
rl_get_keymap
(
void
)
{
return
NULL
;
}
void
/*ARGSUSED*/
rl_set_keymap
(
Keymap
k
)
{
}
int
/*ARGSUSED*/
rl_generic_bind
(
int
type
,
const
char
*
keyseq
,
const
char
*
data
,
Keymap
k
)
{
return
0
;
}
int
/*ARGSUSED*/
rl_bind_key_in_map
(
int
key
,
Function
*
fun
,
Keymap
k
)
{
return
0
;
}
cmd-line-utils/libedit/readline/readline.h
View file @
fab053cc
/* $NetBSD: readline.h,v 1.
12 2004/09/08 18:15:37
christos Exp $ */
/* $NetBSD: readline.h,v 1.
24 2009/02/05 19:15:26
christos Exp $ */
/*-
* Copyright (c) 1997 The NetBSD Foundation, Inc.
...
...
@@ -15,13 +15,6 @@
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. All advertising materials mentioning features or use of this software
* must display the following acknowledgement:
* This product includes software developed by the NetBSD
* Foundation, Inc. and its contributors.
* 4. Neither the name of The NetBSD Foundation nor the names of its
* contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
* ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
...
...
@@ -45,14 +38,14 @@
/* typedefs */
typedef
int
Function
(
const
char
*
,
int
);
typedef
void
VFunction
(
void
);
typedef
void
VCPFunction
(
char
*
);
typedef
char
*
CPFunction
(
const
char
*
,
int
);
typedef
char
**
CPPFunction
(
const
char
*
,
int
,
int
);
typedef
void
*
histdata_t
;
typedef
char
*
rl_compentry_func_t
(
const
char
*
,
int
);
typedef
struct
_hist_entry
{
const
char
*
line
;
histdata_t
*
data
;
const
char
*
data
;
}
HIST_ENTRY
;
typedef
struct
_keymap_entry
{
...
...
@@ -73,7 +66,7 @@ typedef KEYMAP_ENTRY *Keymap;
#ifndef CTRL
#include <sys/ioctl.h>
#if
defined(__GLIBC__) || defined(__MWERKS
__)
#if
!defined(__sun__) && !defined(__hpux
__)
#include <sys/ttydefaults.h>
#endif
#ifndef CTRL
...
...
@@ -102,8 +95,9 @@ extern int max_input_history;
extern
char
*
rl_basic_word_break_characters
;
extern
char
*
rl_completer_word_break_characters
;
extern
char
*
rl_completer_quote_characters
;
extern
CPFunction
*
rl_completion_entry_function
;
extern
Function
*
rl_completion_entry_function
;
extern
CPPFunction
*
rl_attempted_completion_function
;
extern
int
rl_attempted_completion_over
;
extern
int
rl_completion_type
;
extern
int
rl_completion_query_items
;
extern
char
*
rl_special_prefixes
;
...
...
@@ -122,11 +116,13 @@ extern KEYMAP_ENTRY_ARRAY emacs_standard_keymap,
emacs_ctlx_keymap
;
extern
int
rl_filename_completion_desired
;
extern
int
rl_ignore_completion_duplicates
;
extern
Function
*
rl_getc_function
;
extern
int
(
*
rl_getc_function
)(
FILE
*
)
;
extern
VFunction
*
rl_redisplay_function
;
extern
VFunction
*
rl_completion_display_matches_hook
;
extern
VFunction
*
rl_prep_term_function
;
extern
VFunction
*
rl_deprep_term_function
;
extern
int
readline_echoing_p
;
extern
int
_rl_print_completions_horizontally
;
/* supported functions */
char
*
readline
(
const
char
*
);
...
...
@@ -141,6 +137,7 @@ int history_is_stifled(void);
int
where_history
(
void
);
HIST_ENTRY
*
current_history
(
void
);
HIST_ENTRY
*
history_get
(
int
);
HIST_ENTRY
*
remove_history
(
int
);
int
history_total_bytes
(
void
);
int
history_set_pos
(
int
);
HIST_ENTRY
*
previous_history
(
void
);
...
...
@@ -168,7 +165,7 @@ void rl_reset_terminal(const char *);
int
rl_bind_key
(
int
,
int
(
*
)(
int
,
int
));
int
rl_newline
(
int
,
int
);
void
rl_callback_read_char
(
void
);
void
rl_callback_handler_install
(
const
char
*
,
VFunction
*
);
void
rl_callback_handler_install
(
const
char
*
,
V
CP
Function
*
);
void
rl_callback_handler_remove
(
void
);
void
rl_redisplay
(
void
);
int
rl_get_previous_history
(
int
,
int
);
...
...
@@ -176,13 +173,24 @@ void rl_prep_terminal(int);
void
rl_deprep_terminal
(
void
);
int
rl_read_init_file
(
const
char
*
);
int
rl_parse_and_bind
(
const
char
*
);
int
rl_variable_bind
(
const
char
*
,
const
char
*
);
void
rl_stuff_char
(
int
);
int
rl_add_defun
(
const
char
*
,
Function
*
,
int
);
void
rl_get_screen_size
(
int
*
,
int
*
);
void
rl_set_screen_size
(
int
,
int
);
char
*
rl_filename_completion_function
(
const
char
*
,
int
);
int
_rl_abort_internal
(
void
);
int
_rl_qsort_string_compare
(
char
**
,
char
**
);
char
**
rl_completion_matches
(
const
char
*
,
rl_compentry_func_t
*
);
void
rl_forced_update_display
(
void
);
int
rl_set_prompt
(
const
char
*
);
/*
* The following are not implemented
*/
int
rl_kill_text
(
int
,
int
);
Keymap
rl_get_keymap
(
void
);
void
rl_set_keymap
(
Keymap
);
Keymap
rl_make_bare_keymap
(
void
);
int
rl_generic_bind
(
int
,
const
char
*
,
const
char
*
,
Keymap
);
int
rl_bind_key_in_map
(
int
,
Function
*
,
Keymap
);
...
...
cmd-line-utils/libedit/refresh.c
View file @
fab053cc
/* $NetBSD: refresh.c,v 1.2
6 2003/08/07 16:44:33 agc
Exp $ */
/* $NetBSD: refresh.c,v 1.2
8 2008/09/10 15:45:37 christos
Exp $ */
/*-
* Copyright (c) 1992, 1993
...
...
@@ -32,7 +32,13 @@
* SUCH DAMAGE.
*/
#include <config.h>
#include "config.h"
#if !defined(lint) && !defined(SCCSID)
#if 0
static char sccsid[] = "@(#)refresh.c 8.1 (Berkeley) 6/4/93";
#else
#endif
#endif
/* not lint && not SCCSID */
/*
* refresh.c: Lower level screen refreshing functions
...
...
@@ -49,6 +55,7 @@ private void re_update_line(EditLine *, char *, char *, int);
private
void
re_insert
(
EditLine
*
,
char
*
,
int
,
int
,
char
*
,
int
);
private
void
re_delete
(
EditLine
*
,
char
*
,
int
,
int
,
int
);
private
void
re_fastputc
(
EditLine
*
,
int
);
private
void
re_clear_eol
(
EditLine
*
,
int
,
int
,
int
);
private
void
re__strncopy
(
char
*
,
char
*
,
size_t
);
private
void
re__copy_and_pad
(
char
*
,
const
char
*
,
size_t
);
...
...
@@ -315,9 +322,9 @@ re_goto_bottom(EditLine *el)
{
term_move_to_line
(
el
,
el
->
el_refresh
.
r_oldcv
);
term__putc
(
'\n'
);
term__putc
(
el
,
'\n'
);
re_clear_display
(
el
);
term__flush
();
term__flush
(
el
);
}
...
...
@@ -340,7 +347,7 @@ re_insert(EditLine *el __attribute__((__unused__)),
ELRE_DEBUG
(
1
,
(
__F
,
"re_insert() starting: %d at %d max %d, d ==
\"
%s
\"\n
"
,
num
,
dat
,
dlen
,
d
));
ELRE_DEBUG
(
1
,
(
__F
,
"s ==
\"
%s
\"
n"
,
s
));
ELRE_DEBUG
(
1
,
(
__F
,
"s ==
\"
%s
\"
\
n
"
,
s
));
/* open up the space for num chars */
if
(
num
>
0
)
{
...
...
@@ -353,7 +360,7 @@ re_insert(EditLine *el __attribute__((__unused__)),
ELRE_DEBUG
(
1
,
(
__F
,
"re_insert() after insert: %d at %d max %d, d ==
\"
%s
\"\n
"
,
num
,
dat
,
dlen
,
d
));
ELRE_DEBUG
(
1
,
(
__F
,
"s ==
\"
%s
\"
n"
,
s
));
ELRE_DEBUG
(
1
,
(
__F
,
"s ==
\"
%s
\"
\
n
"
,
s
));
/* copy the characters */
for
(
a
=
d
+
dat
;
(
a
<
d
+
dlen
)
&&
(
num
>
0
);
num
--
)
...
...
@@ -362,7 +369,7 @@ re_insert(EditLine *el __attribute__((__unused__)),
ELRE_DEBUG
(
1
,
(
__F
,
"re_insert() after copy: %d at %d max %d, %s ==
\"
%s
\"\n
"
,
num
,
dat
,
dlen
,
d
,
s
));
ELRE_DEBUG
(
1
,
(
__F
,
"s ==
\"
%s
\"
n"
,
s
));
ELRE_DEBUG
(
1
,
(
__F
,
"s ==
\"
%s
\"
\
n
"
,
s
));
}
...
...
@@ -411,6 +418,32 @@ re__strncopy(char *a, char *b, size_t n)
*
a
++
=
*
b
++
;
}
/* re_clear_eol():
* Find the number of characters we need to clear till the end of line
* in order to make sure that we have cleared the previous contents of
* the line. fx and sx is the number of characters inserted or deleted
* int the first or second diff, diff is the difference between the
* number of characters between the new and old line.
*/
private
void
re_clear_eol
(
EditLine
*
el
,
int
fx
,
int
sx
,
int
diff
)
{
ELRE_DEBUG
(
1
,
(
__F
,
"re_clear_eol sx %d, fx %d, diff %d
\n
"
,
sx
,
fx
,
diff
));
if
(
fx
<
0
)
fx
=
-
fx
;
if
(
sx
<
0
)
sx
=
-
sx
;
if
(
fx
>
diff
)
diff
=
fx
;
if
(
sx
>
diff
)
diff
=
sx
;
ELRE_DEBUG
(
1
,
(
__F
,
"re_clear_eol %d
\n
"
,
diff
));
term_clear_EOL
(
el
,
diff
);
}
/*****************************************************************
re_update_line() is based on finding the middle difference of each line
...
...
@@ -626,7 +659,7 @@ re_update_line(EditLine *el, char *old, char *new, int i)
fx
=
(
nsb
-
nfd
)
-
(
osb
-
ofd
);
sx
=
(
nls
-
nse
)
-
(
ols
-
ose
);
ELRE_DEBUG
(
1
,
(
__F
,
"
\n
"
));
ELRE_DEBUG
(
1
,
(
__F
,
"
fx %d, sx %d
\n
"
,
fx
,
sx
));
ELRE_DEBUG
(
1
,
(
__F
,
"ofd %d, osb %d, ose %d, ols %d, oe %d
\n
"
,
ofd
-
old
,
osb
-
old
,
ose
-
old
,
ols
-
old
,
oe
-
old
));
ELRE_DEBUG
(
1
,
(
__F
,
"nfd %d, nsb %d, nse %d, nls %d, ne %d
\n
"
,
...
...
@@ -775,9 +808,7 @@ re_update_line(EditLine *el, char *old, char *new, int i)
* write (nsb-nfd) chars of new starting at nfd
*/
term_overwrite
(
el
,
nfd
,
(
nsb
-
nfd
));
ELRE_DEBUG
(
1
,
(
__F
,
"cleareol %d
\n
"
,
(
oe
-
old
)
-
(
ne
-
new
)));
term_clear_EOL
(
el
,
(
oe
-
old
)
-
(
ne
-
new
));
re_clear_eol
(
el
,
fx
,
sx
,
(
oe
-
old
)
-
(
ne
-
new
));
/*
* Done
*/
...
...
@@ -818,10 +849,7 @@ re_update_line(EditLine *el, char *old, char *new, int i)
ELRE_DEBUG
(
1
,
(
__F
,
"but with nothing left to save
\r\n
"
));
term_overwrite
(
el
,
nse
,
(
nls
-
nse
));
ELRE_DEBUG
(
1
,
(
__F
,
"cleareol %d
\n
"
,
(
oe
-
old
)
-
(
ne
-
new
)));
if
((
oe
-
old
)
-
(
ne
-
new
)
!=
0
)
term_clear_EOL
(
el
,
(
oe
-
old
)
-
(
ne
-
new
));
re_clear_eol
(
el
,
fx
,
sx
,
(
oe
-
old
)
-
(
ne
-
new
));
}
}
/*
...
...
@@ -982,7 +1010,7 @@ re_refresh_cursor(EditLine *el)
/* now go there */
term_move_to_line
(
el
,
v
);
term_move_to_char
(
el
,
h
);
term__flush
();
term__flush
(
el
);
}
...
...
@@ -993,7 +1021,7 @@ private void
re_fastputc
(
EditLine
*
el
,
int
c
)
{
term__putc
(
c
);
term__putc
(
el
,
c
);
el
->
el_display
[
el
->
el_cursor
.
v
][
el
->
el_cursor
.
h
++
]
=
c
;
if
(
el
->
el_cursor
.
h
>=
el
->
el_term
.
t_size
.
h
)
{
/* if we must overflow */
...
...
@@ -1020,12 +1048,12 @@ re_fastputc(EditLine *el, int c)
}
if
(
EL_HAS_AUTO_MARGINS
)
{
if
(
EL_HAS_MAGIC_MARGINS
)
{
term__putc
(
' '
);
term__putc
(
'\b'
);
term__putc
(
el
,
' '
);
term__putc
(
el
,
'\b'
);
}
}
else
{
term__putc
(
'\r'
);
term__putc
(
'\n'
);
term__putc
(
el
,
'\r'
);
term__putc
(
el
,
'\n'
);
}
}
}
...
...
@@ -1065,7 +1093,7 @@ re_fastaddc(EditLine *el)
re_fastputc
(
el
,
(
int
)(((((
unsigned
int
)
c
)
>>
3
)
&
7
)
+
'0'
));
re_fastputc
(
el
,
(
c
&
7
)
+
'0'
);
}
term__flush
();
term__flush
(
el
);
}
...
...
@@ -1104,7 +1132,7 @@ re_clear_lines(EditLine *el)
}
else
{
term_move_to_line
(
el
,
el
->
el_refresh
.
r_oldcv
);
/* go to last line */
term__putc
(
'\r'
);
/* go to BOL */
term__putc
(
'\n'
);
/* go to new line */
term__putc
(
el
,
'\r'
);
/* go to BOL */
term__putc
(
el
,
'\n'
);
/* go to new line */
}
}
cmd-line-utils/libedit/search.c
View file @
fab053cc
...
...
@@ -32,12 +32,17 @@
* SUCH DAMAGE.
*/
#include <config.h>
#include "config.h"
#if !defined(lint) && !defined(SCCSID)
#if 0
static char sccsid[] = "@(#)search.c 8.1 (Berkeley) 6/4/93";
#else
#endif
#endif
/* not lint && not SCCSID */
/*
* search.c: History and character search functions
*/
#include <sys/types.h>
#include <stdlib.h>
#if defined(REGEX)
#include <regex.h>
...
...
cmd-line-utils/libedit/sig.c
View file @
fab053cc
/* $NetBSD: sig.c,v 1.1
1 2003/08/07 16:44:33 agc
Exp $ */
/* $NetBSD: sig.c,v 1.1
2 2008/09/10 15:45:37 christos
Exp $ */
/*-
* Copyright (c) 1992, 1993
...
...
@@ -32,7 +32,13 @@
* SUCH DAMAGE.
*/
#include <config.h>
#include "config.h"
#if !defined(lint) && !defined(SCCSID)
#if 0
static char sccsid[] = "@(#)sig.c 8.1 (Berkeley) 6/4/93";
#else
#endif
#endif
/* not lint && not SCCSID */
/*
* sig.c: Signal handling stuff.
...
...
@@ -51,15 +57,15 @@ private const int sighdl[] = {
-
1
};
private
void
sig_handler
(
int
);
private
void
el_
sig_handler
(
int
);
/* sig_handler():
/*
el_
sig_handler():
* This is the handler called for all signals
* XXX: we cannot pass any data so we just store the old editline
* state in a private variable
*/
private
void
sig_handler
(
int
signo
)
el_
sig_handler
(
int
signo
)
{
int
i
;
sigset_t
nset
,
oset
;
...
...
@@ -73,7 +79,7 @@ sig_handler(int signo)
tty_rawmode
(
sel
);
if
(
ed_redisplay
(
sel
,
0
)
==
CC_REFRESH
)
re_refresh
(
sel
);
term__flush
();
term__flush
(
sel
);
break
;
case
SIGWINCH
:
...
...
@@ -154,7 +160,7 @@ sig_set(EditLine *el)
for
(
i
=
0
;
sighdl
[
i
]
!=
-
1
;
i
++
)
{
el_signalhandler_t
s
;
/* This could happen if we get interrupted */
if
((
s
=
signal
(
sighdl
[
i
],
sig_handler
))
!=
sig_handler
)
if
((
s
=
signal
(
sighdl
[
i
],
el_sig_handler
))
!=
el_
sig_handler
)
el
->
el_signal
[
i
]
=
s
;
}
sel
=
el
;
...
...
cmd-line-utils/libedit/sig.h
View file @
fab053cc
/* $NetBSD: sig.h,v 1.
5 2003/08/07 16:44:33 agc
Exp $ */
/* $NetBSD: sig.h,v 1.
6 2008/07/12 15:27:14 christos
Exp $ */
/*-
* Copyright (c) 1992, 1993
...
...
@@ -51,7 +51,6 @@
#define ALLSIGS \
_DO(SIGINT) \
_DO(SIGTSTP) \
_DO(SIGSTOP) \
_DO(SIGQUIT) \
_DO(SIGHUP) \
_DO(SIGTERM) \
...
...
cmd-line-utils/libedit/strlcpy.c
deleted
100644 → 0
View file @
6c6fc097
/* $NetBSD: strlcpy.c,v 1.14 2003/10/27 00:12:42 lukem Exp $ */
/* $OpenBSD: strlcpy.c,v 1.7 2003/04/12 21:56:39 millert Exp $ */
/*
* Copyright (c) 1998 Todd C. Miller <Todd.Miller@courtesan.com>
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND TODD C. MILLER DISCLAIMS ALL
* WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL TODD C. MILLER BE LIABLE
* FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
* OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
* CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
#include <config.h>
#include <sys/types.h>
#include <assert.h>
#include <string.h>
#ifdef _LIBC
# ifdef __weak_alias
__weak_alias
(
strlcpy
,
_strlcpy
)
# endif
#endif
#if !HAVE_STRLCPY
/*
* Copy src to string dst of size siz. At most siz-1 characters
* will be copied. Always NUL terminates (unless siz == 0).
* Returns strlen(src); if retval >= siz, truncation occurred.
*/
size_t
#ifdef _LIBC
_strlcpy
(
dst
,
src
,
siz
)
#else
strlcpy
(
dst
,
src
,
siz
)
#endif
char
*
dst
;
const
char
*
src
;
size_t
siz
;
{
char
*
d
=
dst
;
const
char
*
s
=
src
;
size_t
n
=
siz
;
_DIAGASSERT
(
dst
!=
NULL
);
_DIAGASSERT
(
src
!=
NULL
);
/* Copy as many bytes as will fit */
if
(
n
!=
0
&&
--
n
!=
0
)
{
do
{
if
((
*
d
++
=
*
s
++
)
==
0
)
break
;
}
while
(
--
n
!=
0
);
}
/* Not enough room in dst, add NUL and traverse rest of src */
if
(
n
==
0
)
{
if
(
siz
!=
0
)
*
d
=
'\0'
;
/* NUL-terminate dst */
while
(
*
s
++
)
;
}
return
(
s
-
src
-
1
);
/* count does not include NUL */
}
#endif
cmd-line-utils/libedit/strlcpy.h
deleted
100644 → 0
View file @
6c6fc097
size_t
strlcpy
(
char
*
dst
,
const
char
*
src
,
size_t
size
);
size_t
strlcat
(
char
*
dst
,
const
char
*
src
,
size_t
size
);
cmd-line-utils/libedit/sys.h
View file @
fab053cc
...
...
@@ -48,14 +48,14 @@
# define __attribute__(A)
#endif
#ifndef __P
# define __P(x) x
#endif
#ifndef _DIAGASSERT
# define _DIAGASSERT(x)
#endif
#ifndef SIZE_T_MAX
# define SIZE_T_MAX UINT_MAX
#endif
#ifndef __BEGIN_DECLS
# ifdef __cplusplus
# define __BEGIN_DECLS extern "C" {
...
...
@@ -113,6 +113,25 @@ char *fgetln(FILE *fp, size_t *len);
#define REGEX
/* Use POSIX.2 regular expression functions */
#undef REGEXP
/* Use UNIX V8 regular expression functions */
#ifdef __SunOS
extern
int
tgetent
(
char
*
,
const
char
*
);
extern
int
tgetflag
(
char
*
);
extern
int
tgetnum
(
char
*
);
extern
int
tputs
(
const
char
*
,
int
,
int
(
*
)(
int
));
extern
char
*
tgoto
(
const
char
*
,
int
,
int
);
extern
char
*
tgetstr
(
char
*
,
char
**
);
#endif
/* XXXMYSQL: Bug#10218 Command line recall rolls into segfault */
#if !HAVE_DECL_TGOTO
/*
'tgoto' is not declared in the system header files, this causes
problems on 64-bit systems. The function returns a 64 bit pointer
but caller see it as "int" and it's thus truncated to 32-bit
*/
extern
char
*
tgoto
(
const
char
*
,
int
,
int
);
#endif
#ifdef notdef
# undef REGEX
# undef REGEXP
...
...
cmd-line-utils/libedit/term.c
View file @
fab053cc
/* $NetBSD: term.c,v 1.4
0 2004/05/22 23:21:28 christos
Exp $ */
/* $NetBSD: term.c,v 1.4
8 2009/02/06 20:08:13 sketch
Exp $ */
/*-
* Copyright (c) 1992, 1993
...
...
@@ -32,7 +32,13 @@
* SUCH DAMAGE.
*/
#include <config.h>
#include "config.h"
#if !defined(lint) && !defined(SCCSID)
#if 0
static char sccsid[] = "@(#)term.c 8.2 (Berkeley) 4/30/95";
#else
#endif
#endif
/* not lint && not SCCSID */
/*
* term.c: Editor/termcap-curses interface
...
...
@@ -44,21 +50,26 @@
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#ifdef HAVE_TERMCAP_H
#include <termcap.h>
#endif
#ifdef HAVE_CURSES_H
# include <curses.h>
#elif HAVE_NCURSES_H
# include <ncurses.h>
#include <curses.h>
#endif
#ifdef HAVE_NCURSES_H
#include <ncurses.h>
#endif
/* Solaris's term.h does horrid things. */
#if (defined(HAVE_TERM_H) && !defined(_
SUN
OS))
#
include <term.h>
#if (defined(HAVE_TERM_H) && !defined(_
_Sun
OS))
#include <term.h>
#endif
#include <sys/types.h>
#include <sys/ioctl.h>
#ifdef _REENTRANT
#include <pthread.h>
#endif
#include "el.h"
/*
...
...
@@ -263,9 +274,13 @@ private int term_alloc_display(EditLine *);
private
void
term_alloc
(
EditLine
*
,
const
struct
termcapstr
*
,
const
char
*
);
private
void
term_init_arrow
(
EditLine
*
);
private
void
term_reset_arrow
(
EditLine
*
);
private
int
term_putc
(
int
);
private
void
term_tputs
(
EditLine
*
,
const
char
*
,
int
);
private
FILE
*
term_outfile
=
NULL
;
/* XXX: How do we fix that? */
#ifdef _REENTRANT
private
pthread_mutex_t
term_mutex
=
PTHREAD_MUTEX_INITIALIZER
;
#endif
private
FILE
*
term_outfile
=
NULL
;
/* term_setflags():
...
...
@@ -313,7 +328,6 @@ term_setflags(EditLine *el)
#endif
/* DEBUG_SCREEN */
}
/* term_init():
* Initialize the terminal stuff
*/
...
...
@@ -339,7 +353,6 @@ term_init(EditLine *el)
if
(
el
->
el_term
.
t_val
==
NULL
)
return
(
-
1
);
(
void
)
memset
(
el
->
el_term
.
t_val
,
0
,
T_val
*
sizeof
(
int
));
term_outfile
=
el
->
el_outfile
;
(
void
)
term_set
(
el
,
NULL
);
term_init_arrow
(
el
);
return
(
0
);
...
...
@@ -390,7 +403,8 @@ term_alloc(EditLine *el, const struct termcapstr *t, const char *cap)
* New string is shorter; no need to allocate space
*/
if
(
clen
<=
tlen
)
{
(
void
)
strcpy
(
*
str
,
cap
);
/* XXX strcpy is safe */
if
(
*
str
)
(
void
)
strcpy
(
*
str
,
cap
);
/* XXX strcpy is safe */
return
;
}
/*
...
...
@@ -464,8 +478,12 @@ term_alloc_display(EditLine *el)
return
(
-
1
);
for
(
i
=
0
;
i
<
c
->
v
;
i
++
)
{
b
[
i
]
=
(
char
*
)
el_malloc
((
size_t
)
(
sizeof
(
char
)
*
(
c
->
h
+
1
)));
if
(
b
[
i
]
==
NULL
)
if
(
b
[
i
]
==
NULL
)
{
while
(
--
i
>=
0
)
el_free
((
ptr_t
)
b
[
i
]);
el_free
((
ptr_t
)
b
);
return
(
-
1
);
}
}
b
[
c
->
v
]
=
NULL
;
el
->
el_display
=
b
;
...
...
@@ -475,8 +493,12 @@ term_alloc_display(EditLine *el)
return
(
-
1
);
for
(
i
=
0
;
i
<
c
->
v
;
i
++
)
{
b
[
i
]
=
(
char
*
)
el_malloc
((
size_t
)
(
sizeof
(
char
)
*
(
c
->
h
+
1
)));
if
(
b
[
i
]
==
NULL
)
if
(
b
[
i
]
==
NULL
)
{
while
(
--
i
>=
0
)
el_free
((
ptr_t
)
b
[
i
]);
el_free
((
ptr_t
)
b
);
return
(
-
1
);
}
}
b
[
c
->
v
]
=
NULL
;
el
->
el_vdisplay
=
b
;
...
...
@@ -542,12 +564,12 @@ term_move_to_line(EditLine *el, int where)
del
--
;
}
else
{
if
((
del
>
1
)
&&
GoodStr
(
T_DO
))
{
(
void
)
tputs
(
tgoto
(
Str
(
T_DO
),
del
,
del
)
,
del
,
term__putc
);
term_tputs
(
el
,
tgoto
(
Str
(
T_DO
),
del
,
del
),
del
);
del
=
0
;
}
else
{
for
(;
del
>
0
;
del
--
)
term__putc
(
'\n'
);
term__putc
(
el
,
'\n'
);
/* because the \n will become \r\n */
el
->
el_cursor
.
h
=
0
;
}
...
...
@@ -555,12 +577,11 @@ term_move_to_line(EditLine *el, int where)
}
}
else
{
/* del < 0 */
if
(
GoodStr
(
T_UP
)
&&
(
-
del
>
1
||
!
GoodStr
(
T_up
)))
(
void
)
tputs
(
tgoto
(
Str
(
T_UP
),
-
del
,
-
del
),
-
del
,
term__putc
);
term_tputs
(
el
,
tgoto
(
Str
(
T_UP
),
-
del
,
-
del
),
-
del
);
else
{
if
(
GoodStr
(
T_up
))
for
(;
del
<
0
;
del
++
)
(
void
)
tputs
(
Str
(
T_up
),
1
,
term__putc
);
term_tputs
(
el
,
Str
(
T_up
),
1
);
}
}
el
->
el_cursor
.
v
=
where
;
/* now where is here */
...
...
@@ -587,7 +608,7 @@ mc_again:
return
;
}
if
(
!
where
)
{
/* if where is first column */
term__putc
(
'\r'
);
/* do a CR */
term__putc
(
el
,
'\r'
);
/* do a CR */
el
->
el_cursor
.
h
=
0
;
return
;
}
...
...
@@ -595,12 +616,11 @@ mc_again:
if
((
del
<
-
4
||
del
>
4
)
&&
GoodStr
(
T_ch
))
/* go there directly */
(
void
)
tputs
(
tgoto
(
Str
(
T_ch
),
where
,
where
),
where
,
term__putc
);
term_tputs
(
el
,
tgoto
(
Str
(
T_ch
),
where
,
where
),
where
);
else
{
if
(
del
>
0
)
{
/* moving forward */
if
((
del
>
4
)
&&
GoodStr
(
T_RI
))
(
void
)
tputs
(
tgoto
(
Str
(
T_RI
),
del
,
del
),
del
,
term__putc
);
term_tputs
(
el
,
tgoto
(
Str
(
T_RI
),
del
,
del
),
del
);
else
{
/* if I can do tabs, use them */
if
(
EL_CAN_TAB
)
{
...
...
@@ -611,7 +631,7 @@ mc_again:
(
el
->
el_cursor
.
h
&
0370
);
i
<
(
where
&
0370
);
i
+=
8
)
term__putc
(
'\t'
);
term__putc
(
el
,
'\t'
);
/* then tab over */
el
->
el_cursor
.
h
=
where
&
0370
;
}
...
...
@@ -631,8 +651,8 @@ mc_again:
}
}
else
{
/* del < 0 := moving backward */
if
((
-
del
>
4
)
&&
GoodStr
(
T_LE
))
(
void
)
tputs
(
tgoto
(
Str
(
T_LE
),
-
del
,
-
del
),
-
del
,
term__putc
);
term_tputs
(
el
,
tgoto
(
Str
(
T_LE
),
-
del
,
-
del
),
-
del
);
else
{
/* can't go directly there */
/*
* if the "cost" is greater than the "cost"
...
...
@@ -643,12 +663,12 @@ mc_again:
(((
unsigned
int
)
where
>>
3
)
+
(
where
&
07
)))
:
(
-
del
>
where
))
{
term__putc
(
'\r'
);
/* do a CR */
term__putc
(
el
,
'\r'
);
/* do a CR */
el
->
el_cursor
.
h
=
0
;
goto
mc_again
;
/* and try again */
}
for
(
i
=
0
;
i
<
-
del
;
i
++
)
term__putc
(
'\b'
);
term__putc
(
el
,
'\b'
);
}
}
}
...
...
@@ -673,7 +693,7 @@ term_overwrite(EditLine *el, const char *cp, int n)
return
;
}
do
{
term__putc
(
*
cp
++
);
term__putc
(
el
,
*
cp
++
);
el
->
el_cursor
.
h
++
;
}
while
(
--
n
);
...
...
@@ -689,7 +709,7 @@ term_overwrite(EditLine *el, const char *cp, int n)
!=
'\0'
)
term_overwrite
(
el
,
&
c
,
1
);
else
term__putc
(
' '
);
term__putc
(
el
,
' '
);
el
->
el_cursor
.
h
=
1
;
}
}
else
/* no wrap, but cursor stays on screen */
...
...
@@ -723,19 +743,18 @@ term_deletechars(EditLine *el, int num)
if
(
GoodStr
(
T_DC
))
/* if I have multiple delete */
if
((
num
>
1
)
||
!
GoodStr
(
T_dc
))
{
/* if dc would be more
* expen. */
(
void
)
tputs
(
tgoto
(
Str
(
T_DC
),
num
,
num
),
num
,
term__putc
);
term_tputs
(
el
,
tgoto
(
Str
(
T_DC
),
num
,
num
),
num
);
return
;
}
if
(
GoodStr
(
T_dm
))
/* if I have delete mode */
(
void
)
tputs
(
Str
(
T_dm
),
1
,
term__putc
);
term_tputs
(
el
,
Str
(
T_dm
),
1
);
if
(
GoodStr
(
T_dc
))
/* else do one at a time */
while
(
num
--
)
(
void
)
tputs
(
Str
(
T_dc
),
1
,
term__putc
);
term_tputs
(
el
,
Str
(
T_dc
),
1
);
if
(
GoodStr
(
T_ed
))
/* if I have delete mode */
(
void
)
tputs
(
Str
(
T_ed
),
1
,
term__putc
);
term_tputs
(
el
,
Str
(
T_ed
),
1
);
}
...
...
@@ -764,37 +783,35 @@ term_insertwrite(EditLine *el, char *cp, int num)
if
(
GoodStr
(
T_IC
))
/* if I have multiple insert */
if
((
num
>
1
)
||
!
GoodStr
(
T_ic
))
{
/* if ic would be more expensive */
(
void
)
tputs
(
tgoto
(
Str
(
T_IC
),
num
,
num
),
num
,
term__putc
);
term_tputs
(
el
,
tgoto
(
Str
(
T_IC
),
num
,
num
),
num
);
term_overwrite
(
el
,
cp
,
num
);
/* this updates el_cursor.h */
return
;
}
if
(
GoodStr
(
T_im
)
&&
GoodStr
(
T_ei
))
{
/* if I have insert mode */
(
void
)
tputs
(
Str
(
T_im
),
1
,
term__putc
);
term_tputs
(
el
,
Str
(
T_im
),
1
);
el
->
el_cursor
.
h
+=
num
;
do
term__putc
(
*
cp
++
);
term__putc
(
el
,
*
cp
++
);
while
(
--
num
);
if
(
GoodStr
(
T_ip
))
/* have to make num chars insert */
(
void
)
tputs
(
Str
(
T_ip
),
1
,
term__putc
);
term_tputs
(
el
,
Str
(
T_ip
),
1
);
(
void
)
tputs
(
Str
(
T_ei
),
1
,
term__putc
);
term_tputs
(
el
,
Str
(
T_ei
),
1
);
return
;
}
do
{
if
(
GoodStr
(
T_ic
))
/* have to make num chars insert */
(
void
)
tputs
(
Str
(
T_ic
),
1
,
term__putc
);
/* insert a char */
term_tputs
(
el
,
Str
(
T_ic
),
1
);
term__putc
(
*
cp
++
);
term__putc
(
el
,
*
cp
++
);
el
->
el_cursor
.
h
++
;
if
(
GoodStr
(
T_ip
))
/* have to make num chars insert */
(
void
)
tputs
(
Str
(
T_ip
),
1
,
term__putc
);
term_tputs
(
el
,
Str
(
T_ip
),
1
);
/* pad the inserted char */
}
while
(
--
num
);
...
...
@@ -810,10 +827,10 @@ term_clear_EOL(EditLine *el, int num)
int
i
;
if
(
EL_CAN_CEOL
&&
GoodStr
(
T_ce
))
(
void
)
tputs
(
Str
(
T_ce
),
1
,
term__putc
);
term_tputs
(
el
,
Str
(
T_ce
),
1
);
else
{
for
(
i
=
0
;
i
<
num
;
i
++
)
term__putc
(
' '
);
term__putc
(
el
,
' '
);
el
->
el_cursor
.
h
+=
num
;
/* have written num spaces */
}
}
...
...
@@ -828,14 +845,14 @@ term_clear_screen(EditLine *el)
if
(
GoodStr
(
T_cl
))
/* send the clear screen code */
(
void
)
tputs
(
Str
(
T_cl
),
Val
(
T_li
),
term__putc
);
term_tputs
(
el
,
Str
(
T_cl
),
Val
(
T_li
)
);
else
if
(
GoodStr
(
T_ho
)
&&
GoodStr
(
T_cd
))
{
(
void
)
tputs
(
Str
(
T_ho
),
Val
(
T_li
),
term__putc
);
/* home */
term_tputs
(
el
,
Str
(
T_ho
),
Val
(
T_li
)
);
/* home */
/* clear to bottom of screen */
(
void
)
tputs
(
Str
(
T_cd
),
Val
(
T_li
),
term__putc
);
term_tputs
(
el
,
Str
(
T_cd
),
Val
(
T_li
)
);
}
else
{
term__putc
(
'\r'
);
term__putc
(
'\n'
);
term__putc
(
el
,
'\r'
);
term__putc
(
el
,
'\n'
);
}
}
...
...
@@ -848,9 +865,9 @@ term_beep(EditLine *el)
{
if
(
GoodStr
(
T_bl
))
/* what termcap says we should use */
(
void
)
tputs
(
Str
(
T_bl
),
1
,
term__putc
);
term_tputs
(
el
,
Str
(
T_bl
),
1
);
else
term__putc
(
'\007'
);
/* an ASCII bell; ^G */
term__putc
(
el
,
'\007'
);
/* an ASCII bell; ^G */
}
...
...
@@ -862,9 +879,9 @@ protected void
term_clear_to_bottom
(
EditLine
*
el
)
{
if
(
GoodStr
(
T_cd
))
(
void
)
tputs
(
Str
(
T_cd
),
Val
(
T_li
),
term__putc
);
term_tputs
(
el
,
Str
(
T_cd
),
Val
(
T_li
)
);
else
if
(
GoodStr
(
T_ce
))
(
void
)
tputs
(
Str
(
T_ce
),
Val
(
T_li
),
term__putc
);
term_tputs
(
el
,
Str
(
T_ce
),
Val
(
T_li
)
);
}
#endif
...
...
@@ -936,7 +953,7 @@ term_set(EditLine *el, const char *term)
Val
(
T_co
)
=
tgetnum
(
"co"
);
Val
(
T_li
)
=
tgetnum
(
"li"
);
for
(
t
=
tstr
;
t
->
name
!=
NULL
;
t
++
)
{
/* XXX: some systems tgetstr needs non const */
/* XXX: some systems
'
tgetstr needs non const */
term_alloc
(
el
,
t
,
tgetstr
(
strchr
(
t
->
name
,
*
t
->
name
),
&
area
));
}
...
...
@@ -1220,26 +1237,62 @@ term_bind_arrow(EditLine *el)
}
}
/* term_putc():
* Add a character
*/
private
int
term_putc
(
int
c
)
{
if
(
term_outfile
==
NULL
)
return
-
1
;
return
fputc
(
c
,
term_outfile
);
}
private
void
term_tputs
(
EditLine
*
el
,
const
char
*
cap
,
int
affcnt
)
{
#ifdef _REENTRANT
pthread_mutex_lock
(
&
term_mutex
);
#endif
term_outfile
=
el
->
el_outfile
;
(
void
)
tputs
(
cap
,
affcnt
,
term_putc
);
#ifdef _REENTRANT
pthread_mutex_unlock
(
&
term_mutex
);
#endif
}
/* term__putc():
* Add a character
*/
protected
int
term__putc
(
int
c
)
term__putc
(
EditLine
*
el
,
int
c
)
{
return
(
fputc
(
c
,
term_outfile
)
);
return
fputc
(
c
,
el
->
el_outfile
);
}
/* term__flush():
* Flush output
*/
protected
void
term__flush
(
void
)
term__flush
(
EditLine
*
el
)
{
(
void
)
fflush
(
term_outfile
);
(
void
)
fflush
(
el
->
el_outfile
);
}
/* term_writec():
* Write the given character out, in a human readable form
*/
protected
void
term_writec
(
EditLine
*
el
,
int
c
)
{
char
buf
[
8
];
int
cnt
=
key__decode_char
(
buf
,
sizeof
(
buf
),
0
,
c
);
buf
[
cnt
]
=
'\0'
;
term_overwrite
(
el
,
buf
,
cnt
);
term__flush
(
el
);
}
...
...
@@ -1269,11 +1322,17 @@ term_telltc(EditLine *el, int argc __attribute__((__unused__)),
(
void
)
fprintf
(
el
->
el_outfile
,
"
\t
It %s magic margins
\n
"
,
EL_HAS_MAGIC_MARGINS
?
"has"
:
"does not have"
);
for
(
t
=
tstr
,
ts
=
el
->
el_term
.
t_str
;
t
->
name
!=
NULL
;
t
++
,
ts
++
)
for
(
t
=
tstr
,
ts
=
el
->
el_term
.
t_str
;
t
->
name
!=
NULL
;
t
++
,
ts
++
)
{
const
char
*
ub
;
if
(
*
ts
&&
**
ts
)
{
(
void
)
key__decode_str
(
*
ts
,
upbuf
,
sizeof
(
upbuf
),
""
);
ub
=
upbuf
;
}
else
{
ub
=
"(empty)"
;
}
(
void
)
fprintf
(
el
->
el_outfile
,
"
\t
%25s (%s) == %s
\n
"
,
t
->
long_name
,
t
->
name
,
*
ts
&&
**
ts
?
key__decode_str
(
*
ts
,
upbuf
,
""
)
:
"(empty)"
);
t
->
long_name
,
t
->
name
,
ub
);
}
(
void
)
fputc
(
'\n'
,
el
->
el_outfile
);
return
(
0
);
}
...
...
@@ -1292,7 +1351,7 @@ term_settc(EditLine *el, int argc __attribute__((__unused__)),
const
char
*
what
,
*
how
;
if
(
argv
==
NULL
||
argv
[
1
]
==
NULL
||
argv
[
2
]
==
NULL
)
return
(
-
1
)
;
return
-
1
;
what
=
argv
[
1
];
how
=
argv
[
2
];
...
...
@@ -1307,7 +1366,7 @@ term_settc(EditLine *el, int argc __attribute__((__unused__)),
if
(
ts
->
name
!=
NULL
)
{
term_alloc
(
el
,
ts
,
how
);
term_setflags
(
el
);
return
(
0
)
;
return
0
;
}
/*
* Do the numeric ones second
...
...
@@ -1316,46 +1375,100 @@ term_settc(EditLine *el, int argc __attribute__((__unused__)),
if
(
strcmp
(
tv
->
name
,
what
)
==
0
)
break
;
if
(
tv
->
name
!=
NULL
)
{
if
(
tv
==
&
tval
[
T_pt
]
||
tv
==
&
tval
[
T_km
]
||
tv
==
&
tval
[
T_am
]
||
tv
==
&
tval
[
T_xn
])
{
if
(
strcmp
(
how
,
"yes"
)
==
0
)
el
->
el_term
.
t_val
[
tv
-
tval
]
=
1
;
else
if
(
strcmp
(
how
,
"no"
)
==
0
)
el
->
el_term
.
t_val
[
tv
-
tval
]
=
0
;
else
{
(
void
)
fprintf
(
el
->
el_errfile
,
"settc: Bad value `%s'.
\n
"
,
how
);
return
(
-
1
);
}
term_setflags
(
el
);
if
(
term_change_size
(
el
,
Val
(
T_li
),
Val
(
T_co
))
==
-
1
)
return
(
-
1
);
return
(
0
);
}
else
{
long
i
;
char
*
ep
;
if
(
tv
->
name
!=
NULL
)
return
-
1
;
i
=
strtol
(
how
,
&
ep
,
10
);
if
(
*
ep
!=
'\0'
)
{
(
void
)
fprintf
(
el
->
el_errfile
,
"settc: Bad value `%s'.
\n
"
,
how
);
return
(
-
1
);
}
el
->
el_term
.
t_val
[
tv
-
tval
]
=
(
int
)
i
;
el
->
el_term
.
t_size
.
v
=
Val
(
T_co
);
el
->
el_term
.
t_size
.
h
=
Val
(
T_li
);
if
(
tv
==
&
tval
[
T_co
]
||
tv
==
&
tval
[
T_li
])
if
(
term_change_size
(
el
,
Val
(
T_li
),
Val
(
T_co
))
==
-
1
)
return
(
-
1
);
return
(
0
);
if
(
tv
==
&
tval
[
T_pt
]
||
tv
==
&
tval
[
T_km
]
||
tv
==
&
tval
[
T_am
]
||
tv
==
&
tval
[
T_xn
])
{
if
(
strcmp
(
how
,
"yes"
)
==
0
)
el
->
el_term
.
t_val
[
tv
-
tval
]
=
1
;
else
if
(
strcmp
(
how
,
"no"
)
==
0
)
el
->
el_term
.
t_val
[
tv
-
tval
]
=
0
;
else
{
(
void
)
fprintf
(
el
->
el_errfile
,
"%s: Bad value `%s'.
\n
"
,
argv
[
0
],
how
);
return
-
1
;
}
term_setflags
(
el
);
if
(
term_change_size
(
el
,
Val
(
T_li
),
Val
(
T_co
))
==
-
1
)
return
-
1
;
return
0
;
}
else
{
long
i
;
char
*
ep
;
i
=
strtol
(
how
,
&
ep
,
10
);
if
(
*
ep
!=
'\0'
)
{
(
void
)
fprintf
(
el
->
el_errfile
,
"%s: Bad value `%s'.
\n
"
,
argv
[
0
],
how
);
return
-
1
;
}
el
->
el_term
.
t_val
[
tv
-
tval
]
=
(
int
)
i
;
el
->
el_term
.
t_size
.
v
=
Val
(
T_co
);
el
->
el_term
.
t_size
.
h
=
Val
(
T_li
);
if
(
tv
==
&
tval
[
T_co
]
||
tv
==
&
tval
[
T_li
])
if
(
term_change_size
(
el
,
Val
(
T_li
),
Val
(
T_co
))
==
-
1
)
return
-
1
;
return
0
;
}
return
(
-
1
);
}
/* term_gettc():
* Get the current terminal characteristics
*/
protected
int
/*ARGSUSED*/
term_gettc
(
EditLine
*
el
,
int
argc
__attribute__
((
__unused__
)),
char
**
argv
)
{
const
struct
termcapstr
*
ts
;
const
struct
termcapval
*
tv
;
char
*
what
;
void
*
how
;
if
(
argv
==
NULL
||
argv
[
1
]
==
NULL
||
argv
[
2
]
==
NULL
)
return
(
-
1
);
what
=
argv
[
1
];
how
=
argv
[
2
];
/*
* Do the strings first
*/
for
(
ts
=
tstr
;
ts
->
name
!=
NULL
;
ts
++
)
if
(
strcmp
(
ts
->
name
,
what
)
==
0
)
break
;
if
(
ts
->
name
!=
NULL
)
{
*
(
char
**
)
how
=
el
->
el_term
.
t_str
[
ts
-
tstr
];
return
0
;
}
/*
* Do the numeric ones second
*/
for
(
tv
=
tval
;
tv
->
name
!=
NULL
;
tv
++
)
if
(
strcmp
(
tv
->
name
,
what
)
==
0
)
break
;
if
(
tv
->
name
==
NULL
)
return
-
1
;
if
(
tv
==
&
tval
[
T_pt
]
||
tv
==
&
tval
[
T_km
]
||
tv
==
&
tval
[
T_am
]
||
tv
==
&
tval
[
T_xn
])
{
static
char
yes
[]
=
"yes"
;
static
char
no
[]
=
"no"
;
if
(
el
->
el_term
.
t_val
[
tv
-
tval
])
*
(
char
**
)
how
=
yes
;
else
*
(
char
**
)
how
=
no
;
return
0
;
}
else
{
*
(
int
*
)
how
=
el
->
el_term
.
t_val
[
tv
-
tval
];
return
0
;
}
}
/* term_echotc():
* Print the termcap string out with variable substitution
*/
...
...
@@ -1441,7 +1554,7 @@ term_echotc(EditLine *el, int argc __attribute__((__unused__)),
break
;
}
if
(
t
->
name
==
NULL
)
{
/* XXX: some systems tgetstr needs non const */
/* XXX: some systems
'
tgetstr needs non const */
scap
=
tgetstr
(
strchr
(
*
argv
,
**
argv
),
&
area
);
}
if
(
!
scap
||
scap
[
0
]
==
'\0'
)
{
...
...
@@ -1494,7 +1607,7 @@ term_echotc(EditLine *el, int argc __attribute__((__unused__)),
*
argv
);
return
(
-
1
);
}
(
void
)
tputs
(
scap
,
1
,
term__putc
);
term_tputs
(
el
,
scap
,
1
);
break
;
case
1
:
argv
++
;
...
...
@@ -1522,7 +1635,7 @@ term_echotc(EditLine *el, int argc __attribute__((__unused__)),
*
argv
);
return
(
-
1
);
}
(
void
)
tputs
(
tgoto
(
scap
,
arg_cols
,
arg_rows
),
1
,
term__putc
);
term_tputs
(
el
,
tgoto
(
scap
,
arg_cols
,
arg_rows
),
1
);
break
;
default:
/* This is wrong, but I will ignore it... */
...
...
@@ -1578,8 +1691,7 @@ term_echotc(EditLine *el, int argc __attribute__((__unused__)),
*
argv
);
return
(
-
1
);
}
(
void
)
tputs
(
tgoto
(
scap
,
arg_cols
,
arg_rows
),
arg_rows
,
term__putc
);
term_tputs
(
el
,
tgoto
(
scap
,
arg_cols
,
arg_rows
),
arg_rows
);
break
;
}
return
(
0
);
...
...
cmd-line-utils/libedit/tokenizer.c
View file @
fab053cc
...
...
@@ -32,7 +32,13 @@
* SUCH DAMAGE.
*/
#include <config.h>
#include "config.h"
#if !defined(lint) && !defined(SCCSID)
#if 0
static char sccsid[] = "@(#)tokenizer.c 8.1 (Berkeley) 6/4/93";
#else
#endif
#endif
/* not lint && not SCCSID */
/*
* tokenize.c: Bourne shell like tokenizer
...
...
cmd-line-utils/libedit/tokenizer.h
deleted
100644 → 0
View file @
6c6fc097
/* $NetBSD: tokenizer.h,v 1.5 2002/03/18 16:01:00 christos Exp $ */
/*-
* Copyright (c) 1992, 1993
* The Regents of the University of California. All rights reserved.
*
* This code is derived from software contributed to Berkeley by
* Christos Zoulas of Cornell University.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. All advertising materials mentioning features or use of this software
* must display the following acknowledgement:
* This product includes software developed by the University of
* California, Berkeley and its contributors.
* 4. Neither the name of the University nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
* @(#)tokenizer.h 8.1 (Berkeley) 6/4/93
*/
/*
* tokenizer.h: Header file for tokenizer routines
*/
#ifndef _h_tokenizer
#define _h_tokenizer
typedef
struct
tokenizer
Tokenizer
;
Tokenizer
*
tok_init
(
const
char
*
);
void
tok_reset
(
Tokenizer
*
);
void
tok_end
(
Tokenizer
*
);
int
tok_line
(
Tokenizer
*
,
const
char
*
,
int
*
,
const
char
***
);
#endif
/* _h_tokenizer */
cmd-line-utils/libedit/tty.c
View file @
fab053cc
/* $NetBSD: tty.c,v 1.2
1 2004/08/13 12:10:39 mycroft
Exp $ */
/* $NetBSD: tty.c,v 1.2
8 2009/02/06 19:53:23 sketch
Exp $ */
/*-
* Copyright (c) 1992, 1993
...
...
@@ -32,18 +32,25 @@
* SUCH DAMAGE.
*/
#include <config.h>
#include "config.h"
#if !defined(lint) && !defined(SCCSID)
#if 0
static char sccsid[] = "@(#)tty.c 8.1 (Berkeley) 6/4/93";
#else
#endif
#endif
/* not lint && not SCCSID */
/*
* tty.c: tty interface stuff
*/
#include <assert.h>
#include <errno.h>
#include "tty.h"
#include "el.h"
typedef
struct
ttymodes_t
{
const
char
*
m_name
;
u
_
int
m_value
;
u
nsigned
int
m_value
;
int
m_type
;
}
ttymodes_t
;
...
...
@@ -438,13 +445,12 @@ private const ttymodes_t ttymodes[] = {
#define tty_getty(el, td) tcgetattr((el)->el_infd, (td))
#define tty_setty(el, td) tcsetattr((el)->el_infd, TCSADRAIN, (td))
#define tty__gettabs(td) ((((td)->c_oflag & TAB3) == TAB3) ? 0 : 1)
#define tty__geteightbit(td) (((td)->c_cflag & CSIZE) == CS8)
#define tty__cooked_mode(td) ((td)->c_lflag & ICANON)
private
int
tty_getty
(
EditLine
*
,
struct
termios
*
);
private
int
tty_setty
(
EditLine
*
,
int
,
const
struct
termios
*
);
private
int
tty__getcharindex
(
int
);
private
void
tty__getchar
(
struct
termios
*
,
unsigned
char
*
);
private
void
tty__setchar
(
struct
termios
*
,
unsigned
char
*
);
...
...
@@ -453,6 +459,29 @@ private int tty_setup(EditLine *);
#define t_qu t_ts
/* tty_getty():
* Wrapper for tcgetattr to handle EINTR
*/
private
int
tty_getty
(
EditLine
*
el
,
struct
termios
*
t
)
{
int
rv
;
while
((
rv
=
tcgetattr
(
el
->
el_infd
,
t
))
==
-
1
&&
errno
==
EINTR
)
continue
;
return
rv
;
}
/* tty_setty():
* Wrapper for tcsetattr to handle EINTR
*/
private
int
tty_setty
(
EditLine
*
el
,
int
action
,
const
struct
termios
*
t
)
{
int
rv
;
while
((
rv
=
tcsetattr
(
el
->
el_infd
,
action
,
t
))
==
-
1
&&
errno
==
EINTR
)
continue
;
return
rv
;
}
/* tty_setup():
* Get the tty parameters and initialize the editing state
...
...
@@ -514,7 +543,7 @@ tty_setup(EditLine *el)
el
->
el_tty
.
t_c
[
TS_IO
][
rst
];
}
tty__setchar
(
&
el
->
el_tty
.
t_ex
,
el
->
el_tty
.
t_c
[
EX_IO
]);
if
(
tty_setty
(
el
,
&
el
->
el_tty
.
t_ex
)
==
-
1
)
{
if
(
tty_setty
(
el
,
TCSADRAIN
,
&
el
->
el_tty
.
t_ex
)
==
-
1
)
{
#ifdef DEBUG_TTY
(
void
)
fprintf
(
el
->
el_errfile
,
"tty_setup: tty_setty: %s
\n
"
,
...
...
@@ -522,8 +551,11 @@ tty_setup(EditLine *el)
#endif
/* DEBUG_TTY */
return
(
-
1
);
}
}
else
}
#ifdef notdef
else
tty__setchar
(
&
el
->
el_tty
.
t_ex
,
el
->
el_tty
.
t_c
[
EX_IO
]);
#endif
el
->
el_tty
.
t_ed
.
c_iflag
&=
~
el
->
el_tty
.
t_t
[
ED_IO
][
MD_INP
].
t_clrmask
;
el
->
el_tty
.
t_ed
.
c_iflag
|=
el
->
el_tty
.
t_t
[
ED_IO
][
MD_INP
].
t_setmask
;
...
...
@@ -1040,7 +1072,7 @@ tty_rawmode(EditLine *el)
}
}
}
if
(
tty_setty
(
el
,
&
el
->
el_tty
.
t_ed
)
==
-
1
)
{
if
(
tty_setty
(
el
,
TCSADRAIN
,
&
el
->
el_tty
.
t_ed
)
==
-
1
)
{
#ifdef DEBUG_TTY
(
void
)
fprintf
(
el
->
el_errfile
,
"tty_rawmode: tty_setty: %s
\n
"
,
strerror
(
errno
));
...
...
@@ -1065,7 +1097,7 @@ tty_cookedmode(EditLine *el)
if
(
el
->
el_flags
&
EDIT_DISABLED
)
return
(
0
);
if
(
tty_setty
(
el
,
&
el
->
el_tty
.
t_ex
)
==
-
1
)
{
if
(
tty_setty
(
el
,
TCSADRAIN
,
&
el
->
el_tty
.
t_ex
)
==
-
1
)
{
#ifdef DEBUG_TTY
(
void
)
fprintf
(
el
->
el_errfile
,
"tty_cookedmode: tty_setty: %s
\n
"
,
...
...
@@ -1101,7 +1133,7 @@ tty_quotemode(EditLine *el)
el
->
el_tty
.
t_qu
.
c_lflag
&=
~
el
->
el_tty
.
t_t
[
QU_IO
][
MD_LIN
].
t_clrmask
;
el
->
el_tty
.
t_qu
.
c_lflag
|=
el
->
el_tty
.
t_t
[
QU_IO
][
MD_LIN
].
t_setmask
;
if
(
tty_setty
(
el
,
&
el
->
el_tty
.
t_qu
)
==
-
1
)
{
if
(
tty_setty
(
el
,
TCSADRAIN
,
&
el
->
el_tty
.
t_qu
)
==
-
1
)
{
#ifdef DEBUG_TTY
(
void
)
fprintf
(
el
->
el_errfile
,
"QuoteModeOn: tty_setty: %s
\n
"
,
strerror
(
errno
));
...
...
@@ -1122,7 +1154,7 @@ tty_noquotemode(EditLine *el)
if
(
el
->
el_tty
.
t_mode
!=
QU_IO
)
return
(
0
);
if
(
tty_setty
(
el
,
&
el
->
el_tty
.
t_ed
)
==
-
1
)
{
if
(
tty_setty
(
el
,
TCSADRAIN
,
&
el
->
el_tty
.
t_ed
)
==
-
1
)
{
#ifdef DEBUG_TTY
(
void
)
fprintf
(
el
->
el_errfile
,
"QuoteModeOff: tty_setty: %s
\n
"
,
strerror
(
errno
));
...
...
@@ -1193,10 +1225,14 @@ tty_stty(EditLine *el, int argc __attribute__((__unused__)), const char **argv)
st
=
len
=
strlen
(
el
->
el_tty
.
t_t
[
z
][
m
->
m_type
].
t_name
);
}
x
=
(
el
->
el_tty
.
t_t
[
z
][
i
].
t_setmask
&
m
->
m_value
)
?
'+'
:
'\0'
;
x
=
(
el
->
el_tty
.
t_t
[
z
][
i
].
t_clrmask
&
m
->
m_value
)
?
'-'
:
x
;
if
(
i
!=
-
1
)
{
x
=
(
el
->
el_tty
.
t_t
[
z
][
i
].
t_setmask
&
m
->
m_value
)
?
'+'
:
'\0'
;
x
=
(
el
->
el_tty
.
t_t
[
z
][
i
].
t_clrmask
&
m
->
m_value
)
?
'-'
:
x
;
}
else
{
x
=
'\0'
;
}
if
(
x
!=
'\0'
||
aflag
)
{
...
...
@@ -1221,7 +1257,7 @@ tty_stty(EditLine *el, int argc __attribute__((__unused__)), const char **argv)
return
(
0
);
}
while
(
argv
&&
(
s
=
*
argv
++
))
{
char
*
p
;
c
onst
c
har
*
p
;
switch
(
*
s
)
{
case
'+'
:
case
'-'
:
...
...
@@ -1232,10 +1268,10 @@ tty_stty(EditLine *el, int argc __attribute__((__unused__)), const char **argv)
break
;
}
d
=
s
;
if
((
p
=
strchr
(
s
,
'='
))
!=
NULL
)
*
p
++
=
'\0'
;
p
=
strchr
(
s
,
'='
);
for
(
m
=
ttymodes
;
m
->
m_name
;
m
++
)
if
(
strcmp
(
m
->
m_name
,
d
)
==
0
&&
if
((
p
?
strncmp
(
m
->
m_name
,
d
,
(
size_t
)(
p
-
d
))
:
strcmp
(
m
->
m_name
,
d
))
==
0
&&
(
p
==
NULL
||
m
->
m_type
==
MD_CHAR
))
break
;
...
...
@@ -1246,7 +1282,7 @@ tty_stty(EditLine *el, int argc __attribute__((__unused__)), const char **argv)
}
if
(
p
)
{
int
c
=
ffs
((
int
)
m
->
m_value
);
int
v
=
*
p
?
parse__escape
((
const
char
**
const
)
&
p
)
:
int
v
=
*
++
p
?
parse__escape
((
const
char
**
)
&
p
)
:
el
->
el_tty
.
t_vdisable
;
assert
(
c
--
!=
0
);
c
=
tty__getcharindex
(
c
);
...
...
@@ -1269,6 +1305,17 @@ tty_stty(EditLine *el, int argc __attribute__((__unused__)), const char **argv)
break
;
}
}
if
(
el
->
el_tty
.
t_mode
==
z
)
{
if
(
tty_setty
(
el
,
TCSADRAIN
,
tios
)
==
-
1
)
{
#ifdef DEBUG_TTY
(
void
)
fprintf
(
el
->
el_errfile
,
"tty_stty: tty_setty: %s
\n
"
,
strerror
(
errno
));
#endif
/* DEBUG_TTY */
return
(
-
1
);
}
}
return
(
0
);
}
...
...
cmd-line-utils/libedit/tty.h
View file @
fab053cc
/* $NetBSD: tty.h,v 1.1
0 2003/08/07 16:44:34 agc
Exp $ */
/* $NetBSD: tty.h,v 1.1
1 2005/06/01 11:37:52 lukem
Exp $ */
/*-
* Copyright (c) 1992, 1993
...
...
@@ -450,8 +450,8 @@
typedef
struct
{
const
char
*
t_name
;
u
_
int
t_setmask
;
u
_
int
t_clrmask
;
u
nsigned
int
t_setmask
;
u
nsigned
int
t_clrmask
;
}
ttyperm_t
[
NN_IO
][
MD_NN
];
typedef
unsigned
char
ttychar_t
[
NN_IO
][
C_NCC
];
...
...
cmd-line-utils/libedit/unvis.c
deleted
100644 → 0
View file @
6c6fc097
/* $NetBSD: unvis.c,v 1.24 2003/08/07 16:42:59 agc Exp $ */
/*-
* Copyright (c) 1989, 1993
* The Regents of the University of California. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. Neither the name of the University nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*/
#include <config.h>
#define __LIBC12_SOURCE__
#include <sys/types.h>
#include <assert.h>
#include <ctype.h>
#include <stdio.h>
#include <vis.h>
#ifdef __weak_alias
__weak_alias
(
strunvis
,
_strunvis
)
__weak_alias
(
unvis
,
_unvis
)
#endif
#ifdef __warn_references
__warn_references
(
unvis
,
"warning: reference to compatibility unvis(); include <vis.h> for correct reference"
)
#endif
#if !HAVE_VIS
/*
* decode driven by state machine
*/
#define S_GROUND 0
/* haven't seen escape char */
#define S_START 1
/* start decoding special sequence */
#define S_META 2
/* metachar started (M) */
#define S_META1 3
/* metachar more, regular char (-) */
#define S_CTRL 4
/* control char started (^) */
#define S_OCTAL2 5
/* octal digit 2 */
#define S_OCTAL3 6
/* octal digit 3 */
#define S_HEX1 7
/* hex digit */
#define S_HEX2 8
/* hex digit 2 */
#define isoctal(c) (((u_char)(c)) >= '0' && ((u_char)(c)) <= '7')
#define xtod(c) (isdigit(c) ? (c - '0') : ((tolower(c) - 'a') + 10))
int
unvis
(
cp
,
c
,
astate
,
flag
)
char
*
cp
;
int
c
;
int
*
astate
,
flag
;
{
return
__unvis13
(
cp
,
(
int
)
c
,
astate
,
flag
);
}
/*
* unvis - decode characters previously encoded by vis
*/
int
__unvis13
(
cp
,
c
,
astate
,
flag
)
char
*
cp
;
int
c
;
int
*
astate
,
flag
;
{
_DIAGASSERT
(
cp
!=
NULL
);
_DIAGASSERT
(
astate
!=
NULL
);
if
(
flag
&
UNVIS_END
)
{
if
(
*
astate
==
S_OCTAL2
||
*
astate
==
S_OCTAL3
||
*
astate
==
S_HEX2
)
{
*
astate
=
S_GROUND
;
return
(
UNVIS_VALID
);
}
return
(
*
astate
==
S_GROUND
?
UNVIS_NOCHAR
:
UNVIS_SYNBAD
);
}
switch
(
*
astate
)
{
case
S_GROUND
:
*
cp
=
0
;
if
(
c
==
'\\'
)
{
*
astate
=
S_START
;
return
(
0
);
}
if
((
flag
&
VIS_HTTPSTYLE
)
&&
c
==
'%'
)
{
*
astate
=
S_HEX1
;
return
(
0
);
}
*
cp
=
c
;
return
(
UNVIS_VALID
);
case
S_START
:
switch
(
c
)
{
case
'\\'
:
*
cp
=
c
;
*
astate
=
S_GROUND
;
return
(
UNVIS_VALID
);
case
'0'
:
case
'1'
:
case
'2'
:
case
'3'
:
case
'4'
:
case
'5'
:
case
'6'
:
case
'7'
:
*
cp
=
(
c
-
'0'
);
*
astate
=
S_OCTAL2
;
return
(
0
);
case
'M'
:
*
cp
=
(
char
)
0200
;
*
astate
=
S_META
;
return
(
0
);
case
'^'
:
*
astate
=
S_CTRL
;
return
(
0
);
case
'n'
:
*
cp
=
'\n'
;
*
astate
=
S_GROUND
;
return
(
UNVIS_VALID
);
case
'r'
:
*
cp
=
'\r'
;
*
astate
=
S_GROUND
;
return
(
UNVIS_VALID
);
case
'b'
:
*
cp
=
'\b'
;
*
astate
=
S_GROUND
;
return
(
UNVIS_VALID
);
case
'a'
:
*
cp
=
'\007'
;
*
astate
=
S_GROUND
;
return
(
UNVIS_VALID
);
case
'v'
:
*
cp
=
'\v'
;
*
astate
=
S_GROUND
;
return
(
UNVIS_VALID
);
case
't'
:
*
cp
=
'\t'
;
*
astate
=
S_GROUND
;
return
(
UNVIS_VALID
);
case
'f'
:
*
cp
=
'\f'
;
*
astate
=
S_GROUND
;
return
(
UNVIS_VALID
);
case
's'
:
*
cp
=
' '
;
*
astate
=
S_GROUND
;
return
(
UNVIS_VALID
);
case
'E'
:
*
cp
=
'\033'
;
*
astate
=
S_GROUND
;
return
(
UNVIS_VALID
);
case
'\n'
:
/*
* hidden newline
*/
*
astate
=
S_GROUND
;
return
(
UNVIS_NOCHAR
);
case
'$'
:
/*
* hidden marker
*/
*
astate
=
S_GROUND
;
return
(
UNVIS_NOCHAR
);
}
*
astate
=
S_GROUND
;
return
(
UNVIS_SYNBAD
);
case
S_META
:
if
(
c
==
'-'
)
*
astate
=
S_META1
;
else
if
(
c
==
'^'
)
*
astate
=
S_CTRL
;
else
{
*
astate
=
S_GROUND
;
return
(
UNVIS_SYNBAD
);
}
return
(
0
);
case
S_META1
:
*
astate
=
S_GROUND
;
*
cp
|=
c
;
return
(
UNVIS_VALID
);
case
S_CTRL
:
if
(
c
==
'?'
)
*
cp
|=
0177
;
else
*
cp
|=
c
&
037
;
*
astate
=
S_GROUND
;
return
(
UNVIS_VALID
);
case
S_OCTAL2
:
/* second possible octal digit */
if
(
isoctal
(
c
))
{
/*
* yes - and maybe a third
*/
*
cp
=
(
*
cp
<<
3
)
+
(
c
-
'0'
);
*
astate
=
S_OCTAL3
;
return
(
0
);
}
/*
* no - done with current sequence, push back passed char
*/
*
astate
=
S_GROUND
;
return
(
UNVIS_VALIDPUSH
);
case
S_OCTAL3
:
/* third possible octal digit */
*
astate
=
S_GROUND
;
if
(
isoctal
(
c
))
{
*
cp
=
(
*
cp
<<
3
)
+
(
c
-
'0'
);
return
(
UNVIS_VALID
);
}
/*
* we were done, push back passed char
*/
return
(
UNVIS_VALIDPUSH
);
case
S_HEX1
:
if
(
isxdigit
(
c
))
{
*
cp
=
xtod
(
c
);
*
astate
=
S_HEX2
;
return
(
0
);
}
/*
* no - done with current sequence, push back passed char
*/
*
astate
=
S_GROUND
;
return
(
UNVIS_VALIDPUSH
);
case
S_HEX2
:
*
astate
=
S_GROUND
;
if
(
isxdigit
(
c
))
{
*
cp
=
xtod
(
c
)
|
(
*
cp
<<
4
);
return
(
UNVIS_VALID
);
}
return
(
UNVIS_VALIDPUSH
);
default:
/*
* decoder in unknown state - (probably uninitialized)
*/
*
astate
=
S_GROUND
;
return
(
UNVIS_SYNBAD
);
}
}
/*
* strunvis - decode src into dst
*
* Number of chars decoded into dst is returned, -1 on error.
* Dst is null terminated.
*/
int
strunvisx
(
dst
,
src
,
flag
)
char
*
dst
;
const
char
*
src
;
int
flag
;
{
char
c
;
char
*
start
=
dst
;
int
state
=
0
;
_DIAGASSERT
(
src
!=
NULL
);
_DIAGASSERT
(
dst
!=
NULL
);
while
((
c
=
*
src
++
)
!=
'\0'
)
{
again:
switch
(
__unvis13
(
dst
,
c
,
&
state
,
flag
))
{
case
UNVIS_VALID
:
dst
++
;
break
;
case
UNVIS_VALIDPUSH
:
dst
++
;
goto
again
;
case
0
:
case
UNVIS_NOCHAR
:
break
;
default:
return
(
-
1
);
}
}
if
(
__unvis13
(
dst
,
c
,
&
state
,
UNVIS_END
)
==
UNVIS_VALID
)
dst
++
;
*
dst
=
'\0'
;
return
(
dst
-
start
);
}
int
strunvis
(
dst
,
src
)
char
*
dst
;
const
char
*
src
;
{
return
strunvisx
(
dst
,
src
,
0
);
}
#endif
cmd-line-utils/libedit/vi.c
View file @
fab053cc
/* $NetBSD: vi.c,v 1.2
0 2004/08/13 12:10:39 mycroft
Exp $ */
/* $NetBSD: vi.c,v 1.2
8 2009/02/06 13:14:37 sketch
Exp $ */
/*-
* Copyright (c) 1992, 1993
...
...
@@ -32,11 +32,17 @@
* SUCH DAMAGE.
*/
#include
<config.h>
#include
"config.h"
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>
#if !defined(lint) && !defined(SCCSID)
#if 0
static char sccsid[] = "@(#)vi.c 8.1 (Berkeley) 6/4/93";
#else
#endif
#endif
/* not lint && not SCCSID */
/*
* vi.c: Vi mode commands.
...
...
@@ -64,8 +70,10 @@ cv_action(EditLine *el, int c)
el
->
el_line
.
lastchar
-
el
->
el_line
.
buffer
);
el
->
el_chared
.
c_vcmd
.
action
=
NOP
;
el
->
el_chared
.
c_vcmd
.
pos
=
0
;
el
->
el_line
.
lastchar
=
el
->
el_line
.
buffer
;
el
->
el_line
.
cursor
=
el
->
el_line
.
buffer
;
if
(
!
(
c
&
YANK
))
{
el
->
el_line
.
lastchar
=
el
->
el_line
.
buffer
;
el
->
el_line
.
cursor
=
el
->
el_line
.
buffer
;
}
if
(
c
&
INSERT
)
el
->
el_map
.
current
=
el
->
el_map
.
key
;
...
...
@@ -82,7 +90,6 @@ cv_action(EditLine *el, int c)
private
el_action_t
cv_paste
(
EditLine
*
el
,
int
c
)
{
char
*
ptr
;
c_kill_t
*
k
=
&
el
->
el_chared
.
c_kill
;
int
len
=
k
->
last
-
k
->
buf
;
...
...
@@ -96,12 +103,12 @@ cv_paste(EditLine *el, int c)
if
(
!
c
&&
el
->
el_line
.
cursor
<
el
->
el_line
.
lastchar
)
el
->
el_line
.
cursor
++
;
ptr
=
el
->
el_line
.
cursor
;
c_insert
(
el
,
len
);
if
(
el
->
el_line
.
cursor
+
len
>
el
->
el_line
.
lastchar
)
return
(
CC_ERROR
);
(
void
)
memcpy
(
ptr
,
k
->
buf
,
len
+
0u
);
(
void
)
memcpy
(
el
->
el_line
.
cursor
,
k
->
buf
,
len
+
0u
);
return
(
CC_REFRESH
);
}
...
...
@@ -592,13 +599,12 @@ vi_delete_prev_char(EditLine *el, int c __attribute__((__unused__)))
*/
protected
el_action_t
/*ARGSUSED*/
vi_list_or_eof
(
EditLine
*
el
,
int
c
__attribute__
((
__unused__
))
)
vi_list_or_eof
(
EditLine
*
el
,
int
c
)
{
if
(
el
->
el_line
.
cursor
==
el
->
el_line
.
lastchar
)
{
if
(
el
->
el_line
.
cursor
==
el
->
el_line
.
buffer
)
{
term_overwrite
(
el
,
STReof
,
4
);
/* then do a EOF */
term__flush
();
term_writec
(
el
,
c
);
/* then do a EOF */
return
(
CC_EOF
);
}
else
{
/*
...
...
@@ -888,7 +894,7 @@ vi_yank(EditLine *el, int c)
/* vi_comment_out():
* Vi comment out current command
* [
c
]
* [
#
]
*/
protected
el_action_t
/*ARGSUSED*/
...
...
@@ -905,18 +911,19 @@ vi_comment_out(EditLine *el, int c)
/* vi_alias():
* Vi include shell alias
* [@]
* NB: posix imp
il
es that we should enter insert mode, however
* NB: posix imp
li
es that we should enter insert mode, however
* this is against historical precedent...
*/
#ifdef __weak_reference
extern
char
*
get_alias_text
(
const
char
*
)
__weak_reference
(
get_alias_text
);
#endif
protected
el_action_t
/*ARGSUSED*/
vi_alias
(
EditLine
*
el
,
int
c
)
{
#ifdef __weak_
extern
#ifdef __weak_
reference
char
alias_name
[
3
];
char
*
alias_text
;
extern
char
*
get_alias_text
(
const
char
*
);
__weak_extern
(
get_alias_text
);
if
(
get_alias_text
==
0
)
{
return
CC_ERROR
;
...
...
@@ -1014,7 +1021,7 @@ vi_histedit(EditLine *el, int c)
return
CC_ERROR
;
case
0
:
close
(
fd
);
execlp
(
"vi"
,
"vi"
,
tempfile
,
(
char
*
)
NULL
);
execlp
(
"vi"
,
"vi"
,
tempfile
,
(
char
*
)
NULL
);
exit
(
0
);
/*NOTREACHED*/
default:
...
...
cmd-line-utils/libedit/vis.c
deleted
100644 → 0
View file @
6c6fc097
/* $NetBSD: vis.c,v 1.27 2004/02/26 23:01:15 enami Exp $ */
/*-
* Copyright (c) 1989, 1993
* The Regents of the University of California. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. All advertising materials mentioning features or use of this software
* must display the following acknowledgement:
* This product includes software developed by the University of
* California, Berkeley and its contributors.
* 4. Neither the name of the University nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*/
/*-
* Copyright (c) 1999 The NetBSD Foundation, Inc.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. All advertising materials mentioning features or use of this software
* must display the following acknowledgement:
* This product includes software developed by the University of
* California, Berkeley and its contributors.
* 4. Neither the name of the University nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*/
/* AIX requires this to be the first thing in the file. */
#if defined (_AIX) && !defined (__GNUC__)
#pragma alloca
#endif
#include <config.h>
#ifdef __GNUC__
# undef alloca
# define alloca(n) __builtin_alloca (n)
#else
# ifdef HAVE_ALLOCA_H
# include <alloca.h>
# else
# ifndef _AIX
extern
char
*
alloca
();
# endif
# endif
#endif
#include <sys/types.h>
#include <assert.h>
#include <vis.h>
#include <stdlib.h>
#ifdef __weak_alias
__weak_alias
(
strsvis
,
_strsvis
)
__weak_alias
(
strsvisx
,
_strsvisx
)
__weak_alias
(
strvis
,
_strvis
)
__weak_alias
(
strvisx
,
_strvisx
)
__weak_alias
(
svis
,
_svis
)
__weak_alias
(
vis
,
_vis
)
#endif
#if !HAVE_VIS || !HAVE_SVIS
#include <ctype.h>
#include <limits.h>
#include <stdio.h>
#include <string.h>
#undef BELL
#define BELL '\a'
#define isoctal(c) (((u_char)(c)) >= '0' && ((u_char)(c)) <= '7')
#define iswhite(c) (c == ' ' || c == '\t' || c == '\n')
#define issafe(c) (c == '\b' || c == BELL || c == '\r')
#define xtoa(c) "0123456789abcdef"[c]
#define MAXEXTRAS 5
#define MAKEEXTRALIST(flag, extra, orig) \
do { \
const char *o = orig; \
char *e; \
while (*o++) \
continue; \
extra = alloca((size_t)((o - orig) + MAXEXTRAS)); \
for (o = orig, e = extra; (*e++ = *o++) != '\0';) \
continue; \
e--; \
if (flag & VIS_SP) *e++ = ' '; \
if (flag & VIS_TAB) *e++ = '\t'; \
if (flag & VIS_NL) *e++ = '\n'; \
if ((flag & VIS_NOSLASH) == 0) *e++ = '\\'; \
*e = '\0'; \
} while (
/*CONSTCOND*/
0)
/*
* This is HVIS, the macro of vis used to HTTP style (RFC 1808)
*/
#define HVIS(dst, c, flag, nextc, extra) \
do \
if (!isascii(c) || !isalnum(c) || strchr("$-_.+!*'(),", c) != NULL) { \
*dst++ = '%'; \
*dst++ = xtoa(((unsigned int)c >> 4) & 0xf); \
*dst++ = xtoa((unsigned int)c & 0xf); \
} else { \
SVIS(dst, c, flag, nextc, extra); \
} \
while (
/*CONSTCOND*/
0)
/*
* This is SVIS, the central macro of vis.
* dst: Pointer to the destination buffer
* c: Character to encode
* flag: Flag word
* nextc: The character following 'c'
* extra: Pointer to the list of extra characters to be
* backslash-protected.
*/
#define SVIS(dst, c, flag, nextc, extra) \
do { \
int isextra; \
isextra = strchr(extra, c) != NULL; \
if (!isextra && isascii(c) && (isgraph(c) || iswhite(c) || \
((flag & VIS_SAFE) && issafe(c)))) { \
*dst++ = c; \
break; \
} \
if (flag & VIS_CSTYLE) { \
switch (c) { \
case '\n': \
*dst++ = '\\'; *dst++ = 'n'; \
continue; \
case '\r': \
*dst++ = '\\'; *dst++ = 'r'; \
continue; \
case '\b': \
*dst++ = '\\'; *dst++ = 'b'; \
continue; \
case BELL: \
*dst++ = '\\'; *dst++ = 'a'; \
continue; \
case '\v': \
*dst++ = '\\'; *dst++ = 'v'; \
continue; \
case '\t': \
*dst++ = '\\'; *dst++ = 't'; \
continue; \
case '\f': \
*dst++ = '\\'; *dst++ = 'f'; \
continue; \
case ' ': \
*dst++ = '\\'; *dst++ = 's'; \
continue; \
case '\0': \
*dst++ = '\\'; *dst++ = '0'; \
if (isoctal(nextc)) { \
*dst++ = '0'; \
*dst++ = '0'; \
} \
continue; \
default: \
if (isgraph(c)) { \
*dst++ = '\\'; *dst++ = c; \
continue; \
} \
} \
} \
if (isextra || ((c & 0177) == ' ') || (flag & VIS_OCTAL)) { \
*dst++ = '\\'; \
*dst++ = (u_char)(((u_int32_t)(u_char)c >> 6) & 03) + '0'; \
*dst++ = (u_char)(((u_int32_t)(u_char)c >> 3) & 07) + '0'; \
*dst++ = (c & 07) + '0'; \
} else { \
if ((flag & VIS_NOSLASH) == 0) *dst++ = '\\'; \
if (c & 0200) { \
c &= 0177; *dst++ = 'M'; \
} \
if (iscntrl(c)) { \
*dst++ = '^'; \
if (c == 0177) \
*dst++ = '?'; \
else \
*dst++ = c + '@'; \
} else { \
*dst++ = '-'; *dst++ = c; \
} \
} \
} while (
/*CONSTCOND*/
0)
/*
* svis - visually encode characters, also encoding the characters
* pointed to by `extra'
*/
char
*
svis
(
dst
,
c
,
flag
,
nextc
,
extra
)
char
*
dst
;
int
c
,
flag
,
nextc
;
const
char
*
extra
;
{
char
*
nextra
;
_DIAGASSERT
(
dst
!=
NULL
);
_DIAGASSERT
(
extra
!=
NULL
);
MAKEEXTRALIST
(
flag
,
nextra
,
extra
);
if
(
flag
&
VIS_HTTPSTYLE
)
HVIS
(
dst
,
c
,
flag
,
nextc
,
nextra
);
else
SVIS
(
dst
,
c
,
flag
,
nextc
,
nextra
);
*
dst
=
'\0'
;
return
(
dst
);
}
/*
* strsvis, strsvisx - visually encode characters from src into dst
*
* Extra is a pointer to a \0-terminated list of characters to
* be encoded, too. These functions are useful e. g. to
* encode strings in such a way so that they are not interpreted
* by a shell.
*
* Dst must be 4 times the size of src to account for possible
* expansion. The length of dst, not including the trailing NULL,
* is returned.
*
* Strsvisx encodes exactly len bytes from src into dst.
* This is useful for encoding a block of data.
*/
int
strsvis
(
dst
,
csrc
,
flag
,
extra
)
char
*
dst
;
const
char
*
csrc
;
int
flag
;
const
char
*
extra
;
{
int
c
;
char
*
start
;
char
*
nextra
;
const
unsigned
char
*
src
=
(
const
unsigned
char
*
)
csrc
;
_DIAGASSERT
(
dst
!=
NULL
);
_DIAGASSERT
(
src
!=
NULL
);
_DIAGASSERT
(
extra
!=
NULL
);
MAKEEXTRALIST
(
flag
,
nextra
,
extra
);
if
(
flag
&
VIS_HTTPSTYLE
)
{
for
(
start
=
dst
;
(
c
=
*
src
++
)
!=
'\0'
;
/* empty */
)
HVIS
(
dst
,
c
,
flag
,
*
src
,
nextra
);
}
else
{
for
(
start
=
dst
;
(
c
=
*
src
++
)
!=
'\0'
;
/* empty */
)
SVIS
(
dst
,
c
,
flag
,
*
src
,
nextra
);
}
*
dst
=
'\0'
;
return
(
dst
-
start
);
}
int
strsvisx
(
dst
,
csrc
,
len
,
flag
,
extra
)
char
*
dst
;
const
char
*
csrc
;
size_t
len
;
int
flag
;
const
char
*
extra
;
{
int
c
;
char
*
start
;
char
*
nextra
;
const
unsigned
char
*
src
=
(
const
unsigned
char
*
)
csrc
;
_DIAGASSERT
(
dst
!=
NULL
);
_DIAGASSERT
(
src
!=
NULL
);
_DIAGASSERT
(
extra
!=
NULL
);
MAKEEXTRALIST
(
flag
,
nextra
,
extra
);
if
(
flag
&
VIS_HTTPSTYLE
)
{
for
(
start
=
dst
;
len
>
0
;
len
--
)
{
c
=
*
src
++
;
HVIS
(
dst
,
c
,
flag
,
len
?
*
src
:
'\0'
,
nextra
);
}
}
else
{
for
(
start
=
dst
;
len
>
0
;
len
--
)
{
c
=
*
src
++
;
SVIS
(
dst
,
c
,
flag
,
len
?
*
src
:
'\0'
,
nextra
);
}
}
*
dst
=
'\0'
;
return
(
dst
-
start
);
}
#endif
#if !HAVE_VIS
/*
* vis - visually encode characters
*/
char
*
vis
(
dst
,
c
,
flag
,
nextc
)
char
*
dst
;
int
c
,
flag
,
nextc
;
{
char
*
extra
;
_DIAGASSERT
(
dst
!=
NULL
);
MAKEEXTRALIST
(
flag
,
extra
,
""
);
if
(
flag
&
VIS_HTTPSTYLE
)
HVIS
(
dst
,
c
,
flag
,
nextc
,
extra
);
else
SVIS
(
dst
,
c
,
flag
,
nextc
,
extra
);
*
dst
=
'\0'
;
return
(
dst
);
}
/*
* strvis, strvisx - visually encode characters from src into dst
*
* Dst must be 4 times the size of src to account for possible
* expansion. The length of dst, not including the trailing NULL,
* is returned.
*
* Strvisx encodes exactly len bytes from src into dst.
* This is useful for encoding a block of data.
*/
int
strvis
(
dst
,
src
,
flag
)
char
*
dst
;
const
char
*
src
;
int
flag
;
{
char
*
extra
;
MAKEEXTRALIST
(
flag
,
extra
,
""
);
return
(
strsvis
(
dst
,
src
,
flag
,
extra
));
}
int
strvisx
(
dst
,
src
,
len
,
flag
)
char
*
dst
;
const
char
*
src
;
size_t
len
;
int
flag
;
{
char
*
extra
;
MAKEEXTRALIST
(
flag
,
extra
,
""
);
return
(
strsvisx
(
dst
,
src
,
len
,
flag
,
extra
));
}
#endif
cmd-line-utils/libedit/vis.h
deleted
100644 → 0
View file @
6c6fc097
/* $NetBSD: vis.h,v 1.15 2005/02/03 04:39:32 perry Exp $ */
/*-
* Copyright (c) 1990, 1993
* The Regents of the University of California. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. Neither the name of the University nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
* @(#)vis.h 8.1 (Berkeley) 6/2/93
*/
#ifndef _VIS_H_
#define _VIS_H_
#include <config.h>
/*
* to select alternate encoding format
*/
#define VIS_OCTAL 0x01
/* use octal \ddd format */
#define VIS_CSTYLE 0x02
/* use \[nrft0..] where appropiate */
/*
* to alter set of characters encoded (default is to encode all
* non-graphic except space, tab, and newline).
*/
#define VIS_SP 0x04
/* also encode space */
#define VIS_TAB 0x08
/* also encode tab */
#define VIS_NL 0x10
/* also encode newline */
#define VIS_WHITE (VIS_SP | VIS_TAB | VIS_NL)
#define VIS_SAFE 0x20
/* only encode "unsafe" characters */
/*
* other
*/
#define VIS_NOSLASH 0x40
/* inhibit printing '\' */
#define VIS_HTTPSTYLE 0x80
/* http-style escape % HEX HEX */
/*
* unvis return codes
*/
#define UNVIS_VALID 1
/* character valid */
#define UNVIS_VALIDPUSH 2
/* character valid, push back passed char */
#define UNVIS_NOCHAR 3
/* valid sequence, no character produced */
#define UNVIS_SYNBAD -1
/* unrecognized escape sequence */
#define UNVIS_ERROR -2
/* decoder in unknown state (unrecoverable) */
/*
* unvis flags
*/
#define UNVIS_END 1
/* no more characters */
__BEGIN_DECLS
char
*
vis
(
char
*
,
int
,
int
,
int
);
char
*
svis
(
char
*
,
int
,
int
,
int
,
const
char
*
);
int
strvis
(
char
*
,
const
char
*
,
int
);
int
strsvis
(
char
*
,
const
char
*
,
int
,
const
char
*
);
int
strvisx
(
char
*
,
const
char
*
,
size_t
,
int
);
int
strsvisx
(
char
*
,
const
char
*
,
size_t
,
int
,
const
char
*
);
int
strunvis
(
char
*
,
const
char
*
);
int
strunvisx
(
char
*
,
const
char
*
,
int
);
#ifdef __LIBC12_SOURCE__
int
unvis
(
char
*
,
int
,
int
*
,
int
);
int
__unvis13
(
char
*
,
int
,
int
*
,
int
);
#else
int
unvis
(
char
*
,
int
,
int
*
,
int
);
#endif
__END_DECLS
#endif
/* !_VIS_H_ */
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment