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
61 int FillVal = 0; // suppress warning from gcc that I don't understand
\r
62 memset(szLine, FillVal, (size_t) uBytes);
\r
64 unsigned uBytesCopied = 0;
\r
66 // Loop until end of line or end of file.
\r
70 bool bEof = GetChar(c);
\r
77 if (uBytesCopied < uBytes - 1)
\r
78 szLine[uBytesCopied++] = (char) c;
\r
80 Quit("TextFile::GetLine: input buffer too small, line %u",
\r
85 // As GetLine, but trim leading and trailing blanks; skip empty lines
\r
86 bool TextFile::GetTrimLine(char szLine[], unsigned uBytes)
\r
89 Quit("GetTrimLine");
\r
92 bool bEOF = GetLine(szLine, uBytes);
\r
102 void TextFile::Rewind()
\r
104 fseek(m_ptrFile, 0, SEEK_SET);
\r
106 m_bLastCharWasEOL = true;
\r
109 void TextFile::PutChar(char c)
\r
111 int i = fputc(c, m_ptrFile);
\r
122 void TextFile::PutString(const char szLine[])
\r
124 int iError = fputs(szLine, m_ptrFile);
\r
125 assert(iError >= 0);
\r
128 void TextFile::PutFormat(const char szFormat[], ...)
\r
132 va_start(ArgList, szFormat);
\r
133 vsprintf(szStr, szFormat, ArgList);
\r
137 void TextFile::GetLineX(char szLine[], unsigned uBytes)
\r
141 bool bEof = GetLine(szLine, uBytes);
\r
143 Quit("end-of-file in GetLineX");
\r
146 bool TextFile::GetToken(char szToken[], unsigned uBytes, const char szCharTokens[])
\r
148 // Skip leading white space
\r
152 bool bEof = GetChar(c);
\r
159 // Check for special case single-character tokens
\r
160 if (0 != strchr(szCharTokens, c))
\r
162 assert(uBytes >= 2);
\r
168 // Loop until token terminated by white space, EOF or special
\r
169 unsigned uBytesCopied = 0;
\r
172 if (uBytesCopied < uBytes - 1)
\r
173 szToken[uBytesCopied++] = c;
\r
175 Quit("TextFile::GetToken: input buffer too small, line %u",
\r
177 bool bEof = GetChar(c);
\r
180 szToken[uBytesCopied] = 0;
\r
183 // Check for special case single-character tokens
\r
184 if (0 != strchr(szCharTokens, c))
\r
187 assert(uBytesCopied > 0 && uBytesCopied < uBytes);
\r
188 szToken[uBytesCopied] = 0;
\r
193 assert(uBytesCopied > 0 && uBytesCopied < uBytes);
\r
194 szToken[uBytesCopied] = 0;
\r
200 void TextFile::GetTokenX(char szToken[], unsigned uBytes, const char szCharTokens[])
\r
202 bool bEof = GetToken(szToken, uBytes, szCharTokens);
\r
204 Quit("End-of-file in GetTokenX");
\r
207 void TextFile::Skip()
\r
212 bool bEof = GetChar(c);
\r
213 if (bEof || '\n' == c)
\r
215 assert(isspace(c));
\r
221 TEXTFILEPOS TextFile::GetPos()
\r
224 int i = fgetpos(m_ptrFile, &p);
\r
228 Pos.uOffset = (unsigned) p;
\r
229 Pos.uLineNr = m_uLineNr;
\r
230 Pos.uColNr = m_uColNr;
\r
234 void TextFile::SetPos(TEXTFILEPOS Pos)
\r
236 fpos_t p = (fpos_t) Pos.uOffset;
\r
237 int i = fsetpos(m_ptrFile, &p);
\r
239 m_uLineNr = Pos.uLineNr;
\r
240 m_uColNr = Pos.uColNr;
\r
245 TEXTFILEPOS TextFile::GetPos()
\r
248 Pos.uOffset = ftell(m_ptrFile);
\r
249 Pos.uLineNr = m_uLineNr;
\r
250 Pos.uColNr = m_uColNr;
\r
254 void TextFile::SetPos(TEXTFILEPOS Pos)
\r
256 fseek(m_ptrFile, Pos.uOffset, SEEK_SET);
\r
257 m_uLineNr = Pos.uLineNr;
\r
258 m_uColNr = Pos.uColNr;
\r
263 bool TextFile::GetChar(char &c)
\r
265 if (-1 != m_cPushedBack)
\r
267 c = (char) m_cPushedBack;
\r
268 m_cPushedBack = -1;
\r
272 int ic = fgetc(m_ptrFile);
\r
275 if (feof(m_ptrFile))
\r
277 // Hack to fix up a non-empty text file that is missing
\r
278 // and end-of-line character in the last line.
\r
279 if (!m_bLastCharWasEOL && m_uLineNr > 0)
\r
282 m_bLastCharWasEOL = true;
\r
287 Quit("TextFile::GetChar, error %s", strerror(errno));
\r
292 m_bLastCharWasEOL = true;
\r
298 m_bLastCharWasEOL = false;
\r
304 void TextFile::GetCharX(char &c)
\r
306 bool bEof = GetChar(c);
\r
308 Quit("End-of-file in GetCharX");
\r
311 void TextFile::GetNonblankChar(char &c)
\r
315 bool bEof = GetChar(c);
\r
317 Quit("End-of-file in GetCharX");
\r
319 while (isspace(c));
\r
322 void TextFile::SkipLine()
\r
324 if (m_bLastCharWasEOL)
\r
329 bool bEof = GetChar(c);
\r
331 Quit("End-of-file in SkipLine");
\r
337 void TextFile::SkipWhite()
\r
339 bool bEof = SkipWhiteX();
\r
341 Quit("End-of-file skipping white space");
\r
344 bool TextFile::SkipWhiteX()
\r
349 bool bEof = GetChar(c);
\r