1// Common/StdInStream.cpp 2 3#include "StdAfx.h" 4 5#include <tchar.h> 6 7#include "StdInStream.h" 8#include "StringConvert.h" 9#include "UTFConvert.h" 10 11#ifdef _MSC_VER 12// "was declared deprecated" disabling 13#pragma warning(disable : 4996 ) 14#endif 15 16static const char kIllegalChar = '\0'; 17static const char kNewLineChar = '\n'; 18 19static const char *kEOFMessage = "Unexpected end of input stream"; 20static const char *kReadErrorMessage ="Error reading input stream"; 21static const char *kIllegalCharMessage = "Illegal character in input stream"; 22 23static LPCTSTR kFileOpenMode = TEXT("r"); 24 25extern int g_CodePage; 26 27CStdInStream g_StdIn(stdin); 28 29bool CStdInStream::Open(LPCTSTR fileName) 30{ 31 Close(); 32 _stream = _tfopen(fileName, kFileOpenMode); 33 _streamIsOpen = (_stream != 0); 34 return _streamIsOpen; 35} 36 37bool CStdInStream::Close() 38{ 39 if (!_streamIsOpen) 40 return true; 41 _streamIsOpen = (fclose(_stream) != 0); 42 return !_streamIsOpen; 43} 44 45CStdInStream::~CStdInStream() 46{ 47 Close(); 48} 49 50AString CStdInStream::ScanStringUntilNewLine(bool allowEOF) 51{ 52 AString s; 53 for (;;) 54 { 55 int intChar = GetChar(); 56 if (intChar == EOF) 57 { 58 if (allowEOF) 59 break; 60 throw kEOFMessage; 61 } 62 char c = char(intChar); 63 if (c == kIllegalChar) 64 throw kIllegalCharMessage; 65 if (c == kNewLineChar) 66 break; 67 s += c; 68 } 69 return s; 70} 71 72UString CStdInStream::ScanUStringUntilNewLine() 73{ 74 AString s = ScanStringUntilNewLine(true); 75 int codePage = g_CodePage; 76 if (codePage == -1) 77 codePage = CP_OEMCP; 78 UString dest; 79 if (codePage == CP_UTF8) 80 ConvertUTF8ToUnicode(s, dest); 81 else 82 dest = MultiByteToUnicodeString(s, (UINT)codePage); 83 return dest; 84} 85 86void CStdInStream::ReadToString(AString &resultString) 87{ 88 resultString.Empty(); 89 int c; 90 while ((c = GetChar()) != EOF) 91 resultString += char(c); 92} 93 94bool CStdInStream::Eof() 95{ 96 return (feof(_stream) != 0); 97} 98 99int CStdInStream::GetChar() 100{ 101 int c = fgetc(_stream); // getc() doesn't work in BeOS? 102 if (c == EOF && !Eof()) 103 throw kReadErrorMessage; 104 return c; 105} 106 107 108