io-console 0.6.0 → 0.7.1

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: de02d043306e16f29960fa17d759837467ccefd601846e609b4885ea0daa78ff
4
- data.tar.gz: c856d4c462e9c1ed04c22863b441fc0b2e0802ad9aae0a2a9307d92d3018dd45
3
+ metadata.gz: 3e3b733596bf1321d1707591ae4432f9b376ca67926612396c2ea70af6623298
4
+ data.tar.gz: 4f9af1c89378179febe0bb08b50ac381e2e691cc00db4aac14b4b3b28984e924
5
5
  SHA512:
6
- metadata.gz: a1bc386a15fc15532d8c673a3769284f629a44c10402d5a8b9807ab142d1288eb3158ba6dc485f41e4fa9ead0081c180285fad1bc1f27cf6882e41b44ebdbcf0
7
- data.tar.gz: 6476a4e36be5c0f49ec6ebddbfefb902e15d55fc09f726416bdfb9b781a2c7746504ce06c606fe1573af2cfe0fdb10338a78f1088cc43fcae3b71a133c0e87e9
6
+ metadata.gz: a59066b0ef365b48506ece88aa529c497ba3168d8e1c4448d8be5d14ce4e5068da6d47f65211caa19fdb129514105b253ebaef4f545dbf29057fad772ea950c9
7
+ data.tar.gz: '0068b743595457e23d0607635c3746f4b5cc8731bcfc0f729077b6fd2e23fa84e07024536753cc0eefeffa0a8953d3eccff627c08fe6adb8c529021840ce5d30'
data/.document ADDED
@@ -0,0 +1,4 @@
1
+ LICENSE.txt
2
+ README.md
3
+ ext/
4
+ lib/io/console/size.rb
@@ -76,9 +76,7 @@ getattr(int fd, conmode *t)
76
76
  #endif
77
77
 
78
78
  static ID id_getc, id_console, id_close;
79
- #if ENABLE_IO_GETPASS
80
- static ID id_gets, id_chomp_bang;
81
- #endif
79
+ static ID id_gets, id_flush, id_chomp_bang;
82
80
 
83
81
  #if defined HAVE_RUBY_FIBER_SCHEDULER_H
84
82
  # include "ruby/fiber/scheduler.h"
@@ -87,7 +85,41 @@ extern VALUE rb_scheduler_timeout(struct timeval *timeout);
87
85
  # define rb_fiber_scheduler_make_timeout rb_scheduler_timeout
88
86
  #endif
89
87
 
90
- #define sys_fail_fptr(fptr) rb_sys_fail_str((fptr)->pathv)
88
+ #ifndef HAVE_RB_IO_DESCRIPTOR
89
+ static int
90
+ io_descriptor_fallback(VALUE io)
91
+ {
92
+ rb_io_t *fptr;
93
+ GetOpenFile(io, fptr);
94
+ return fptr->fd;
95
+ }
96
+ #define rb_io_descriptor io_descriptor_fallback
97
+ #endif
98
+
99
+ #ifndef HAVE_RB_IO_PATH
100
+ static VALUE
101
+ io_path_fallback(VALUE io)
102
+ {
103
+ rb_io_t *fptr;
104
+ GetOpenFile(io, fptr);
105
+ return fptr->pathv;
106
+ }
107
+ #define rb_io_path io_path_fallback
108
+ #endif
109
+
110
+ #ifndef HAVE_RB_IO_GET_WRITE_IO
111
+ static VALUE
112
+ io_get_write_io_fallback(VALUE io)
113
+ {
114
+ rb_io_t *fptr;
115
+ GetOpenFile(io, fptr);
116
+ VALUE wio = fptr->tied_io_for_writing;
117
+ return wio ? wio : io;
118
+ }
119
+ #define rb_io_get_write_io io_get_write_io_fallback
120
+ #endif
121
+
122
+ #define sys_fail(io) rb_sys_fail_str(rb_io_path(io))
91
123
 
92
124
  #ifndef HAVE_RB_F_SEND
93
125
  #ifndef RB_PASS_CALLED_KEYWORDS
@@ -293,33 +325,21 @@ set_ttymode(int fd, conmode *t, void (*setter)(conmode *, void *), void *arg)
293
325
  return setattr(fd, &r);
294
326
  }
295
327
 
296
- #define GetReadFD(fptr) ((fptr)->fd)
297
-
298
- static inline int
299
- get_write_fd(const rb_io_t *fptr)
300
- {
301
- VALUE wio = fptr->tied_io_for_writing;
302
- rb_io_t *ofptr;
303
- if (!wio) return fptr->fd;
304
- GetOpenFile(wio, ofptr);
305
- return ofptr->fd;
306
- }
307
- #define GetWriteFD(fptr) get_write_fd(fptr)
328
+ #define GetReadFD(io) rb_io_descriptor(io)
329
+ #define GetWriteFD(io) rb_io_descriptor(rb_io_get_write_io(io))
308
330
 
309
331
  #define FD_PER_IO 2
310
332
 
311
333
  static VALUE
312
334
  ttymode(VALUE io, VALUE (*func)(VALUE), VALUE farg, void (*setter)(conmode *, void *), void *arg)
