Module Name: src
Committed By: christos
Date: Tue Mar 31 17:38:27 UTC 2009
Modified Files:
src/lib/libedit: editline.3 el.c histedit.h prompt.c prompt.h refresh.c
term.c term.h
src/lib/libedit/TEST: tc1.c
Log Message:
Implement literal prompt sequences. Now someone can implement
RL_PROMPT_START_LITERAL/RL_PROMPT_END_LITERAL :-)
To generate a diff of this commit:
cvs rdiff -u -r1.64 -r1.65 src/lib/libedit/editline.3
cvs rdiff -u -r1.50 -r1.51 src/lib/libedit/el.c src/lib/libedit/term.c
cvs rdiff -u -r1.38 -r1.39 src/lib/libedit/histedit.h
cvs rdiff -u -r1.13 -r1.14 src/lib/libedit/prompt.c
cvs rdiff -u -r1.8 -r1.9 src/lib/libedit/prompt.h
cvs rdiff -u -r1.29 -r1.30 src/lib/libedit/refresh.c
cvs rdiff -u -r1.19 -r1.20 src/lib/libedit/term.h
cvs rdiff -u -r1.1 -r1.2 src/lib/libedit/TEST/tc1.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/lib/libedit/editline.3
diff -u src/lib/libedit/editline.3:1.64 src/lib/libedit/editline.3:1.65
--- src/lib/libedit/editline.3:1.64 Tue Mar 10 18:55:14 2009
+++ src/lib/libedit/editline.3 Tue Mar 31 13:38:27 2009
@@ -1,4 +1,4 @@
-.\" $NetBSD: editline.3,v 1.64 2009/03/10 22:55:14 wiz Exp $
+.\" $NetBSD: editline.3,v 1.65 2009/03/31 17:38:27 christos Exp $
.\"
.\" Copyright (c) 1997-2003 The NetBSD Foundation, Inc.
.\" All rights reserved.
@@ -26,7 +26,7 @@
.\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
.\" POSSIBILITY OF SUCH DAMAGE.
.\"
-.Dd March 10, 2009
+.Dd March 31, 2009
.Dt EDITLINE 3
.Os
.Sh NAME
@@ -218,10 +218,22 @@
.Fa op
are supported, along with the required argument list:
.Bl -tag -width 4n
-.It Dv EL_PROMPT , Fa "char *(*f)(EditLine *)"
+.It Dv EL_PROMPT , Fa "char *(*f)(EditLine *)", Fa "char c"
Define prompt printing function as
.Fa f ,
which is to return a string that contains the prompt.
+The
+.Fa c
+argument indicates the start/stop literal prompt character.
+.Pp
+If a start/stop literal character is found in the prompt, itself
+is not printed, but characters after it are printed directly to the
+terminal without affecting the state of the current line.
+A subsequent second start/stop literal character ends this behavior.
+This is typically used to embed literal escape sequences that change the
+color/style of the terminal in the prompt.
+.Dv 0
+unsets it.
.It Dv EL_REFRESH
Re-display the current line on the next terminal line.
.It Dv EL_RPROMPT , Fa "char *(*f)(EditLine *)"
@@ -437,10 +449,22 @@
are supported, along with actual type of
.Fa result :
.Bl -tag -width 4n
-.It Dv EL_PROMPT , Fa "char *(*f)(EditLine *)"
-Return a pointer to the function that displays the prompt.
-.It Dv EL_RPROMPT , Fa "char *(*f)(EditLine *)"
-Return a pointer to the function that displays the rightside prompt.
+.It Dv EL_PROMPT , Fa "char *(*f)(EditLine *)" , Fa "char *c"
+Return a pointer to the function that displays the prompt in
+.Fa f .
+If
+.Fa c
+is not
+.Dv NULL ,
+return the start/stop literal prompt character in it.
+.It Dv EL_RPROMPT , Fa "char *(*f)(EditLine *)" , Fa "char *c"
+Return a pointer to the function that displays the prompt in
+.Fa f .
+If
+.Fa c
+is not
+.Dv NULL ,
+return the start/stop literal prompt character in it.
.It Dv EL_EDITOR , Fa "const char *"
Return the name of the editor, which will be one of
.Dq emacs
Index: src/lib/libedit/el.c
diff -u src/lib/libedit/el.c:1.50 src/lib/libedit/el.c:1.51
--- src/lib/libedit/el.c:1.50 Fri Feb 20 19:05:23 2009
+++ src/lib/libedit/el.c Tue Mar 31 13:38:27 2009
@@ -1,4 +1,4 @@
-/* $NetBSD: el.c,v 1.50 2009/02/21 00:05:23 christos Exp $ */
+/* $NetBSD: el.c,v 1.51 2009/03/31 17:38:27 christos Exp $ */
/*-
* Copyright (c) 1992, 1993
@@ -37,7 +37,7 @@
#if 0
static char sccsid[] = "@(#)el.c 8.2 (Berkeley) 1/3/94";
#else
-__RCSID("$NetBSD: el.c,v 1.50 2009/02/21 00:05:23 christos Exp $");
+__RCSID("$NetBSD: el.c,v 1.51 2009/03/31 17:38:27 christos Exp $");
#endif
#endif /* not lint && not SCCSID */
@@ -155,9 +155,13 @@
switch (op) {
case EL_PROMPT:
- case EL_RPROMPT:
- rv = prompt_set(el, va_arg(ap, el_pfunc_t), op);
+ case EL_RPROMPT: {
+ el_pfunc_t p = va_arg(ap, el_pfunc_t);
+ char c = va_arg(ap, int);
+
+ rv = prompt_set(el, p, c, op);
break;
+ }
case EL_TERMINAL:
rv = term_set(el, va_arg(ap, char *));
@@ -340,9 +344,13 @@
switch (op) {
case EL_PROMPT:
- case EL_RPROMPT:
- rv = prompt_get(el, va_arg(ap, el_pfunc_t *), op);
+ case EL_RPROMPT: {
+ el_pfunc_t *p = va_arg(ap, el_pfunc_t *);
+ char *c = va_arg(ap, char *);
+
+ rv = prompt_get(el, p, c, op);
break;
+ }
case EL_EDITOR:
rv = map_get_editor(el, va_arg(ap, const char **));
Index: src/lib/libedit/term.c
diff -u src/lib/libedit/term.c:1.50 src/lib/libedit/term.c:1.51
--- src/lib/libedit/term.c:1.50 Sun Feb 15 16:55:23 2009
+++ src/lib/libedit/term.c Tue Mar 31 13:38:27 2009
@@ -1,4 +1,4 @@
-/* $NetBSD: term.c,v 1.50 2009/02/15 21:55:23 christos Exp $ */
+/* $NetBSD: term.c,v 1.51 2009/03/31 17:38:27 christos Exp $ */
/*-
* Copyright (c) 1992, 1993
@@ -37,7 +37,7 @@
#if 0
static char sccsid[] = "@(#)term.c 8.2 (Berkeley) 4/30/95";
#else
-__RCSID("$NetBSD: term.c,v 1.50 2009/02/15 21:55:23 christos Exp $");
+__RCSID("$NetBSD: term.c,v 1.51 2009/03/31 17:38:27 christos Exp $");
#endif
#endif /* not lint && not SCCSID */
@@ -559,7 +559,7 @@
term_move_to_char(el, el->el_term.t_size.h - 1);
term_overwrite(el,
&el->el_display[el->el_cursor.v][el->el_cursor.h],
- 1);
+ (size_t)1);
/* updates Cursor */
del--;
} else {
@@ -646,7 +646,7 @@
*/
term_overwrite(el,
&el->el_display[el->el_cursor.v][el->el_cursor.h],
- where - el->el_cursor.h);
+ (size_t)(where - el->el_cursor.h));
}
} else { /* del < 0 := moving backward */
@@ -680,10 +680,10 @@
* Overstrike num characters
*/
protected void
-term_overwrite(EditLine *el, const char *cp, int n)
+term_overwrite(EditLine *el, const char *cp, size_t n)
{
- if (n <= 0)
- return; /* catch bugs */
+ if (n == 0)
+ return;
if (n > el->el_term.t_size.h) {
#ifdef DEBUG_SCREEN
@@ -692,6 +692,7 @@
#endif /* DEBUG_SCREEN */
return;
}
+
do {
term__putc(el, *cp++);
el->el_cursor.h++;
@@ -784,7 +785,7 @@
if ((num > 1) || !GoodStr(T_ic)) {
/* if ic would be more expensive */
term_tputs(el, tgoto(Str(T_IC), num, num), num);
- term_overwrite(el, cp, num);
+ term_overwrite(el, cp, (size_t)num);
/* this updates el_cursor.h */
return;
}
@@ -1289,9 +1290,9 @@
term_writec(EditLine *el, int c)
{
char buf[8];
- int cnt = key__decode_char(buf, sizeof(buf), 0, c);
+ size_t cnt = key__decode_char(buf, sizeof(buf), 0, c);
buf[cnt] = '\0';
- term_overwrite(el, buf, cnt);
+ term_overwrite(el, buf, (size_t)cnt);
term__flush(el);
}
Index: src/lib/libedit/histedit.h
diff -u src/lib/libedit/histedit.h:1.38 src/lib/libedit/histedit.h:1.39
--- src/lib/libedit/histedit.h:1.38 Fri Feb 20 19:05:23 2009
+++ src/lib/libedit/histedit.h Tue Mar 31 13:38:27 2009
@@ -1,4 +1,4 @@
-/* $NetBSD: histedit.h,v 1.38 2009/02/21 00:05:23 christos Exp $ */
+/* $NetBSD: histedit.h,v 1.39 2009/03/31 17:38:27 christos Exp $ */
/*-
* Copyright (c) 1992, 1993
@@ -115,7 +115,7 @@
/*
* el_set/el_get parameters
*/
-#define EL_PROMPT 0 /* , el_pfunc_t); */
+#define EL_PROMPT 0 /* , el_pfunc_t, char); */
#define EL_TERMINAL 1 /* , const char *); */
#define EL_EDITOR 2 /* , const char *); */
#define EL_SIGNAL 3 /* , int); */
@@ -128,7 +128,7 @@
/* , el_func_t); */
#define EL_HIST 10 /* , hist_fun_t, const char *); */
#define EL_EDITMODE 11 /* , int); */
-#define EL_RPROMPT 12 /* , el_pfunc_t); */
+#define EL_RPROMPT 12 /* , el_pfunc_t, char); */
#define EL_GETCFN 13 /* , el_rfunc_t); */
#define EL_CLIENTDATA 14 /* , void *); */
#define EL_UNBUFFERED 15 /* , int); */
Index: src/lib/libedit/prompt.c
diff -u src/lib/libedit/prompt.c:1.13 src/lib/libedit/prompt.c:1.14
--- src/lib/libedit/prompt.c:1.13 Fri Feb 20 19:05:23 2009
+++ src/lib/libedit/prompt.c Tue Mar 31 13:38:27 2009
@@ -1,4 +1,4 @@
-/* $NetBSD: prompt.c,v 1.13 2009/02/21 00:05:23 christos Exp $ */
+/* $NetBSD: prompt.c,v 1.14 2009/03/31 17:38:27 christos Exp $ */
/*-
* Copyright (c) 1992, 1993
@@ -37,7 +37,7 @@
#if 0
static char sccsid[] = "@(#)prompt.c 8.1 (Berkeley) 6/4/93";
#else
-__RCSID("$NetBSD: prompt.c,v 1.13 2009/02/21 00:05:23 christos Exp $");
+__RCSID("$NetBSD: prompt.c,v 1.14 2009/03/31 17:38:27 christos Exp $");
#endif
#endif /* not lint && not SCCSID */
@@ -87,14 +87,23 @@
{
el_prompt_t *elp;
char *p;
+ int ignore = 0;
if (op == EL_PROMPT)
elp = &el->el_prompt;
else
elp = &el->el_rprompt;
p = (elp->p_func) (el);
- while (*p)
- re_putc(el, *p++, 1);
+ while (*p) {
+ if (elp->p_ignore == *p) {
+ ignore = !ignore;
+ continue;
+ }
+ if (ignore)
+ term__putc(el, *p++);
+ else
+ re_putc(el, *p++, 1);
+ }
elp->p_pos.v = el->el_refresh.r_cursor.v;
elp->p_pos.h = el->el_refresh.r_cursor.h;
@@ -111,10 +120,12 @@
el->el_prompt.p_func = prompt_default;
el->el_prompt.p_pos.v = 0;
el->el_prompt.p_pos.h = 0;
+ el->el_prompt.p_ignore = '\0';
el->el_rprompt.p_func = prompt_default_r;
el->el_rprompt.p_pos.v = 0;
el->el_rprompt.p_pos.h = 0;
- return (0);
+ el->el_rprompt.p_ignore = '\0';
+ return 0;
}
@@ -132,7 +143,7 @@
* Install a prompt printing function
*/
protected int
-prompt_set(EditLine *el, el_pfunc_t prf, int op)
+prompt_set(EditLine *el, el_pfunc_t prf, char c, int op)
{
el_prompt_t *p;
@@ -140,6 +151,7 @@
p = &el->el_prompt;
else
p = &el->el_rprompt;
+
if (prf == NULL) {
if (op == EL_PROMPT)
p->p_func = prompt_default;
@@ -147,9 +159,13 @@
p->p_func = prompt_default_r;
} else
p->p_func = prf;
+
+ p->p_ignore = c;
+
p->p_pos.v = 0;
p->p_pos.h = 0;
- return (0);
+
+ return 0;
}
@@ -157,14 +173,22 @@
* Retrieve the prompt printing function
*/
protected int
-prompt_get(EditLine *el, el_pfunc_t *prf, int op)
+prompt_get(EditLine *el, el_pfunc_t *prf, char *c, int op)
{
+ el_prompt_t *p;
if (prf == NULL)
- return (-1);
+ return -1;
+
if (op == EL_PROMPT)
- *prf = el->el_prompt.p_func;
+ p = &el->el_prompt;
else
- *prf = el->el_rprompt.p_func;
- return (0);
+ p = &el->el_rprompt;
+
+ *prf = el->el_rprompt.p_func;
+
+ if (c)
+ *c = p->p_ignore;
+
+ return 0;
}
Index: src/lib/libedit/prompt.h
diff -u src/lib/libedit/prompt.h:1.8 src/lib/libedit/prompt.h:1.9
--- src/lib/libedit/prompt.h:1.8 Fri Feb 20 19:05:23 2009
+++ src/lib/libedit/prompt.h Tue Mar 31 13:38:27 2009
@@ -1,4 +1,4 @@
-/* $NetBSD: prompt.h,v 1.8 2009/02/21 00:05:23 christos Exp $ */
+/* $NetBSD: prompt.h,v 1.9 2009/03/31 17:38:27 christos Exp $ */
/*-
* Copyright (c) 1992, 1993
@@ -45,13 +45,14 @@
typedef char * (*el_pfunc_t)(EditLine*);
typedef struct el_prompt_t {
- el_pfunc_t p_func; /* Function to return the prompt */
- coord_t p_pos; /* position in the line after prompt */
+ el_pfunc_t p_func; /* Function to return the prompt */
+ coord_t p_pos; /* position in the line after prompt */
+ char p_ignore; /* character to start/end literal */
} el_prompt_t;
protected void prompt_print(EditLine *, int);
-protected int prompt_set(EditLine *, el_pfunc_t, int);
-protected int prompt_get(EditLine *, el_pfunc_t *, int);
+protected int prompt_set(EditLine *, el_pfunc_t, char, int);
+protected int prompt_get(EditLine *, el_pfunc_t *, char *, int);
protected int prompt_init(EditLine *);
protected void prompt_end(EditLine *);
Index: src/lib/libedit/refresh.c
diff -u src/lib/libedit/refresh.c:1.29 src/lib/libedit/refresh.c:1.30
--- src/lib/libedit/refresh.c:1.29 Sun Feb 15 16:55:23 2009
+++ src/lib/libedit/refresh.c Tue Mar 31 13:38:27 2009
@@ -1,4 +1,4 @@
-/* $NetBSD: refresh.c,v 1.29 2009/02/15 21:55:23 christos Exp $ */
+/* $NetBSD: refresh.c,v 1.30 2009/03/31 17:38:27 christos Exp $ */
/*-
* Copyright (c) 1992, 1993
@@ -37,7 +37,7 @@
#if 0
static char sccsid[] = "@(#)refresh.c 8.1 (Berkeley) 6/4/93";
#else
-__RCSID("$NetBSD: refresh.c,v 1.29 2009/02/15 21:55:23 christos Exp $");
+__RCSID("$NetBSD: refresh.c,v 1.30 2009/03/31 17:38:27 christos Exp $");
#endif
#endif /* not lint && not SCCSID */
@@ -300,7 +300,7 @@
term_move_to_char(el, 0);
term_clear_EOL(el, (int) strlen(el->el_display[i]));
#ifdef DEBUG_REFRESH
- term_overwrite(el, "C\b", 2);
+ term_overwrite(el, "C\b", (size_t)2);
#endif /* DEBUG_REFRESH */
el->el_display[i][0] = '\0';
}
@@ -477,6 +477,7 @@
char *ofd, *ols, *oe, *nfd, *nls, *ne;
char *osb, *ose, *nsb, *nse;
int fx, sx;
+ size_t len;
/*
* find first diff
@@ -761,14 +762,14 @@
* write (nsb-nfd) - fx chars of new starting at
* (nfd + fx)
*/
- term_overwrite(el, (nfd + fx),
- (int)((nsb - nfd) - fx));
- re__strncopy(ofd + fx, nfd + fx,
- (size_t) ((nsb - nfd) - fx));
+ len = (size_t) ((nsb - nfd) - fx);
+ term_overwrite(el, (nfd + fx), len);
+ re__strncopy(ofd + fx, nfd + fx, len);
} else {
ELRE_DEBUG(1, (__F, "without anything to save\r\n"));
- term_overwrite(el, nfd, (int)(nsb - nfd));
- re__strncopy(ofd, nfd, (size_t) (nsb - nfd));
+ len = (size_t)(nsb - nfd);
+ term_overwrite(el, nfd, len);
+ re__strncopy(ofd, nfd, len);
/*
* Done
*/
@@ -800,8 +801,9 @@
/*
* write (nsb-nfd) chars of new starting at nfd
*/
- term_overwrite(el, nfd, (int)(nsb - nfd));
- re__strncopy(ofd, nfd, (size_t) (nsb - nfd));
+ len = (size_t) (nsb - nfd);
+ term_overwrite(el, nfd, len);
+ re__strncopy(ofd, nfd, len);
} else {
ELRE_DEBUG(1, (__F,
@@ -809,7 +811,7 @@
/*
* write (nsb-nfd) chars of new starting at nfd
*/
- term_overwrite(el, nfd, (int)(nsb - nfd));
+ term_overwrite(el, nfd, (size_t)(nsb - nfd));
re_clear_eol(el, fx, sx,
(int)((oe - old) - (ne - new)));
/*
@@ -847,11 +849,11 @@
/*
* write (nls-nse) chars of new starting at nse
*/
- term_overwrite(el, nse, (int)(nls - nse));
+ term_overwrite(el, nse, (size_t)(nls - nse));
} else {
ELRE_DEBUG(1, (__F,
"but with nothing left to save\r\n"));
- term_overwrite(el, nse, (int)(nls - nse));
+ term_overwrite(el, nse, (size_t)(nls - nse));
re_clear_eol(el, fx, sx,
(int)((oe - old) - (ne - new)));
}
@@ -889,14 +891,14 @@
* write (nsb-nfd) - fx chars of new starting at
* (nfd + fx)
*/
- term_overwrite(el, (nfd + fx),
- (int)((nsb - nfd) - fx));
- re__strncopy(ofd + fx, nfd + fx,
- (size_t) ((nsb - nfd) - fx));
+ len = (size_t) ((nsb - nfd) - fx);
+ term_overwrite(el, (nfd + fx), len);
+ re__strncopy(ofd + fx, nfd + fx, len);
} else {
ELRE_DEBUG(1, (__F, "without anything to save\r\n"));
- term_overwrite(el, nfd, (int)(nsb - nfd));
- re__strncopy(ofd, nfd, (size_t) (nsb - nfd));
+ len = (size_t) (nsb - nfd);
+ term_overwrite(el, nfd, len);
+ re__strncopy(ofd, nfd, len);
}
}
/*
@@ -919,10 +921,10 @@
* (nse + sx)
*/
term_overwrite(el, (nse + sx),
- (int)((nls - nse) - sx));
+ (size_t)((nls - nse) - sx));
} else {
ELRE_DEBUG(1, (__F, "without anything to save\r\n"));
- term_overwrite(el, nse, (int)(nls - nse));
+ term_overwrite(el, nse, (size_t)(nls - nse));
/*
* No need to do a clear-to-end here because we were
Index: src/lib/libedit/term.h
diff -u src/lib/libedit/term.h:1.19 src/lib/libedit/term.h:1.20
--- src/lib/libedit/term.h:1.19 Wed Sep 10 11:45:37 2008
+++ src/lib/libedit/term.h Tue Mar 31 13:38:27 2009
@@ -1,4 +1,4 @@
-/* $NetBSD: term.h,v 1.19 2008/09/10 15:45:37 christos Exp $ */
+/* $NetBSD: term.h,v 1.20 2009/03/31 17:38:27 christos Exp $ */
/*-
* Copyright (c) 1992, 1993
@@ -84,7 +84,7 @@
protected void term_move_to_line(EditLine *, int);
protected void term_move_to_char(EditLine *, int);
protected void term_clear_EOL(EditLine *, int);
-protected void term_overwrite(EditLine *, const char *, int);
+protected void term_overwrite(EditLine *, const char *, size_t);
protected void term_insertwrite(EditLine *, char *, int);
protected void term_deletechars(EditLine *, int);
protected void term_clear_screen(EditLine *);
Index: src/lib/libedit/TEST/tc1.c
diff -u src/lib/libedit/TEST/tc1.c:1.1 src/lib/libedit/TEST/tc1.c:1.2
--- src/lib/libedit/TEST/tc1.c:1.1 Thu Aug 31 16:20:38 2006
+++ src/lib/libedit/TEST/tc1.c Tue Mar 31 13:38:27 2009
@@ -1,4 +1,4 @@
-/* $NetBSD: tc1.c,v 1.1 2006/08/31 20:20:38 rpaulo Exp $ */
+/* $NetBSD: tc1.c,v 1.2 2009/03/31 17:38:27 christos Exp $ */
/*-
* Copyright (c) 1992, 1993
@@ -42,7 +42,7 @@
#if 0
static char sccsid[] = "@(#)test.c 8.1 (Berkeley) 6/4/93";
#else
-__RCSID("$NetBSD: tc1.c,v 1.1 2006/08/31 20:20:38 rpaulo Exp $");
+__RCSID("$NetBSD: tc1.c,v 1.2 2009/03/31 17:38:27 christos Exp $");
#endif
#endif /* not lint && not SCCSID */
@@ -71,7 +71,7 @@
static char *
prompt(EditLine *el)
{
- static char a[] = "Edit$ ";
+ static char a[] = "\1\e[7m\1Edit$\1\e[0m\1 ";
static char b[] = "Edit> ";
return (continuation ? b : a);
@@ -146,7 +146,7 @@
el_set(el, EL_EDITOR, "vi"); /* Default editor is vi */
el_set(el, EL_SIGNAL, 1); /* Handle signals gracefully */
- el_set(el, EL_PROMPT, prompt); /* Set the prompt function */
+ el_set(el, EL_PROMPT, prompt, '\1');/* Set the prompt function */
/* Tell editline to use this history interface */
el_set(el, EL_HIST, history, hist);