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
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
nexedi
MariaDB
Commits
5d2a6c47
Commit
5d2a6c47
authored
Apr 30, 2009
by
Daniel Fischer
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Backported libedit changes.
parent
3742489c
Changes
39
Hide whitespace changes
Inline
Side-by-side
Showing
39 changed files
with
1639 additions
and
1381 deletions
+1639
-1381
cmd-line-utils/libedit/Makefile.am
cmd-line-utils/libedit/Makefile.am
+7
-21
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/config.h
cmd-line-utils/libedit/config.h
+0
-14
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/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/makelist.sh
cmd-line-utils/libedit/makelist.sh
+8
-8
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
+316
-522
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/sys.h
cmd-line-utils/libedit/sys.h
+23
-4
cmd-line-utils/libedit/term.c
cmd-line-utils/libedit/term.c
+225
-111
cmd-line-utils/libedit/tokenizer.c
cmd-line-utils/libedit/tokenizer.c
+7
-1
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/vi.c
cmd-line-utils/libedit/vi.c
+23
-16
No files found.
cmd-line-utils/libedit/Makefile.am
View file @
5d2a6c47
## 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 np/
vis.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/chared.c
View file @
5d2a6c47
/* $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 @
5d2a6c47
/* $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 @
5d2a6c47
/* $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/config.h
View file @
5d2a6c47
#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/el.c
View file @
5d2a6c47
/* $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 @
5d2a6c47
/* $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 @
5d2a6c47
/* $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 @
5d2a6c47
/* $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/hist.c
View file @
5d2a6c47
...
...
@@ -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 @
5d2a6c47
/* $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 @
5d2a6c47
/* $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 @
5d2a6c47
/* $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 @
5d2a6c47
/* $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/makelist.sh
View file @
5d2a6c47
#!/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
...
...
@@ -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
'
...
...
@@ -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 @
5d2a6c47
/* $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 @
5d2a6c47
/* $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 @
5d2a6c47
/* $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 @
5d2a6c47
/* $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 @
5d2a6c47
/* $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 @
5d2a6c47
/* $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 @
5d2a6c47
/* $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 @
5d2a6c47
/* $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 @
5d2a6c47
/* $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 @
5d2a6c47
...
...
@@ -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 @
5d2a6c47
/* $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 @
5d2a6c47
/* $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 @
5d2a6c47
/* $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,20 @@ extern char *alloca ();
#include <limits.h>
#include <errno.h>
#include <fcntl.h>
#include <setjmp.h>
#ifdef HAVE_VIS_H
#include <vis.h>
#else
#include "np/vis.h"
#endif
#include "readline/readline.h"
#include "el.h"
#include "fcns.h"
/* for EL_NUM_FCNS */
#include "histedit.h"
#include "filecomplete.h"
void
rl_prep_terminal
(
int
);
void
rl_deprep_terminal
(
void
);
/* for rl_complete() */
#define TAB '\r'
...
...
@@ -94,9 +79,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 +100,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 +140,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 +150,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 +191,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 +242,6 @@ rl_initialize(void)
{
HistEvent
ev
;
const
LineInfo
*
li
;
int
i
;
int
editmode
=
1
;
struct
termios
t
;
...
...
@@ -257,9 +275,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 +312,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 +337,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 +351,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 +453,7 @@ _rl_compat_sub(const char *str, const char *what, const char *with,
}
else
*
r
++
=
*
s
++
;
}
*
r
=
0
;
*
r
=
'\0'
;
return
(
result
);
}
...
...
@@ -467,7 +474,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 +696,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 +706,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 +715,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 +739,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 +752,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 +765,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 +783,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 +795,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 +864,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 +883,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 +921,11 @@ history_expand(char *str, char **output)
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 +935,11 @@ history_expand(char *str, char **output)
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 +991,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 +1170,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 +1202,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 +1420,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 +1453,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 +1465,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 +1476,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 +1516,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 +1643,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 +1661,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 +1679,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 +1693,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 +1724,7 @@ rl_prep_terminal(int meta_flag)
}
void
rl_deprep_terminal
()
rl_deprep_terminal
(
void
)
{
el_set
(
e
,
EL_PREP_TERM
,
0
);
}
...
...
@@ -2104,6 +1749,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 +1774,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 +1819,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 @
5d2a6c47
/* $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) && !defined(_AIX
)
#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 @
5d2a6c47
/* $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 @
5d2a6c47
...
...
@@ -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 @
5d2a6c47
/* $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 @
5d2a6c47
/* $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/sys.h
View file @
5d2a6c47
...
...
@@ -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 @
5d2a6c47
/* $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,28 @@
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#if 0 /* TODO: do we need this */
#ifdef HAVE_TERMCAP_H
#include <termcap.h>
#endif
#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 +276,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 +330,6 @@ term_setflags(EditLine *el)
#endif
/* DEBUG_SCREEN */
}
/* term_init():
* Initialize the terminal stuff
*/
...
...
@@ -339,7 +355,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 +405,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 +480,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 +495,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 +566,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 +579,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 +610,7 @@ term_move_to_char(EditLine *el, int where)
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 +618,11 @@ term_move_to_char(EditLine *el, int where)
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 +633,7 @@ term_move_to_char(EditLine *el, int where)
(
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 +653,8 @@ term_move_to_char(EditLine *el, int where)
}
}
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 +665,12 @@ term_move_to_char(EditLine *el, int where)
(((
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 +695,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 +711,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 +745,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 +785,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 +829,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 +847,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 +867,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 +881,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 +955,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 +1239,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 +1324,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 +1353,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 +1368,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 +1377,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 +1556,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 +1609,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 +1637,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 +1693,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 @
5d2a6c47
...
...
@@ -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/tty.c
View file @
5d2a6c47
/* $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 @
5d2a6c47
/* $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/vi.c
View file @
5d2a6c47
/* $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...
*/
#if defined(__weak_reference) && !defined(__FreeBSD__)
extern
char
*
get_alias_text
(
const
char
*
)
__weak_reference
(
get_alias_text
);
#endif
protected
el_action_t
/*ARGSUSED*/
vi_alias
(
EditLine
*
el
,
int
c
)
{
#if
def __weak_extern
#if
defined(__weak_reference) && !defined(__FreeBSD__)
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:
...
...
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