TFIn::TFIn(const TStr& FNm): TSBase(FNm.CStr()), TSIn(FNm), FileId(NULL), Bf(NULL), BfC(0), BfL(0){ EAssertR(!FNm.Empty(), "Empty file-name."); FileId=fopen(FNm.CStr(), "rb"); EAssertR(FileId!=NULL, "Can not open file '"+FNm+"'."); Bf=new char[MxBfL]; BfC=BfL=-1; FillBf(); }
TZipIn::TZipIn(const TStr& FNm) : TSBase(), TSIn(), ZipStdoutRd(NULL), ZipStdoutWr(NULL), SNm(FNm.CStr()), FLen(0), CurFPos(0), Bf(NULL), BfC(0), BfL(0) { EAssertR(! FNm.Empty(), "Empty file-name."); EAssertR(TFile::Exists(FNm), TStr::Fmt("File %s does not exist", FNm.CStr()).CStr()); FLen = 0; // non-zip files not supported, need uncompressed file length information // TODO: find the correct set of supported extensions //if (FNm.GetFExt() != ".zip" && FNm.GetFExt() != ".gz") { // printf("*** Error: file %s, compression format %s not supported\n", FNm.CStr(), FNm.GetFExt().CStr()); // EFailR(TStr::Fmt("File %s: compression format %s not supported", FNm.CStr(), FNm.GetFExt().CStr()).CStr()); //} FLen = TZipIn::GetFLen(FNm); // return for malformed files if (FLen == 0) { return; } // empty file #ifdef GLib_WIN // create pipes SECURITY_ATTRIBUTES saAttr; saAttr.nLength = sizeof(SECURITY_ATTRIBUTES); saAttr.bInheritHandle = TRUE; saAttr.lpSecurityDescriptor = NULL; // Create a pipe for the child process's STDOUT. const int PipeBufferSz = 32*1024; EAssertR(CreatePipe(&ZipStdoutRd, &ZipStdoutWr, &saAttr, PipeBufferSz), "Stdout pipe creation failed"); // Ensure the read handle to the pipe for STDOUT is not inherited. SetHandleInformation(ZipStdoutRd, HANDLE_FLAG_INHERIT, 0); #else // no implementation needed #endif CreateZipProcess(GetCmd(FNm), FNm); Bf = new char[MxBfL]; BfC = BfL=-1; FillBf(); }
TFIn::TFIn(const TStr& FNm, bool& OpenedP): TSIn(FNm), FileId(NULL), Bf(NULL), BfC(0), BfL(0){ EAssertR(!FNm.Empty(), "Empty file-name."); FileId=fopen(FNm.CStr(), "rb"); OpenedP=(FileId!=NULL); if (OpenedP){ Bf=new char[MxBfL]; BfC=BfL=-1; FillBf();} }
int TZipIn::GetBf(const void* LBf, const TSize& LBfL){ int LBfS=0; if (TSize(BfC+LBfL)>TSize(BfL)){ for (TSize LBfC=0; LBfC<LBfL; LBfC++){ if (BfC==BfL){FillBf();} LBfS+=((char*)LBf)[LBfC]=Bf[BfC++];} } else { for (TSize LBfC=0; LBfC<LBfL; LBfC++){ LBfS+=(((char*)LBf)[LBfC]=Bf[BfC++]);} } return LBfS; }
int TFIn::GetBf(const void* LBf, const int& LBfL){ int LBfS=0; if (BfC+LBfL>BfL){ for (int LBfC=0; LBfC<LBfL; LBfC++){ if (BfC==BfL){FillBf();} LBfS+=((char*)LBf)[LBfC]=Bf[BfC++];} } else { for (int LBfC=0; LBfC<LBfL; LBfC++){ LBfS+=(((char*)LBf)[LBfC]=Bf[BfC++]);} } return LBfS; }
TFIn::TFIn(const TStr& FNm, bool& OpenedP, const bool IgnoreBOMIfExistsP): TSBase(FNm.CStr()), TSIn(FNm), FileId(NULL), Bf(NULL), BfC(0), BfL(0){ EAssertR(!FNm.Empty(), "Empty file-name."); FileId=fopen(FNm.CStr(), "rb"); OpenedP=(FileId!=NULL); if (OpenedP){ Bf=new char[MxBfL]; BfC=BfL=-1; FillBf(); if (IgnoreBOMIfExistsP && BfL >= 3) { // https://en.wikipedia.org/wiki/Byte_order_mark if (Bf[0] == (char)0xEF && Bf[1] == (char)0xBB && Bf[2] == (char)0xBF) BfC = 3; } } }
// Sets BfN to the end of line or end of buffer. Reads more data, if needed. // Returns 1, when an end of line was found, BfN is end of line. // Returns 0, when an end of line was not found and more data is required, // BfN is end of buffer. // Returns -1, when an end of file was found, BfN is not defined. int TZipIn::FindEol(int& BfN) { char Ch; if (BfC >= BfL) { // check for eof, read more data if (Eof()) { return -1; } FillBf(); } while (BfC < BfL) { Ch = Bf[BfC++]; if (Ch=='\n') { BfN = BfC-1; return 1; } if (Ch=='\r' && Bf[BfC+1]=='\n') { BfC++; BfN = BfC-2; return 1; } } BfN = BfC; return 0; }
// reads LBfL bytes into LBf int TFIn::GetBf(const void* LBf, const TSize& LBfL){ int LBfS=0; if (TSize(BfC+LBfL)>TSize(BfL)){ for (TSize LBfC=0; LBfC<LBfL; LBfC++){ if (BfC==BfL){ FillBf(); // we tried to fill a buffer (that is used in the next statement). // the available buffer BfL therefore has to be non-empty EAssertR(BfL > 0, "Unable to fill a buffer from " + GetSNm() + "'."); } LBfS+=((char*)LBf)[LBfC]=Bf[BfC++];} } else { for (TSize LBfC=0; LBfC<LBfL; LBfC++){ LBfS+=(((char*)LBf)[LBfC]=Bf[BfC++]);} } return LBfS; }
TZipIn::TZipIn(const TStr& FNm, bool& OpenedP) : TSBase(), TSIn(), ZipStdoutRd(NULL), ZipStdoutWr(NULL), SNm(FNm.CStr()), FLen(0), CurFPos(0), Bf(NULL), BfC(0), BfL(0) { EAssertR(! FNm.Empty(), "Empty file-name."); FLen = TZipIn::GetFLen(FNm); OpenedP = TFile::Exists(FNm); if (OpenedP) { #ifdef GLib_WIN SECURITY_ATTRIBUTES saAttr; saAttr.nLength = sizeof(SECURITY_ATTRIBUTES); saAttr.bInheritHandle = TRUE; saAttr.lpSecurityDescriptor = NULL; // Create a pipe for the child process's STDOUT. EAssertR(CreatePipe(&ZipStdoutRd, &ZipStdoutWr, &saAttr, 0), "Stdout pipe creation failed"); // Ensure the read handle to the pipe for STDOUT is not inherited. SetHandleInformation(ZipStdoutRd, HANDLE_FLAG_INHERIT, 0); #else // no implementation needed #endif CreateZipProcess(GetCmd(FNm.GetFExt()), FNm); Bf = new char[MxBfL]; BfC = BfL=-1; FillBf(); } }
TZipIn::TZipIn(const TStr& FNm) : TSBase(FNm.CStr()), TSIn(FNm), ZipStdoutRd(NULL), ZipStdoutWr(NULL), FLen(0), CurFPos(0), Bf(NULL), BfC(0), BfL(0) { EAssertR(! FNm.Empty(), "Empty file-name."); EAssertR(TFile::Exists(FNm), TStr::Fmt("File %s does not exist", FNm.CStr()).CStr()); FLen = TZipIn::GetFLen(FNm); if (FLen == 0) { return; } // empty file #ifdef GLib_WIN // create pipes SECURITY_ATTRIBUTES saAttr; saAttr.nLength = sizeof(SECURITY_ATTRIBUTES); saAttr.bInheritHandle = TRUE; saAttr.lpSecurityDescriptor = NULL; // Create a pipe for the child process's STDOUT. const int PipeBufferSz = 32*1024; EAssertR(CreatePipe(&ZipStdoutRd, &ZipStdoutWr, &saAttr, PipeBufferSz), "Stdout pipe creation failed"); // Ensure the read handle to the pipe for STDOUT is not inherited. SetHandleInformation(ZipStdoutRd, HANDLE_FLAG_INHERIT, 0); #else // no implementation needed #endif CreateZipProcess(GetCmd(FNm), FNm); Bf = new char[MxBfL]; BfC = BfL=-1; FillBf(); }