From: <vo...@us...> - 2009-02-16 20:58:15
|
Revision: 1134 http://opde.svn.sourceforge.net/opde/?rev=1134&view=rev Author: volca Date: 2009-02-16 20:58:13 +0000 (Mon, 16 Feb 2009) Log Message: ----------- simple line reading ability added (untested) Modified Paths: -------------- trunk/src/base/file/File.cpp trunk/src/base/file/File.h Modified: trunk/src/base/file/File.cpp =================================================================== --- trunk/src/base/file/File.cpp 2009-02-16 20:57:20 UTC (rev 1133) +++ trunk/src/base/file/File.cpp 2009-02-16 20:58:13 UTC (rev 1134) @@ -95,111 +95,111 @@ //------------------------------------ File& File::readStruct(void* buf, const char* format, uint32_t ExpectedLen, uint count) { - uint32_t TotalBytes = 0; + uint32_t TotalBytes = 0; for (uint i = 0; i < count; i++) { uint32_t Index = 0; char* bpos = static_cast<char*>(buf); - + while (format[Index]) { int rep = 0; bool haverep = false; - + // While the char is a number, compose an integer out of it while (format[Index] >= '0' && format[Index] <= '9') { rep *= 10; rep += format[Index] - '0'; - + Index++; - + haverep = true; // A repetitions count was supplied } - + if (!haverep) // no repetitions supplied rep = 1; - + size_t elem_size = 0; - + if (!format[Index]) // End of line after repetitions? That is not format compliant! OPDE_FILEEXCEPT(FILE_OTHER_ERROR, "Element count should be followed by format!", "File::readStruct"); - + switch (format[Index]) { case 'c' : elem_size = 1; break; case 'w' : elem_size = 2; break; case 'i' : case 'f' : elem_size = 4; break; case 'q' : elem_size = 8; break; - + default: OPDE_FILEEXCEPT(FILE_OTHER_ERROR, "Bad readStruct format!", "File::readStruct"); } - + // Go to next char, would you kindly? ;) Index++; - + if (elem_size > 1) readElem(bpos, elem_size, rep); else read(bpos, rep); - + // Increment the position bpos += elem_size * rep; TotalBytes += elem_size * rep; } - } + } if(TotalBytes != ExpectedLen) LogManager::getSingleton().logMessage("readStruct warning: ExpectedLen != TotalBytes"); return *this; } - + //------------------------------------ File& File::writeStruct(const void* buf, const char* format, uint32_t ExpectedLen, uint count) { uint32_t TotalBytes = 0; for (uint i = 0; i < count; i++) { uint32_t Index = 0; const char* bpos = static_cast<const char*>(buf); - + while (format[Index]) { int rep = 0; bool haverep = false; - + // While the char is a number, compose an integer out of it while (format[Index] >= '0' && format[Index] <= '9') { rep *= 10; rep += format[Index] - '0'; - + Index++; - + haverep = true; // A repetitions count was supplied } - + if (!haverep) // no repetitions supplied rep = 1; - + size_t elem_size = 0; - + if (!format[Index]) // End of line after repetitions? That is not format compliant! OPDE_FILEEXCEPT(FILE_OTHER_ERROR, "Element count should be followed by format!", "File::readStruct"); - + switch (format[Index]) { case 'c' : elem_size = 1; break; case 'w' : elem_size = 2; break; case 'i' : case 'f' : elem_size = 4; break; case 'q' : elem_size = 8; break; - + default: OPDE_FILEEXCEPT(FILE_OTHER_ERROR, "Bad writeStruct format!", "File::writeStruct"); } - + // Go to next char, would you kindly? ;) Index++; - + if (elem_size > 1) writeElem(bpos, elem_size, rep); else write(bpos, rep); - + // Increment the position bpos += elem_size * rep; TotalBytes += elem_size * rep; @@ -212,6 +212,35 @@ } //------------------------------------ + std::string File::getLine() { + std::string line; + + while (!eof()) { + unsigned char c; + read(&c, 1); + + if (c == '\n' || c == '\r') { // line end? + // see if we can eat the next \r as well (if present) + if (!eof()) { + unsigned char c2; + + read(&c2, 1); + + // step back, it's not a complementary char or it's not a line-feed at all + if ((c2 != '\r' && c2 != '\n') || c2 == c) + seek(-1, FSEEK_CUR); + } + + return line; + } else { + line += c; + } + } + + return line; + } + + //------------------------------------ void File::swapEndian(void* buf, file_size_t size, uint count) { // swap all elements for (uint i = 0; i < count; i++) { @@ -226,7 +255,7 @@ } } } - + /*------------------------------------------------------*/ /*---------------------- StdFile -----------------------*/ /*------------------------------------------------------*/ Modified: trunk/src/base/file/File.h =================================================================== --- trunk/src/base/file/File.h 2009-02-16 20:57:20 UTC (rev 1133) +++ trunk/src/base/file/File.h 2009-02-16 20:58:13 UTC (rev 1134) @@ -157,7 +157,7 @@ * @param size the element size * @param count the element count */ File& writeElem(const void* buf, file_size_t size, uint count = 1); - + /** Reads structured data from the file The format string determines how to load the data. The format is specified as this @li c Character (one byte). No byte swapping is done, direct read @@ -169,14 +169,18 @@ @param buf The buffer to read to @param format The format to use @param ExpectedLen The numbers of bytes expected to be read/written - @param count The count of the structures to read (use in case of struct array) + @param count The count of the structures to read (use in case of struct array) */ File& readStruct(void* buf, const char* format, uint32_t ExpectedLen, uint count = 1); - + /** Writes a structure to the file. @see File::readStruct */ File& writeStruct(const void* buf, const char* format, uint32_t ExpectedLen, uint count = 1); + /** Reads one line from a file (treating it as a text file). Strips the line ending in the process + */ + std::string getLine(); + protected: /** swaps the endianness of the given buffer * @param ptr the buffer to swap endianness on This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |