summaryrefslogtreecommitdiff
path: root/Src
diff options
context:
space:
mode:
Diffstat (limited to 'Src')
-rw-r--r--Src/params.c3
-rw-r--r--Src/utils.c42
2 files changed, 29 insertions, 16 deletions
diff --git a/Src/params.c b/Src/params.c
index 2b0837e03..f5750a4b4 100644
--- a/Src/params.c
+++ b/Src/params.c
@@ -4748,6 +4748,7 @@ setlang(char *x)
if ((x = getsparam_u(ln->name)) && *x)
setlocale(ln->category, x);
unqueue_signals();
+ inittyptab();
}
/**/
@@ -4771,6 +4772,7 @@ lc_allsetfn(Param pm, char *x)
else {
setlocale(LC_ALL, unmeta(x));
clear_mbstate();
+ inittyptab();
}
}
@@ -4809,6 +4811,7 @@ lcsetfn(Param pm, char *x)
}
unqueue_signals();
clear_mbstate(); /* LC_CTYPE may have changed */
+ inittyptab();
}
#endif /* USE_LOCALE */
diff --git a/Src/utils.c b/Src/utils.c
index f13e3a79d..94a33453f 100644
--- a/Src/utils.c
+++ b/Src/utils.c
@@ -74,9 +74,6 @@ set_widearray(char *mb_array, Widechar_array wca)
}
wca->len = 0;
- if (!isset(MULTIBYTE))
- return;
-
if (mb_array) {
VARARR(wchar_t, tmpwcs, strlen(mb_array));
wchar_t *wcptr = tmpwcs;
@@ -87,8 +84,7 @@ set_widearray(char *mb_array, Widechar_array wca)
int mblen;
if ((unsigned char) *mb_array <= 0x7f) {
- mb_array++;
- *wcptr++ = (wchar_t)*mb_array;
+ *wcptr++ = (wchar_t)*mb_array++;
continue;
}
@@ -4121,8 +4117,9 @@ inittyptab(void)
* having IIDENT here is a good idea at all, but this code
* should disappear into history...
*/
- for (t0 = 0240; t0 != 0400; t0++)
- typtab[t0] = IALPHA | IALNUM | IIDENT | IUSER | IWORD;
+ if isset(MULTIBYTE)
+ for (t0 = 0240; t0 != 0400; t0++)
+ typtab[t0] = IALPHA | IALNUM | IIDENT | IUSER | IWORD;
#endif
/* typtab['.'] |= IIDENT; */ /* Allow '.' in variable names - broken */
typtab['_'] = IIDENT | IUSER;
@@ -4137,11 +4134,24 @@ inittyptab(void)
typtab[t0] |= ITOK | IMETA;
for (t0 = (int) (unsigned char) Snull; t0 <= (int) (unsigned char) Nularg; t0++)
typtab[t0] |= ITOK | IMETA | INULL;
- for (s = ifs ? ifs : EMULATION(EMULATE_KSH|EMULATE_SH) ?
- DEFAULT_IFS_SH : DEFAULT_IFS; *s; s++) {
+ /* ifs */
+#define CURRENT_DEFAULT_IFS (EMULATION(EMULATE_KSH|EMULATE_SH) ? \
+ DEFAULT_IFS_SH : DEFAULT_IFS)
+#ifdef MULTIBYTE_SUPPORT
+ if (isset(MULTIBYTE)) {
+ set_widearray(ifs ? ifs : CURRENT_DEFAULT_IFS, &ifs_wide);
+ if (ifs && !ifs_wide.chars) {
+ zwarn("IFS has an invalid character; resetting IFS to default");
+ zsfree(ifs);
+ ifs = ztrdup(CURRENT_DEFAULT_IFS);
+ set_widearray(ifs, &ifs_wide);
+ }
+ }
+#endif
+ for (s = ifs ? ifs : CURRENT_DEFAULT_IFS; *s; s++) {
int c = (unsigned char) (*s == Meta ? *++s ^ 32 : *s);
#ifdef MULTIBYTE_SUPPORT
- if (!isascii(c)) {
+ if (isset(MULTIBYTE) && !isascii(c)) {
/* see comment for wordchars below */
continue;
}
@@ -4154,10 +4164,15 @@ inittyptab(void)
}
typtab[c] |= ISEP;
}
+ /* wordchars */
+#ifdef MULTIBYTE_SUPPORT
+ if (isset(MULTIBYTE))
+ set_widearray(wordchars, &wordchars_wide);
+#endif
for (s = wordchars ? wordchars : DEFAULT_WORDCHARS; *s; s++) {
int c = (unsigned char) (*s == Meta ? *++s ^ 32 : *s);
#ifdef MULTIBYTE_SUPPORT
- if (!isascii(c)) {
+ if (isset(MULTIBYTE) && !isascii(c)) {
/*
* If we have support for multibyte characters, we don't
* handle non-ASCII characters here; instead, we turn
@@ -4170,11 +4185,6 @@ inittyptab(void)
#endif
typtab[c] |= IWORD;
}
-#ifdef MULTIBYTE_SUPPORT
- set_widearray(wordchars, &wordchars_wide);
- set_widearray(ifs ? ifs : EMULATION(EMULATE_KSH|EMULATE_SH) ?
- DEFAULT_IFS_SH : DEFAULT_IFS, &ifs_wide);
-#endif
for (s = SPECCHARS; *s; s++)
typtab[(unsigned char) *s] |= ISPECIAL;
if (typtab_flags & ZTF_SP_COMMA)