diff options
Diffstat (limited to 'Src')
-rw-r--r-- | Src/Modules/curses.c | 2 | ||||
-rw-r--r-- | Src/Zle/comp.h | 5 | ||||
-rw-r--r-- | Src/Zle/zle.h | 2 | ||||
-rw-r--r-- | Src/Zle/zle_main.c | 2 | ||||
-rw-r--r-- | Src/Zle/zle_params.c | 30 | ||||
-rw-r--r-- | Src/compat.c | 2 | ||||
-rw-r--r-- | Src/hist.c | 6 | ||||
-rw-r--r-- | Src/pattern.c | 43 | ||||
-rw-r--r-- | Src/zsh.h | 17 |
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) ^ @@ -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. */ |