#include "common.h" #include "ZReader.h" #include "ZScanner.h" #include #include ZReader::ZReader(const char* fn) : file(-1), pBuffer(0), nMax(0), nSize(0), sFilename(fn), iLastError(0) { allocateBuffer(1 * 1024 * 1024); } ZReader::ZReader() : file(0), pBuffer(0), nMax(0), nSize(0), sFilename("STDIN"), iLastError(0) { allocateBuffer(1 * 1024 * 1024); } ZReader::~ZReader() { if (0 < file) { closeFile(); } } void ZReader::allocateBuffer(int cb) { pBuffer = new char[cb+1]; nMax = cb; nSize = 0; } bool ZReader::openFile() { file = open(sFilename,0); if (file < 0) { iLastError = errno; perror(sFilename); return false; } return true; } bool ZReader::scanFile(ZScanner& scanner) { ZString sLine; for (;;) { int nWanted = nMax - nSize; nWanted &= ~(0xFFFF); // read in 64KB quanta int nRead = read(file,pBuffer + nSize,nWanted); if (nRead <= 0) { break; } nSize += nRead; pBuffer[nSize] = 0; char* pBase = pBuffer; char* pEOB = pBuffer + nSize; for (;;) { char* pEOL = strchr(pBase,'\n'); if (!pEOL) { int n = nSize - (int)(pBase - pBuffer); memmove(pBuffer,pBase,n); nSize = n; break; } int n = (int)(pEOL - pBase) + 1; sLine.strcpy(pBase,n); scanner.onLine(sLine); pBase += n; if (pEOB <= pBase) { nSize = 0; break; } } } if (0 < nSize) { sLine.strcpy(pBuffer,nSize); scanner.onLine(sLine); } scanner.onEOF(); return true; } void ZReader::closeFile() { if (0 < file) { close(file); file = -1; } } void ZReader::scanFiles(ZScanner& scanner, int iBase, int ac, char** av) { for (int i=iBase; i