io-console 0.5.4 → 0.5.9
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +1 -1
- data/ext/io/console/console.c +79 -35
- data/ext/io/console/extconf.rb +11 -3
- 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: d4124dc490e2ac47dda9ad9283023351e95d781ac40af9a22f012a25c3b3eb15
|
4
|
+
data.tar.gz: 9ff304d0831ef2d5486f02c5da57fbe91ae960c4d3f1f28057e8e55a7fc7507a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c8f277a43454e22b0c43beee7eba4069eac9db3b369a4ce0799259d482606a212fbb1d3deae07031703840add83fd5561dfe7170bc62f60675aabf695613e493
|
7
|
+
data.tar.gz: dfe52d8ca7becd7cf2aa8a27a56702380c1723bfd12393583cff7ad04c2996671b669476d8fd506c3e703d30b75c4084467ffcb8b0fcd7fe6e2be424f9d57c11
|
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,9 +77,18 @@ 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
|
84
93
|
static ID id___send__;
|
85
94
|
|
@@ -111,6 +120,9 @@ rawmode_opt(int *argcp, VALUE *argv, int min_argc, int max_argc, rawmode_arg_t *
|
|
111
120
|
int argc = *argcp;
|
112
121
|
rawmode_arg_t *optp = NULL;
|
113
122
|
VALUE vopts = Qnil;
|
123
|
+
#ifdef RB_SCAN_ARGS_PASS_CALLED_KEYWORDS
|
124
|
+
argc = rb_scan_args(argc, argv, "*:", NULL, &vopts);
|
125
|
+
#else
|
114
126
|
if (argc > min_argc) {
|
115
127
|
vopts = rb_check_hash_type(argv[argc-1]);
|
116
128
|
if (!NIL_P(vopts)) {
|
@@ -120,6 +132,7 @@ rawmode_opt(int *argcp, VALUE *argv, int min_argc, int max_argc, rawmode_arg_t *
|
|
120
132
|
if (!vopts) vopts = Qnil;
|
121
133
|
}
|
122
134
|
}
|
135
|
+
#endif
|
123
136
|
rb_check_arity(argc, min_argc, max_argc);
|
124
137
|
if (!NIL_P(vopts)) {
|
125
138
|
VALUE vmin = rb_hash_aref(vopts, ID2SYM(id_min));
|
@@ -190,6 +203,7 @@ set_rawmode(conmode *t, void *arg)
|
|
190
203
|
if (r->intr) {
|
191
204
|
t->c_iflag |= BRKINT;
|
192
205
|
t->c_lflag |= ISIG;
|
206
|
+
t->c_oflag |= OPOST;
|
193
207
|
}
|
194
208
|
#endif
|
195
209
|
(void)r;
|
@@ -355,9 +369,9 @@ ttymode_with_io(VALUE io, VALUE (*func)(VALUE, VALUE), VALUE farg, void (*setter
|
|
355
369
|
|
356
370
|
/*
|
357
371
|
* call-seq:
|
358
|
-
* io.raw(min: nil, time: nil) {|io| }
|
372
|
+
* io.raw(min: nil, time: nil, intr: nil) {|io| }
|
359
373
|
*
|
360
|
-
* Yields +self+ within raw mode.
|
374
|
+
* Yields +self+ within raw mode, and returns the result of the block.
|
361
375
|
*
|
362
376
|
* STDIN.raw(&:gets)
|
363
377
|
*
|
@@ -369,6 +383,9 @@ ttymode_with_io(VALUE io, VALUE (*func)(VALUE, VALUE), VALUE farg, void (*setter
|
|
369
383
|
* The parameter +time+ specifies the timeout in _seconds_ with a
|
370
384
|
* precision of 1/10 of a second. (default: 0)
|
371
385
|
*
|
386
|
+
* If the parameter +intr+ is +true+, enables break, interrupt, quit,
|
387
|
+
* and suspend special characters.
|
388
|
+
*
|
372
389
|
* Refer to the manual page of termios for further details.
|
373
390
|
*
|
374
391
|
* You must require 'io/console' to use this method.
|
@@ -382,11 +399,11 @@ console_raw(int argc, VALUE *argv, VALUE io)
|
|
382
399
|
|
383
400
|
/*
|
384
401
|
* call-seq:
|
385
|
-
* io.raw!(min: nil, time: nil)
|
402
|
+
* io.raw!(min: nil, time: nil, intr: nil) -> io
|
386
403
|
*
|
387
|
-
* Enables raw mode
|
404
|
+
* Enables raw mode, and returns +io+.
|
388
405
|
*
|
389
|
-
* If the terminal mode needs to be back, use io.raw { ... }
|
406
|
+
* If the terminal mode needs to be back, use <code>io.raw { ... }</code>.
|
390
407
|
*
|
391
408
|
* See IO#raw for details on the parameters.
|
392
409
|
*
|
@@ -402,9 +419,9 @@ console_set_raw(int argc, VALUE *argv, VALUE io)
|
|
402
419
|
|
403
420
|
GetOpenFile(io, fptr);
|
404
421
|
fd = GetReadFD(fptr);
|
405
|
-
if (!getattr(fd, &t))
|
422
|
+
if (!getattr(fd, &t)) sys_fail_fptr(fptr);
|
406
423
|
set_rawmode(&t, optp);
|
407
|
-
if (!setattr(fd, &t))
|
424
|
+
if (!setattr(fd, &t)) sys_fail_fptr(fptr);
|
408
425
|
return io;
|
409
426
|
}
|
410
427
|
|
@@ -445,9 +462,9 @@ console_set_cooked(VALUE io)
|
|
445
462
|
|
446
463
|
GetOpenFile(io, fptr);
|
447
464
|
fd = GetReadFD(fptr);
|
448
|
-
if (!getattr(fd, &t))
|
465
|
+
if (!getattr(fd, &t)) sys_fail_fptr(fptr);
|
449
466
|
set_cookedmode(&t, NULL);
|
450
|
-
if (!setattr(fd, &t))
|
467
|
+
if (!setattr(fd, &t)) sys_fail_fptr(fptr);
|
451
468
|
return io;
|
452
469
|
}
|
453
470
|
|
@@ -482,7 +499,7 @@ nogvl_getch(void *p)
|
|
482
499
|
|
483
500
|
/*
|
484
501
|
* call-seq:
|
485
|
-
* io.getch(min: nil, time: nil)
|
502
|
+
* io.getch(min: nil, time: nil, intr: nil) -> char
|
486
503
|
*
|
487
504
|
* Reads and returns a character in raw mode.
|
488
505
|
*
|
@@ -500,28 +517,50 @@ console_getch(int argc, VALUE *argv, VALUE io)
|
|
500
517
|
rb_io_t *fptr;
|
501
518
|
VALUE str;
|
502
519
|
wint_t c;
|
503
|
-
int
|
520
|
+
int len;
|
504
521
|
char buf[8];
|
505
522
|
wint_t wbuf[2];
|
523
|
+
# ifndef HAVE_RB_IO_WAIT
|
506
524
|
struct timeval *to = NULL, tv;
|
525
|
+
# else
|
526
|
+
VALUE timeout = Qnil;
|
527
|
+
# endif
|
507
528
|
|
508
529
|
GetOpenFile(io, fptr);
|
509
530
|
if (optp) {
|
510
531
|
if (optp->vtime) {
|
532
|
+
# ifndef HAVE_RB_IO_WAIT
|
511
533
|
to = &tv;
|
534
|
+
# else
|
535
|
+
struct timeval tv;
|
536
|
+
# endif
|
512
537
|
tv.tv_sec = optp->vtime / 10;
|
513
538
|
tv.tv_usec = (optp->vtime % 10) * 100000;
|
539
|
+
# ifdef HAVE_RB_IO_WAIT
|
540
|
+
timeout = rb_fiber_scheduler_make_timeout(&tv);
|
541
|
+
# endif
|
514
542
|
}
|
515
|
-
|
516
|
-
|
543
|
+
switch (optp->vmin) {
|
544
|
+
case 1: /* default */
|
545
|
+
break;
|
546
|
+
case 0: /* return nil when timed out */
|
547
|
+
if (optp->vtime) break;
|
548
|
+
/* fallthru */
|
549
|
+
default:
|
550
|
+
rb_warning("min option larger than 1 ignored");
|
517
551
|
}
|
518
552
|
if (optp->intr) {
|
519
|
-
|
553
|
+
# ifndef HAVE_RB_IO_WAIT
|
554
|
+
int w = rb_wait_for_single_fd(fptr->fd, RB_WAITFD_IN, to);
|
520
555
|
if (w < 0) rb_eof_error();
|
521
556
|
if (!(w & RB_WAITFD_IN)) return Qnil;
|
557
|
+
# else
|
558
|
+
VALUE result = rb_io_wait(io, RUBY_IO_READABLE, timeout);
|
559
|
+
if (result == Qfalse) return Qnil;
|
560
|
+
# endif
|
522
561
|
}
|
523
|
-
else {
|
524
|
-
rb_warning("vtime option ignored if intr flag is unset");
|
562
|
+
else if (optp->vtime) {
|
563
|
+
rb_warning("Non-zero vtime option ignored if intr flag is unset");
|
525
564
|
}
|
526
565
|
}
|
527
566
|
len = (int)(VALUE)rb_thread_call_without_gvl(nogvl_getch, wbuf, RUBY_UBF_IO, 0);
|
@@ -582,12 +621,12 @@ console_set_echo(VALUE io, VALUE f)
|
|
582
621
|
|
583
622
|
GetOpenFile(io, fptr);
|
584
623
|
fd = GetReadFD(fptr);
|
585
|
-
if (!getattr(fd, &t))
|
624
|
+
if (!getattr(fd, &t)) sys_fail_fptr(fptr);
|
586
625
|
if (RTEST(f))
|
587
626
|
set_echo(&t, NULL);
|
588
627
|
else
|
589
628
|
set_noecho(&t, NULL);
|
590
|
-
if (!setattr(fd, &t))
|
629
|
+
if (!setattr(fd, &t)) sys_fail_fptr(fptr);
|
591
630
|
return io;
|
592
631
|
}
|
593
632
|
|
@@ -608,7 +647,7 @@ console_echo_p(VALUE io)
|
|
608
647
|
|
609
648
|
GetOpenFile(io, fptr);
|
610
649
|
fd = GetReadFD(fptr);
|
611
|
-
if (!getattr(fd, &t))
|
650
|
+
if (!getattr(fd, &t)) sys_fail_fptr(fptr);
|
612
651
|
return echo_p(&t) ? Qtrue : Qfalse;
|
613
652
|
}
|
614
653
|
|
@@ -692,7 +731,7 @@ console_conmode_get(VALUE io)
|
|
692
731
|
|
693
732
|
GetOpenFile(io, fptr);
|
694
733
|
fd = GetReadFD(fptr);
|
695
|
-
if (!getattr(fd, &t))
|
734
|
+
if (!getattr(fd, &t)) sys_fail_fptr(fptr);
|
696
735
|
|
697
736
|
return conmode_new(cConmode, &t);
|
698
737
|
}
|
@@ -716,7 +755,7 @@ console_conmode_set(VALUE io, VALUE mode)
|
|
716
755
|
r = *t;
|
717
756
|
GetOpenFile(io, fptr);
|
718
757
|
fd = GetReadFD(fptr);
|
719
|
-
if (!setattr(fd, &r))
|
758
|
+
if (!setattr(fd, &r)) sys_fail_fptr(fptr);
|
720
759
|
|
721
760
|
return mode;
|
722
761
|
}
|
@@ -758,7 +797,7 @@ console_winsize(VALUE io)
|
|
758
797
|
|
759
798
|
GetOpenFile(io, fptr);
|
760
799
|
fd = GetWriteFD(fptr);
|
761
|
-
if (!getwinsize(fd, &ws))
|
800
|
+
if (!getwinsize(fd, &ws)) sys_fail_fptr(fptr);
|
762
801
|
return rb_assoc_new(INT2NUM(winsize_row(&ws)), INT2NUM(winsize_col(&ws)));
|
763
802
|
}
|
764
803
|
|
@@ -805,7 +844,7 @@ console_set_winsize(VALUE io, VALUE size)
|
|
805
844
|
SET(xpixel);
|
806
845
|
SET(ypixel);
|
807
846
|
#undef SET
|
808
|
-
if (!setwinsize(fd, &ws))
|
847
|
+
if (!setwinsize(fd, &ws)) sys_fail_fptr(fptr);
|
809
848
|
#elif defined _WIN32
|
810
849
|
wh = (HANDLE)rb_w32_get_osfhandle(fd);
|
811
850
|
#define SET(m) new##m = NIL_P(m) ? 0 : (unsigned short)NUM2UINT(m)
|
@@ -880,7 +919,7 @@ console_iflush(VALUE io)
|
|
880
919
|
GetOpenFile(io, fptr);
|
881
920
|
fd = GetReadFD(fptr);
|
882
921
|
#if defined HAVE_TERMIOS_H || defined HAVE_TERMIO_H
|
883
|
-
if (tcflush(fd, TCIFLUSH))
|
922
|
+
if (tcflush(fd, TCIFLUSH)) sys_fail_fptr(fptr);
|
884
923
|
#endif
|
885
924
|
(void)fd;
|
886
925
|
return io;
|
@@ -903,7 +942,7 @@ console_oflush(VALUE io)
|
|
903
942
|
GetOpenFile(io, fptr);
|
904
943
|
fd = GetWriteFD(fptr);
|
905
944
|
#if defined HAVE_TERMIOS_H || defined HAVE_TERMIO_H
|
906
|
-
if (tcflush(fd, TCOFLUSH))
|
945
|
+
if (tcflush(fd, TCOFLUSH)) sys_fail_fptr(fptr);
|
907
946
|
#endif
|
908
947
|
(void)fd;
|
909
948
|
return io;
|
@@ -930,11 +969,11 @@ console_ioflush(VALUE io)
|
|
930
969
|
fd1 = GetReadFD(fptr);
|
931
970
|
fd2 = GetWriteFD(fptr);
|
932
971
|
if (fd2 != -1 && fd1 != fd2) {
|
933
|
-
if (tcflush(fd1, TCIFLUSH))
|
934
|
-
if (tcflush(fd2, TCOFLUSH))
|
972
|
+
if (tcflush(fd1, TCIFLUSH)) sys_fail_fptr(fptr);
|
973
|
+
if (tcflush(fd2, TCOFLUSH)) sys_fail_fptr(fptr);
|
935
974
|
}
|
936
975
|
else {
|
937
|
-
if (tcflush(fd1, TCIOFLUSH))
|
976
|
+
if (tcflush(fd1, TCIOFLUSH)) sys_fail_fptr(fptr);
|
938
977
|
}
|
939
978
|
#endif
|
940
979
|
return io;
|
@@ -953,7 +992,7 @@ console_beep(VALUE io)
|
|
953
992
|
MessageBeep(0);
|
954
993
|
#else
|
955
994
|
if (write(fd, "\a", 1) < 0)
|
956
|
-
|
995
|
+
sys_fail_fptr(fptr);
|
957
996
|
#endif
|
958
997
|
return io;
|
959
998
|
}
|
@@ -1187,8 +1226,8 @@ console_key_pressed_p(VALUE io, VALUE k)
|
|
1187
1226
|
}
|
1188
1227
|
#else
|
1189
1228
|
struct query_args {
|
1190
|
-
|
1191
|
-
|
1229
|
+
char qstr[6];
|
1230
|
+
unsigned char opt;
|
1192
1231
|
};
|
1193
1232
|
|
1194
1233
|
static int
|
@@ -1489,7 +1528,7 @@ console_dev(int argc, VALUE *argv, VALUE klass)
|
|
1489
1528
|
|
1490
1529
|
/*
|
1491
1530
|
* call-seq:
|
1492
|
-
* io.getch(min: nil, time: nil)
|
1531
|
+
* io.getch(min: nil, time: nil, intr: nil) -> char
|
1493
1532
|
*
|
1494
1533
|
* See IO#getch.
|
1495
1534
|
*/
|
@@ -1526,7 +1565,7 @@ static VALUE
|
|
1526
1565
|
str_chomp(VALUE str)
|
1527
1566
|
{
|
1528
1567
|
if (!NIL_P(str)) {
|
1529
|
-
|
1568
|
+
rb_funcallv(str, id_chomp_bang, 0, 0);
|
1530
1569
|
}
|
1531
1570
|
return str;
|
1532
1571
|
}
|
@@ -1538,6 +1577,10 @@ str_chomp(VALUE str)
|
|
1538
1577
|
* Reads and returns a line without echo back.
|
1539
1578
|
* Prints +prompt+ unless it is +nil+.
|
1540
1579
|
*
|
1580
|
+
* The newline character that terminates the
|
1581
|
+
* read line is removed from the returned string,
|
1582
|
+
* see String#chomp!.
|
1583
|
+
*
|
1541
1584
|
* You must require 'io/console' to use this method.
|
1542
1585
|
*/
|
1543
1586
|
static VALUE
|
@@ -1582,6 +1625,7 @@ Init_console(void)
|
|
1582
1625
|
id_getc = rb_intern("getc");
|
1583
1626
|
#if ENABLE_IO_GETPASS
|
1584
1627
|
id_gets = rb_intern("gets");
|
1628
|
+
id_chomp_bang = rb_intern("chomp!");
|
1585
1629
|
#endif
|
1586
1630
|
id_console = rb_intern("console");
|
1587
1631
|
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
|
4
|
+
ok = true if RUBY_ENGINE == "ruby" || RUBY_ENGINE == "truffleruby"
|
5
5
|
hdr = nil
|
6
6
|
case
|
7
7
|
when macro_defined?("_WIN32", "")
|
@@ -14,8 +14,9 @@ when have_header(hdr = "sgtty.h")
|
|
14
14
|
%w"stty gtty".each {|f| have_func(f, hdr)}
|
15
15
|
else
|
16
16
|
ok = false
|
17
|
-
end
|
18
|
-
|
17
|
+
end if ok
|
18
|
+
case ok
|
19
|
+
when true
|
19
20
|
have_header("sys/ioctl.h") if hdr
|
20
21
|
# rb_check_hash_type: 1.9.3
|
21
22
|
# rb_io_get_write_io: 1.9.1
|
@@ -23,8 +24,15 @@ if ok
|
|
23
24
|
# rb_funcallv: 2.1.0
|
24
25
|
# RARRAY_CONST_PTR: 2.1.0
|
25
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
|
26
32
|
$defs << "-D""ENABLE_IO_GETPASS=1"
|
27
33
|
create_makefile("io/console") {|conf|
|
28
34
|
conf << "\n""VK_HEADER = #{vk_header}\n"
|
29
35
|
}
|
36
|
+
when nil
|
37
|
+
File.write("Makefile", dummy_makefile($srcdir).join(""))
|
30
38
|
end
|
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.9
|
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-03-10 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.4.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.
|
47
|
-
signing_key:
|
47
|
+
rubygems_version: 3.2.3
|
48
|
+
signing_key:
|
48
49
|
specification_version: 4
|
49
50
|
summary: Console interface
|
50
51
|
test_files: []
|