Merge remote-tracking branch 'upstream/master'
This commit is contained in:
		
						commit
						65601dd130
					
				
					 10 changed files with 226 additions and 32 deletions
				
			
		| 
						 | 
					@ -110,6 +110,7 @@ set(MAIN_HEADERS
 | 
				
			||||||
	src/flashable.h
 | 
						src/flashable.h
 | 
				
			||||||
	src/font.h
 | 
						src/font.h
 | 
				
			||||||
	src/input.h
 | 
						src/input.h
 | 
				
			||||||
 | 
						src/iniconfig.h
 | 
				
			||||||
	src/plane.h
 | 
						src/plane.h
 | 
				
			||||||
	src/scene.h
 | 
						src/scene.h
 | 
				
			||||||
	src/sprite.h
 | 
						src/sprite.h
 | 
				
			||||||
| 
						 | 
					@ -167,6 +168,7 @@ set(MAIN_SOURCE
 | 
				
			||||||
	src/filesystem.cpp
 | 
						src/filesystem.cpp
 | 
				
			||||||
	src/font.cpp
 | 
						src/font.cpp
 | 
				
			||||||
	src/input.cpp
 | 
						src/input.cpp
 | 
				
			||||||
 | 
						src/iniconfig.cpp
 | 
				
			||||||
	src/plane.cpp
 | 
						src/plane.cpp
 | 
				
			||||||
	src/scene.cpp
 | 
						src/scene.cpp
 | 
				
			||||||
	src/sprite.cpp
 | 
						src/sprite.cpp
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										6
									
								
								mkxp.pro
									
										
									
									
									
								
							
							
						
						
									
										6
									
								
								mkxp.pro
									
										
									
									
									
								
							| 
						 | 
					@ -8,6 +8,10 @@ INCLUDEPATH += . src
 | 
				
			||||||
 | 
					
 | 
				
			||||||
CONFIG(release, debug|release): DEFINES += NDEBUG
 | 
					CONFIG(release, debug|release): DEFINES += NDEBUG
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					CONFIG += c++11
 | 
				
			||||||
 | 
					# And for older qmake versions..
 | 
				
			||||||
 | 
					QMAKE_CXXFLAGS += -std=c++11
 | 
				
			||||||
 | 
					
 | 
				
			||||||
isEmpty(BINDING) {
 | 
					isEmpty(BINDING) {
 | 
				
			||||||
	BINDING = MRI
 | 
						BINDING = MRI
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -89,6 +93,7 @@ HEADERS += \
 | 
				
			||||||
	src/flashable.h \
 | 
						src/flashable.h \
 | 
				
			||||||
	src/font.h \
 | 
						src/font.h \
 | 
				
			||||||
	src/input.h \
 | 
						src/input.h \
 | 
				
			||||||
 | 
						src/iniconfig.h \
 | 
				
			||||||
	src/plane.h \
 | 
						src/plane.h \
 | 
				
			||||||
	src/scene.h \
 | 
						src/scene.h \
 | 
				
			||||||
	src/sprite.h \
 | 
						src/sprite.h \
 | 
				
			||||||
| 
						 | 
					@ -145,6 +150,7 @@ SOURCES += \
 | 
				
			||||||
	src/filesystem.cpp \
 | 
						src/filesystem.cpp \
 | 
				
			||||||
	src/font.cpp \
 | 
						src/font.cpp \
 | 
				
			||||||
	src/input.cpp \
 | 
						src/input.cpp \
 | 
				
			||||||
 | 
						src/iniconfig.cpp \
 | 
				
			||||||
	src/plane.cpp \
 | 
						src/plane.cpp \
 | 
				
			||||||
	src/scene.cpp \
 | 
						src/scene.cpp \
 | 
				
			||||||
	src/sprite.cpp \
 | 
						src/sprite.cpp \
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -35,6 +35,7 @@
 | 
				
			||||||
#include "debugwriter.h"
 | 
					#include "debugwriter.h"
 | 
				
			||||||
#include "util.h"
 | 
					#include "util.h"
 | 
				
			||||||
#include "sdl-util.h"
 | 
					#include "sdl-util.h"
 | 
				
			||||||
 | 
					#include "iniconfig.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef INI_ENCODING
 | 
					#ifdef INI_ENCODING
 | 
				
			||||||
extern "C" {
 | 
					extern "C" {
 | 
				
			||||||
| 
						 | 
					@ -321,26 +322,32 @@ void Config::readGameINI()
 | 
				
			||||||
		return;
 | 
							return;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	po::options_description podesc;
 | 
					 | 
				
			||||||
	podesc.add_options()
 | 
					 | 
				
			||||||
	        ("Game.Title", po::value<std::string>())
 | 
					 | 
				
			||||||
	        ("Game.Scripts", po::value<std::string>())
 | 
					 | 
				
			||||||
	        ;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	po::variables_map vm;
 | 
					 | 
				
			||||||
	std::string iniFilename = execName + ".ini";
 | 
						std::string iniFilename = execName + ".ini";
 | 
				
			||||||
	SDLRWStream iniFile(iniFilename.c_str(), "r");
 | 
						SDLRWStream iniFile(iniFilename.c_str(), "r");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (iniFile)
 | 
						if (iniFile)
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		try
 | 
							INIConfiguration ic;
 | 
				
			||||||
 | 
							if(ic.load(iniFile.stream()))
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			po::store(po::parse_config_file(iniFile.stream(), podesc, true), vm);
 | 
								GUARD_ALL( game.title = ic.getStringProperty("Game", "Title"); );
 | 
				
			||||||
			po::notify(vm);
 | 
								GUARD_ALL( game.scripts = ic.getStringProperty("Game", "Scripts"); );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								strReplace(game.scripts, '\\', '/');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								if (game.title.empty())
 | 
				
			||||||
 | 
								{
 | 
				
			||||||
 | 
									Debug() << iniFilename + ": Could not find Game.Title property";
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								if (game.scripts.empty())
 | 
				
			||||||
 | 
								{
 | 
				
			||||||
 | 
									Debug() << iniFilename + ": Could not find Game.Scripts property";
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		catch (po::error &error)
 | 
							else
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			Debug() << iniFilename + ":" << error.what();
 | 
								Debug() << iniFilename + ": Failed to parse ini file";
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	else
 | 
						else
 | 
				
			||||||
| 
						 | 
					@ -348,11 +355,6 @@ void Config::readGameINI()
 | 
				
			||||||
		Debug() << "FAILED to open" << iniFilename;
 | 
							Debug() << "FAILED to open" << iniFilename;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	GUARD_ALL( game.title = vm["Game.Title"].as<std::string>(); );
 | 
					 | 
				
			||||||
	GUARD_ALL( game.scripts = vm["Game.Scripts"].as<std::string>(); );
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	strReplace(game.scripts, '\\', '/');
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#ifdef INI_ENCODING
 | 
					#ifdef INI_ENCODING
 | 
				
			||||||
	/* Can add more later */
 | 
						/* Can add more later */
 | 
				
			||||||
	const char *languages[] =
 | 
						const char *languages[] =
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -311,18 +311,32 @@ struct FileSystemPrivate
 | 
				
			||||||
	bool havePathCache;
 | 
						bool havePathCache;
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void throwPhysfsError(const char *desc)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						PHYSFS_ErrorCode ec = PHYSFS_getLastErrorCode();
 | 
				
			||||||
 | 
						const char *englishStr = PHYSFS_getErrorByCode(ec);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						throw Exception(Exception::PHYSFSError, "%s: %s", desc, englishStr);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
FileSystem::FileSystem(const char *argv0,
 | 
					FileSystem::FileSystem(const char *argv0,
 | 
				
			||||||
                       bool allowSymlinks)
 | 
					                       bool allowSymlinks)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
						if (PHYSFS_init(argv0) == 0)
 | 
				
			||||||
 | 
							throwPhysfsError("Error initializing PhysFS");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/* One error (=return 0) turns the whole product to 0 */
 | 
				
			||||||
 | 
						int er = 1;
 | 
				
			||||||
 | 
						er *= PHYSFS_registerArchiver(&RGSS1_Archiver);
 | 
				
			||||||
 | 
						er *= PHYSFS_registerArchiver(&RGSS2_Archiver);
 | 
				
			||||||
 | 
						er *= PHYSFS_registerArchiver(&RGSS3_Archiver);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (er == 0)
 | 
				
			||||||
 | 
							throwPhysfsError("Error registering PhysFS RGSS archiver");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	p = new FileSystemPrivate;
 | 
						p = new FileSystemPrivate;
 | 
				
			||||||
	p->havePathCache = false;
 | 
						p->havePathCache = false;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	PHYSFS_init(argv0);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	PHYSFS_registerArchiver(&RGSS1_Archiver);
 | 
					 | 
				
			||||||
	PHYSFS_registerArchiver(&RGSS2_Archiver);
 | 
					 | 
				
			||||||
	PHYSFS_registerArchiver(&RGSS3_Archiver);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	if (allowSymlinks)
 | 
						if (allowSymlinks)
 | 
				
			||||||
		PHYSFS_permitSymbolicLinks(1);
 | 
							PHYSFS_permitSymbolicLinks(1);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -469,7 +483,7 @@ fontSetEnumCB (void *data, const char *dir, const char *fname)
 | 
				
			||||||
	const char *ext = findExt(fname);
 | 
						const char *ext = findExt(fname);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (!ext)
 | 
						if (!ext)
 | 
				
			||||||
		return PHYSFS_ENUM_STOP;
 | 
							return PHYSFS_ENUM_OK;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	char lowExt[8];
 | 
						char lowExt[8];
 | 
				
			||||||
	size_t i;
 | 
						size_t i;
 | 
				
			||||||
| 
						 | 
					@ -479,7 +493,7 @@ fontSetEnumCB (void *data, const char *dir, const char *fname)
 | 
				
			||||||
	lowExt[i] = '\0';
 | 
						lowExt[i] = '\0';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (strcmp(lowExt, "ttf") && strcmp(lowExt, "otf"))
 | 
						if (strcmp(lowExt, "ttf") && strcmp(lowExt, "otf"))
 | 
				
			||||||
		return PHYSFS_ENUM_STOP;
 | 
							return PHYSFS_ENUM_OK;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	char filename[512];
 | 
						char filename[512];
 | 
				
			||||||
	snprintf(filename, sizeof(filename), "%s/%s", dir, fname);
 | 
						snprintf(filename, sizeof(filename), "%s/%s", dir, fname);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -6,10 +6,6 @@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "debugwriter.h"
 | 
					#include "debugwriter.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef SHARED_FLUID
 | 
					 | 
				
			||||||
#include <fluidsynth.h>
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#if __LINUX__ || __ANDROID__
 | 
					#if __LINUX__ || __ANDROID__
 | 
				
			||||||
#define FLUID_LIB "libfluidsynth.so.1"
 | 
					#define FLUID_LIB "libfluidsynth.so.1"
 | 
				
			||||||
#elif __MACOSX__
 | 
					#elif __MACOSX__
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,6 +1,12 @@
 | 
				
			||||||
#ifndef FLUIDFUN_H
 | 
					#ifndef FLUIDFUN_H
 | 
				
			||||||
#define FLUIDFUN_H
 | 
					#define FLUIDFUN_H
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef SHARED_FLUID
 | 
				
			||||||
 | 
					# include <fluidsynth.h>
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
					# define FLUIDSYNTH_VERSION_MAJOR 2
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
typedef struct _fluid_hashtable_t fluid_settings_t;
 | 
					typedef struct _fluid_hashtable_t fluid_settings_t;
 | 
				
			||||||
typedef struct _fluid_synth_t fluid_synth_t;
 | 
					typedef struct _fluid_synth_t fluid_synth_t;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -19,7 +25,12 @@ typedef int (*FLUIDSYNTHPROGRAMCHANGEPROC)(fluid_synth_t* synth, int chan, int p
 | 
				
			||||||
typedef fluid_settings_t* (*NEWFLUIDSETTINGSPROC)(void);
 | 
					typedef fluid_settings_t* (*NEWFLUIDSETTINGSPROC)(void);
 | 
				
			||||||
typedef fluid_synth_t* (*NEWFLUIDSYNTHPROC)(fluid_settings_t* settings);
 | 
					typedef fluid_synth_t* (*NEWFLUIDSYNTHPROC)(fluid_settings_t* settings);
 | 
				
			||||||
typedef void (*DELETEFLUIDSETTINGSPROC)(fluid_settings_t* settings);
 | 
					typedef void (*DELETEFLUIDSETTINGSPROC)(fluid_settings_t* settings);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#if FLUIDSYNTH_VERSION_MAJOR == 1
 | 
				
			||||||
typedef int (*DELETEFLUIDSYNTHPROC)(fluid_synth_t* synth);
 | 
					typedef int (*DELETEFLUIDSYNTHPROC)(fluid_synth_t* synth);
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
					typedef void (*DELETEFLUIDSYNTHPROC)(fluid_synth_t* synth);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define FLUID_FUNCS \
 | 
					#define FLUID_FUNCS \
 | 
				
			||||||
	FLUID_FUN(settings_setnum, FLUIDSETTINGSSETNUMPROC) \
 | 
						FLUID_FUN(settings_setnum, FLUIDSETTINGSSETNUMPROC) \
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -759,6 +759,9 @@ void Graphics::transition(int duration,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	setBrightness(255);
 | 
						setBrightness(255);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/* Capture new scene */
 | 
				
			||||||
 | 
						p->screen.composite();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* The PP frontbuffer will hold the current scene after the
 | 
						/* The PP frontbuffer will hold the current scene after the
 | 
				
			||||||
	 * composition step. Since the backbuffer is unused during
 | 
						 * composition step. Since the backbuffer is unused during
 | 
				
			||||||
	 * the transition, we can reuse it as the target buffer for
 | 
						 * the transition, we can reuse it as the target buffer for
 | 
				
			||||||
| 
						 | 
					@ -766,9 +769,6 @@ void Graphics::transition(int duration,
 | 
				
			||||||
	TEXFBO ¤tScene = p->screen.getPP().frontBuffer();
 | 
						TEXFBO ¤tScene = p->screen.getPP().frontBuffer();
 | 
				
			||||||
	TEXFBO &transBuffer  = p->screen.getPP().backBuffer();
 | 
						TEXFBO &transBuffer  = p->screen.getPP().backBuffer();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* Capture new scene */
 | 
					 | 
				
			||||||
	p->screen.composite();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	/* If no transition bitmap is provided,
 | 
						/* If no transition bitmap is provided,
 | 
				
			||||||
	 * we can use a simplified shader */
 | 
						 * we can use a simplified shader */
 | 
				
			||||||
	TransShader &transShader = shState->shaders().trans;
 | 
						TransShader &transShader = shState->shaders().trans;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										114
									
								
								src/iniconfig.cpp
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										114
									
								
								src/iniconfig.cpp
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,114 @@
 | 
				
			||||||
 | 
					#include "iniconfig.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <algorithm>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					std::string toLowerCase(const std::string& str)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						std::string lower = str;
 | 
				
			||||||
 | 
						std::transform(lower.begin(), lower.end(), lower.begin(), ::tolower);
 | 
				
			||||||
 | 
						return lower;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					std::string trim(const std::string& str, const std::string& chars = "\t\n\v\f\r ")
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						std::string trimmed = str;
 | 
				
			||||||
 | 
						trimmed.erase(trimmed.find_last_not_of(chars) + 1);
 | 
				
			||||||
 | 
						trimmed.erase(0, trimmed.find_first_not_of(chars));
 | 
				
			||||||
 | 
						return trimmed;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					INIConfiguration::Section::Section (const std::string& sname) : m_Name (sname), m_PropertyMap()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					bool INIConfiguration::Section::getStringProperty (const std::string& name, std::string& outPropStr) const
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						try
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							outPropStr = m_PropertyMap.at(toLowerCase(name)).m_Value;
 | 
				
			||||||
 | 
							return true;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						catch (std::out_of_range& oorexcept)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							return false;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					bool INIConfiguration::load (std::istream& is)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						if (!is.good())
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							return false;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						std::string currSectionName;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						std::string line;
 | 
				
			||||||
 | 
						std::getline (is, line);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						while (!is.eof() && !is.bad())
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							if (line[0] == '[')
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								currSectionName = line.substr (1, line.find_last_of (']') - 1);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							else if (line[0] != '#' && line.length() > 2)
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								int crloc = line.length() - 1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								if (crloc >= 0  && line[crloc] == '\r') //check for Windows-style newline
 | 
				
			||||||
 | 
									line.resize (crloc);                //and correct
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								size_t equalsPos = line.find_first_of ("=");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								if (equalsPos != std::string::npos)
 | 
				
			||||||
 | 
								{
 | 
				
			||||||
 | 
									std::string key = line.substr (0, equalsPos);
 | 
				
			||||||
 | 
									std::string val = line.substr (equalsPos + 1);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									addProperty (currSectionName, key , val);
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							std::getline (is, line);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (is.bad())
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							return false;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return true;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					std::string INIConfiguration::getStringProperty(const std::string& sname, const std::string& name, const std::string& def) const
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						auto sectionIt = m_SectionMap.find(toLowerCase(sname));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (sectionIt != m_SectionMap.end())
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							std::string prop;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if(sectionIt->second.getStringProperty(name, prop))
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								return prop;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						return def;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void INIConfiguration::addProperty (const std::string& sname, const std::string& name, const std::string& val)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						if (m_SectionMap.find (toLowerCase(sname)) == m_SectionMap.end())
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							m_SectionMap.emplace (toLowerCase(sname), Section (sname));
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						Section::Property p;
 | 
				
			||||||
 | 
						p.m_Name = trim(name);
 | 
				
			||||||
 | 
						p.m_Value = trim(val);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						m_SectionMap.at (toLowerCase(sname)).m_PropertyMap[toLowerCase(p.m_Name)] = p;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										46
									
								
								src/iniconfig.h
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										46
									
								
								src/iniconfig.h
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,46 @@
 | 
				
			||||||
 | 
					#ifndef INICONFIG_H
 | 
				
			||||||
 | 
					#define INICONFIG_H
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <iostream>
 | 
				
			||||||
 | 
					#include <map>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class INIConfiguration
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						class Section
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							friend class INIConfiguration;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							struct Property
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								std::string m_Name;
 | 
				
			||||||
 | 
								std::string m_Value;
 | 
				
			||||||
 | 
							};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							typedef std::map<std::string, Property> property_map;
 | 
				
			||||||
 | 
						public:
 | 
				
			||||||
 | 
							Section (const Section& s) = default;
 | 
				
			||||||
 | 
							Section (Section&& s) = default;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							bool getStringProperty (const std::string& name, std::string& outPropStr) const;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						private:
 | 
				
			||||||
 | 
							explicit Section (const std::string& name);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							std::string m_Name;
 | 
				
			||||||
 | 
							property_map m_PropertyMap;
 | 
				
			||||||
 | 
						};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						typedef std::map<std::string, Section> section_map;
 | 
				
			||||||
 | 
					public:
 | 
				
			||||||
 | 
						bool load (std::istream& inStream);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						std::string getStringProperty(const std::string& sname, const std::string& name, const std::string& def = "") const;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					protected:
 | 
				
			||||||
 | 
						void addProperty (const std::string& sname, const std::string& name, const std::string& val);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					private:
 | 
				
			||||||
 | 
						section_map m_SectionMap;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#endif // INICONFIG_H
 | 
				
			||||||
| 
						 | 
					@ -35,6 +35,9 @@
 | 
				
			||||||
#include "quadarray.h"
 | 
					#include "quadarray.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <math.h>
 | 
					#include <math.h>
 | 
				
			||||||
 | 
					#ifndef M_PI
 | 
				
			||||||
 | 
					# define M_PI 3.14159265358979323846
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <SDL_rect.h>
 | 
					#include <SDL_rect.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue