1*f6dc9357SAndroid Build Coastguard Worker // Common/StdInStream.cpp 2*f6dc9357SAndroid Build Coastguard Worker 3*f6dc9357SAndroid Build Coastguard Worker #include "StdAfx.h" 4*f6dc9357SAndroid Build Coastguard Worker 5*f6dc9357SAndroid Build Coastguard Worker #ifdef _WIN32 6*f6dc9357SAndroid Build Coastguard Worker #include <tchar.h> 7*f6dc9357SAndroid Build Coastguard Worker #endif 8*f6dc9357SAndroid Build Coastguard Worker 9*f6dc9357SAndroid Build Coastguard Worker #include "StdInStream.h" 10*f6dc9357SAndroid Build Coastguard Worker #include "StringConvert.h" 11*f6dc9357SAndroid Build Coastguard Worker #include "UTFConvert.h" 12*f6dc9357SAndroid Build Coastguard Worker 13*f6dc9357SAndroid Build Coastguard Worker // #define kEOFMessage "Unexpected end of input stream" 14*f6dc9357SAndroid Build Coastguard Worker // #define kReadErrorMessage "Error reading input stream" 15*f6dc9357SAndroid Build Coastguard Worker // #define kIllegalCharMessage "Illegal zero character in input stream" 16*f6dc9357SAndroid Build Coastguard Worker 17*f6dc9357SAndroid Build Coastguard Worker 18*f6dc9357SAndroid Build Coastguard Worker CStdInStream g_StdIn(stdin); 19*f6dc9357SAndroid Build Coastguard Worker 20*f6dc9357SAndroid Build Coastguard Worker /* 21*f6dc9357SAndroid Build Coastguard Worker #define kFileOpenMode TEXT("r") 22*f6dc9357SAndroid Build Coastguard Worker 23*f6dc9357SAndroid Build Coastguard Worker bool CStdInStream::Open(LPCTSTR fileName) throw() 24*f6dc9357SAndroid Build Coastguard Worker { 25*f6dc9357SAndroid Build Coastguard Worker Close(); 26*f6dc9357SAndroid Build Coastguard Worker _stream = 27*f6dc9357SAndroid Build Coastguard Worker #ifdef _WIN32 28*f6dc9357SAndroid Build Coastguard Worker _tfopen 29*f6dc9357SAndroid Build Coastguard Worker #else 30*f6dc9357SAndroid Build Coastguard Worker fopen 31*f6dc9357SAndroid Build Coastguard Worker #endif 32*f6dc9357SAndroid Build Coastguard Worker (fileName, kFileOpenMode); 33*f6dc9357SAndroid Build Coastguard Worker _streamIsOpen = (_stream != 0); 34*f6dc9357SAndroid Build Coastguard Worker return _streamIsOpen; 35*f6dc9357SAndroid Build Coastguard Worker } 36*f6dc9357SAndroid Build Coastguard Worker 37*f6dc9357SAndroid Build Coastguard Worker bool CStdInStream::Close() throw() 38*f6dc9357SAndroid Build Coastguard Worker { 39*f6dc9357SAndroid Build Coastguard Worker if (!_streamIsOpen) 40*f6dc9357SAndroid Build Coastguard Worker return true; 41*f6dc9357SAndroid Build Coastguard Worker _streamIsOpen = (fclose(_stream) != 0); 42*f6dc9357SAndroid Build Coastguard Worker return !_streamIsOpen; 43*f6dc9357SAndroid Build Coastguard Worker } 44*f6dc9357SAndroid Build Coastguard Worker */ 45*f6dc9357SAndroid Build Coastguard Worker ScanAStringUntilNewLine(AString & s)46*f6dc9357SAndroid Build Coastguard Workerbool CStdInStream::ScanAStringUntilNewLine(AString &s) 47*f6dc9357SAndroid Build Coastguard Worker { 48*f6dc9357SAndroid Build Coastguard Worker s.Empty(); 49*f6dc9357SAndroid Build Coastguard Worker for (;;) 50*f6dc9357SAndroid Build Coastguard Worker { 51*f6dc9357SAndroid Build Coastguard Worker const int intChar = GetChar(); 52*f6dc9357SAndroid Build Coastguard Worker if (intChar == EOF) 53*f6dc9357SAndroid Build Coastguard Worker return true; 54*f6dc9357SAndroid Build Coastguard Worker const char c = (char)intChar; 55*f6dc9357SAndroid Build Coastguard Worker if (c == 0) 56*f6dc9357SAndroid Build Coastguard Worker return false; 57*f6dc9357SAndroid Build Coastguard Worker if (c == '\n') 58*f6dc9357SAndroid Build Coastguard Worker return true; 59*f6dc9357SAndroid Build Coastguard Worker s.Add_Char(c); 60*f6dc9357SAndroid Build Coastguard Worker } 61*f6dc9357SAndroid Build Coastguard Worker } 62*f6dc9357SAndroid Build Coastguard Worker ScanUStringUntilNewLine(UString & dest)63*f6dc9357SAndroid Build Coastguard Workerbool CStdInStream::ScanUStringUntilNewLine(UString &dest) 64*f6dc9357SAndroid Build Coastguard Worker { 65*f6dc9357SAndroid Build Coastguard Worker dest.Empty(); 66*f6dc9357SAndroid Build Coastguard Worker AString s; 67*f6dc9357SAndroid Build Coastguard Worker const bool res = ScanAStringUntilNewLine(s); 68*f6dc9357SAndroid Build Coastguard Worker int codePage = CodePage; 69*f6dc9357SAndroid Build Coastguard Worker if (codePage == -1) 70*f6dc9357SAndroid Build Coastguard Worker codePage = CP_OEMCP; 71*f6dc9357SAndroid Build Coastguard Worker if ((unsigned)codePage == CP_UTF8) 72*f6dc9357SAndroid Build Coastguard Worker ConvertUTF8ToUnicode(s, dest); 73*f6dc9357SAndroid Build Coastguard Worker else 74*f6dc9357SAndroid Build Coastguard Worker MultiByteToUnicodeString2(dest, s, (UINT)(unsigned)codePage); 75*f6dc9357SAndroid Build Coastguard Worker return res; 76*f6dc9357SAndroid Build Coastguard Worker } 77*f6dc9357SAndroid Build Coastguard Worker 78*f6dc9357SAndroid Build Coastguard Worker /* 79*f6dc9357SAndroid Build Coastguard Worker bool CStdInStream::ReadToString(AString &resultString) 80*f6dc9357SAndroid Build Coastguard Worker { 81*f6dc9357SAndroid Build Coastguard Worker resultString.Empty(); 82*f6dc9357SAndroid Build Coastguard Worker for (;;) 83*f6dc9357SAndroid Build Coastguard Worker { 84*f6dc9357SAndroid Build Coastguard Worker int intChar = GetChar(); 85*f6dc9357SAndroid Build Coastguard Worker if (intChar == EOF) 86*f6dc9357SAndroid Build Coastguard Worker return !Error(); 87*f6dc9357SAndroid Build Coastguard Worker char c = (char)intChar; 88*f6dc9357SAndroid Build Coastguard Worker if (c == 0) 89*f6dc9357SAndroid Build Coastguard Worker return false; 90*f6dc9357SAndroid Build Coastguard Worker resultString += c; 91*f6dc9357SAndroid Build Coastguard Worker } 92*f6dc9357SAndroid Build Coastguard Worker } 93*f6dc9357SAndroid Build Coastguard Worker */ 94*f6dc9357SAndroid Build Coastguard Worker GetChar()95*f6dc9357SAndroid Build Coastguard Workerint CStdInStream::GetChar() 96*f6dc9357SAndroid Build Coastguard Worker { 97*f6dc9357SAndroid Build Coastguard Worker return fgetc(_stream); // getc() doesn't work in BeOS? 98*f6dc9357SAndroid Build Coastguard Worker } 99