313
335
  {
314
- rb_io_t *fptr;
315
336
  int status = -1;
316
337
  int error = 0;
317
338
  int fd[FD_PER_IO];
318
339
  conmode t[FD_PER_IO];
319
340
  VALUE result = Qnil;
320
341
 
321
- GetOpenFile(io, fptr);
322
- fd[0] = GetReadFD(fptr);
342
+ fd[0] = GetReadFD(io);
323
343
  if (fd[0] != -1) {
324
344
  if (set_ttymode(fd[0], t+0, setter, arg)) {
325
345
  status = 0;
@@ -329,7 +349,7 @@ ttymode(VALUE io, VALUE (*func)(VALUE), VALUE farg, void (*setter)(conmode *, vo
329
349
  fd[0] = -1;
330
350
  }
331
351
  }
332
- fd[1] = GetWriteFD(fptr);
352
+ fd[1] = GetWriteFD(io);
333
353
  if (fd[1] != -1 && fd[1] != fd[0]) {
334
354
  if (set_ttymode(fd[1], t+1, setter, arg)) {
335
355
  status = 0;
@@ -342,14 +362,13 @@ ttymode(VALUE io, VALUE (*func)(VALUE), VALUE farg, void (*setter)(conmode *, vo
342
362
  if (status == 0) {
343
363
  result = rb_protect(func, farg, &status);
344
364
  }
345
- GetOpenFile(io, fptr);
346
- if (fd[0] != -1 && fd[0] == GetReadFD(fptr)) {
365
+ if (fd[0] != -1 && fd[0] == GetReadFD(io)) {
347
366
  if (!setattr(fd[0], t+0)) {
348
367
  error = errno;
349
368
  status = -1;
350
369
  }
351
370
  }
352
- if (fd[1] != -1 && fd[1] != fd[0] && fd[1] == GetWriteFD(fptr)) {
371
+ if (fd[1] != -1 && fd[1] != fd[0] && fd[1] == GetWriteFD(io)) {
353
372
  if (!setattr(fd[1], t+1)) {
354
373
  error = errno;
355
374
  status = -1;
@@ -435,15 +454,11 @@ static VALUE
435
454
  console_set_raw(int argc, VALUE *argv, VALUE io)
436
455
  {
437
456
  conmode t;
438
- rb_io_t *fptr;
439
- int fd;
440
457
  rawmode_arg_t opts, *optp = rawmode_opt(&argc, argv, 0, 0, &opts);
441
-
442
- GetOpenFile(io, fptr);
443
- fd = GetReadFD(fptr);
444
- if (!getattr(fd, &t)) sys_fail_fptr(fptr);
458
+ int fd = GetReadFD(io);
459
+ if (!getattr(fd, &t)) sys_fail(io);
445
460
  set_rawmode(&t, optp);
446
- if (!setattr(fd, &t)) sys_fail_fptr(fptr);
461
+ if (!setattr(fd, &t)) sys_fail(io);
447
462
  return io;
448
463
  }
449
464
 
@@ -479,14 +494,10 @@ static VALUE
479
494
  console_set_cooked(VALUE io)
480
495
  {
481
496
  conmode t;
482
- rb_io_t *fptr;
483
- int fd;
484
-
485
- GetOpenFile(io, fptr);
486
- fd = GetReadFD(fptr);
487
- if (!getattr(fd, &t)) sys_fail_fptr(fptr);
497
+ int fd = GetReadFD(io);
498
+ if (!getattr(fd, &t)) sys_fail(io);
488
499
  set_cookedmode(&t, NULL);
489
- if (!setattr(fd, &t)) sys_fail_fptr(fptr);
500
+ if (!setattr(fd, &t)) sys_fail(io);
490
501
  return io;
491
502
  }
492
503
 
@@ -638,17 +649,17 @@ static VALUE
638
649
  console_set_echo(VALUE io, VALUE f)
639
650
  {
640
651
  conmode t;
641
- rb_io_t *fptr;
642
- int fd;
652
+ int fd = GetReadFD(io);
653
+
654
+ if (!getattr(fd, &t)) sys_fail(io);
643
655
 
644
- GetOpenFile(io, fptr);
645
- fd = GetReadFD(fptr);
646
- if (!getattr(fd, &t)) sys_fail_fptr(fptr);
647
656
  if (RTEST(f))
648
- set_echo(&t, NULL);
657
+ set_echo(&t, NULL);
649
658
  else
650
- set_noecho(&t, NULL);
651
- if (!setattr(fd, &t)) sys_fail_fptr(fptr);
659
+ set_noecho(&t, NULL);
660
+
661
+ if (!setattr(fd, &t)) sys_fail(io);
662
+
652
663
  return io;
653
664
  }
654
665
 
@@ -664,12 +675,9 @@ static VALUE
664
675
  console_echo_p(VALUE io)
665
676
  {
666
677
  conmode t;
667
- rb_io_t *fptr;
668
- int fd;
678
+ int fd = GetReadFD(io);
669
679
 
670
- GetOpenFile(io, fptr);
671
- fd = GetReadFD(fptr);
672
- if (!getattr(fd, &t)) sys_fail_fptr(fptr);
680
+ if (!getattr(fd, &t)) sys_fail(io);
673
681
  return echo_p(&t) ? Qtrue : Qfalse;
674
682
  }
675
683
 
@@ -748,12 +756,9 @@ static VALUE
748
756
  console_conmode_get(VALUE io)
749
757
  {
750
758
  conmode t;
751
- rb_io_t *fptr;
752
- int fd;
759
+ int fd = GetReadFD(io);
753
760
 
754
- GetOpenFile(io, fptr);
755
- fd = GetReadFD(fptr);
756
- if (!getattr(fd, &t)) sys_fail_fptr(fptr);
761
+ if (!getattr(fd, &t)) sys_fail(io);
757
762
 
758
763
  return conmode_new(cConmode, &t);
759
764
  }
@@ -770,14 +775,12 @@ static VALUE
770
775
  console_conmode_set(VALUE io, VALUE mode)
771
776
  {
772
777
  conmode *t, r;
773
- rb_io_t *fptr;
774
- int fd;
778
+ int fd = GetReadFD(io);
775
779
 
776
780
  TypedData_Get_Struct(mode, conmode, &conmode_type, t);
777
781
  r = *t;
778
- GetOpenFile(io, fptr);
779
- fd = GetReadFD(fptr);
780
- if (!setattr(fd, &r)) sys_fail_fptr(fptr);
782
+
783
+ if (!setattr(fd, &r)) sys_fail(io);
781
784
 
782
785
  return mode;
783
786
  }
@@ -813,13 +816,9 @@ typedef CONSOLE_SCREEN_BUFFER_INFO rb_console_size_t;
813
816
  static VALUE
814
817
  console_winsize(VALUE io)
815
818
  {
816
- rb_io_t *fptr;
817
- int fd;
818
819
  rb_console_size_t ws;
819
-
820
- GetOpenFile(io, fptr);
821
- fd = GetWriteFD(fptr);
822
- if (!getwinsize(fd, &ws)) sys_fail_fptr(fptr);
820
+ int fd = GetWriteFD(io);
821
+ if (!getwinsize(fd, &ws)) sys_fail(io);
823
822
  return rb_assoc_new(INT2NUM(winsize_row(&ws)), INT2NUM(winsize_col(&ws)));
824
823
  }
825
824
 
@@ -835,7 +834,6 @@ console_winsize(VALUE io)
835
834
  static VALUE
836
835
  console_set_winsize(VALUE io, VALUE size)
837
836
  {
838
- rb_io_t *fptr;
839
837
  rb_console_size_t ws;
840
838
  #if defined _WIN32
841
839
  HANDLE wh;
@@ -844,20 +842,17 @@ console_set_winsize(VALUE io, VALUE size)
844
842
  #endif
845
843
  VALUE row, col, xpixel, ypixel;
846
844
  const VALUE *sz;
847
- int fd;
848
845
  long sizelen;
846
+ int fd;
849
847
 
850
- GetOpenFile(io, fptr);
851
848
  size = rb_Array(size);
852
849
  if ((sizelen = RARRAY_LEN(size)) != 2 && sizelen != 4) {
853
- rb_raise(rb_eArgError,
854
- "wrong number of arguments (given %ld, expected 2 or 4)",
855
- sizelen);
850
+ rb_raise(rb_eArgError, "wrong number of arguments (given %ld, expected 2 or 4)", sizelen);
856
851
  }
857
852
  sz = RARRAY_CONST_PTR(size);
858
853
  row = sz[0], col = sz[1], xpixel = ypixel = Qnil;
859
854
  if (sizelen == 4) xpixel = sz[2], ypixel = sz[3];
860
- fd = GetWriteFD(fptr);
855
+ fd = GetWriteFD(io);
861
856
  #if defined TIOCSWINSZ
862
857
  ws.ws_row = ws.ws_col = ws.ws_xpixel = ws.ws_ypixel = 0;
863
858
  #define SET(m) ws.ws_##m = NIL_P(m) ? 0 : (unsigned short)NUM2UINT(m)
@@ -866,7 +861,7 @@ console_set_winsize(VALUE io, VALUE size)
866
861
  SET(xpixel);
867
862
  SET(ypixel);
868
863
  #undef SET
869
- if (!setwinsize(fd, &ws)) sys_fail_fptr(fptr);
864
+ if (!setwinsize(fd, &ws)) sys_fail(io);
870
865
  #elif defined _WIN32
871
866
  wh = (HANDLE)rb_w32_get_osfhandle(fd);
872
867
  #define SET(m) new##m = NIL_P(m) ? 0 : (unsigned short)NUM2UINT(m)
@@ -904,12 +899,10 @@ console_set_winsize(VALUE io, VALUE size)
904
899
  static VALUE
905
900
  console_check_winsize_changed(VALUE io)
906
901
  {
907
- rb_io_t *fptr;
908
902
  HANDLE h;
909
903
  DWORD num;
910
904
 
911
- GetOpenFile(io, fptr);
912
- h = (HANDLE)rb_w32_get_osfhandle(GetReadFD(fptr));
905
+ h = (HANDLE)rb_w32_get_osfhandle(GetReadFD(io));
913
906
  while (GetNumberOfConsoleInputEvents(h, &num) && num > 0) {
914
907
  INPUT_RECORD rec;
915
908
  if (ReadConsoleInput(h, &rec, 1, &num)) {
@@ -935,15 +928,11 @@ console_check_winsize_changed(VALUE io)
935
928
  static VALUE
936
929
  console_iflush(VALUE io)
937
930
  {
938
- rb_io_t *fptr;
939
- int fd;
940
-
941
- GetOpenFile(io, fptr);
942
- fd = GetReadFD(fptr);
943
931
  #if defined HAVE_TERMIOS_H || defined HAVE_TERMIO_H
944
- if (tcflush(fd, TCIFLUSH)) sys_fail_fptr(fptr);
932
+ int fd = GetReadFD(io);
933
+ if (tcflush(fd, TCIFLUSH)) sys_fail(io);
945
934
  #endif
946
- (void)fd;
935
+
947
936
  return io;
948
937
  }
949
938
 
@@ -958,13 +947,9 @@ console_iflush(VALUE io)
958
947
  static VALUE
959
948
  console_oflush(VALUE io)
960
949
  {
961
- rb_io_t *fptr;
962
- int fd;
963
-
964
- GetOpenFile(io, fptr);
965
- fd = GetWriteFD(fptr);
950
+ int fd = GetWriteFD(io);
966
951
  #if defined HAVE_TERMIOS_H || defined HAVE_TERMIO_H
967
- if (tcflush(fd, TCOFLUSH)) sys_fail_fptr(fptr);
952
+ if (tcflush(fd, TCOFLUSH)) sys_fail(io);
968
953
  #endif
969
954
  (void)fd;
970
955
  return io;
@@ -981,40 +966,30 @@ console_oflush(VALUE io)
981
966
  static VALUE
982
967
  console_ioflush(VALUE io)
983
968
  {
984
- rb_io_t *fptr;
985
969
  #if defined HAVE_TERMIOS_H || defined HAVE_TERMIO_H
986
- int fd1, fd2;
987
- #endif
970
+ int fd1 = GetReadFD(io);
971
+ int fd2 = GetWriteFD(io);
988
972
 
989
- GetOpenFile(io, fptr);
990
- #if defined HAVE_TERMIOS_H || defined HAVE_TERMIO_H
991
- fd1 = GetReadFD(fptr);
992
- fd2 = GetWriteFD(fptr);
993
973
  if (fd2 != -1 && fd1 != fd2) {
994
- if (tcflush(fd1, TCIFLUSH)) sys_fail_fptr(fptr);
995
- if (tcflush(fd2, TCOFLUSH)) sys_fail_fptr(fptr);
974
+ if (tcflush(fd1, TCIFLUSH)) sys_fail(io);
975
+ if (tcflush(fd2, TCOFLUSH)) sys_fail(io);
996
976
  }
997
977
  else {
998
- if (tcflush(fd1, TCIOFLUSH)) sys_fail_fptr(fptr);
978
+ if (tcflush(fd1, TCIOFLUSH)) sys_fail(io);
999
979
  }
1000
980
  #endif
981
+
1001
982
  return io;
1002
983
  }
1003
984
 
1004
985
  static VALUE
1005
986
  console_beep(VALUE io)
1006
987
  {
1007
- rb_io_t *fptr;
1008
- int fd;
1009
-
1010
- GetOpenFile(io, fptr);
1011
- fd = GetWriteFD(fptr);
1012
988
  #ifdef _WIN32
1013
- (void)fd;
1014
989
  MessageBeep(0);
1015
990
  #else
1016
- if (write(fd, "\a", 1) < 0)
1017
- sys_fail_fptr(fptr);
991
+ int fd = GetWriteFD(io);
992
+ if (write(fd, "\a", 1) < 0) sys_fail(io);
1018
993
  #endif
1019
994
  return io;
1020
995
  }
@@ -1035,79 +1010,6 @@ mode_in_range(VALUE val, int high, const char *modename)
1035
1010
  }
1036
1011
 
1037
1012
  #if defined _WIN32
1038
- static VALUE
1039
- console_goto(VALUE io, VALUE y, VALUE x)
1040
- {
1041
- rb_io_t *fptr;
1042
- int fd;
1043
- COORD pos;
1044
-
1045
- GetOpenFile(io, fptr);
1046
- fd = GetWriteFD(fptr);
1047
- pos.X = NUM2UINT(x);
1048
- pos.Y = NUM2UINT(y);
1049
- if (!SetConsoleCursorPosition((HANDLE)rb_w32_get_osfhandle(fd), pos)) {
1050
- rb_syserr_fail(LAST_ERROR, 0);
1051
- }
1052
- return io;
1053
- }
1054
-
1055
- static VALUE
1056
- console_cursor_pos(VALUE io)
1057
- {
1058
- rb_io_t *fptr;
1059
- int fd;
1060
- rb_console_size_t ws;
1061
-
1062
- GetOpenFile(io, fptr);
1063
- fd = GetWriteFD(fptr);
1064
- if (!GetConsoleScreenBufferInfo((HANDLE)rb_w32_get_osfhandle(fd), &ws)) {
1065
- rb_syserr_fail(LAST_ERROR, 0);
1066
- }
1067
- return rb_assoc_new(UINT2NUM(ws.dwCursorPosition.Y), UINT2NUM(ws.dwCursorPosition.X));
1068
- }
1069
-
1070
- static VALUE
1071
- console_move(VALUE io, int y, int x)
1072
- {
1073
- rb_io_t *fptr;
1074
- HANDLE h;
1075
- rb_console_size_t ws;
1076
- COORD *pos = &ws.dwCursorPosition;
1077
-
1078
- GetOpenFile(io, fptr);
1079
- h = (HANDLE)rb_w32_get_osfhandle(GetWriteFD(fptr));
1080
- if (!GetConsoleScreenBufferInfo(h, &ws)) {
1081
- rb_syserr_fail(LAST_ERROR, 0);
1082
- }
1083
- pos->X += x;
1084
- pos->Y += y;
1085
- if (!SetConsoleCursorPosition(h, *pos)) {
1086
- rb_syserr_fail(LAST_ERROR, 0);
1087
- }
1088
- return io;
1089
- }
1090
-
1091
- static VALUE
1092
- console_goto_column(VALUE io, VALUE val)
1093
- {
1094
- rb_io_t *fptr;
1095
- HANDLE h;
1096
- rb_console_size_t ws;
1097
- COORD *pos = &ws.dwCursorPosition;
1098
-
1099
- GetOpenFile(io, fptr);
1100
- h = (HANDLE)rb_w32_get_osfhandle(GetWriteFD(fptr));
1101
- if (!GetConsoleScreenBufferInfo(h, &ws)) {
1102
- rb_syserr_fail(LAST_ERROR, 0);
1103
- }
1104
- pos->X = NUM2INT(val);
1105
- if (!SetConsoleCursorPosition(h, *pos)) {
1106
- rb_syserr_fail(LAST_ERROR, 0);
1107
- }
1108
- return io;
1109
- }
1110
-
1111
1013
  static void
1112
1014
  constat_clear(HANDLE handle, WORD attr, DWORD len, COORD pos)
1113
1015
  {
@@ -1117,87 +1019,13 @@ constat_clear(HANDLE handle, WORD attr, DWORD len, COORD pos)
1117
1019
  FillConsoleOutputCharacterW(handle, L' ', len, pos, &written);
1118
1020
  }
1119
1021
 
1120
- static VALUE
1121
- console_erase_line(VALUE io, VALUE val)
1122
- {
1123
- rb_io_t *fptr;
1124
- HANDLE h;
1125
- rb_console_size_t ws;
1126
- COORD *pos = &ws.dwCursorPosition;
1127
- DWORD w;
1128
- int mode = mode_in_range(val, 2, "line erase");
1129
-
1130
- GetOpenFile(io, fptr);
1131
- h = (HANDLE)rb_w32_get_osfhandle(GetWriteFD(fptr));
1132
- if (!GetConsoleScreenBufferInfo(h, &ws)) {
1133
- rb_syserr_fail(LAST_ERROR, 0);
1134
- }
1135
- w = winsize_col(&ws);
1136
- switch (mode) {
1137
- case 0: /* after cursor */
1138
- w -= pos->X;
1139
- break;
1140
- case 1: /* before *and* cursor */
1141
- w = pos->X + 1;
1142
- pos->X = 0;
1143
- break;
1144
- case 2: /* entire line */
1145
- pos->X = 0;
1146
- break;
1147
- }
1148
- constat_clear(h, ws.wAttributes, w, *pos);
1149
- return io;
1150
- }
1151
-
1152
- static VALUE
1153
- console_erase_screen(VALUE io, VALUE val)
1154
- {
1155
- rb_io_t *fptr;
1156
- HANDLE h;
1157
- rb_console_size_t ws;
1158
- COORD *pos = &ws.dwCursorPosition;
1159
- DWORD w;
1160
- int mode = mode_in_range(val, 3, "screen erase");
1161
-
1162
- GetOpenFile(io, fptr);
1163
- h = (HANDLE)rb_w32_get_osfhandle(GetWriteFD(fptr));
1164
- if (!GetConsoleScreenBufferInfo(h, &ws)) {
1165
- rb_syserr_fail(LAST_ERROR, 0);
1166
- }
1167
- w = winsize_col(&ws);
1168
- switch (mode) {
1169
- case 0: /* erase after cursor */
1170
- w = (w * (ws.srWindow.Bottom - pos->Y + 1) - pos->X);
1171
- break;
1172
- case 1: /* erase before *and* cursor */
1173
- w = (w * (pos->Y - ws.srWindow.Top) + pos->X + 1);
1174
- pos->X = 0;
1175
- pos->Y = ws.srWindow.Top;
1176
- break;
1177
- case 2: /* erase entire screen */
1178
- w = (w * winsize_row(&ws));
1179
- pos->X = 0;
1180
- pos->Y = ws.srWindow.Top;
1181
- break;
1182
- case 3: /* erase entire screen */
1183
- w = (w * ws.dwSize.Y);
1184
- pos->X = 0;
1185
- pos->Y = 0;
1186
- break;
1187
- }
1188
- constat_clear(h, ws.wAttributes, w, *pos);
1189
- return io;
1190
- }
1191
-
1192
1022
  static VALUE
1193
1023
  console_scroll(VALUE io, int line)
1194
1024
  {
1195
- rb_io_t *fptr;
1196
1025
  HANDLE h;
1197
1026
  rb_console_size_t ws;
1198
1027
 
1199
- GetOpenFile(io, fptr);
1200
- h = (HANDLE)rb_w32_get_osfhandle(GetWriteFD(fptr));
1028
+ h = (HANDLE)rb_w32_get_osfhandle(GetWriteFD(io));
1201
1029
  if (!GetConsoleScreenBufferInfo(h, &ws)) {
1202
1030
  rb_syserr_fail(LAST_ERROR, 0);
1203
1031
  }
@@ -1256,23 +1084,11 @@ static int
1256
1084
  direct_query(VALUE io, const struct query_args *query)
1257
1085
  {
1258
1086
  if (RB_TYPE_P(io, T_FILE)) {
1259
- rb_io_t *fptr;
1260
- VALUE wio;
1261
- GetOpenFile(io, fptr);
1262
- wio = fptr->tied_io_for_writing;
1263
- if (wio) {
1264
- VALUE s = rb_str_new_cstr(query->qstr);
1265
- rb_io_write(wio, s);
1266
- rb_io_flush(wio);
1267
- return 1;
1268
- }
1269
- if (write(fptr->fd, query->qstr, strlen(query->qstr)) != -1) {
1270
- return 1;
1271
- }
1272
- if (fptr->fd == 0 &&
1273
- write(1, query->qstr, strlen(query->qstr)) != -1) {
1274
- return 1;
1275
- }
1087
+ VALUE wio = rb_io_get_write_io(io);
1088
+ VALUE s = rb_str_new_cstr(query->qstr);
1089
+ rb_io_write(wio, s);
1090
+ rb_io_flush(wio);
1091
+ return 1;
1276
1092
  }
1277
1093
  return 0;
1278
1094
  }
@@ -1322,9 +1138,41 @@ console_vt_response(int argc, VALUE *argv, VALUE io, const struct query_args *qa
1322
1138
  return ret;
1323
1139
  }
1324
1140
 
1141
+ static VALUE
1142
+ console_scroll(VALUE io, int line)
1143
+ {
1144
+ if (line) {
1145
+ VALUE s = rb_sprintf("\x1b[%d%c", line < 0 ? -line : line,
1146
+ line < 0 ? 'T' : 'S');
1147
+ rb_io_write(io, s);
1148
+ }
1149
+ return io;
1150
+ }
1151
+
1152
+ # define console_key_pressed_p rb_f_notimplement
1153
+ #endif
1154
+
1155
+ /*
1156
+ * call-seq:
1157
+ * io.cursor -> [row, column]
1158
+ *
1159
+ * Returns the current cursor position as a two-element array of integers (row, column)
1160
+ *
1161
+ * io.cursor # => [3, 5]
1162
+ *
1163
+ * You must require 'io/console' to use this method.
1164
+ */
1325
1165
  static VALUE
1326
1166
  console_cursor_pos(VALUE io)
1327
1167
  {
1168
+ #ifdef _WIN32
1169
+ rb_console_size_t ws;
1170
+ int fd = GetWriteFD(io);
1171
+ if (!GetConsoleScreenBufferInfo((HANDLE)rb_w32_get_osfhandle(fd), &ws)) {
1172
+ rb_syserr_fail(LAST_ERROR, 0);
1173
+ }
1174
+ return rb_assoc_new(UINT2NUM(ws.dwCursorPosition.Y), UINT2NUM(ws.dwCursorPosition.X));
1175
+ #else
1328
1176
  static const struct query_args query = {"\033[6n", 0};
1329
1177
  VALUE resp = console_vt_response(0, 0, io, &query);
1330
1178
  VALUE row, column, term;
@@ -1341,18 +1189,44 @@ console_cursor_pos(VALUE io)
1341
1189
  RARRAY_ASET(resp, 0, INT2NUM(r));
1342
1190
  RARRAY_ASET(resp, 1, INT2NUM(c));
1343
1191
  return resp;
1192
+ #endif
1344
1193
  }
1345
1194
 
1346
1195
  static VALUE
1347
1196
  console_goto(VALUE io, VALUE y, VALUE x)
1348
1197
  {
1198
+ #ifdef _WIN32
1199
+ COORD pos;
1200
+ int fd = GetWriteFD(io);
1201
+ pos.X = NUM2UINT(x);
1202
+ pos.Y = NUM2UINT(y);
1203
+ if (!SetConsoleCursorPosition((HANDLE)rb_w32_get_osfhandle(fd), pos)) {
1204
+ rb_syserr_fail(LAST_ERROR, 0);
1205
+ }
1206
+ #else
1349
1207
  rb_io_write(io, rb_sprintf("\x1b[%d;%dH", NUM2UINT(y)+1, NUM2UINT(x)+1));
1208
+ #endif
1350
1209
  return io;
1351
1210
  }
1352
1211
 
1353
1212
  static VALUE
1354
1213
  console_move(VALUE io, int y, int x)
1355
1214
  {
1215
+ #ifdef _WIN32
1216
+ HANDLE h;
1217
+ rb_console_size_t ws;
1218
+ COORD *pos = &ws.dwCursorPosition;
1219
+
1220
+ h = (HANDLE)rb_w32_get_osfhandle(GetWriteFD(io));
1221
+ if (!GetConsoleScreenBufferInfo(h, &ws)) {
1222
+ rb_syserr_fail(LAST_ERROR, 0);
1223
+ }
1224
+ pos->X += x;
1225
+ pos->Y += y;
1226
+ if (!SetConsoleCursorPosition(h, *pos)) {
1227
+ rb_syserr_fail(LAST_ERROR, 0);
1228
+ }
1229
+ #else
1356
1230
  if (x || y) {
1357
1231
  VALUE s = rb_str_new_cstr("");
1358
1232
  if (y) rb_str_catf(s, "\x1b[%d%c", y < 0 ? -y : y, y < 0 ? 'A' : 'B');
@@ -1360,13 +1234,29 @@ console_move(VALUE io, int y, int x)
1360
1234
  rb_io_write(io, s);
1361
1235
  rb_io_flush(io);
1362
1236
  }
1237
+ #endif
1363
1238
  return io;
1364
1239
  }
1365
1240
 
1366
1241
  static VALUE
1367
1242
  console_goto_column(VALUE io, VALUE val)
1368
1243
  {
1244
+ #ifdef _WIN32
1245
+ HANDLE h;
1246
+ rb_console_size_t ws;
1247
+ COORD *pos = &ws.dwCursorPosition;
1248
+
1249
+ h = (HANDLE)rb_w32_get_osfhandle(GetWriteFD(io));
1250
+ if (!GetConsoleScreenBufferInfo(h, &ws)) {
1251
+ rb_syserr_fail(LAST_ERROR, 0);
1252
+ }
1253
+ pos->X = NUM2INT(val);
1254
+ if (!SetConsoleCursorPosition(h, *pos)) {
1255
+ rb_syserr_fail(LAST_ERROR, 0);
1256
+ }
1257
+ #else
1369
1258
  rb_io_write(io, rb_sprintf("\x1b[%dG", NUM2UINT(val)+1));
1259
+ #endif
1370
1260
  return io;
1371
1261
  }
1372
1262
 
@@ -1374,7 +1264,34 @@ static VALUE
1374
1264
  console_erase_line(VALUE io, VALUE val)
1375
1265
  {
1376
1266
  int mode = mode_in_range(val, 2, "line erase");
1267
+ #ifdef _WIN32
1268
+ HANDLE h;
1269
+ rb_console_size_t ws;
1270
+ COORD *pos = &ws.dwCursorPosition;
1271
+ DWORD w;
1272
+
1273
+ h = (HANDLE)rb_w32_get_osfhandle(GetWriteFD(io));
1274
+ if (!GetConsoleScreenBufferInfo(h, &ws)) {
1275
+ rb_syserr_fail(LAST_ERROR, 0);
1276
+ }
1277
+ w = winsize_col(&ws);
1278
+ switch (mode) {
1279
+ case 0: /* after cursor */
1280
+ w -= pos->X;
1281
+ break;
1282
+ case 1: /* before *and* cursor */
1283
+ w = pos->X + 1;
1284
+ pos->X = 0;
1285
+ break;
1286
+ case 2: /* entire line */
1287
+ pos->X = 0;
1288
+ break;
1289
+ }
1290
+ constat_clear(h, ws.wAttributes, w, *pos);
1291
+ return io;
1292
+ #else
1377
1293
  rb_io_write(io, rb_sprintf("\x1b[%dK", mode));
1294
+ #endif
1378
1295
  return io;
1379
1296
  }
1380
1297
 
@@ -1382,22 +1299,43 @@ static VALUE
1382
1299
  console_erase_screen(VALUE io, VALUE val)
1383
1300
  {
1384
1301
  int mode = mode_in_range(val, 3, "screen erase");
1385
- rb_io_write(io, rb_sprintf("\x1b[%dJ", mode));
1386
- return io;
1387
- }
1302
+ #ifdef _WIN32
1303
+ HANDLE h;
1304
+ rb_console_size_t ws;
1305
+ COORD *pos = &ws.dwCursorPosition;
1306
+ DWORD w;
1388
1307
 
1389
- static VALUE
1390
- console_scroll(VALUE io, int line)
1391
- {
1392
- if (line) {
1393
- VALUE s = rb_sprintf("\x1b[%d%c", line < 0 ? -line : line,
1394
- line < 0 ? 'T' : 'S');
1395
- rb_io_write(io, s);
1308
+ h = (HANDLE)rb_w32_get_osfhandle(GetWriteFD(io));
1309
+ if (!GetConsoleScreenBufferInfo(h, &ws)) {
1310
+ rb_syserr_fail(LAST_ERROR, 0);
1396
1311
  }
1312
+ w = winsize_col(&ws);
1313
+ switch (mode) {
1314
+ case 0: /* erase after cursor */
1315
+ w = (w * (ws.srWindow.Bottom - pos->Y + 1) - pos->X);
1316
+ break;
1317
+ case 1: /* erase before *and* cursor */
1318
+ w = (w * (pos->Y - ws.srWindow.Top) + pos->X + 1);
1319
+ pos->X = 0;
1320
+ pos->Y = ws.srWindow.Top;
1321
+ break;
1322
+ case 2: /* erase entire screen */
1323
+ w = (w * winsize_row(&ws));
1324
+ pos->X = 0;
1325
+ pos->Y = ws.srWindow.Top;
1326
+ break;
1327
+ case 3: /* erase entire screen */
1328
+ w = (w * ws.dwSize.Y);
1329
+ pos->X = 0;
1330
+ pos->Y = 0;
1331
+ break;
1332
+ }
1333
+ constat_clear(h, ws.wAttributes, w, *pos);
1334
+ #else
1335
+ rb_io_write(io, rb_sprintf("\x1b[%dJ", mode));
1336
+ #endif
1397
1337
  return io;
1398
1338
  }
1399
- # define console_key_pressed_p rb_f_notimplement
1400
- #endif
1401
1339
 
1402
1340
  static VALUE
1403
1341
  console_cursor_set(VALUE io, VALUE cpos)
@@ -1451,6 +1389,38 @@ console_clear_screen(VALUE io)
1451
1389
  return io;
1452
1390
  }
1453
1391
 
1392
+ #ifndef HAVE_RB_IO_OPEN_DESCRIPTOR
1393
+ static VALUE
1394
+ io_open_descriptor_fallback(VALUE klass, int descriptor, int mode, VALUE path, VALUE timeout, void *encoding)
1395
+ {
1396
+ rb_update_max_fd(descriptor);
1397
+
1398
+ VALUE arguments[2] = {
1399
+ INT2NUM(descriptor),
1400
+ INT2FIX(mode),
1401
+ };
1402
+
1403
+ VALUE self = rb_class_new_instance(2, arguments, klass);
1404
+
1405
+ rb_io_t *fptr;
1406
+ GetOpenFile(self, fptr);
1407
+ fptr->pathv = path;
1408
+ fptr->mode |= mode;
1409
+
1410
+ return self;
1411
+ }
1412
+ #define rb_io_open_descriptor io_open_descriptor_fallback
1413
+ #endif
1414
+
1415
+ #ifndef HAVE_RB_IO_CLOSED_P
1416
+ static VALUE
1417
+ rb_io_closed_p(VALUE io)
1418
+ {
1419
+ rb_io_t *fptr = RFILE(io)->fptr;
1420
+ return fptr->fd == -1 ? Qtrue : Qfalse;
1421
+ }
1422
+ #endif
1423
+
1454
1424
  /*
1455
1425
  * call-seq:
1456
1426
  * IO.console -> #<File:/dev/tty>
@@ -1468,34 +1438,37 @@ static VALUE
1468
1438
  console_dev(int argc, VALUE *argv, VALUE klass)
1469
1439
  {
1470
1440
  VALUE con = 0;
1471
- rb_io_t *fptr;
1472
1441
  VALUE sym = 0;
1473
1442
 
1474
1443
  rb_check_arity(argc, 0, UNLIMITED_ARGUMENTS);
1444
+
1475
1445
  if (argc) {
1476
- Check_Type(sym = argv[0], T_SYMBOL);
1446
+ Check_Type(sym = argv[0], T_SYMBOL);
1477
1447
  }
1448
+
1449
+ // Force the class to be File.
1478
1450
  if (klass == rb_cIO) klass = rb_cFile;
1451
+
1479
1452
  if (rb_const_defined(klass, id_console)) {
1480
- con = rb_const_get(klass, id_console);
1481
- if (!RB_TYPE_P(con, T_FILE) ||
1482
- (!(fptr = RFILE(con)->fptr) || GetReadFD(fptr) == -1)) {
1483
- rb_const_remove(klass, id_console);
1484
- con = 0;
1485
- }
1453
+ con = rb_const_get(klass, id_console);
1454
+ if (!RB_TYPE_P(con, T_FILE) || RTEST(rb_io_closed_p(con))) {
1455
+ rb_const_remove(klass, id_console);
1456
+ con = 0;
1457
+ }
1486
1458
  }
1459
+
1487
1460
  if (sym) {
1488
- if (sym == ID2SYM(id_close) && argc == 1) {
1489
- if (con) {
1490
- rb_io_close(con);
1491
- rb_const_remove(klass, id_console);
1492
- con = 0;
1493
- }
1494
- return Qnil;
1495
- }
1461
+ if (sym == ID2SYM(id_close) && argc == 1) {
1462
+ if (con) {
1463
+ rb_io_close(con);
1464
+ rb_const_remove(klass, id_console);
1465
+ con = 0;
1466
+ }
1467
+ return Qnil;
1468
+ }
1496
1469
  }
1470
+
1497
1471
  if (!con) {
1498
- VALUE args[2];
1499
1472
  #if defined HAVE_TERMIOS_H || defined HAVE_TERMIO_H || defined HAVE_SGTTY_H
1500
1473
  # define CONSOLE_DEVICE "/dev/tty"
1501
1474
  #elif defined _WIN32
@@ -1507,44 +1480,36 @@ console_dev(int argc, VALUE *argv, VALUE klass)
1507
1480
  # define CONSOLE_DEVICE_FOR_READING CONSOLE_DEVICE
1508
1481
  #endif
1509
1482
  #ifdef CONSOLE_DEVICE_FOR_WRITING
1510
- VALUE out;
1511
- rb_io_t *ofptr;
1483
+ VALUE out;
1484
+ rb_io_t *ofptr;
1512
1485
  #endif
1513
- int fd;
1486
+ int fd;
1487
+ VALUE path = rb_obj_freeze(rb_str_new2(CONSOLE_DEVICE));
1514
1488
 
1515
1489
  #ifdef CONSOLE_DEVICE_FOR_WRITING
1516
- fd = rb_cloexec_open(CONSOLE_DEVICE_FOR_WRITING, O_RDWR, 0);
1517
- if (fd < 0) return Qnil;
1518
- rb_update_max_fd(fd);
1519
- args[1] = INT2FIX(O_WRONLY);
1520
- args[0] = INT2NUM(fd);
1521
- out = rb_class_new_instance(2, args, klass);
1490
+ fd = rb_cloexec_open(CONSOLE_DEVICE_FOR_WRITING, O_RDWR, 0);
1491
+ if (fd < 0) return Qnil;
1492
+ out = rb_io_open_descriptor(klass, fd, FMODE_WRITABLE | FMODE_SYNC, path, Qnil, NULL);
1522
1493
  #endif
1523
- fd = rb_cloexec_open(CONSOLE_DEVICE_FOR_READING, O_RDWR, 0);
1524
- if (fd < 0) {
1494
+ fd = rb_cloexec_open(CONSOLE_DEVICE_FOR_READING, O_RDWR, 0);
1495
+ if (fd < 0) {
1525
1496
  #ifdef CONSOLE_DEVICE_FOR_WRITING
1526
- rb_io_close(out);
1497
+ rb_io_close(out);
1527
1498
  #endif
1528
- return Qnil;
1529
- }
1530
- rb_update_max_fd(fd);
1531
- args[1] = INT2FIX(O_RDWR);
1532
- args[0] = INT2NUM(fd);
1533
- con = rb_class_new_instance(2, args, klass);
1534
- GetOpenFile(con, fptr);
1535
- fptr->pathv = rb_obj_freeze(rb_str_new2(CONSOLE_DEVICE));
1499
+ return Qnil;
1500
+ }
1501
+
1502
+ con = rb_io_open_descriptor(klass, fd, FMODE_READWRITE | FMODE_SYNC, path, Qnil, NULL);
1536
1503
  #ifdef CONSOLE_DEVICE_FOR_WRITING
1537
- GetOpenFile(out, ofptr);
1538
- ofptr->pathv = fptr->pathv;
1539
- fptr->tied_io_for_writing = out;
1540
- ofptr->mode |= FMODE_SYNC;
1504
+ rb_io_set_write_io(con, out);
1541
1505
  #endif
1542
- fptr->mode |= FMODE_SYNC;
1543
- rb_const_set(klass, id_console, con);
1506
+ rb_const_set(klass, id_console, con);
1544
1507
  }
1508
+
1545
1509
  if (sym) {
1546
- return rb_f_send(argc, argv, con);
1510
+ return rb_f_send(argc, argv, con);
1547
1511
  }
1512
+
1548
1513
  return con;
1549
1514
  }
1550
1515
 
@@ -1560,13 +1525,18 @@ io_getch(int argc, VALUE *argv, VALUE io)
1560
1525
  return rb_funcallv(io, id_getc, argc, argv);
1561
1526
  }
1562
1527
 
1563
- #if ENABLE_IO_GETPASS
1564
1528
  static VALUE
1565
1529
  puts_call(VALUE io)
1566
1530
  {
1567
1531
  return rb_io_write(io, rb_default_rs);
1568
1532
  }
1569
1533
 
1534
+ static VALUE
1535
+ gets_call(VALUE io)
1536
+ {
1537
+ return rb_funcallv(io, id_gets, 0, 0);
1538
+ }
1539
+
1570
1540
  static VALUE
1571
1541
  getpass_call(VALUE io)
1572
1542
  {
@@ -1587,7 +1557,8 @@ static VALUE
1587
1557
  str_chomp(VALUE str)
1588
1558
  {
1589
1559
  if (!NIL_P(str)) {
1590
- rb_funcallv(str, id_chomp_bang, 0, 0);
1560
+ const VALUE rs = rb_default_rs; /* rvalue in TruffleRuby */
1561
+ rb_funcallv(str, id_chomp_bang, 1, &rs);
1591
1562
  }
1592
1563
  return str;
1593
1564
  }
@@ -1604,6 +1575,12 @@ str_chomp(VALUE str)
1604
1575
  * see String#chomp!.
1605
1576
  *
1606
1577
  * You must require 'io/console' to use this method.
1578
+ *
1579
+ * require 'io/console'
1580
+ * IO::console.getpass("Enter password:")
1581
+ * Enter password:
1582
+ * # => "mypassword"
1583
+ *
1607
1584
  */
1608
1585
  static VALUE
1609
1586
  console_getpass(int argc, VALUE *argv, VALUE io)
@@ -1614,6 +1591,7 @@ console_getpass(int argc, VALUE *argv, VALUE io)
1614
1591
  wio = rb_io_get_write_io(io);
1615
1592
  if (wio == io && io == rb_stdin) wio = rb_stderr;
1616
1593
  prompt(argc, argv, wio);
1594
+ rb_io_flush(wio);
1617
1595
  str = rb_ensure(getpass_call, io, puts_call, wio);
1618
1596
  return str_chomp(str);
1619
1597
  }
@@ -1631,11 +1609,10 @@ io_getpass(int argc, VALUE *argv, VALUE io)
1631
1609
 
1632
1610
  rb_check_arity(argc, 0, 1);
1633
1611
  prompt(argc, argv, io);
1634
- str = str_chomp(rb_funcallv(io, id_gets, 0, 0));
1635
- puts_call(io);
1636
- return str;
1612
+ rb_check_funcall(io, id_flush, 0, 0);
1613
+ str = rb_ensure(gets_call, io, puts_call, io);
1614
+ return str_chomp(str);
1637
1615
  }
1638
- #endif
1639
1616
 
1640
1617
  /*
1641
1618
  * IO console methods
@@ -1645,10 +1622,9 @@ Init_console(void)
1645
1622
  {
1646
1623
  #undef rb_intern
1647
1624
  id_getc = rb_intern("getc");
1648
- #if ENABLE_IO_GETPASS
1649
1625
  id_gets = rb_intern("gets");
1626
+ id_flush = rb_intern("flush");
1650
1627
  id_chomp_bang = rb_intern("chomp!");
1651
- #endif
1652
1628
  id_console = rb_intern("console");
1653
1629
  id_close = rb_intern("close");
1654
1630
  #define init_rawmode_opt_id(name) \
@@ -1696,20 +1672,17 @@ InitVM_console(void)
1696
1672
  rb_define_method(rb_cIO, "clear_screen", console_clear_screen, 0);
1697
1673
  rb_define_method(rb_cIO, "pressed?", console_key_pressed_p, 1);
1698
1674
  rb_define_method(rb_cIO, "check_winsize_changed", console_check_winsize_changed, 0);
1699
- #if ENABLE_IO_GETPASS
1700
1675
  rb_define_method(rb_cIO, "getpass", console_getpass, -1);
1701
- #endif
1702
1676
  rb_define_singleton_method(rb_cIO, "console", console_dev, -1);
1703
1677
  {
1704
1678
  VALUE mReadable = rb_define_module_under(rb_cIO, "generic_readable");
1705
1679
  rb_define_method(mReadable, "getch", io_getch, -1);
1706
- #if ENABLE_IO_GETPASS
1707
1680
  rb_define_method(mReadable, "getpass", io_getpass, -1);
1708
- #endif
1709
1681
  }
1710
1682
  {
1711
1683
  /* :stopdoc: */
1712
1684
  cConmode = rb_define_class_under(rb_cIO, "ConsoleMode", rb_cObject);
1685
+ rb_define_const(cConmode, "VERSION", rb_str_new_cstr(STRINGIZE(IO_CONSOLE_VERSION)));
1713
1686
  rb_define_alloc_func(cConmode, conmode_alloc);
1714
1687
  rb_undef_method(cConmode, "initialize");
1715
1688
  rb_define_method(cConmode, "initialize_copy", conmode_init_copy, 1);
@@ -1,6 +1,17 @@
1
1
  # frozen_string_literal: false
2
2
  require 'mkmf'
3
3
 
4
+ version = ["../../..", "."].find do |dir|
5
+ break File.read(File.join(__dir__, dir, "io-console.gemspec"))[/^_VERSION\s*=\s*"(.*?)"/, 1]
6
+ rescue
7
+ end
8
+
9
+ have_func("rb_io_path")
10
+ have_func("rb_io_descriptor")
11
+ have_func("rb_io_get_write_io")
12
+ have_func("rb_io_closed_p")
13
+ have_func("rb_io_open_descriptor")
14
+
4
15
  ok = true if RUBY_ENGINE == "ruby" || RUBY_ENGINE == "truffleruby"
5
16
  hdr = nil
6
17
  case
@@ -29,7 +40,7 @@ when true
29
40
  elsif have_func("rb_scheduler_timeout") # 3.0
30
41
  have_func("rb_io_wait")
31
42
  end
32
- $defs << "-D""ENABLE_IO_GETPASS=1"
43
+ $defs << "-D""IO_CONSOLE_VERSION=#{version}"
33
44
  create_makefile("io/console") {|conf|
34
45
  conf << "\n""VK_HEADER = #{vk_header}\n"
35
46
  }
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.6.0
4
+ version: 0.7.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Nobu Nakada
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-12-16 00:00:00.000000000 Z
11
+ date: 2023-12-16 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: add console capabilities to IO instances.
14
14
  email: nobu@ruby-lang.org
@@ -17,6 +17,7 @@ extensions:
17
17
  - ext/io/console/extconf.rb
18
18
  extra_rdoc_files: []
19
19
  files:
20
+ - ".document"
20
21
  - LICENSE.txt
21
22
  - README.md
22
23
  - ext/io/console/console.c
@@ -44,7 +45,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
44
45
  - !ruby/object:Gem::Version
45
46
  version: '0'
46
47
  requirements: []
47
- rubygems_version: 3.4.0.dev
48
+ rubygems_version: 3.5.0.dev
48
49
  signing_key:
49
50
  specification_version: 4
50
51
  summary: Console interface