From 4949504dfaa79e32b9dc24c2937fdad63c8fcff5 Mon Sep 17 00:00:00 2001
From: Alexander Sulfrian <alexander@sulfrian.net>
Date: Sat, 16 Jan 2010 18:51:57 +0100
Subject: cut big function for parsing song lines in some smaller

---
 src/base/songloading/songloading_strategy_txt.cpp | 154 ++++++++++++----------
 src/base/songloading/songloading_strategy_txt.hpp |   7 +
 2 files changed, 91 insertions(+), 70 deletions(-)

diff --git a/src/base/songloading/songloading_strategy_txt.cpp b/src/base/songloading/songloading_strategy_txt.cpp
index 6b9a03b7..5f2017a6 100644
--- a/src/base/songloading/songloading_strategy_txt.cpp
+++ b/src/base/songloading/songloading_strategy_txt.cpp
@@ -105,90 +105,104 @@ namespace usdx
 		LOG4CXX_DEBUG(log, "Starting loading song from file: " << song->get_filename());
 
 		File file(song->get_filename());
-		std::string line;
-		char type;
 
-		int line_number = 0;;
+		int line_number = 0;
+		while (file.stream().good() && parse_line(song, file, ++line_number));
 
-		while (file.stream().good()) {
-			std::getline(file.stream(), line);
-			++line_number;
+		// fill song
 
-			std::istringstream linestream(line);
-			linestream >> std::skipws >> type;
+		return song;
+	}
 
