Line editing with linenoise.
https://github.com/antirez/linenoise https://todo.sr.ht/~sforman/thun-der/33
This commit is contained in:
parent
d8263e0527
commit
b32a3f2496
Binary file not shown.
|
|
@ -1,4 +1,4 @@
|
||||||
OBJS=joy.o keywords.o definitions.o
|
OBJS=joy.o keywords.o definitions.o linenoise.o
|
||||||
|
|
||||||
LDFLAGS=-L/usr/local/lib -lgc -lgmp
|
LDFLAGS=-L/usr/local/lib -lgc -lgmp
|
||||||
|
|
||||||
|
|
@ -42,3 +42,6 @@ keywords.c: KEYWORDS.txt
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
rm -vf *.o joy KEYWORDS.txt
|
rm -vf *.o joy KEYWORDS.txt
|
||||||
|
|
||||||
|
linenoise.o: linenoise.c linenoise.h
|
||||||
|
cc -c linenoise.c -o linenoise.o
|
||||||
|
|
|
||||||
|
|
@ -37,6 +37,7 @@ along with Thun. If not see <http://www.gnu.org/licenses/>.
|
||||||
#include "joy.h"
|
#include "joy.h"
|
||||||
#include "definitions.h"
|
#include "definitions.h"
|
||||||
#include "uthash.h"
|
#include "uthash.h"
|
||||||
|
#include "linenoise.h"
|
||||||
|
|
||||||
|
|
||||||
static jmp_buf jbuf;
|
static jmp_buf jbuf;
|
||||||
|
|
@ -924,7 +925,6 @@ int
|
||||||
main(int argc, char *argv[])
|
main(int argc, char *argv[])
|
||||||
{
|
{
|
||||||
char *line;
|
char *line;
|
||||||
char *status;
|
|
||||||
JoyList stack = EMPTY_LIST;
|
JoyList stack = EMPTY_LIST;
|
||||||
JoyList expression = EMPTY_LIST;
|
JoyList expression = EMPTY_LIST;
|
||||||
JoyList s;
|
JoyList s;
|
||||||
|
|
@ -939,29 +939,13 @@ main(int argc, char *argv[])
|
||||||
|
|
||||||
quiet = ((2 == argc) && (!strcmp("-q", argv[1])));
|
quiet = ((2 == argc) && (!strcmp("-q", argv[1])));
|
||||||
|
|
||||||
line = (char *)GC_malloc(1025);
|
|
||||||
|
|
||||||
while (1) {
|
while (1) {
|
||||||
SHH("joy? ")
|
line = linenoise(quiet? "" : "joy? ");
|
||||||
status = gets_s(line, 1025);
|
if (NULL == line) {
|
||||||
if (NULL == status) {
|
|
||||||
/*
|
|
||||||
From the man page:
|
|
||||||
|
|
||||||
> Upon successful completion, fgets(), gets_s(), and gets() return a
|
|
||||||
pointer to the string. If end-of-file occurs before any characters are
|
|
||||||
read, they return NULL and the buffer contents remain unchanged. If an
|
|
||||||
error occurs, they return NULL and the buffer contents are indeterminate.
|
|
||||||
The fgets(), gets_s(), and gets() functions do not distinguish between
|
|
||||||
end-of-file and error, and callers must use feof(3) and ferror(3) to
|
|
||||||
determine which occurred.
|
|
||||||
|
|
||||||
TODO: "use feof(3) and ferror(3)"...
|
|
||||||
|
|
||||||
*/
|
|
||||||
SHH("\n")
|
SHH("\n")
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
linenoiseHistoryAdd(line);
|
||||||
s = stack;
|
s = stack;
|
||||||
if (!setjmp(jbuf)) {
|
if (!setjmp(jbuf)) {
|
||||||
expression = text_to_expression(line);
|
expression = text_to_expression(line);
|
||||||
|
|
@ -970,6 +954,7 @@ main(int argc, char *argv[])
|
||||||
/* err */
|
/* err */
|
||||||
stack = s;
|
stack = s;
|
||||||
}
|
}
|
||||||
|
free(line);
|
||||||
print_stack(stack);
|
print_stack(stack);
|
||||||
printf("\n");
|
printf("\n");
|
||||||
}
|
}
|
||||||
|
|
|
||||||
File diff suppressed because it is too large
Load Diff
|
|
@ -0,0 +1,75 @@
|
||||||
|
/* linenoise.h -- VERSION 1.0
|
||||||
|
*
|
||||||
|
* Guerrilla line editing library against the idea that a line editing lib
|
||||||
|
* needs to be 20,000 lines of C code.
|
||||||
|
*
|
||||||
|
* See linenoise.c for more information.
|
||||||
|
*
|
||||||
|
* ------------------------------------------------------------------------
|
||||||
|
*
|
||||||
|
* Copyright (c) 2010-2014, Salvatore Sanfilippo <antirez at gmail dot com>
|
||||||
|
* Copyright (c) 2010-2013, Pieter Noordhuis <pcnoordhuis at gmail dot 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:
|
||||||
|
*
|
||||||
|
* * Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* * 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 COPYRIGHT HOLDERS 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 COPYRIGHT
|
||||||
|
* HOLDER 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __LINENOISE_H
|
||||||
|
#define __LINENOISE_H
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
typedef struct linenoiseCompletions {
|
||||||
|
size_t len;
|
||||||
|
char **cvec;
|
||||||
|
} linenoiseCompletions;
|
||||||
|
|
||||||
|
typedef void(linenoiseCompletionCallback)(const char *, linenoiseCompletions *);
|
||||||
|
typedef char*(linenoiseHintsCallback)(const char *, int *color, int *bold);
|
||||||
|
typedef void(linenoiseFreeHintsCallback)(void *);
|
||||||
|
void linenoiseSetCompletionCallback(linenoiseCompletionCallback *);
|
||||||
|
void linenoiseSetHintsCallback(linenoiseHintsCallback *);
|
||||||
|
void linenoiseSetFreeHintsCallback(linenoiseFreeHintsCallback *);
|
||||||
|
void linenoiseAddCompletion(linenoiseCompletions *, const char *);
|
||||||
|
|
||||||
|
char *linenoise(const char *prompt);
|
||||||
|
void linenoiseFree(void *ptr);
|
||||||
|
int linenoiseHistoryAdd(const char *line);
|
||||||
|
int linenoiseHistorySetMaxLen(int len);
|
||||||
|
int linenoiseHistorySave(const char *filename);
|
||||||
|
int linenoiseHistoryLoad(const char *filename);
|
||||||
|
void linenoiseClearScreen(void);
|
||||||
|
void linenoiseSetMultiLine(int ml);
|
||||||
|
void linenoisePrintKeyCodes(void);
|
||||||
|
void linenoiseMaskModeEnable(void);
|
||||||
|
void linenoiseMaskModeDisable(void);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* __LINENOISE_H */
|
||||||
Loading…
Reference in New Issue