diff options
author | Chet Ramey <chet.ramey@case.edu> | 2011-12-07 09:08:27 -0500 |
---|---|---|
committer | Chet Ramey <chet.ramey@case.edu> | 2011-12-07 09:08:27 -0500 |
commit | b0c16657b4514191b4f6c328615d162726758247 (patch) | |
tree | 699cabe601ecbb4ffb42f52bc78e3c6d972d1f9c /builtins/read.def | |
parent | d7f499903c4fd2559900f12ec3712d234869eddc (diff) | |
download | bash-b0c16657b4514191b4f6c328615d162726758247.tar.gz |
commit bash-20070523 snapshot
Diffstat (limited to 'builtins/read.def')
-rw-r--r-- | builtins/read.def | 64 |
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; |