From 21e7622f0bffa1dd3188971bafb82dd51fef1dca Mon Sep 17 00:00:00 2001 From: Robin Mills Date: Tue, 6 Sep 2016 07:29:01 +0000 Subject: [PATCH] #1057 Fixed src\exiv2app.hpp formatting. Moved reading stdin from ctor to getStdin(). WIP: unsolved Windows pipe issues. --- src/exiv2app.hpp | 94 ++++++++++++++++++++++++------------------------ 1 file changed, 48 insertions(+), 46 deletions(-) diff --git a/src/exiv2app.hpp b/src/exiv2app.hpp index c5b0bd6c..9131b73a 100644 --- a/src/exiv2app.hpp +++ b/src/exiv2app.hpp @@ -292,50 +292,6 @@ private: yodAdjust_[yodYear] = emptyYodAdjust_[yodYear]; yodAdjust_[yodMonth] = emptyYodAdjust_[yodMonth]; yodAdjust_[yodDay] = emptyYodAdjust_[yodDay]; - - // copy stdin to stdinBuf - SET_BINARY_MODE(stdin); - -#if 0 -#ifdef _MSC_VER - // http://stackoverflow.com/questions/19955617/win32-read-from-stdin-with-timeout - INPUT_RECORD record; - DWORD numRead; - if ( ReadConsoleInput(GetStdHandle(STD_INPUT_HANDLE), &record, 1, &numRead)) { -#endif -#endif - -#if defined(__APPLE__) || defined(__LINUX__) - // http://stackoverflow.com/questions/34479795/make-c-not-wait-for-user-input/34479916#34479916 - fd_set readfds; - FD_ZERO (&readfds); - FD_SET(STDIN_FILENO, &readfds); - struct timeval timeout = { 0,0 }; - - // if we have something in the pipe, read it - if (select(1, &readfds, NULL, NULL, &timeout)) { - const int buff_size = 4*1028; - Exiv2::byte* bytes = (Exiv2::byte*)::malloc(buff_size); - int nBytes = 0 ; - bool more = bytes != NULL; - while ( more ) { - char buff[buff_size]; - int n = (int) fread(buff,1,buff_size,stdin); - more = n > 0 ; - if ( more ) { - bytes = (Exiv2::byte*) realloc(bytes,nBytes+n); - memcpy(bytes+nBytes,buff,n); - nBytes += n ; - } - } - - if ( nBytes ) { - stdinBuf.alloc(nBytes); - memcpy(stdinBuf.pData_,(const void*)bytes,nBytes); - } - if ( bytes != NULL ) ::free(bytes) ; - } -#endif } //! Prevent copy-construction: not implemented. @@ -398,8 +354,54 @@ public: */ void getStdin(Exiv2::DataBuf& buf) { - buf.alloc(stdinBuf.size_); - memcpy(buf.pData_,stdinBuf.pData_,buf.size_); + if ( stdinBuf.size_ == 0 ) { + // copy stdin to stdinBuf + SET_BINARY_MODE(stdin); + +#if defined(_MSC_VER) + // http://stackoverflow.com/questions/19955617/win32-read-from-stdin-with-timeout + INPUT_RECORD record; + DWORD numRead; + if ( PeekConsoleInput(GetStdHandle(STD_INPUT_HANDLE), &record, 1, &numRead)) { + +#elif defined(__APPLE__) || defined(__LINUX__) // || defined(__CYGWIN__) + // http://stackoverflow.com/questions/34479795/make-c-not-wait-for-user-input/34479916#34479916 + fd_set readfds; + FD_ZERO (&readfds); + FD_SET(STDIN_FILENO, &readfds); + struct timeval timeout = { 0,0 }; + + // if we have something in the pipe, read it + if (select(1, &readfds, NULL, NULL, &timeout)) { +#endif +#if defined(__APPLE__) || defined(__LINUX__) || defined(_MSC_VER) //|| defined(__CYGWIN__) + const int buff_size = 4*1028; + Exiv2::byte* bytes = (Exiv2::byte*)::malloc(buff_size); + int nBytes = 0 ; + bool more = bytes != NULL; + while ( more ) { + char buff[buff_size]; + int n = (int) fread(buff,1,buff_size,stdin); + more = n > 0 ; + if ( more ) { + bytes = (Exiv2::byte*) realloc(bytes,nBytes+n); + memcpy(bytes+nBytes,buff,n); + nBytes += n ; + } + } + + if ( nBytes ) { + stdinBuf.alloc(nBytes); + memcpy(stdinBuf.pData_,(const void*)bytes,nBytes); + } + if ( bytes != NULL ) ::free(bytes) ; + } +#endif + } + if ( stdinBuf.size_ ) { + buf.alloc(stdinBuf.size_); + memcpy(buf.pData_,stdinBuf.pData_,buf.size_); + } }; }; // class Params