mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
* ext/curses/curses.c: curses encoding should obey locale.
* ext/curses/curses.c (curses_getch): 1.9 getch should return one character string for single byte string. wchar_t support may follow in the future. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@20145 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
551dfe9d8b
commit
80d16e7403
5 changed files with 77 additions and 17 deletions
|
@ -1,3 +1,11 @@
|
||||||
|
Sat Nov 8 06:20:42 2008 Yukihiro Matsumoto <matz@ruby-lang.org>
|
||||||
|
|
||||||
|
* ext/curses/curses.c: curses encoding should obey locale.
|
||||||
|
|
||||||
|
* ext/curses/curses.c (curses_getch): 1.9 getch should return one
|
||||||
|
character string for single byte string. wchar_t support may
|
||||||
|
follow in the future.
|
||||||
|
|
||||||
Sat Nov 8 05:46:50 2008 Nobuyoshi Nakada <nobu@ruby-lang.org>
|
Sat Nov 8 05:46:50 2008 Nobuyoshi Nakada <nobu@ruby-lang.org>
|
||||||
|
|
||||||
* include/ruby/io.h (rb_io_t): added write_lock to serialize.
|
* include/ruby/io.h (rb_io_t): added write_lock to serialize.
|
||||||
|
|
|
@ -307,13 +307,35 @@ curses_flash(VALUE obj)
|
||||||
return Qnil;
|
return Qnil;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
curses_char(VALUE c)
|
||||||
|
{
|
||||||
|
if (FIXNUM_P(c)) {
|
||||||
|
return NUM2INT(c);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
int cc;
|
||||||
|
|
||||||
|
StringValue(c);
|
||||||
|
if (RSTRING_LEN(c) == 0 || RSTRING_LEN(c) > 1) {
|
||||||
|
rb_raise(rb_eArgError, "string not corresponding a character");
|
||||||
|
}
|
||||||
|
cc = RSTRING_PTR(c)[0];
|
||||||
|
if (cc > 0x7f) {
|
||||||
|
rb_raise(rb_eArgError, "no multibyte string supported (yet)");
|
||||||
|
}
|
||||||
|
return cc;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* def ungetch */
|
/* def ungetch */
|
||||||
static VALUE
|
static VALUE
|
||||||
curses_ungetch(VALUE obj, VALUE ch)
|
curses_ungetch(VALUE obj, VALUE ch)
|
||||||
{
|
{
|
||||||
#ifdef HAVE_UNGETCH
|
#ifdef HAVE_UNGETCH
|
||||||
|
int c = curses_char(ch);
|
||||||
curses_stdscr();
|
curses_stdscr();
|
||||||
ungetch(NUM2INT(ch));
|
ungetch(c);
|
||||||
#else
|
#else
|
||||||
rb_notimplement();
|
rb_notimplement();
|
||||||
#endif
|
#endif
|
||||||
|
@ -375,9 +397,11 @@ curses_insch(VALUE obj, VALUE ch)
|
||||||
static VALUE
|
static VALUE
|
||||||
curses_addstr(VALUE obj, VALUE str)
|
curses_addstr(VALUE obj, VALUE str)
|
||||||
{
|
{
|
||||||
|
StringValue(str);
|
||||||
|
str = rb_str_export_locale(str);
|
||||||
curses_stdscr();
|
curses_stdscr();
|
||||||
if (!NIL_P(str)) {
|
if (!NIL_P(str)) {
|
||||||
addstr(STR2CSTR(str));
|
addstr(StringValueCStr(str));
|
||||||
}
|
}
|
||||||
return Qnil;
|
return Qnil;
|
||||||
}
|
}
|
||||||
|
@ -386,9 +410,18 @@ curses_addstr(VALUE obj, VALUE str)
|
||||||
static VALUE
|
static VALUE
|
||||||
curses_getch(VALUE obj)
|
curses_getch(VALUE obj)
|
||||||
{
|
{
|
||||||
|
int c;
|
||||||
|
|
||||||
rb_read_check(stdin);
|
rb_read_check(stdin);
|
||||||
curses_stdscr();
|
curses_stdscr();
|
||||||
return UINT2NUM(getch());
|
c = getch();
|
||||||
|
if (c == EOF) return Qnil;
|
||||||
|
if (ISPRINT(c)) {
|
||||||
|
char ch = (char)c;
|
||||||
|
|
||||||
|
return rb_locale_str_new(&ch, 1);
|
||||||
|
}
|
||||||
|
return UINT2NUM(c);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* def getstr */
|
/* def getstr */
|
||||||
|
@ -403,7 +436,7 @@ curses_getstr(VALUE obj)
|
||||||
#else
|
#else
|
||||||
getstr(rtn);
|
getstr(rtn);
|
||||||
#endif
|
#endif
|
||||||
return rb_tainted_str_new2(rtn);
|
return rb_locale_str_new_cstr(rtn);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* def delch */
|
/* def delch */
|
||||||
|
@ -439,16 +472,18 @@ static VALUE
|
||||||
curses_keyname(VALUE obj, VALUE c)
|
curses_keyname(VALUE obj, VALUE c)
|
||||||
{
|
{
|
||||||
#ifdef HAVE_KEYNAME
|
#ifdef HAVE_KEYNAME
|
||||||
const char *name;
|
int cc = curses_char(c);
|
||||||
|
const char *name;
|
||||||
|
|
||||||
name = keyname(NUM2INT(c));
|
name = keyname(cc);
|
||||||
if (name) {
|
if (name) {
|
||||||
return rb_str_new2(name);
|
return rb_str_new_cstr(name);
|
||||||
} else {
|
}
|
||||||
return Qnil;
|
else {
|
||||||
}
|
return Qnil;
|
||||||
|
}
|
||||||
#else
|
#else
|
||||||
return Qnil;
|
return Qnil;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1048,8 +1083,10 @@ window_addstr(VALUE obj, VALUE str)
|
||||||
if (!NIL_P(str)) {
|
if (!NIL_P(str)) {
|
||||||
struct windata *winp;
|
struct windata *winp;
|
||||||
|
|
||||||
|
StringValue(str);
|
||||||
|
str = rb_str_export_locale(str);
|
||||||
GetWINDOW(obj, winp);
|
GetWINDOW(obj, winp);
|
||||||
waddstr(winp->window, STR2CSTR(str));
|
waddstr(winp->window, StringValueCStr(str));
|
||||||
}
|
}
|
||||||
return Qnil;
|
return Qnil;
|
||||||
}
|
}
|
||||||
|
@ -1067,10 +1104,18 @@ static VALUE
|
||||||
window_getch(VALUE obj)
|
window_getch(VALUE obj)
|
||||||
{
|
{
|
||||||
struct windata *winp;
|
struct windata *winp;
|
||||||
|
int c;
|
||||||
|
|
||||||
rb_read_check(stdin);
|
rb_read_check(stdin);
|
||||||
GetWINDOW(obj, winp);
|
GetWINDOW(obj, winp);
|
||||||
return UINT2NUM(wgetch(winp->window));
|
c = wgetch(winp->window);
|
||||||
|
if (c == EOF) return Qnil;
|
||||||
|
if (ISPRINT(c)) {
|
||||||
|
char ch = (char)c;
|
||||||
|
|
||||||
|
return rb_locale_str_new(&ch, 1);
|
||||||
|
}
|
||||||
|
return UINT2NUM(c);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* def getstr */
|
/* def getstr */
|
||||||
|
@ -1087,7 +1132,7 @@ window_getstr(VALUE obj)
|
||||||
#else
|
#else
|
||||||
wgetstr(winp->window, rtn);
|
wgetstr(winp->window, rtn);
|
||||||
#endif
|
#endif
|
||||||
return rb_tainted_str_new2(rtn);
|
return rb_locale_str_new_cstr(rtn);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* def delch */
|
/* def delch */
|
||||||
|
|
|
@ -48,7 +48,7 @@ while TRUE
|
||||||
explicit = FALSE
|
explicit = FALSE
|
||||||
n = 0
|
n = 0
|
||||||
while TRUE
|
while TRUE
|
||||||
c = getch.chr
|
c = getch
|
||||||
if c =~ /[0-9]/
|
if c =~ /[0-9]/
|
||||||
n = 10 * n + c.to_i
|
n = 10 * n + c.to_i
|
||||||
else
|
else
|
||||||
|
|
|
@ -378,6 +378,7 @@ VALUE rb_str_export(VALUE);
|
||||||
SafeStringValue(v);\
|
SafeStringValue(v);\
|
||||||
(v) = rb_str_export(v);\
|
(v) = rb_str_export(v);\
|
||||||
} while (0)
|
} while (0)
|
||||||
|
VALUE rb_str_export_locale(VALUE);
|
||||||
|
|
||||||
VALUE rb_get_path(VALUE);
|
VALUE rb_get_path(VALUE);
|
||||||
#define FilePathValue(v) ((v) = rb_get_path(v))
|
#define FilePathValue(v) ((v) = rb_get_path(v))
|
||||||
|
|
6
string.c
6
string.c
|
@ -570,6 +570,12 @@ rb_str_export(VALUE str)
|
||||||
return rb_str_conv_enc(str, STR_ENC_GET(str), rb_default_external_encoding());
|
return rb_str_conv_enc(str, STR_ENC_GET(str), rb_default_external_encoding());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
VALUE
|
||||||
|
rb_str_export_locale(VALUE str)
|
||||||
|
{
|
||||||
|
return rb_str_conv_enc(str, STR_ENC_GET(str), rb_locale_encoding());
|
||||||
|
}
|
||||||
|
|
||||||
VALUE
|
VALUE
|
||||||
rb_str_export_to_enc(VALUE str, rb_encoding *enc)
|
rb_str_export_to_enc(VALUE str, rb_encoding *enc)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in a new issue