Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
ruanhaishen
redis
Commits
ff405818
Commit
ff405818
authored
Nov 29, 2010
by
Pieter Noordhuis
Browse files
Update linenoise
parent
a2a69d58
Changes
3
Hide whitespace changes
Inline
Side-by-side
deps/linenoise/example.c
View file @
ff405818
...
@@ -2,9 +2,18 @@
...
@@ -2,9 +2,18 @@
#include <stdlib.h>
#include <stdlib.h>
#include "linenoise.h"
#include "linenoise.h"
void
completion
(
const
char
*
buf
,
linenoiseCompletions
*
lc
)
{
if
(
buf
[
0
]
==
'h'
)
{
linenoiseAddCompletion
(
lc
,
"hello"
);
linenoiseAddCompletion
(
lc
,
"hello there"
);
}
}
int
main
(
void
)
{
int
main
(
void
)
{
char
*
line
;
char
*
line
;
linenoiseSetCompletionCallback
(
completion
);
linenoiseHistoryLoad
(
"history.txt"
);
/* Load the history at startup */
linenoiseHistoryLoad
(
"history.txt"
);
/* Load the history at startup */
while
((
line
=
linenoise
(
"hello> "
))
!=
NULL
)
{
while
((
line
=
linenoise
(
"hello> "
))
!=
NULL
)
{
if
(
line
[
0
]
!=
'\0'
)
{
if
(
line
[
0
]
!=
'\0'
)
{
...
...
deps/linenoise/linenoise.c
View file @
ff405818
...
@@ -79,10 +79,12 @@
...
@@ -79,10 +79,12 @@
#include <sys/types.h>
#include <sys/types.h>
#include <sys/ioctl.h>
#include <sys/ioctl.h>
#include <unistd.h>
#include <unistd.h>
#include "linenoise.h"
#define LINENOISE_DEFAULT_HISTORY_MAX_LEN 100
#define LINENOISE_DEFAULT_HISTORY_MAX_LEN 100
#define LINENOISE_MAX_LINE 4096
#define LINENOISE_MAX_LINE 4096
static
char
*
unsupported_term
[]
=
{
"dumb"
,
"cons25"
,
NULL
};
static
char
*
unsupported_term
[]
=
{
"dumb"
,
"cons25"
,
NULL
};
static
linenoiseCompletionCallback
*
completionCallback
=
NULL
;
static
struct
termios
orig_termios
;
/* in order to restore at exit */
static
struct
termios
orig_termios
;
/* in order to restore at exit */
static
int
rawmode
=
0
;
/* for atexit() function to check if restore is needed*/
static
int
rawmode
=
0
;
/* for atexit() function to check if restore is needed*/
...
@@ -195,6 +197,70 @@ static void refreshLine(int fd, const char *prompt, char *buf, size_t len, size_
...
@@ -195,6 +197,70 @@ static void refreshLine(int fd, const char *prompt, char *buf, size_t len, size_
if
(
write
(
fd
,
seq
,
strlen
(
seq
))
==
-
1
)
return
;
if
(
write
(
fd
,
seq
,
strlen
(
seq
))
==
-
1
)
return
;
}
}
static
void
beep
()
{
fprintf
(
stderr
,
"\x7"
);
fflush
(
stderr
);
}
static
void
freeCompletions
(
linenoiseCompletions
*
lc
)
{
size_t
i
;
for
(
i
=
0
;
i
<
lc
->
len
;
i
++
)
free
(
lc
->
cvec
[
i
]);
if
(
lc
->
cvec
!=
NULL
)
free
(
lc
->
cvec
);
}
static
int
completeLine
(
int
fd
,
const
char
*
prompt
,
char
*
buf
,
size_t
buflen
,
size_t
*
len
,
size_t
*
pos
,
size_t
cols
)
{
linenoiseCompletions
lc
=
{
0
,
NULL
};
int
nread
,
nwritten
;
char
c
=
0
;
completionCallback
(
buf
,
&
lc
);
if
(
lc
.
len
==
0
)
{
beep
();
}
else
{
size_t
stop
=
0
,
i
=
0
;
size_t
clen
;
while
(
!
stop
)
{
/* Show completion or original buffer */
if
(
i
<
lc
.
len
)
{
clen
=
strlen
(
lc
.
cvec
[
i
]);
refreshLine
(
fd
,
prompt
,
lc
.
cvec
[
i
],
clen
,
clen
,
cols
);
}
else
{
refreshLine
(
fd
,
prompt
,
buf
,
*
len
,
*
pos
,
cols
);
}
nread
=
read
(
fd
,
&
c
,
1
);
if
(
nread
<=
0
)
{
freeCompletions
(
&
lc
);
return
-
1
;
}
switch
(
c
)
{
case
9
:
/* tab */
i
=
(
i
+
1
)
%
(
lc
.
len
+
1
);
if
(
i
==
lc
.
len
)
beep
();
break
;
case
27
:
/* escape */
stop
=
1
;
break
;
default:
/* update buffer and return */
if
(
i
<
lc
.
len
)
{
nwritten
=
snprintf
(
buf
,
buflen
,
"%s"
,
lc
.
cvec
[
i
]);
*
len
=
*
pos
=
nwritten
;
}
stop
=
1
;
break
;
}
}
}
freeCompletions
(
&
lc
);
return
c
;
/* Return last read character */
}
static
int
linenoisePrompt
(
int
fd
,
char
*
buf
,
size_t
buflen
,
const
char
*
prompt
)
{
static
int
linenoisePrompt
(
int
fd
,
char
*
buf
,
size_t
buflen
,
const
char
*
prompt
)
{
size_t
plen
=
strlen
(
prompt
);
size_t
plen
=
strlen
(
prompt
);
size_t
pos
=
0
;
size_t
pos
=
0
;
...
@@ -217,6 +283,18 @@ static int linenoisePrompt(int fd, char *buf, size_t buflen, const char *prompt)
...
@@ -217,6 +283,18 @@ static int linenoisePrompt(int fd, char *buf, size_t buflen, const char *prompt)
nread
=
read
(
fd
,
&
c
,
1
);
nread
=
read
(
fd
,
&
c
,
1
);
if
(
nread
<=
0
)
return
len
;
if
(
nread
<=
0
)
return
len
;
/* Only autocomplete when the callback is set. It returns < 0 when
* there was an error reading from fd. Otherwise it will return the
* character that should be handled next. */
if
(
c
==
9
&&
completionCallback
!=
NULL
)
{
c
=
completeLine
(
fd
,
prompt
,
buf
,
buflen
,
&
len
,
&
pos
,
cols
);
/* Return on errors */
if
(
c
<
0
)
return
len
;
/* Read next character when 0 */
if
(
c
==
0
)
continue
;
}
switch
(
c
)
{
switch
(
c
)
{
case
13
:
/* enter */
case
13
:
/* enter */
case
4
:
/* ctrl-d */
case
4
:
/* ctrl-d */
...
@@ -402,6 +480,19 @@ char *linenoise(const char *prompt) {
...
@@ -402,6 +480,19 @@ char *linenoise(const char *prompt) {
}
}
}
}
/* Register a callback function to be called for tab-completion. */
void
linenoiseSetCompletionCallback
(
linenoiseCompletionCallback
*
fn
)
{
completionCallback
=
fn
;
}
void
linenoiseAddCompletion
(
linenoiseCompletions
*
lc
,
char
*
str
)
{
size_t
len
=
strlen
(
str
);
char
*
copy
=
malloc
(
len
+
1
);
memcpy
(
copy
,
str
,
len
+
1
);
lc
->
cvec
=
realloc
(
lc
->
cvec
,
sizeof
(
char
*
)
*
(
lc
->
len
+
1
));
lc
->
cvec
[
lc
->
len
++
]
=
copy
;
}
/* Using a circular buffer is smarter, but a bit more complex to handle. */
/* Using a circular buffer is smarter, but a bit more complex to handle. */
int
linenoiseHistoryAdd
(
const
char
*
line
)
{
int
linenoiseHistoryAdd
(
const
char
*
line
)
{
char
*
linecopy
;
char
*
linecopy
;
...
...
deps/linenoise/linenoise.h
View file @
ff405818
...
@@ -34,6 +34,15 @@
...
@@ -34,6 +34,15 @@
#ifndef __LINENOISE_H
#ifndef __LINENOISE_H
#define __LINENOISE_H
#define __LINENOISE_H
typedef
struct
linenoiseCompletions
{
size_t
len
;
char
**
cvec
;
}
linenoiseCompletions
;
typedef
void
(
linenoiseCompletionCallback
)(
const
char
*
,
linenoiseCompletions
*
);
void
linenoiseSetCompletionCallback
(
linenoiseCompletionCallback
*
);
void
linenoiseAddCompletion
(
linenoiseCompletions
*
,
char
*
);
char
*
linenoise
(
const
char
*
prompt
);
char
*
linenoise
(
const
char
*
prompt
);
int
linenoiseHistoryAdd
(
const
char
*
line
);
int
linenoiseHistoryAdd
(
const
char
*
line
);
int
linenoiseHistorySetMaxLen
(
int
len
);
int
linenoiseHistorySetMaxLen
(
int
len
);
...
...
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