io-console 0.8.0.beta1 → 0.8.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/ext/io/console/console.c +71 -3
- data/ext/io/console/extconf.rb +6 -0
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a8485f98825214ba70388cfaf023a5380201fc1de70b87ffddb36a9a2603115c
|
4
|
+
data.tar.gz: db5deeb27f6bc90121cdb8ad6005aca2615f5a81976f97f09f25e63caed7070e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: fcafaead8dd6a72e82e852ad8cf57bff49fb8fd8959520b8522c3fbf79bd97f1b218dd341f1e66656500c2a5ccd34045260655af948d86031e8f01ce19887df7
|
7
|
+
data.tar.gz: f8ebf55a9fef2383adda797b62824cc7b9cc9458c98fd9025bab2945111851651df9a44469ec10549d4ea063469870ba2cc32a4a25d3e68dc57206531bce6c54
|
data/ext/io/console/console.c
CHANGED
@@ -4,7 +4,7 @@
|
|
4
4
|
*/
|
5
5
|
|
6
6
|
static const char *const
|
7
|
-
IO_CONSOLE_VERSION = "0.8.0
|
7
|
+
IO_CONSOLE_VERSION = "0.8.0";
|
8
8
|
|
9
9
|
#include "ruby.h"
|
10
10
|
#include "ruby/io.h"
|
@@ -84,6 +84,11 @@ getattr(int fd, conmode *t)
|
|
84
84
|
static ID id_getc, id_close;
|
85
85
|
static ID id_gets, id_flush, id_chomp_bang;
|
86
86
|
|
87
|
+
#ifndef HAVE_RB_INTERNED_STR_CSTR
|
88
|
+
# define rb_str_to_interned_str(str) rb_str_freeze(str)
|
89
|
+
# define rb_interned_str_cstr(str) rb_str_freeze(rb_usascii_str_new_cstr(str))
|
90
|
+
#endif
|
91
|
+
|
87
92
|
#if defined HAVE_RUBY_FIBER_SCHEDULER_H
|
88
93
|
# include "ruby/fiber/scheduler.h"
|
89
94
|
#elif defined HAVE_RB_SCHEDULER_TIMEOUT
|
@@ -125,7 +130,14 @@ io_get_write_io_fallback(VALUE io)
|
|
125
130
|
#define rb_io_get_write_io io_get_write_io_fallback
|
126
131
|
#endif
|
127
132
|
|
128
|
-
#
|
133
|
+
#ifndef DHAVE_RB_SYSERR_FAIL_STR
|
134
|
+
# define rb_syserr_fail_str(e, mesg) rb_exc_raise(rb_syserr_new_str(e, mesg))
|
135
|
+
#endif
|
136
|
+
|
137
|
+
#define sys_fail(io) do { \
|
138
|
+
int err = errno; \
|
139
|
+
rb_syserr_fail_str(err, rb_io_path(io)); \
|
140
|
+
} while (0)
|
129
141
|
|
130
142
|
#ifndef HAVE_RB_F_SEND
|
131
143
|
#ifndef RB_PASS_CALLED_KEYWORDS
|
@@ -1811,6 +1823,61 @@ io_getpass(int argc, VALUE *argv, VALUE io)
|
|
1811
1823
|
return str_chomp(str);
|
1812
1824
|
}
|
1813
1825
|
|
1826
|
+
#if defined(_WIN32) || defined(HAVE_TTYNAME_R) || defined(HAVE_TTYNAME)
|
1827
|
+
/*
|
1828
|
+
* call-seq:
|
1829
|
+
* io.ttyname -> string or nil
|
1830
|
+
*
|
1831
|
+
* Returns name of associated terminal (tty) if +io+ is not a tty.
|
1832
|
+
* Returns +nil+ otherwise.
|
1833
|
+
*/
|
1834
|
+
static VALUE
|
1835
|
+
console_ttyname(VALUE io)
|
1836
|
+
{
|
1837
|
+
int fd = rb_io_descriptor(io);
|
1838
|
+
if (!isatty(fd)) return Qnil;
|
1839
|
+
# if defined _WIN32
|
1840
|
+
return rb_usascii_str_new_lit("con");
|
1841
|
+
# elif defined HAVE_TTYNAME_R
|
1842
|
+
{
|
1843
|
+
char termname[1024], *tn = termname;
|
1844
|
+
size_t size = sizeof(termname);
|
1845
|
+
int e;
|
1846
|
+
if (ttyname_r(fd, tn, size) == 0)
|
1847
|
+
return rb_interned_str_cstr(tn);
|
1848
|
+
if ((e = errno) == ERANGE) {
|
1849
|
+
VALUE s = rb_str_new(0, size);
|
1850
|
+
while (1) {
|
1851
|
+
tn = RSTRING_PTR(s);
|
1852
|
+
size = rb_str_capacity(s);
|
1853
|
+
if (ttyname_r(fd, tn, size) == 0) {
|
1854
|
+
return rb_str_to_interned_str(rb_str_resize(s, strlen(tn)));
|
1855
|
+
}
|
1856
|
+
if ((e = errno) != ERANGE) break;
|
1857
|
+
if ((size *= 2) >= INT_MAX/2) break;
|
1858
|
+
rb_str_resize(s, size);
|
1859
|
+
}
|
1860
|
+
}
|
1861
|
+
rb_syserr_fail_str(e, rb_sprintf("ttyname_r(%d)", fd));
|
1862
|
+
UNREACHABLE_RETURN(Qnil);
|
1863
|
+
}
|
1864
|
+
# elif defined HAVE_TTYNAME
|
1865
|
+
{
|
1866
|
+
const char *tn = ttyname(fd);
|
1867
|
+
if (!tn) {
|
1868
|
+
int e = errno;
|
1869
|
+
rb_syserr_fail_str(e, rb_sprintf("ttyname(%d)", fd));
|
1870
|
+
}
|
1871
|
+
return rb_interned_str_cstr(tn);
|
1872
|
+
}
|
1873
|
+
# else
|
1874
|
+
# error No ttyname function
|
1875
|
+
# endif
|
1876
|
+
}
|
1877
|
+
#else
|
1878
|
+
# define console_ttyname rb_f_notimplement
|
1879
|
+
#endif
|
1880
|
+
|
1814
1881
|
/*
|
1815
1882
|
* IO console methods
|
1816
1883
|
*/
|
@@ -1878,6 +1945,7 @@ InitVM_console(void)
|
|
1878
1945
|
rb_define_method(rb_cIO, "pressed?", console_key_pressed_p, 1);
|
1879
1946
|
rb_define_method(rb_cIO, "check_winsize_changed", console_check_winsize_changed, 0);
|
1880
1947
|
rb_define_method(rb_cIO, "getpass", console_getpass, -1);
|
1948
|
+
rb_define_method(rb_cIO, "ttyname", console_ttyname, 0);
|
1881
1949
|
rb_define_singleton_method(rb_cIO, "console", console_dev, -1);
|
1882
1950
|
{
|
1883
1951
|
/* :stopdoc: */
|
@@ -1889,7 +1957,7 @@ InitVM_console(void)
|
|
1889
1957
|
{
|
1890
1958
|
/* :stopdoc: */
|
1891
1959
|
cConmode = rb_define_class_under(rb_cIO, "ConsoleMode", rb_cObject);
|
1892
|
-
rb_define_const(cConmode, "VERSION", rb_str_new_cstr(IO_CONSOLE_VERSION));
|
1960
|
+
rb_define_const(cConmode, "VERSION", rb_obj_freeze(rb_str_new_cstr(IO_CONSOLE_VERSION)));
|
1893
1961
|
rb_define_alloc_func(cConmode, conmode_alloc);
|
1894
1962
|
rb_undef_method(cConmode, "initialize");
|
1895
1963
|
rb_define_method(cConmode, "initialize_copy", conmode_init_copy, 1);
|
data/ext/io/console/extconf.rb
CHANGED
@@ -5,6 +5,11 @@ require 'mkmf'
|
|
5
5
|
# See https://bugs.ruby-lang.org/issues/20345
|
6
6
|
MakeMakefile::RbConfig ||= ::RbConfig
|
7
7
|
|
8
|
+
have_func("rb_syserr_fail_str(0, Qnil)") or
|
9
|
+
have_func("rb_syserr_new_str(0, Qnil)") or
|
10
|
+
abort
|
11
|
+
|
12
|
+
have_func("rb_interned_str_cstr")
|
8
13
|
have_func("rb_io_path")
|
9
14
|
have_func("rb_io_descriptor")
|
10
15
|
have_func("rb_io_get_write_io")
|
@@ -47,6 +52,7 @@ when true
|
|
47
52
|
elsif have_func("rb_scheduler_timeout") # 3.0
|
48
53
|
have_func("rb_io_wait")
|
49
54
|
end
|
55
|
+
have_func("ttyname_r") or have_func("ttyname")
|
50
56
|
create_makefile("io/console") {|conf|
|
51
57
|
conf << "\n""VK_HEADER = #{vk_header}\n"
|
52
58
|
}
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: io-console
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.8.0
|
4
|
+
version: 0.8.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Nobu Nakada
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2024-
|
11
|
+
date: 2024-12-03 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description: add console capabilities to IO instances.
|
14
14
|
email: nobu@ruby-lang.org
|