From c1a2e9a82cc7ba1d0025ae964420146037b75208 Mon Sep 17 00:00:00 2001 From: cybermind Date: Mon, 26 Jul 2021 22:06:54 +0500 Subject: [PATCH] Allow piping files to stdin and stdout --- src/stream.c | 29 ++++++++++++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) diff --git a/src/stream.c b/src/stream.c index 8937487..06e63e8 100644 --- a/src/stream.c +++ b/src/stream.c @@ -34,6 +34,10 @@ #include #include #include "stream.h" +#ifdef _WIN32 +#include +#include +#endif /** * Close file stream @@ -98,7 +102,30 @@ static int lzsa_filestream_eof(lzsa_stream_t *stream) { * @return 0 for success, nonzero for failure */ int lzsa_filestream_open(lzsa_stream_t *stream, const char *pszInFilename, const char *pszMode) { - stream->obj = (void*)fopen(pszInFilename, pszMode); + const char* stdInOutFile = "-"; + const char* stdInMode = "rb"; + const char* stdOutMode = "wb"; + int result; + + if (!strncmp(pszInFilename, stdInOutFile, 1)) { + if (!strncmp(pszMode, stdInMode, 2)) { +#ifdef _WIN32 + result = _setmode(_fileno(stdin), _O_BINARY); +#endif + stream->obj = stdin; + } else if (!strncmp(pszMode, stdOutMode, 2)) { +#ifdef _WIN32 + result = _setmode(_fileno(stdout), _O_BINARY); +#endif + stream->obj = stdout; + } else { + return -1; + } + + } else { + stream->obj = (void*)fopen(pszInFilename, pszMode); + } + if (stream->obj) { stream->read = lzsa_filestream_read; stream->write = lzsa_filestream_write;