io-console 0.5.3 → 0.5.8
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 +77 -36
- data/ext/io/console/extconf.rb +9 -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: decdf097b0ff0dfc69754156a1cb766b68b45fc5007bb845b38e15c6b4190230
|
4
|
+
data.tar.gz: f8c2f4ccc7aa3fcc4ad95467a752e313cb86e2473ff2356ccf01ee792d3e7315
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e1bd8dab05ec7e64ee220b39be6aa5429796f6c179b1ac6b300a91cce69469b8e3785d7bc03ab97eb2c22b88e21da1674891fd1574c0cc9affc69a2b084c0f33
|
7
|
+
data.tar.gz: 9a8445e54933da15df523fb6dc71670b0ab6c9db4e2fcc2c39ae9df4b4be6887bf590410e722e96caa21858cac753e0b3d330645f7745392b2f91bfab8c7ad4d
|
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,15 @@ 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
|
+
#ifdef HAVE_RB_SCHEDULER_TIMEOUT
|
84
|
+
extern VALUE rb_scheduler_timeout(struct timeval *timeout);
|
85
|
+
#endif
|
86
|
+
|
87
|
+
#define sys_fail_fptr(fptr) rb_sys_fail_str((fptr)->pathv)
|
88
|
+
|
83
89
|
#ifndef HAVE_RB_F_SEND
|
84
90
|
static ID id___send__;
|
85
91
|
|
@@ -111,6 +117,9 @@ rawmode_opt(int *argcp, VALUE *argv, int min_argc, int max_argc, rawmode_arg_t *
|
|
111
117
|
int argc = *argcp;
|
112
118
|
rawmode_arg_t *optp = NULL;
|
113
119
|
VALUE vopts = Qnil;
|
120
|
+
#ifdef RB_SCAN_ARGS_PASS_CALLED_KEYWORDS
|
121
|
+
argc = rb_scan_args(argc, argv, "*:", NULL, &vopts);
|
122
|
+
#else
|
114
123
|
if (argc > min_argc) {
|
115
124
|
vopts = rb_check_hash_type(argv[argc-1]);
|
116
125
|
if (!NIL_P(vopts)) {
|
@@ -120,6 +129,7 @@ rawmode_opt(int *argcp, VALUE *argv, int min_argc, int max_argc, rawmode_arg_t *
|
|
120
129
|
if (!vopts) vopts = Qnil;
|
121
130
|
}
|
122
131
|
}
|
132
|
+
#endif
|
123
133
|
rb_check_arity(argc, min_argc, max_argc);
|
124
134
|
if (!NIL_P(vopts)) {
|
125
135
|
VALUE vmin = rb_hash_aref(vopts, ID2SYM(id_min));
|
@@ -188,8 +198,9 @@ set_rawmode(conmode *t, void *arg)
|
|
188
198
|
#endif
|
189
199
|
#ifdef ISIG
|
190
200
|
if (r->intr) {
|
191
|
-
t->c_iflag |= BRKINT
|
201
|
+
t->c_iflag |= BRKINT;
|
192
202
|
t->c_lflag |= ISIG;
|
203
|
+
t->c_oflag |= OPOST;
|
193
204
|
}
|
194
205
|
#endif
|
195
206
|
(void)r;
|
@@ -355,9 +366,9 @@ ttymode_with_io(VALUE io, VALUE (*func)(VALUE, VALUE), VALUE farg, void (*setter
|
|
355
366
|
|
356
367
|
/*
|
357
368
|
* call-seq:
|
358
|
-
* io.raw(min: nil, time: nil) {|io| }
|
369
|
+
* io.raw(min: nil, time: nil, intr: nil) {|io| }
|
359
370
|
*
|
360
|
-
* Yields +self+ within raw mode.
|
371
|
+
* Yields +self+ within raw mode, and returns the result of the block.
|
361
372
|
*
|
362
373
|
* STDIN.raw(&:gets)
|
363
374
|
*
|
@@ -369,6 +380,9 @@ ttymode_with_io(VALUE io, VALUE (*func)(VALUE, VALUE), VALUE farg, void (*setter
|
|
369
380
|
* The parameter +time+ specifies the timeout in _seconds_ with a
|
370
381
|
* precision of 1/10 of a second. (default: 0)
|
371
382
|
*
|
383
|
+
* If the parameter +intr+ is +true+, enables break, interrupt, quit,
|
384
|
+
* and suspend special characters.
|
385
|
+
*
|
372
386
|
* Refer to the manual page of termios for further details.
|
373
387
|
*
|
374
388
|
* You must require 'io/console' to use this method.
|
@@ -382,11 +396,11 @@ console_raw(int argc, VALUE *argv, VALUE io)
|
|
382
396
|
|
383
397
|
/*
|
384
398
|
* call-seq:
|
385
|
-
* io.raw!(min: nil, time: nil)
|
399
|
+
* io.raw!(min: nil, time: nil, intr: nil) -> io
|
386
400
|
*
|
387
|
-
* Enables raw mode
|
401
|
+
* Enables raw mode, and returns +io+.
|
388
402
|
*
|
389
|
-
* If the terminal mode needs to be back, use io.raw { ... }
|
403
|
+
* If the terminal mode needs to be back, use <code>io.raw { ... }</code>.
|
390
404
|
*
|
391
405
|
* See IO#raw for details on the parameters.
|
392
406
|
*
|
@@ -402,9 +416,9 @@ console_set_raw(int argc, VALUE *argv, VALUE io)
|
|
402
416
|
|
403
417
|
GetOpenFile(io, fptr);
|
404
418
|
fd = GetReadFD(fptr);
|
405
|
-
if (!getattr(fd, &t))
|
419
|
+
if (!getattr(fd, &t)) sys_fail_fptr(fptr);
|
406
420
|
set_rawmode(&t, optp);
|
407
|
-
if (!setattr(fd, &t))
|
421
|
+
if (!setattr(fd, &t)) sys_fail_fptr(fptr);
|
408
422
|
return io;
|
409
423
|
}
|
410
424
|
|
@@ -445,9 +459,9 @@ console_set_cooked(VALUE io)
|
|
445
459
|
|
446
460
|
GetOpenFile(io, fptr);
|
447
461
|
fd = GetReadFD(fptr);
|
448
|
-
if (!getattr(fd, &t))
|
462
|
+
if (!getattr(fd, &t)) sys_fail_fptr(fptr);
|
449
463
|
set_cookedmode(&t, NULL);
|
450
|
-
if (!setattr(fd, &t))
|
464
|
+
if (!setattr(fd, &t)) sys_fail_fptr(fptr);
|
451
465
|
return io;
|
452
466
|
}
|
453
467
|
|
@@ -482,7 +496,7 @@ nogvl_getch(void *p)
|
|
482
496
|
|
483
497
|
/*
|
484
498
|
* call-seq:
|
485
|
-
* io.getch(min: nil, time: nil)
|
499
|
+
* io.getch(min: nil, time: nil, intr: nil) -> char
|
486
500
|
*
|
487
501
|
* Reads and returns a character in raw mode.
|
488
502
|
*
|
@@ -500,28 +514,50 @@ console_getch(int argc, VALUE *argv, VALUE io)
|
|
500
514
|
rb_io_t *fptr;
|
501
515
|
VALUE str;
|
502
516
|
wint_t c;
|
503
|
-
int
|
517
|
+
int len;
|
504
518
|
char buf[8];
|
505
519
|
wint_t wbuf[2];
|
520
|
+
# ifndef HAVE_RB_IO_WAIT
|
506
521
|
struct timeval *to = NULL, tv;
|
522
|
+
# else
|
523
|
+
VALUE timeout = Qnil;
|
524
|
+
# endif
|
507
525
|
|
508
526
|
GetOpenFile(io, fptr);
|
509
527
|
if (optp) {
|
510
528
|
if (optp->vtime) {
|
529
|
+
# ifndef HAVE_RB_IO_WAIT
|
511
530
|
to = &tv;
|
531
|
+
# else
|
532
|
+
struct timeval tv;
|
533
|
+
# endif
|
512
534
|
tv.tv_sec = optp->vtime / 10;
|
513
535
|
tv.tv_usec = (optp->vtime % 10) * 100000;
|
536
|
+
# ifdef HAVE_RB_IO_WAIT
|
537
|
+
timeout = rb_scheduler_timeout(&tv);
|
538
|
+
# endif
|
514
539
|
}
|
515
|
-
|
516
|
-
|
540
|
+
switch (optp->vmin) {
|
541
|
+
case 1: /* default */
|
542
|
+
break;
|
543
|
+
case 0: /* return nil when timed out */
|
544
|
+
if (optp->vtime) break;
|
545
|
+
/* fallthru */
|
546
|
+
default:
|
547
|
+
rb_warning("min option larger than 1 ignored");
|
517
548
|
}
|
518
549
|
if (optp->intr) {
|
519
|
-
|
550
|
+
# ifndef HAVE_RB_IO_WAIT
|
551
|
+
int w = rb_wait_for_single_fd(fptr->fd, RB_WAITFD_IN, to);
|
520
552
|
if (w < 0) rb_eof_error();
|
521
553
|
if (!(w & RB_WAITFD_IN)) return Qnil;
|
554
|
+
# else
|
555
|
+
VALUE result = rb_io_wait(io, RUBY_IO_READABLE, timeout);
|
556
|
+
if (result == Qfalse) return Qnil;
|
557
|
+
# endif
|
522
558
|
}
|
523
|
-
else {
|
524
|
-
rb_warning("vtime option ignored if intr flag is unset");
|
559
|
+
else if (optp->vtime) {
|
560
|
+
rb_warning("Non-zero vtime option ignored if intr flag is unset");
|
525
561
|
}
|
526
562
|
}
|
527
563
|
len = (int)(VALUE)rb_thread_call_without_gvl(nogvl_getch, wbuf, RUBY_UBF_IO, 0);
|
@@ -582,12 +618,12 @@ console_set_echo(VALUE io, VALUE f)
|
|
582
618
|
|
583
619
|
GetOpenFile(io, fptr);
|
584
620
|
fd = GetReadFD(fptr);
|
585
|
-
if (!getattr(fd, &t))
|
621
|
+
if (!getattr(fd, &t)) sys_fail_fptr(fptr);
|
586
622
|
if (RTEST(f))
|
587
623
|
set_echo(&t, NULL);
|
588
624
|
else
|
589
625
|
set_noecho(&t, NULL);
|
590
|
-
if (!setattr(fd, &t))
|
626
|
+
if (!setattr(fd, &t)) sys_fail_fptr(fptr);
|
591
627
|
return io;
|
592
628
|
}
|
593
629
|
|
@@ -608,7 +644,7 @@ console_echo_p(VALUE io)
|
|
608
644
|
|
609
645
|
GetOpenFile(io, fptr);
|
610
646
|
fd = GetReadFD(fptr);
|
611
|
-
if (!getattr(fd, &t))
|
647
|
+
if (!getattr(fd, &t)) sys_fail_fptr(fptr);
|
612
648
|
return echo_p(&t) ? Qtrue : Qfalse;
|
613
649
|
}
|
614
650
|
|
@@ -692,7 +728,7 @@ console_conmode_get(VALUE io)
|
|
692
728
|
|
693
729
|
GetOpenFile(io, fptr);
|
694
730
|
fd = GetReadFD(fptr);
|
695
|
-
if (!getattr(fd, &t))
|
731
|
+
if (!getattr(fd, &t)) sys_fail_fptr(fptr);
|
696
732
|
|
697
733
|
return conmode_new(cConmode, &t);
|
698
734
|
}
|
@@ -716,7 +752,7 @@ console_conmode_set(VALUE io, VALUE mode)
|
|
716
752
|
r = *t;
|
717
753
|
GetOpenFile(io, fptr);
|
718
754
|
fd = GetReadFD(fptr);
|
719
|
-
if (!setattr(fd, &r))
|
755
|
+
if (!setattr(fd, &r)) sys_fail_fptr(fptr);
|
720
756
|
|
721
757
|
return mode;
|
722
758
|
}
|
@@ -758,7 +794,7 @@ console_winsize(VALUE io)
|
|
758
794
|
|
759
795
|
GetOpenFile(io, fptr);
|
760
796
|
fd = GetWriteFD(fptr);
|
761
|
-
if (!getwinsize(fd, &ws))
|
797
|
+
if (!getwinsize(fd, &ws)) sys_fail_fptr(fptr);
|
762
798
|
return rb_assoc_new(INT2NUM(winsize_row(&ws)), INT2NUM(winsize_col(&ws)));
|
763
799
|
}
|
764
800
|
|
@@ -805,7 +841,7 @@ console_set_winsize(VALUE io, VALUE size)
|
|
805
841
|
SET(xpixel);
|
806
842
|
SET(ypixel);
|
807
843
|
#undef SET
|
808
|
-
if (!setwinsize(fd, &ws))
|
844
|
+
if (!setwinsize(fd, &ws)) sys_fail_fptr(fptr);
|
809
845
|
#elif defined _WIN32
|
810
846
|
wh = (HANDLE)rb_w32_get_osfhandle(fd);
|
811
847
|
#define SET(m) new##m = NIL_P(m) ? 0 : (unsigned short)NUM2UINT(m)
|
@@ -880,7 +916,7 @@ console_iflush(VALUE io)
|
|
880
916
|
GetOpenFile(io, fptr);
|
881
917
|
fd = GetReadFD(fptr);
|
882
918
|
#if defined HAVE_TERMIOS_H || defined HAVE_TERMIO_H
|
883
|
-
if (tcflush(fd, TCIFLUSH))
|
919
|
+
if (tcflush(fd, TCIFLUSH)) sys_fail_fptr(fptr);
|
884
920
|
#endif
|
885
921
|
(void)fd;
|
886
922
|
return io;
|
@@ -903,7 +939,7 @@ console_oflush(VALUE io)
|
|
903
939
|
GetOpenFile(io, fptr);
|
904
940
|
fd = GetWriteFD(fptr);
|
905
941
|
#if defined HAVE_TERMIOS_H || defined HAVE_TERMIO_H
|
906
|
-
if (tcflush(fd, TCOFLUSH))
|
942
|
+
if (tcflush(fd, TCOFLUSH)) sys_fail_fptr(fptr);
|
907
943
|
#endif
|
908
944
|
(void)fd;
|
909
945
|
return io;
|
@@ -930,11 +966,11 @@ console_ioflush(VALUE io)
|
|
930
966
|
fd1 = GetReadFD(fptr);
|
931
967
|
fd2 = GetWriteFD(fptr);
|
932
968
|
if (fd2 != -1 && fd1 != fd2) {
|
933
|
-
if (tcflush(fd1, TCIFLUSH))
|
934
|
-
if (tcflush(fd2, TCOFLUSH))
|
969
|
+
if (tcflush(fd1, TCIFLUSH)) sys_fail_fptr(fptr);
|
970
|
+
if (tcflush(fd2, TCOFLUSH)) sys_fail_fptr(fptr);
|
935
971
|
}
|
936
972
|
else {
|
937
|
-
if (tcflush(fd1, TCIOFLUSH))
|
973
|
+
if (tcflush(fd1, TCIOFLUSH)) sys_fail_fptr(fptr);
|
938
974
|
}
|
939
975
|
#endif
|
940
976
|
return io;
|
@@ -953,7 +989,7 @@ console_beep(VALUE io)
|
|
953
989
|
MessageBeep(0);
|
954
990
|
#else
|
955
991
|
if (write(fd, "\a", 1) < 0)
|
956
|
-
|
992
|
+
sys_fail_fptr(fptr);
|
957
993
|
#endif
|
958
994
|
return io;
|
959
995
|
}
|
@@ -1187,8 +1223,8 @@ console_key_pressed_p(VALUE io, VALUE k)
|
|
1187
1223
|
}
|
1188
1224
|
#else
|
1189
1225
|
struct query_args {
|
1190
|
-
|
1191
|
-
|
1226
|
+
char qstr[6];
|
1227
|
+
unsigned char opt;
|
1192
1228
|
};
|
1193
1229
|
|
1194
1230
|
static int
|
@@ -1489,7 +1525,7 @@ console_dev(int argc, VALUE *argv, VALUE klass)
|
|
1489
1525
|
|
1490
1526
|
/*
|
1491
1527
|
* call-seq:
|
1492
|
-
* io.getch(min: nil, time: nil)
|
1528
|
+
* io.getch(min: nil, time: nil, intr: nil) -> char
|
1493
1529
|
*
|
1494
1530
|
* See IO#getch.
|
1495
1531
|
*/
|
@@ -1526,7 +1562,7 @@ static VALUE
|
|
1526
1562
|
str_chomp(VALUE str)
|
1527
1563
|
{
|
1528
1564
|
if (!NIL_P(str)) {
|
1529
|
-
|
1565
|
+
rb_funcallv(str, id_chomp_bang, 0, 0);
|
1530
1566
|
}
|
1531
1567
|
return str;
|
1532
1568
|
}
|
@@ -1538,6 +1574,10 @@ str_chomp(VALUE str)
|
|
1538
1574
|
* Reads and returns a line without echo back.
|
1539
1575
|
* Prints +prompt+ unless it is +nil+.
|
1540
1576
|
*
|
1577
|
+
* The newline character that terminates the
|
1578
|
+
* read line is removed from the returned string,
|
1579
|
+
* see String#chomp!.
|
1580
|
+
*
|
1541
1581
|
* You must require 'io/console' to use this method.
|
1542
1582
|
*/
|
1543
1583
|
static VALUE
|
@@ -1582,6 +1622,7 @@ Init_console(void)
|
|
1582
1622
|
id_getc = rb_intern("getc");
|
1583
1623
|
#if ENABLE_IO_GETPASS
|
1584
1624
|
id_gets = rb_intern("gets");
|
1625
|
+
id_chomp_bang = rb_intern("chomp!");
|
1585
1626
|
#endif
|
1586
1627
|
id_console = rb_intern("console");
|
1587
1628
|
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"
|
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,13 @@ 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_func("rb_scheduler_timeout")
|
28
|
+
have_func("rb_io_wait")
|
29
|
+
end
|
26
30
|
$defs << "-D""ENABLE_IO_GETPASS=1"
|
27
31
|
create_makefile("io/console") {|conf|
|
28
32
|
conf << "\n""VK_HEADER = #{vk_header}\n"
|
29
33
|
}
|
34
|
+
when nil
|
35
|
+
File.write("Makefile", dummy_makefile($srcdir).join(""))
|
30
36
|
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.8
|
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-02-11 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: []
|