2 #include "textfile.h"
\r
5 TextFile::TextFile(const char szFileName[], bool bWrite)
\r
10 if (0 == strcmp(szFileName, "-"))
\r
13 ptrFile = fopen(szFileName, "wb");
\r
17 if (0 == strcmp(szFileName, "-"))
\r
20 ptrFile = fopen(szFileName, "rb");
\r
23 Quit("Cannot open '%s' errno=%d\n", szFileName, errno);
\r
24 Init(ptrFile, szFileName);
\r
27 void TextFile::Init(FILE *ptrFile, const char *ptrFileName)
\r
29 m_ptrFile = ptrFile;
\r
30 m_ptrName = strdup(ptrFileName);
\r
33 m_bLastCharWasEOL = true;
\r
36 setbuf(m_ptrFile, 0);
\r
40 TextFile::TextFile(FILE *ptrFile, const char *ptrFileName)
\r
45 TextFile::~TextFile()
\r
48 m_ptrFile != stdin && m_ptrFile != stdout && m_ptrFile != stderr)
\r
53 // Get line from file.
\r
54 // Return true if end-of-file, quit if line too long.
\r
55 bool TextFile::GetLine(char szLine[], unsigned uBytes)
\r
58 Quit("TextFile::GetLine, buffer zero size");
\r
60 memset(szLine, 0, uBytes);
\r
62 unsigned uBytesCopied = 0;
\r
64 // Loop until end of line or end of file.
\r
68 bool bEof = GetChar(c);
\r
75 if (uBytesCopied < uBytes - 1)
\r
76 szLine[uBytesCopied++] = (char) c;
\r
78 Quit("TextFile::GetLine: input buffer too small, line %u",
\r
83 // As GetLine, but trim leading and trailing blanks; skip empty lines
\r
84 bool TextFile::GetTrimLine(char szLine[], unsigned uBytes)
\r
88 bool bEOF = GetLine(szLine, uBytes);
\r
98 void TextFile::Rewind()
\r
100 fseek(m_ptrFile, 0, SEEK_SET);
\r
102 m_bLastCharWasEOL = true;
\r
105 void TextFile::PutChar(char c)
\r
107 int i = fputc(c, m_ptrFile);
\r
118 void TextFile::PutString(const char szLine[])
\r
120 int iError = fputs(szLine, m_ptrFile);
\r
121 assert(iError >= 0);
\r
124 void TextFile::PutFormat(const char szFormat[], ...)
\r
128 va_start(ArgList, szFormat);
\r
129 vsprintf(szStr, szFormat, ArgList);
\r
133 void TextFile::GetLineX(char szLine[], unsigned uBytes)
\r
135 bool bEof = GetLine(szLine, uBytes);
\r
137 Quit("end-of-file in GetLineX");
\r
140 bool TextFile::GetToken(char szToken[], unsigned uBytes, const char szCharTokens[])
\r
142 // Skip leading white space
\r
146 bool bEof = GetChar(c);
\r
153 // Check for special case single-character tokens
\r
154 if (0 != strchr(szCharTokens, c))
\r
156 assert(uBytes >= 2);
\r
162 // Loop until token terminated by white space, EOF or special
\r
163 unsigned uBytesCopied = 0;
\r
166 if (uBytesCopied < uBytes - 1)
\r
167 szToken[uBytesCopied++] = c;
\r
169 Quit("TextFile::GetToken: input buffer too small, line %u",
\r
171 bool bEof = GetChar(c);
\r
174 szToken[uBytesCopied] = 0;
\r
177 // Check for special case single-character tokens
\r
178 if (0 != strchr(szCharTokens, c))
\r
181 assert(uBytesCopied > 0 && uBytesCopied < uBytes);
\r
182 szToken[uBytesCopied] = 0;
\r
187 assert(uBytesCopied > 0 && uBytesCopied < uBytes);
\r
188 szToken[uBytesCopied] = 0;
\r
194 void TextFile::GetTokenX(char szToken[], unsigned uBytes, const char szCharTokens[])
\r
196 bool bEof = GetToken(szToken, uBytes, szCharTokens);
\r
198 Quit("End-of-file in GetTokenX");
\r
201 void TextFile::Skip()
\r
206 bool bEof = GetChar(c);
\r
207 if (bEof || '\n' == c)
\r
209 assert(isspace(c));
\r
215 TEXTFILEPOS TextFile::GetPos()
\r
218 int i = fgetpos(m_ptrFile, &p);
\r
222 Pos.uOffset = (unsigned) p;
\r
223 Pos.uLineNr = m_uLineNr;
\r
224 Pos.uColNr = m_uColNr;
\r
228 void TextFile::SetPos(TEXTFILEPOS Pos)
\r
230 fpos_t p = (fpos_t) Pos.uOffset;
\r
231 int i = fsetpos(m_ptrFile, &p);
\r
233 m_uLineNr = Pos.uLineNr;
\r
234 m_uColNr = Pos.uColNr;
\r
239 TEXTFILEPOS TextFile::GetPos()
\r
242 Pos.uOffset = ftell(m_ptrFile);
\r
243 Pos.uLineNr = m_uLineNr;
\r
244 Pos.uColNr = m_uColNr;
\r
248 void TextFile::SetPos(TEXTFILEPOS Pos)
\r
250 fseek(m_ptrFile, Pos.uOffset, SEEK_SET);
\r
251 m_uLineNr = Pos.uLineNr;
\r
252 m_uColNr = Pos.uColNr;
\r
257 bool TextFile::GetChar(char &c)
\r
259 if (-1 != m_cPushedBack)
\r
261 c = (char) m_cPushedBack;
\r
262 m_cPushedBack = -1;
\r
266 int ic = fgetc(m_ptrFile);
\r
269 if (feof(m_ptrFile))
\r
271 // Hack to fix up a non-empty text file that is missing
\r
272 // and end-of-line character in the last line.
\r
273 if (!m_bLastCharWasEOL && m_uLineNr > 0)
\r
276 m_bLastCharWasEOL = true;
\r
281 Quit("TextFile::GetChar, error %s", strerror(errno));
\r
286 m_bLastCharWasEOL = true;
\r
292 m_bLastCharWasEOL = false;
\r
298 void TextFile::GetCharX(char &c)
\r
300 bool bEof = GetChar(c);
\r
302 Quit("End-of-file in GetCharX");
\r
305 void TextFile::GetNonblankChar(char &c)
\r
309 bool bEof = GetChar(c);
\r
311 Quit("End-of-file in GetCharX");
\r
313 while (isspace(c));
\r
316 void TextFile::SkipLine()
\r
318 if (m_bLastCharWasEOL)
\r
323 bool bEof = GetChar(c);
\r
325 Quit("End-of-file in SkipLine");
\r
331 void TextFile::SkipWhite()
\r
333 bool bEof = SkipWhiteX();
\r
335 Quit("End-of-file skipping white space");
\r
338 bool TextFile::SkipWhiteX()
\r
343 bool bEof = GetChar(c);
\r