aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRon Yorston <rmy@pobox.com>2014-03-20 14:25:06 +0000
committerRon Yorston <rmy@pobox.com>2014-03-20 14:31:23 +0000
commit19633819727ac696e51e0e1f5a6e65fd29f5c089 (patch)
tree6bf83cc85774d36194fe06e3854a04c8188eccc9
parent85aca2f0f45f199458a6cfdcf3eee27c4be2a3a6 (diff)
downloadbusybox-w32-19633819727ac696e51e0e1f5a6e65fd29f5c089.tar.gz
busybox-w32-19633819727ac696e51e0e1f5a6e65fd29f5c089.tar.bz2
busybox-w32-19633819727ac696e51e0e1f5a6e65fd29f5c089.zip
Implement read replacement to handle OEM codepages
-rw-r--r--include/mingw.h2
-rw-r--r--win32/winansi.c26
2 files changed, 28 insertions, 0 deletions
diff --git a/include/mingw.h b/include/mingw.h
index 17db36c05..970eb5ea4 100644
--- a/include/mingw.h
+++ b/include/mingw.h
@@ -147,6 +147,7 @@ int winansi_fputs(const char *str, FILE *stream);
147int winansi_printf(const char *format, ...) __attribute__((format (printf, 1, 2))); 147int winansi_printf(const char *format, ...) __attribute__((format (printf, 1, 2)));
148int winansi_fprintf(FILE *stream, const char *format, ...) __attribute__((format (printf, 2, 3))); 148int winansi_fprintf(FILE *stream, const char *format, ...) __attribute__((format (printf, 2, 3)));
149int winansi_write(int fd, const void *buf, size_t count); 149int winansi_write(int fd, const void *buf, size_t count);
150int winansi_read(int fd, void *buf, size_t count);
150#define putchar winansi_putchar 151#define putchar winansi_putchar
151#define puts winansi_puts 152#define puts winansi_puts
152#define fwrite winansi_fwrite 153#define fwrite winansi_fwrite
@@ -154,6 +155,7 @@ int winansi_write(int fd, const void *buf, size_t count);
154#define printf(...) winansi_printf(__VA_ARGS__) 155#define printf(...) winansi_printf(__VA_ARGS__)
155#define fprintf(...) winansi_fprintf(__VA_ARGS__) 156#define fprintf(...) winansi_fprintf(__VA_ARGS__)
156#define write winansi_write 157#define write winansi_write
158#define read winansi_read
157 159
158int winansi_get_terminal_width_height(struct winsize *win); 160int winansi_get_terminal_width_height(struct winsize *win);
159 161
diff --git a/win32/winansi.c b/win32/winansi.c
index 491285275..8ebe7b1af 100644
--- a/win32/winansi.c
+++ b/win32/winansi.c
@@ -16,6 +16,7 @@
16#undef fwrite 16#undef fwrite
17#undef puts 17#undef puts
18#undef write 18#undef write
19#undef read
19 20
20/* 21/*
21 ANSI codes used by git: m, K 22 ANSI codes used by git: m, K
@@ -25,6 +26,7 @@
25*/ 26*/
26 27
27static HANDLE console; 28static HANDLE console;
29static HANDLE console_in;
28static WORD plain_attr; 30static WORD plain_attr;
29static WORD attr; 31static WORD attr;
30static int negative; 32static int negative;
@@ -37,6 +39,10 @@ static void init(void)
37 if (initialized) 39 if (initialized)
38 return; 40 return;
39 41
42 console_in = GetStdHandle(STD_INPUT_HANDLE);
43 if (console_in == INVALID_HANDLE_VALUE)
44 console_in = NULL;
45
40 console = GetStdHandle(STD_OUTPUT_HANDLE); 46 console = GetStdHandle(STD_OUTPUT_HANDLE);
41 if (console == INVALID_HANDLE_VALUE) 47 if (console == INVALID_HANDLE_VALUE)
42 console = NULL; 48 console = NULL;
@@ -611,3 +617,23 @@ int winansi_write(int fd, const void *buf, size_t count)
611 617
612 return ansi_emulate_write(fd, buf, count); 618 return ansi_emulate_write(fd, buf, count);
613} 619}
620
621int winansi_read(int fd, void *buf, size_t count)
622{
623 int rv;
624
625 rv = read(fd, buf, count);
626 if (!isatty(fd))
627 return rv;
628
629 init();
630
631 if (!console_in)
632 return rv;
633
634 if ( rv > 0 ) {
635 OemToCharBuff(buf, buf, rv);
636 }
637
638 return rv;
639}