diff --git a/Jupiter/File.cpp b/Jupiter/File.cpp index 48e453c..f457d81 100644 --- a/Jupiter/File.cpp +++ b/Jupiter/File.cpp @@ -142,42 +142,84 @@ bool Jupiter::File::load(const Jupiter::ReadableString &file) bool Jupiter::File::load(FILE *file) { Jupiter::String buffer(defaultBufferSize); - int c = fgetc(file); - if (c == EOF) - return false; - if (containsSymbol(ENDL, static_cast(c))) - { - Jupiter::File::data_->lines.add(new Jupiter::StringS(buffer)); - c = fgetc(file); - if (c == EOF) - return true; - if (containsSymbol(ENDL, static_cast(c)) == false) - buffer.concat(static_cast(c)); - } - else - buffer.concat(static_cast(c)); + int chr; - for (;;) + while (true) { - c = fgetc(file); - if (c == EOF) - return true; - if (containsSymbol(ENDL, static_cast(c))) + chr = fgetc(file); + + if (chr == EOF) + { + if (buffer.isNotEmpty()) + { + Jupiter::File::data_->lines.add(new Jupiter::StringS(buffer)); + return true; + } + + return Jupiter::File::data_->lines.size() != 0; + } + + if (static_cast(chr) == '\r') // new line { + new_line_r: + Jupiter::File::data_->lines.add(new Jupiter::StringS(buffer)); - buffer.truncate(buffer.size()); - c = fgetc(file); - if (c == EOF) + buffer.erase(); + + // check for optional trailing \n + + chr = fgetc(file); + + switch (chr) + { + case EOF: return true; - if (containsSymbol(ENDL, static_cast(c)) == false) - buffer.concat(static_cast(c)); + + case '\r': + goto new_line_r; + + case '\n': + continue; + + default: + buffer += static_cast(chr); + } + + continue; } - else - buffer.concat(static_cast(c)); - } - return true; + if (static_cast(chr) == '\n') // new line + { + new_line_n: + + Jupiter::File::data_->lines.add(new Jupiter::StringS(buffer)); + buffer.erase(); + + // check for optional trailing \r + + chr = fgetc(file); + + switch (chr) + { + case EOF: + return true; + + case '\n': + goto new_line_n; + + case '\r': + continue; + + default: + buffer += static_cast(chr); + } + + continue; + } + + buffer += static_cast(chr); + } } void Jupiter::File::unload() diff --git a/Jupiter/Jupiter.h b/Jupiter/Jupiter.h index e649a98..4a2bb51 100644 --- a/Jupiter/Jupiter.h +++ b/Jupiter/Jupiter.h @@ -36,7 +36,7 @@ #define JUPITER_API #endif // _WIN32 -#define JUPITER_VERSION "Jupiter 0.18" /** Version of this program at compile time. */ +#define JUPITER_VERSION "Jupiter 0.18.1" /** Version of this program at compile time. */ #if defined __cplusplus extern "C" diff --git a/Jupiter/Jupiter.rc b/Jupiter/Jupiter.rc index 9339f38..889a356 100644 Binary files a/Jupiter/Jupiter.rc and b/Jupiter/Jupiter.rc differ diff --git a/Release/Jupiter.lib b/Release/Jupiter.lib index c971497..e57fc2a 100644 Binary files a/Release/Jupiter.lib and b/Release/Jupiter.lib differ