-			if (type == '#') {
-				// ignore, header already read
-			}
-			else if (type == 'E') {
-				// song end
-				if (file.stream().eof()) {
-					LOG4CXX_WARN(log, "End marker found in line " << line_number <<
-						     " before end of file: '" << song->get_filename() << "'.");
-				}
+	bool SongloadingStrategyTxt::parse_line(Song* song, File& file, const int line_number)
+	{
+		std::string line;
+		std::getline(file.stream(), line);
 
-				break;
-			}
-			else if (type == '-') {
-				// line break
-				int line_out, line_in = -1;
-
-				linestream >> line_out;
-				if (linestream.good()) {
-					linestream >> line_in;
-					LOG4CXX_DEBUG(log, "Found newline in line " <<
-						      line_number << " with out of last line with "
-						      << line_out << " and in of next line " << line_in);
-				}
-				else {
-					LOG4CXX_DEBUG(log, "Found newline in line " <<
-						      line_number << " with out of last line with "
-						      << line_out);
-				}
+		char type;
+		std::istringstream linestream(line);
+		linestream >> std::skipws >> type;
 
-//				song.new_line(line_out, line_in);
-			}
-			else if (type == 'B') {
-				// new bpm
-				int beat;
-				LocaleIndependentFloat new_bpm;
-
-				linestream >> beat >> new_bpm;
-				LOG4CXX_DEBUG(log, "Found new bpm in line " <<
-					      line_number << " starting at beat: " <<
-					      beat << " and new bpm of " << new_bpm.get_value());
-//				song.new_bpm(new_beat, new_bpm);
-			}
-			else if (type == ':' || type == 'F' || type == '*') {
-				// normal line
-				int beat, length, height;
-				std::string lyric;
-
-				linestream >> beat >> length >> height >> std::noskipws;
-				linestream.ignore();
-				getline(linestream, lyric);
-
-				LOG4CXX_DEBUG(log, "Found lyric: '" << lyric << "' at line: " << line_number <<
-					      " at beat: " << beat << " with length: " << length <<
-					      " at height: " << height);
-//				song.new_note(beat, length, height, lyric);
-			}
-			else {
-				LOG4CXX_WARN(log, "Unknown line in song: '" << line <<
-					     "' in file: " << song->get_filename() <<
-					     " at line " << line_number);
+		if (type == '#') {
+			// ignore, header already read
+		}
+		else if (type == 'E') {
+			// song end
+			if (file.stream().eof()) {
+				LOG4CXX_WARN(log, "End marker found in line " << line_number <<
+					     " before end of file: '" << song->get_filename() << "'.");
 			}
+
+			return false;
+		}
+		else if (type == '-') {
+			parse_newline(song, linestream, line_number);
+		}
+		else if (type == 'B') {
+			parse_bpm(song, linestream, line_number);
+		}
+		else if (type == ':' || type == 'F' || type == '*') {
+			parse_note(song, type, linestream, line_number);
+		}
+		else {
+			LOG4CXX_WARN(log, "Unknown line in song: '" << line <<
+				     "' in file: " << song->get_filename() <<
+				     " at line " << line_number);
 		}
 
-		// fill song
+		return true;
+	}
 
-		return song;
+	void SongloadingStrategyTxt::parse_newline(Song *song, std::istringstream& linestream, const int line_number)
+	{
+		// line break
+		int line_out, line_in = -1;
+
+		linestream >> line_out;
+		if (linestream.good()) {
+			linestream >> line_in;
+			LOG4CXX_DEBUG(log, "Found newline in line " <<
+				      line_number << " with out of last line with "
+				      << line_out << " and in of next line " << line_in);
+		}
+		else {
+			LOG4CXX_DEBUG(log, "Found newline in line " <<
+				      line_number << " with out of last line with "
+				      << line_out);
+		}
+
+		// song.new_line(line_out, line_in);
 	}
 
-/*	void SongloadingStrategyTxt::parse_line(const std::string& line, const int line_num)
+	void SongloadingStrategyTxt::parse_bpm(Song *song, std::istringstream& linestream, const int line_number)
 	{
+		// new bpm
+		int beat;
+		LocaleIndependentFloat new_bpm;
+
+		linestream >> beat >> new_bpm;
+		LOG4CXX_DEBUG(log, "Found new bpm in line " <<
+			      line_number << " starting at beat: " <<
+			      beat << " and new bpm of " << new_bpm.get_value());
+		// song.new_bpm(new_beat, new_bpm);
 	}
-*/
+
+	void SongloadingStrategyTxt::parse_note(Song *song, char type, std::istringstream& linestream, const int line_number)
+	{
+		// normal line
+		int beat, length, height;
+		std::string lyric;
+
+		linestream >> beat >> length >> height >> std::noskipws;
+		linestream.ignore();
+		getline(linestream, lyric);
+
+		LOG4CXX_DEBUG(log, "Found lyric: '" << lyric << "' at line: " << line_number <<
+			      " at beat: " << beat << " with length: " << length <<
+			      " at height: " << height);
+		// song.new_note(beat, length, height, lyric);
+	}
+
 	Song* SongloadingStrategyTxt::load_header(const std::string& filename)
 	{
 		File file(filename);
diff --git a/src/base/songloading/songloading_strategy_txt.hpp b/src/base/songloading/songloading_strategy_txt.hpp
index 31a9815a..b397d2f7 100644
--- a/src/base/songloading/songloading_strategy_txt.hpp
+++ b/src/base/songloading/songloading_strategy_txt.hpp
@@ -30,6 +30,7 @@
 #include <string>
 #include <log4cxx/logger.h>
 #include "songloading_strategy.hpp"
+#include "utils/file.hpp"
 
 namespace usdx
 {
@@ -58,6 +59,12 @@ namespace usdx
 		 */
 		std::string& trim(std::string& line);
 
+		bool parse_line(Song* song, File& file, const int line_number);
+		void parse_newline(Song* song, std::istringstream& linestream, const int line_number);
+		void parse_bpm(Song* song, std::istringstream& linestream, const int line_number);
+		void parse_note(Song* song, char type, std::istringstream& linestream, const int line_number);
+
+
 	public:
 		SongloadingStrategyTxt();
 		virtual ~SongloadingStrategyTxt();
-- 
cgit v1.2.3