From 79b53cfe04a71a301baa59803b48609d797ba86c Mon Sep 17 00:00:00 2001 From: JAJames Date: Wed, 20 Jul 2016 03:21:54 -0400 Subject: [PATCH] Reworked how Jupiter::File reads --- Jupiter/File.cpp | 98 +++++++++++++++++++++++++++++++------------- Jupiter/Jupiter.h | 2 +- Jupiter/Jupiter.rc | Bin 4572 -> 4580 bytes Release/Jupiter.lib | Bin 324110 -> 324110 bytes 4 files changed, 71 insertions(+), 29 deletions(-) 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 9339f382c5754a0c36921c21e776f57f982c58e0..889a356c2d287b12ad8156ad6f656ea9644ffd49 100644 GIT binary patch delta 38 ocmcbk{6u-fCT?au2E)l4xvw*t0ZHA-+j#y#MZ`Cs;uT^602x;eY5)KL delta 37 tcmaE&d`Ef1Cho}}xO65z;$FpQI{7`9?&MuO|9~Q5lb`SkEq=nw0su&~5N-ef diff --git a/Release/Jupiter.lib b/Release/Jupiter.lib index c97149778754d7d50e16668f8c4b7cf68e93007a..e57fc2a457a895e772f7a0d5e730291cc65a7fd8 100644 GIT binary patch delta 24967 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 delta 24184 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