aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRon Yorston <rmy@pobox.com>2023-07-06 10:56:39 +0100
committerRon Yorston <rmy@pobox.com>2023-07-06 11:00:15 +0100
commit1f1ab4d386c8c91adc2292faaee42fe4909f2822 (patch)
tree44859a1e90469debe48e900508543aa10c23d49b
parent532706d17698b48e68bdbf8905c7d700f181488f (diff)
downloadbusybox-w32-1f1ab4d386c8c91adc2292faaee42fe4909f2822.tar.gz
busybox-w32-1f1ab4d386c8c91adc2292faaee42fe4909f2822.tar.bz2
busybox-w32-1f1ab4d386c8c91adc2292faaee42fe4909f2822.zip
win32: character conversion for fread(3)
Some applets use fread(3): dd and od, for example. Perform the necessary conversion when input is coming from the console. Costs 96-112 bytes.
-rw-r--r--include/mingw.h2
-rw-r--r--win32/winansi.c15
2 files changed, 17 insertions, 0 deletions
diff --git a/include/mingw.h b/include/mingw.h
index 34c8bfa3f..a95bf2e91 100644
--- a/include/mingw.h
+++ b/include/mingw.h
@@ -170,6 +170,7 @@ int winansi_printf(const char *format, ...) __attribute__((format (printf, 1, 2)
170int winansi_fprintf(FILE *stream, const char *format, ...) __attribute__((format (printf, 2, 3))); 170int winansi_fprintf(FILE *stream, const char *format, ...) __attribute__((format (printf, 2, 3)));
171int winansi_write(int fd, const void *buf, size_t count); 171int winansi_write(int fd, const void *buf, size_t count);
172int winansi_read(int fd, void *buf, size_t count); 172int winansi_read(int fd, void *buf, size_t count);
173size_t winansi_fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
173int winansi_getc(FILE *stream); 174int winansi_getc(FILE *stream);
174 175
175#define putchar winansi_putchar 176#define putchar winansi_putchar
@@ -186,6 +187,7 @@ int winansi_getc(FILE *stream);
186#define fprintf(...) winansi_fprintf(__VA_ARGS__) 187#define fprintf(...) winansi_fprintf(__VA_ARGS__)
187#define write winansi_write 188#define write winansi_write
188#define read winansi_read 189#define read winansi_read
190#define fread winansi_fread
189#define getc winansi_getc 191#define getc winansi_getc
190 192
191/* 193/*
diff --git a/win32/winansi.c b/win32/winansi.c
index 5a6c33350..ad0d92698 100644
--- a/win32/winansi.c
+++ b/win32/winansi.c
@@ -24,6 +24,7 @@ static BOOL charToConA(LPSTR s);
24#undef puts 24#undef puts
25#undef write 25#undef write
26#undef read 26#undef read
27#undef fread
27#undef getc 28#undef getc
28 29
29#define FOREGROUND_ALL (FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE) 30#define FOREGROUND_ALL (FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE)
@@ -1136,6 +1137,20 @@ int winansi_read(int fd, void *buf, size_t count)
1136 return rv; 1137 return rv;
1137} 1138}
1138 1139
1140size_t winansi_fread(void *ptr, size_t size, size_t nmemb, FILE *stream)
1141{
1142 int rv;
1143
1144 rv = fread(ptr, size, nmemb, stream);
1145 if (!is_console_in(fileno(stream)))
1146 return rv;
1147
1148 if (rv > 0)
1149 conToCharBuffA(ptr, rv * size);
1150
1151 return rv;
1152}
1153
1139int winansi_getc(FILE *stream) 1154int winansi_getc(FILE *stream)
1140{ 1155{
1141 int rv; 1156 int rv;