io-console 0.5.6 → 0.5.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +1 -1
- data/ext/io/console/console.c +69 -29
- data/ext/io/console/extconf.rb +6 -1
- metadata +8 -7
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a402e8ba6c8522b3b423e828a4575da34a084c97a5e6d27cbed65e35695a9c9e
|
4
|
+
data.tar.gz: 50fa0e88472bcdd8f3242c3957c8ed7c39d5f6c6f41f3d7db48a0eaf73cc64f2
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6b190b4fb0d1dedaccc0613754d8c656f65dfa3766ac04624d0a0fd1943339a61aee118beed8be1274de764bfc8404697a303da30300377381d521fbc2d77acf
|
7
|
+
data.tar.gz: 70a62bd336c53ccd8ae25bacc7bb5a8d7a26d0d5eabcd26ee9541137f8d86345159f134d5f04bde13be0486d057ab7bdbbf2a3667d88b92b6350b6543de12c11
|
data/README.md
CHANGED
@@ -27,7 +27,7 @@ IO.console -> #<File:/dev/tty>
|
|
27
27
|
IO.console(sym, *args)
|
28
28
|
```
|
29
29
|
|
30
|
-
Returns
|
30
|
+
Returns a File instance opened console.
|
31
31
|
|
32
32
|
If `sym` is given, it will be sent to the opened console with `args` and the result will be returned instead of the console IO itself.
|
33
33
|
|
data/ext/io/console/console.c
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
/* -*- c-file-style: "ruby" -*- */
|
1
|
+
/* -*- c-file-style: "ruby"; indent-tabs-mode: t -*- */
|
2
2
|
/*
|
3
3
|
* console IO module
|
4
4
|
*/
|
@@ -77,10 +77,23 @@ getattr(int fd, conmode *t)
|
|
77
77
|
|
78
78
|
static ID id_getc, id_console, id_close, id_min, id_time, id_intr;
|
79
79
|
#if ENABLE_IO_GETPASS
|
80
|
-
static ID id_gets;
|
80
|
+
static ID id_gets, id_chomp_bang;
|
81
81
|
#endif
|
82
82
|
|
83
|
+
#if defined HAVE_RUBY_FIBER_SCHEDULER_H
|
84
|
+
# include "ruby/fiber/scheduler.h"
|
85
|
+
#elif defined HAVE_RB_SCHEDULER_TIMEOUT
|
86
|
+
extern VALUE rb_scheduler_timeout(struct timeval *timeout);
|
87
|
+
# define rb_fiber_scheduler_make_timeout rb_scheduler_timeout
|
88
|
+
#endif
|
89
|
+
|
90
|
+
#define sys_fail_fptr(fptr) rb_sys_fail_str((fptr)->pathv)
|
91
|
+
|
83
92
|
#ifndef HAVE_RB_F_SEND
|
93
|
+
#ifndef RB_PASS_CALLED_KEYWORDS
|
94
|
+
# define rb_funcallv_kw(recv, mid, arg, argv, kw_splat) rb_funcallv(recv, mid, arg, argv)
|
95
|
+
#endif
|
96
|
+
|
84
97
|
static ID id___send__;
|
85
98
|
|
86
99
|
static VALUE
|
@@ -95,7 +108,7 @@ rb_f_send(int argc, VALUE *argv, VALUE recv)
|
|
95
108
|
else {
|
96
109
|
vid = id___send__;
|
97
110
|
}
|
98
|
-
return
|
111
|
+
return rb_funcallv_kw(recv, vid, argc, argv, RB_PASS_CALLED_KEYWORDS);
|
99
112
|
}
|
100
113
|
#endif
|
101
114
|
|
@@ -410,9 +423,9 @@ console_set_raw(int argc, VALUE *argv, VALUE io)
|
|
410
423
|
|
411
424
|
GetOpenFile(io, fptr);
|
412
425
|
fd = GetReadFD(fptr);
|
413
|
-
if (!getattr(fd, &t))
|
426
|
+
if (!getattr(fd, &t)) sys_fail_fptr(fptr);
|
414
427
|
set_rawmode(&t, optp);
|
415
|
-
if (!setattr(fd, &t))
|
428
|
+
if (!setattr(fd, &t)) sys_fail_fptr(fptr);
|
416
429
|
return io;
|
417
430
|
}
|
418
431
|
|
@@ -453,9 +466,9 @@ console_set_cooked(VALUE io)
|
|
453
466
|
|
454
467
|
GetOpenFile(io, fptr);
|
455
468
|
fd = GetReadFD(fptr);
|
456
|
-
if (!getattr(fd, &t))
|
469
|
+
if (!getattr(fd, &t)) sys_fail_fptr(fptr);
|
457
470
|
set_cookedmode(&t, NULL);
|
458
|
-
if (!setattr(fd, &t))
|
471
|
+
if (!setattr(fd, &t)) sys_fail_fptr(fptr);
|
459
472
|
return io;
|
460
473
|
}
|
461
474
|
|
@@ -508,28 +521,50 @@ console_getch(int argc, VALUE *argv, VALUE io)
|
|
508
521
|
rb_io_t *fptr;
|
509
522
|
VALUE str;
|
510
523
|
wint_t c;
|
511
|
-
int
|
524
|
+
int len;
|
512
525
|
char buf[8];
|
513
526
|
wint_t wbuf[2];
|
527
|
+
# ifndef HAVE_RB_IO_WAIT
|
514
528
|
struct timeval *to = NULL, tv;
|
529
|
+
# else
|
530
|
+
VALUE timeout = Qnil;
|
531
|
+
# endif
|
515
532
|
|
516
533
|
GetOpenFile(io, fptr);
|
517
534
|
if (optp) {
|
518
535
|
if (optp->vtime) {
|
536
|
+
# ifndef HAVE_RB_IO_WAIT
|
519
537
|
to = &tv;
|
538
|
+
# else
|
539
|
+
struct timeval tv;
|
540
|
+
# endif
|
520
541
|
tv.tv_sec = optp->vtime / 10;
|
521
542
|
tv.tv_usec = (optp->vtime % 10) * 100000;
|
543
|
+
# ifdef HAVE_RB_IO_WAIT
|
544
|
+
timeout = rb_fiber_scheduler_make_timeout(&tv);
|
545
|
+
# endif
|
522
546
|
}
|
523
|
-
|
524
|
-
|
547
|
+
switch (optp->vmin) {
|
548
|
+
case 1: /* default */
|
549
|
+
break;
|
550
|
+
case 0: /* return nil when timed out */
|
551
|
+
if (optp->vtime) break;
|
552
|
+
/* fallthru */
|
553
|
+
default:
|
554
|
+
rb_warning("min option larger than 1 ignored");
|
525
555
|
}
|
526
556
|
if (optp->intr) {
|
527
|
-
|
557
|
+
# ifndef HAVE_RB_IO_WAIT
|
558
|
+
int w = rb_wait_for_single_fd(fptr->fd, RB_WAITFD_IN, to);
|
528
559
|
if (w < 0) rb_eof_error();
|
529
560
|
if (!(w & RB_WAITFD_IN)) return Qnil;
|
561
|
+
# else
|
562
|
+
VALUE result = rb_io_wait(io, RB_INT2NUM(RUBY_IO_READABLE), timeout);
|
563
|
+
if (!RTEST(result)) return Qnil;
|
564
|
+
# endif
|
530
565
|
}
|
531
|
-
else {
|
532
|
-
rb_warning("vtime option ignored if intr flag is unset");
|
566
|
+
else if (optp->vtime) {
|
567
|
+
rb_warning("Non-zero vtime option ignored if intr flag is unset");
|
533
568
|
}
|
534
569
|
}
|
535
570
|
len = (int)(VALUE)rb_thread_call_without_gvl(nogvl_getch, wbuf, RUBY_UBF_IO, 0);
|
@@ -590,12 +625,12 @@ console_set_echo(VALUE io, VALUE f)
|
|
590
625
|
|
591
626
|
GetOpenFile(io, fptr);
|
592
627
|
fd = GetReadFD(fptr);
|
593
|
-
if (!getattr(fd, &t))
|
628
|
+
if (!getattr(fd, &t)) sys_fail_fptr(fptr);
|
594
629
|
if (RTEST(f))
|
595
630
|
set_echo(&t, NULL);
|
596
631
|
else
|
597
632
|
set_noecho(&t, NULL);
|
598
|
-
if (!setattr(fd, &t))
|
633
|
+
if (!setattr(fd, &t)) sys_fail_fptr(fptr);
|
599
634
|
return io;
|
600
635
|
}
|
601
636
|
|
@@ -616,7 +651,7 @@ console_echo_p(VALUE io)
|
|
616
651
|
|
617
652
|
GetOpenFile(io, fptr);
|
618
653
|
fd = GetReadFD(fptr);
|
619
|
-
if (!getattr(fd, &t))
|
654
|
+
if (!getattr(fd, &t)) sys_fail_fptr(fptr);
|
620
655
|
return echo_p(&t) ? Qtrue : Qfalse;
|
621
656
|
}
|
622
657
|
|
@@ -700,7 +735,7 @@ console_conmode_get(VALUE io)
|
|
700
735
|
|
701
736
|
GetOpenFile(io, fptr);
|
702
737
|
fd = GetReadFD(fptr);
|
703
|
-
if (!getattr(fd, &t))
|
738
|
+
if (!getattr(fd, &t)) sys_fail_fptr(fptr);
|
704
739
|
|
705
740
|
return conmode_new(cConmode, &t);
|
706
741
|
}
|
@@ -724,7 +759,7 @@ console_conmode_set(VALUE io, VALUE mode)
|
|
724
759
|
r = *t;
|
725
760
|
GetOpenFile(io, fptr);
|
726
761
|
fd = GetReadFD(fptr);
|
727
|
-
if (!setattr(fd, &r))
|
762
|
+
if (!setattr(fd, &r)) sys_fail_fptr(fptr);
|
728
763
|
|
729
764
|
return mode;
|
730
765
|
}
|
@@ -766,7 +801,7 @@ console_winsize(VALUE io)
|
|
766
801
|
|
767
802
|
GetOpenFile(io, fptr);
|
768
803
|
fd = GetWriteFD(fptr);
|
769
|
-
if (!getwinsize(fd, &ws))
|
804
|
+
if (!getwinsize(fd, &ws)) sys_fail_fptr(fptr);
|
770
805
|
return rb_assoc_new(INT2NUM(winsize_row(&ws)), INT2NUM(winsize_col(&ws)));
|
771
806
|
}
|
772
807
|
|
@@ -813,7 +848,7 @@ console_set_winsize(VALUE io, VALUE size)
|
|
813
848
|
SET(xpixel);
|
814
849
|
SET(ypixel);
|
815
850
|
#undef SET
|
816
|
-
if (!setwinsize(fd, &ws))
|
851
|
+
if (!setwinsize(fd, &ws)) sys_fail_fptr(fptr);
|
817
852
|
#elif defined _WIN32
|
818
853
|
wh = (HANDLE)rb_w32_get_osfhandle(fd);
|
819
854
|
#define SET(m) new##m = NIL_P(m) ? 0 : (unsigned short)NUM2UINT(m)
|
@@ -888,7 +923,7 @@ console_iflush(VALUE io)
|
|
888
923
|
GetOpenFile(io, fptr);
|
889
924
|
fd = GetReadFD(fptr);
|
890
925
|
#if defined HAVE_TERMIOS_H || defined HAVE_TERMIO_H
|
891
|
-
if (tcflush(fd, TCIFLUSH))
|
926
|
+
if (tcflush(fd, TCIFLUSH)) sys_fail_fptr(fptr);
|
892
927
|
#endif
|
893
928
|
(void)fd;
|
894
929
|
return io;
|
@@ -911,7 +946,7 @@ console_oflush(VALUE io)
|
|
911
946
|
GetOpenFile(io, fptr);
|
912
947
|
fd = GetWriteFD(fptr);
|
913
948
|
#if defined HAVE_TERMIOS_H || defined HAVE_TERMIO_H
|
914
|
-
if (tcflush(fd, TCOFLUSH))
|
949
|
+
if (tcflush(fd, TCOFLUSH)) sys_fail_fptr(fptr);
|
915
950
|
#endif
|
916
951
|
(void)fd;
|
917
952
|
return io;
|
@@ -938,11 +973,11 @@ console_ioflush(VALUE io)
|
|
938
973
|
fd1 = GetReadFD(fptr);
|
939
974
|
fd2 = GetWriteFD(fptr);
|
940
975
|
if (fd2 != -1 && fd1 != fd2) {
|
941
|
-
if (tcflush(fd1, TCIFLUSH))
|
942
|
-
if (tcflush(fd2, TCOFLUSH))
|
976
|
+
if (tcflush(fd1, TCIFLUSH)) sys_fail_fptr(fptr);
|
977
|
+
if (tcflush(fd2, TCOFLUSH)) sys_fail_fptr(fptr);
|
943
978
|
}
|
944
979
|
else {
|
945
|
-
if (tcflush(fd1, TCIOFLUSH))
|
980
|
+
if (tcflush(fd1, TCIOFLUSH)) sys_fail_fptr(fptr);
|
946
981
|
}
|
947
982
|
#endif
|
948
983
|
return io;
|
@@ -961,7 +996,7 @@ console_beep(VALUE io)
|
|
961
996
|
MessageBeep(0);
|
962
997
|
#else
|
963
998
|
if (write(fd, "\a", 1) < 0)
|
964
|
-
|
999
|
+
sys_fail_fptr(fptr);
|
965
1000
|
#endif
|
966
1001
|
return io;
|
967
1002
|
}
|
@@ -1195,8 +1230,8 @@ console_key_pressed_p(VALUE io, VALUE k)
|
|
1195
1230
|
}
|
1196
1231
|
#else
|
1197
1232
|
struct query_args {
|
1198
|
-
|
1199
|
-
|
1233
|
+
char qstr[6];
|
1234
|
+
unsigned char opt;
|
1200
1235
|
};
|
1201
1236
|
|
1202
1237
|
static int
|
@@ -1534,7 +1569,7 @@ static VALUE
|
|
1534
1569
|
str_chomp(VALUE str)
|
1535
1570
|
{
|
1536
1571
|
if (!NIL_P(str)) {
|
1537
|
-
|
1572
|
+
rb_funcallv(str, id_chomp_bang, 0, 0);
|
1538
1573
|
}
|
1539
1574
|
return str;
|
1540
1575
|
}
|
@@ -1546,6 +1581,10 @@ str_chomp(VALUE str)
|
|
1546
1581
|
* Reads and returns a line without echo back.
|
1547
1582
|
* Prints +prompt+ unless it is +nil+.
|
1548
1583
|
*
|
1584
|
+
* The newline character that terminates the
|
1585
|
+
* read line is removed from the returned string,
|
1586
|
+
* see String#chomp!.
|
1587
|
+
*
|
1549
1588
|
* You must require 'io/console' to use this method.
|
1550
1589
|
*/
|
1551
1590
|
static VALUE
|
@@ -1590,6 +1629,7 @@ Init_console(void)
|
|
1590
1629
|
id_getc = rb_intern("getc");
|
1591
1630
|
#if ENABLE_IO_GETPASS
|
1592
1631
|
id_gets = rb_intern("gets");
|
1632
|
+
id_chomp_bang = rb_intern("chomp!");
|
1593
1633
|
#endif
|
1594
1634
|
id_console = rb_intern("console");
|
1595
1635
|
id_close = rb_intern("close");
|
data/ext/io/console/extconf.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
# frozen_string_literal: false
|
2
2
|
require 'mkmf'
|
3
3
|
|
4
|
-
ok = true if RUBY_ENGINE == "ruby"
|
4
|
+
ok = true if RUBY_ENGINE == "ruby" || RUBY_ENGINE == "truffleruby"
|
5
5
|
hdr = nil
|
6
6
|
case
|
7
7
|
when macro_defined?("_WIN32", "")
|
@@ -24,6 +24,11 @@ when true
|
|
24
24
|
# rb_funcallv: 2.1.0
|
25
25
|
# RARRAY_CONST_PTR: 2.1.0
|
26
26
|
# rb_sym2str: 2.2.0
|
27
|
+
if have_macro("HAVE_RUBY_FIBER_SCHEDULER_H")
|
28
|
+
$defs << "-D""HAVE_RB_IO_WAIT=1"
|
29
|
+
elsif have_func("rb_scheduler_timeout") # 3.0
|
30
|
+
have_func("rb_io_wait")
|
31
|
+
end
|
27
32
|
$defs << "-D""ENABLE_IO_GETPASS=1"
|
28
33
|
create_makefile("io/console") {|conf|
|
29
34
|
conf << "\n""VK_HEADER = #{vk_header}\n"
|
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.5.
|
4
|
+
version: 0.5.11
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Nobu Nakada
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2021-12-29 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description: add console capabilities to IO instances.
|
14
14
|
email: nobu@ruby-lang.org
|
@@ -25,10 +25,11 @@ files:
|
|
25
25
|
- lib/io/console/size.rb
|
26
26
|
homepage: https://github.com/ruby/io-console
|
27
27
|
licenses:
|
28
|
+
- Ruby
|
28
29
|
- BSD-2-Clause
|
29
30
|
metadata:
|
30
31
|
source_code_url: https://github.com/ruby/io-console
|
31
|
-
post_install_message:
|
32
|
+
post_install_message:
|
32
33
|
rdoc_options: []
|
33
34
|
require_paths:
|
34
35
|
- lib
|
@@ -36,15 +37,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
36
37
|
requirements:
|
37
38
|
- - ">="
|
38
39
|
- !ruby/object:Gem::Version
|
39
|
-
version: 2.
|
40
|
+
version: 2.6.0
|
40
41
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
41
42
|
requirements:
|
42
43
|
- - ">="
|
43
44
|
- !ruby/object:Gem::Version
|
44
45
|
version: '0'
|
45
46
|
requirements: []
|
46
|
-
rubygems_version: 3.2.
|
47
|
-
signing_key:
|
47
|
+
rubygems_version: 3.2.32
|
48
|
+
signing_key:
|
48
49
|
specification_version: 4
|
49
50
|
summary: Console interface
|
50
51
|
test_files: []
|