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 11static const char kNewLineChar = '\n'; 12 13static const char *kEOFMessage = "Unexpected end of input stream"; 14static const char *kReadErrorMessage ="Error reading input stream"; 15static const char *kIllegalCharMessage = "Illegal character in input stream"; 16 17static LPCTSTR kFileOpenMode = TEXT("r"); 18 19extern int g_CodePage; 20 21CStdInStream g_StdIn(stdin); 22 23bool CStdInStream::Open(LPCTSTR fileName) throw() 24{ 25 Close(); 26 _stream = _tfopen(fileName, kFileOpenMode); 27 _streamIsOpen = (_stream != 0); 28 return _streamIsOpen; 29} 30 31bool CStdInStream::Close() throw() 32{ 33 if (!_streamIsOpen) 34 return true; 35 _streamIsOpen = (fclose(_stream) != 0); 36 return !_streamIsOpen; 37} 38 39AString CStdInStream::ScanStringUntilNewLine(bool allowEOF) 40{ 41 AString s; 42 for (;;) 43 { 44 int intChar = GetChar(); 45 if (intChar == EOF) 46 { 47 if (allowEOF) 48 break; 49 throw kEOFMessage; 50 } 51 char c = (char)intChar; 52 if (c == 0) 53 throw kIllegalCharMessage; 54 if (c == kNewLineChar) 55 break; 56 s += c; 57 } 58 return s; 59} 60 61UString CStdInStream::ScanUStringUntilNewLine() 62{ 63 AString s = ScanStringUntilNewLine(true); 64 int codePage = g_CodePage; 65 if (codePage == -1) 66 codePage = CP_OEMCP; 67 UString dest; 68 if (codePage == CP_UTF8) 69 ConvertUTF8ToUnicode(s, dest); 70 else 71 dest = MultiByteToUnicodeString(s, (UINT)codePage); 72 return dest; 73} 74 75void CStdInStream::ReadToString(AString &resultString) 76{ 77 resultString.Empty(); 78 int c; 79 while ((c = GetChar()) != EOF) 80 resultString += (char)c; 81} 82 83bool CStdInStream::Eof() throw() 84{ 85 return (feof(_stream) != 0); 86} 87 88int CStdInStream::GetChar() 89{ 90 int c = fgetc(_stream); // getc() doesn't work in BeOS? 91 if (c == EOF && !Eof()) 92 throw kReadErrorMessage; 93 return c; 94} 95