xref: /aosp_15_r20/external/lzma/CPP/Common/StdInStream.cpp (revision f6dc9357d832569d4d1f5d24eacdb3935a1ae8e6)
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 Worker bool 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 Worker bool 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 Worker int 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