summaryrefslogtreecommitdiff
path: root/Src
diff options
context:
space:
mode:
Diffstat (limited to 'Src')
-rw-r--r--Src/Modules/curses.c2
-rw-r--r--Src/Zle/comp.h5
-rw-r--r--Src/Zle/zle.h2
-rw-r--r--Src/Zle/zle_main.c2
-rw-r--r--Src/Zle/zle_params.c30
-rw-r--r--Src/compat.c2
-rw-r--r--Src/hist.c6
-rw-r--r--Src/pattern.c43
-rw-r--r--Src/zsh.h17
9 files changed, 92 insertions, 17 deletions
diff --git a/Src/Modules/curses.c b/Src/Modules/curses.c
index 62dbd55ea..0054aef52 100644
--- a/Src/Modules/curses.c
+++ b/Src/Modules/curses.c
@@ -339,7 +339,7 @@ zcurses_colorget(const char *nam, char *colorpair)
return NULL;
if (zc_color_phase==1 ||
- !(cpn = (Colorpairnode) gethashnode(zcurses_colorpairs, colorpair))) {
+ !(cpn = (Colorpairnode) gethashnode2(zcurses_colorpairs, colorpair))) {
zc_color_phase = 2;
cp = ztrdup(colorpair);
diff --git a/Src/Zle/comp.h b/Src/Zle/comp.h
index 34da2cabb..023c41814 100644
--- a/Src/Zle/comp.h
+++ b/Src/Zle/comp.h
@@ -202,8 +202,9 @@ struct cpattern {
* TODO: this will change.
*/
#ifdef MULTIBYTE_SUPPORT
-#define PATMATCHRANGE(r, c, ip, mtp) mb_patmatchrange(r, c, ip, mtp)
-#define PATMATCHINDEX(r, i, cp, mtp) mb_patmatchindex(r, i, cp, mtp)
+#define PATMATCHRANGE(r, c, ip, mtp) \
+ mb_patmatchrange(r, c, ZMB_VALID, ip, mtp)
+#define PATMATCHINDEX(r, i, cp, mtp) mb_patmatchindex(r, i, cp, mtp)
#define CONVCAST(c) ((wchar_t)(c))
#define CHR_INVALID (WEOF)
#else
diff --git a/Src/Zle/zle.h b/Src/Zle/zle.h
index 59f459185..2d672de3b 100644
--- a/Src/Zle/zle.h
+++ b/Src/Zle/zle.h
@@ -431,6 +431,8 @@ struct region_highlight {
* 2: suffix
* 3: pasted text
*/
+/* If you change this, update the documentation of zle_highlight/region_highlight
+ * interaction in Doc/Zsh/zle.yo. */
#define N_SPECIAL_HIGHLIGHTS (4)
diff --git a/Src/Zle/zle_main.c b/Src/Zle/zle_main.c
index e610ae1f3..ec3d2c354 100644
--- a/Src/Zle/zle_main.c
+++ b/Src/Zle/zle_main.c
@@ -1276,7 +1276,7 @@ zleread(char **lp, char **rp, int flags, int context, char *init, char *finish)
alarm(0);
freeundo();
- if (eofsent || errflag) {
+ if (eofsent || errflag || exit_pending) {
s = NULL;
} else {
zleline[zlell++] = ZWC('\n');
diff --git a/Src/Zle/zle_params.c b/Src/Zle/zle_params.c
index b84e72088..000bc388c 100644
--- a/Src/Zle/zle_params.c
+++ b/Src/Zle/zle_params.c
@@ -97,6 +97,12 @@ static const struct gsu_integer undo_change_no_gsu =
{ get_undo_current_change, NULL, zleunsetfn };
static const struct gsu_integer undo_limit_no_gsu =
{ get_undo_limit_change, set_undo_limit_change, zleunsetfn };
+static const struct gsu_integer yankstart_gsu =
+{ get_yankstart, NULL, zleunsetfn };
+static const struct gsu_integer yankend_gsu =
+{ get_yankend, NULL, zleunsetfn };
+static const struct gsu_integer yankactive_gsu =
+{ get_yankactive, NULL, zleunsetfn };
static const struct gsu_array killring_gsu =
{ get_killring, set_killring, unset_killring };
@@ -143,6 +149,9 @@ static struct zleparam {
{ "WIDGET", PM_SCALAR | PM_READONLY, GSU(widget_gsu), NULL },
{ "WIDGETFUNC", PM_SCALAR | PM_READONLY, GSU(widgetfunc_gsu), NULL },
{ "WIDGETSTYLE", PM_SCALAR | PM_READONLY, GSU(widgetstyle_gsu), NULL },
+ { "YANK_START", PM_INTEGER | PM_READONLY, GSU(yankstart_gsu), NULL },
+ { "YANK_END", PM_INTEGER | PM_READONLY, GSU(yankend_gsu), NULL },
+ { "YANK_ACTIVE", PM_INTEGER | PM_READONLY, GSU(yankactive_gsu), NULL },
{ "ZLE_STATE", PM_SCALAR | PM_READONLY, GSU(zle_state_gsu), NULL },
{ NULL, 0, NULL, NULL }
};
@@ -477,6 +486,27 @@ get_pending(UNUSED(Param pm))
}
/**/
+static zlong
+get_yankstart(UNUSED(Param pm))
+{
+ return yankb;
+}
+
+/**/
+static zlong
+get_yankend(UNUSED(Param pm))
+{
+ return yanke;
+}
+
+/**/
+static zlong
+get_yankactive(UNUSED(Param pm))
+{
+ return lastcmd & ZLE_YANK;
+}
+
+/**/
static char *
get_cutbuffer(UNUSED(Param pm))
{
diff --git a/Src/compat.c b/Src/compat.c
index db468529a..9041c0bed 100644
--- a/Src/compat.c
+++ b/Src/compat.c
@@ -448,7 +448,7 @@ zgetcwd(void)
}
#endif /* HAVE_GETCWD */
if (!ret)
- ret = pwd;
+ ret = unmeta(pwd);
if (!ret)
ret = dupstring(".");
return ret;
diff --git a/Src/hist.c b/Src/hist.c
index 75e809c48..9c42d85c9 100644
--- a/Src/hist.c
+++ b/Src/hist.c
@@ -390,6 +390,12 @@ ihgetc(void)
{
int c = ingetc();
+ if (exit_pending)
+ {
+ lexstop = 1;
+ errflag |= ERRFLAG_ERROR;
+ return ' ';
+ }
qbang = 0;
if (!stophist && !(inbufflags & INP_ALIAS)) {
/* If necessary, expand history characters. */
diff --git a/Src/pattern.c b/Src/pattern.c
index b4ba33e49..3b55ccf1c 100644
--- a/Src/pattern.c
+++ b/Src/pattern.c
@@ -145,7 +145,7 @@ typedef union upat *Upat;
*
* P_ANY, P_ANYOF: the operand is a null terminated
* string. Normal characters match as expected. Characters
- * in the range Meta+PP_ALPHA..Meta+PP_UNKNWN do the appropriate
+ * in the range Meta+PP_ALPHA..Meta+PP_UNKWN do the appropriate
* Posix range tests. This relies on imeta returning true for these
* characters. We treat unknown POSIX ranges as never matching.
* PP_RANGE means the next two (possibly metafied) characters form
@@ -1119,7 +1119,7 @@ patgetglobflags(char **strp, long *assertp, int *ignore)
static const char *colon_stuffs[] = {
"alpha", "alnum", "ascii", "blank", "cntrl", "digit", "graph",
"lower", "print", "punct", "space", "upper", "xdigit", "IDENT",
- "IFS", "IFSSPACE", "WORD", NULL
+ "IFS", "IFSSPACE", "WORD", "INCOMPLETE", "INVALID", NULL
};
/*
@@ -1870,9 +1870,9 @@ static int globdots; /* Glob initial dots? */
#ifdef MULTIBYTE_SUPPORT
/* Get a character from the start point in a string */
-#define CHARREF(x, y) charref((x), (y))
+#define CHARREF(x, y) charref((x), (y), (int *)NULL)
static wchar_t
-charref(char *x, char *y)
+charref(char *x, char *y, int *zmb_ind)
{
wchar_t wc;
size_t ret;
@@ -1886,9 +1886,13 @@ charref(char *x, char *y)
/* Error. */
/* Reset the shift state for next time. */
memset(&shiftstate, 0, sizeof(shiftstate));
+ if (zmb_ind)
+ *zmb_ind = (ret == MB_INVALID) ? ZMB_INVALID : ZMB_INCOMPLETE;
return WCHAR_INVALID(*x);
}
+ if (zmb_ind)
+ *zmb_ind = ZMB_VALID;
return wc;
}
@@ -2580,10 +2584,11 @@ patmatch(Upat prog)
fail = 1;
else {
#ifdef MULTIBYTE_SUPPORT
- wchar_t cr = CHARREF(patinput, patinend);
+ int zmb_ind;
+ wchar_t cr = charref(patinput, patinend, &zmb_ind);
char *scanop = (char *)P_OPERAND(scan);
if (patglobflags & GF_MULTIBYTE) {
- if (mb_patmatchrange(scanop, cr, NULL, NULL) ^
+ if (mb_patmatchrange(scanop, cr, zmb_ind, NULL, NULL) ^
(P_OP(scan) == P_ANYOF))
fail = 1;
else
@@ -3351,6 +3356,9 @@ patmatch(Upat prog)
* The null-terminated specification is in range; the test
* character is in ch.
*
+ * zmb is one of the enum defined above charref(), for indicating
+ * incomplete or invalid multibyte characters.
+ *
* indptr is used by completion matching, which is why this
* function is exported. If indptr is not NULL we set *indptr
* to the index of the character in the range string, adjusted
@@ -3367,7 +3375,7 @@ patmatch(Upat prog)
/**/
mod_export int
-mb_patmatchrange(char *range, wchar_t ch, wint_t *indptr, int *mtp)
+mb_patmatchrange(char *range, wchar_t ch, int zmb_ind, wint_t *indptr, int *mtp)
{
wchar_t r1, r2;
@@ -3476,6 +3484,14 @@ mb_patmatchrange(char *range, wchar_t ch, wint_t *indptr, int *mtp)
*indptr += r2 - r1;
}
break;
+ case PP_INCOMPLETE:
+ if (zmb_ind == ZMB_INCOMPLETE)
+ return 1;
+ break;
+ case PP_INVALID:
+ if (zmb_ind == ZMB_INVALID)
+ return 1;
+ break;
case PP_UNKWN:
DPUTS(1, "BUG: unknown posix range passed through.\n");
break;
@@ -3545,6 +3561,8 @@ mb_patmatchindex(char *range, wint_t ind, wint_t *chr, int *mtp)
case PP_IFS:
case PP_IFSSPACE:
case PP_WORD:
+ case PP_INCOMPLETE:
+ case PP_INVALID:
if (!ind) {
*mtp = swtype;
return 1;
@@ -3698,6 +3716,10 @@ patmatchrange(char *range, int ch, int *indptr, int *mtp)
if (indptr && r1 < r2)
*indptr += r2 - r1;
break;
+ case PP_INCOMPLETE:
+ case PP_INVALID:
+ /* Never true if not in multibyte mode */
+ break;
case PP_UNKWN:
DPUTS(1, "BUG: unknown posix range passed through.\n");
break;
@@ -3768,6 +3790,8 @@ patmatchindex(char *range, int ind, int *chr, int *mtp)
case PP_IFS:
case PP_IFSSPACE:
case PP_WORD:
+ case PP_INCOMPLETE:
+ case PP_INVALID:
if (!ind) {
*mtp = swtype;
return 1;
@@ -3851,9 +3875,10 @@ static int patrepeat(Upat p, char *charstart)
case P_ANYBUT:
while (scan < patinend) {
#ifdef MULTIBYTE_SUPPORT
- wchar_t cr = CHARREF(scan, patinend);
+ int zmb_ind;
+ wchar_t cr = charref(scan, patinend, &zmb_ind);
if (patglobflags & GF_MULTIBYTE) {
- if (mb_patmatchrange(opnd, cr, NULL, NULL) ^
+ if (mb_patmatchrange(opnd, cr, zmb_ind, NULL, NULL) ^
(P_OP(p) == P_ANYOF))
break;
} else if (patmatchrange(opnd, (int)cr, NULL, NULL) ^
diff --git a/Src/zsh.h b/Src/zsh.h
index a99c90065..4e2cb656e 100644
--- a/Src/zsh.h
+++ b/Src/zsh.h
@@ -1562,13 +1562,15 @@ typedef struct zpc_disables_save *Zpc_disables_save;
#define PP_IFS 15
#define PP_IFSSPACE 16
#define PP_WORD 17
+#define PP_INCOMPLETE 18
+#define PP_INVALID 19
/* Special value for last definition */
-#define PP_LAST 17
+#define PP_LAST 19
/* Unknown type. Not used in a valid token. */
-#define PP_UNKWN 18
+#define PP_UNKWN 20
/* Range: token followed by the (possibly multibyte) start and end */
-#define PP_RANGE 19
+#define PP_RANGE 21
/* Globbing flags: lower 8 bits gives approx count */
#define GF_LCMATCHUC 0x0100
@@ -1577,6 +1579,15 @@ typedef struct zpc_disables_save *Zpc_disables_save;
#define GF_MATCHREF 0x0800
#define GF_MULTIBYTE 0x1000 /* Use multibyte if supported by build */
+enum {
+ /* Valid multibyte character from charref */
+ ZMB_VALID,
+ /* Incomplete multibyte character from charref */
+ ZMB_INCOMPLETE,
+ /* Invalid multibyte character charref */
+ ZMB_INVALID
+};
+
/* Dummy Patprog pointers. Used mainly in executable code, but the
* pattern code needs to know about it, too. */