summaryrefslogtreecommitdiff
path: root/builtins/read.def
diff options
context:
space:
mode:
authorChet Ramey <chet.ramey@case.edu>2011-12-07 09:08:27 -0500
committerChet Ramey <chet.ramey@case.edu>2011-12-07 09:08:27 -0500
commitb0c16657b4514191b4f6c328615d162726758247 (patch)
tree699cabe601ecbb4ffb42f52bc78e3c6d972d1f9c /builtins/read.def
parentd7f499903c4fd2559900f12ec3712d234869eddc (diff)
downloadbash-b0c16657b4514191b4f6c328615d162726758247.tar.gz
commit bash-20070523 snapshot
Diffstat (limited to 'builtins/read.def')
-rw-r--r--builtins/read.def64
1 files changed, 62 insertions, 2 deletions
diff --git a/builtins/read.def b/builtins/read.def
index 0739059f..e5aff643 100644
--- a/builtins/read.def
+++ b/builtins/read.def
@@ -94,6 +94,9 @@ static void set_eol_delim __P((int));
static void reset_eol_delim __P((char *));
#endif
static SHELL_VAR *bind_read_variable __P((char *, char *));
+#if defined (HANDLE_MULTIBYTE)
+static int read_mbchar __P((int, char *, int, int, int));
+#endif
static sighandler sigalrm __P((int));
static void reset_alarm __P((void));
@@ -441,7 +444,7 @@ read_builtin (list)
}
#endif
- if (i + 2 >= size)
+ if (i + 4 >= size) /* XXX was i + 2; use i + 4 for multibyte/read_mbchar */
{
input_string = (char *)xrealloc (input_string, size += 128);
remove_unwind_protect ();
@@ -456,7 +459,7 @@ read_builtin (list)
if (c == '\n')
{
i--; /* back up over the CTLESC */
- if (interactive && raw == 0)
+ if (interactive && input_is_tty && raw == 0)
print_ps2 = 1;
}
else
@@ -487,6 +490,15 @@ read_builtin (list)
add_char:
input_string[i++] = c;
+
+#if defined (HANDLE_MULTIBYTE)
+ if (nchars > 0 && MB_CUR_MAX > 1)
+ {
+ input_string[i] = '\0'; /* for simplicity and debugging */
+ i += read_mbchar (fd, input_string, i, c, unbuffered_read);
+ }
+#endif
+
nr++;
if (nchars > 0 && nr >= nchars)
@@ -721,6 +733,54 @@ bind_read_variable (name, value)
#endif /* !ARRAY_VARS */
}
+#if defined (HANDLE_MULTIBYTE)
+static int
+read_mbchar (fd, string, ind, ch, unbuffered)
+ int fd;
+ char *string;
+ int ind, ch, unbuffered;
+{
+ char mbchar[MB_LEN_MAX + 1];
+ int i, n, r;
+ char c;
+ size_t ret;
+ mbstate_t ps, ps_back;
+ wchar_t wc;
+
+ memset (&ps, '\0', sizeof (mbstate_t));
+ memset (&ps_back, '\0', sizeof (mbstate_t));
+
+ mbchar[0] = ch;
+ i = 1;
+ for (n = 0; n <= MB_LEN_MAX; n++)
+ {
+ ps_back = ps;
+ ret = mbrtowc (&wc, mbchar, i, &ps);
+ if (ret == (size_t)-2)
+ {
+ ps = ps_back;
+ if (unbuffered)
+ r = zread (fd, &c, 1);
+ else
+ r = zreadc (fd, &c);
+ if (r < 0)
+ goto mbchar_return;
+ mbchar[i++] = c;
+ continue;
+ }
+ else if (ret == (size_t)-1 || ret == (size_t)0 || ret > (size_t)0)
+ break;
+ }
+
+mbchar_return:
+ if (i > 1) /* read a multibyte char */
+ /* mbchar[0] is already string[ind-1] */
+ for (r = 1; r < i; r++)
+ string[ind+r-1] = mbchar[r];
+ return i - 1;
+}
+#endif
+
#if defined (READLINE)
static rl_completion_func_t *old_attempted_completion_function = 0;