From a4ae7b2059c103be18d676cf5640648a3d3d3d5f Mon Sep 17 00:00:00 2001 From: Christian Schmitt Date: Mon, 25 Feb 2013 23:03:32 +0100 Subject: [PATCH] sgstream: detect two directly following CR/LF EOL correctly in skipeol, supply a testcase for this. --- simgear/misc/CMakeLists.txt | 4 +++ simgear/misc/sgstream.cxx | 13 +++++---- simgear/misc/sgstream_test.cxx | 51 ++++++++++++++++++++++++++++++++++ 3 files changed, 63 insertions(+), 5 deletions(-) create mode 100644 simgear/misc/sgstream_test.cxx diff --git a/simgear/misc/CMakeLists.txt b/simgear/misc/CMakeLists.txt index 8d7852f1..9c807137 100644 --- a/simgear/misc/CMakeLists.txt +++ b/simgear/misc/CMakeLists.txt @@ -47,6 +47,10 @@ add_executable(test_strings strutils_test.cxx ) add_test(test_strings ${EXECUTABLE_OUTPUT_PATH}/test_strings) target_link_libraries(test_strings ${TEST_LIBS}) +add_executable(test_streams sgstream_test.cxx ) +add_test(test_streams ${EXECUTABLE_OUTPUT_PATH}/test_streams) +target_link_libraries(test_streams ${TEST_LIBS}) + add_executable(test_path path_test.cxx ) add_test(test_path ${EXECUTABLE_OUTPUT_PATH}/test_path) target_link_libraries(test_path ${TEST_LIBS}) diff --git a/simgear/misc/sgstream.cxx b/simgear/misc/sgstream.cxx index 70da33af..c2ed93b5 100644 --- a/simgear/misc/sgstream.cxx +++ b/simgear/misc/sgstream.cxx @@ -102,14 +102,17 @@ istream& skipeol( istream& in ) { char c = '\0'; - // skip to end of line. + // make sure we detect LF, CR and CR/LF while ( in.get(c) ) { - if ( (c == '\n') || (c == '\r') ) { - break; - } + if (c == '\n') + break; + else if (c == '\r') { + if (in.peek() == '\n') + in.get(c); + break; + } } - return in; } diff --git a/simgear/misc/sgstream_test.cxx b/simgear/misc/sgstream_test.cxx new file mode 100644 index 00000000..0188f997 --- /dev/null +++ b/simgear/misc/sgstream_test.cxx @@ -0,0 +1,51 @@ +#include +#include + +#include // for EXIT_FAILURE + +using std::ofstream; +using std::cout; +using std::endl; + +#include + +int main() +{ + const char* fileName = "testfile"; + { + ofstream f; + f.open(fileName, std::ios::binary | std::ios::trunc | std::ios::out); + f.write("first line ends with line-feed\n" + "second line ends with just a cr\r" + "third line ends with both\r\n" + "fourth line as well\r\n" + "fifth line is another CR/LF line\r\n" + "end of test\r\n", 1024); + f.close(); + } + + sg_gzifstream sg(fileName); + std::string stuff; + sg >> skipeol; + sg >> stuff; + if (stuff != "second") return EXIT_FAILURE; + cout << "Detection of LF works." << endl; + + sg >> skipeol; + sg >> stuff; + if (stuff != "third") return EXIT_FAILURE; + cout << "Detection of CR works." << endl; + + sg >> skipeol; + sg >> stuff; + if (stuff != "fourth") return EXIT_FAILURE; + cout << "Detection of CR/LF works." << endl; + + sg >> skipeol; + sg >> skipeol; + sg >> stuff; + if (stuff != "end") return EXIT_FAILURE; + cout << "Detection of 2 following CR/LF lines works." << endl; + + return EXIT_SUCCESS; +}