Page 1 of 6

(C++) Class for reading Windows-INI-like files

Posted: Sat Mar 03, 2007 10:06 pm
by Sylence
Hello everyone!
I'm reading this forum for a long time now and it was always very useful for me. Now I reached the point where I want to give something back to the great community so I decided to post this class here.

I know that Irrlicht has its own XML parser, but I dont like XML...

I'm using this class in almost every project when I need to have a configuration file and I find it always very useful.

UPDATE:
The code is now avaible under http://btbsoft.org it's now a bit faster and was redesigned.

Posted: Sat Mar 03, 2007 10:21 pm
by Spintz

Posted: Sun Mar 04, 2007 2:36 am
by Sylence
Thanks ;)

I don't know if I got you right, but the whole file is loaded into memory and it is just parsed one time (in the load() method)

Posted: Sun Mar 04, 2007 2:46 am
by Spintz

Posted: Sun Mar 04, 2007 11:29 am
by roxaz
this is very useful, thank you! ;]

Posted: Sun Mar 04, 2007 1:18 pm
by Midnight
aside from more simplistic manual editing why would someone prefer this to xml?

considering you have all those extra libraries and such just to have this.

I fail to see the point could you explain it please?

Posted: Sun Mar 04, 2007 1:51 pm
by BlindSide
yeah why does everyone diss XML?

this is nice too though, good work 8) (I like how you make irrlicht specific values like scolor and vector3df)

Posted: Sun Mar 04, 2007 2:20 pm
by Spintz

Posted: Mon Mar 05, 2007 1:35 am
by Midnight
I still fail to see INI's advantage over XML considering you need to add what I thought were bloated include directory's

besides the fact that those includes are useful for other stuff.

Posted: Mon Mar 05, 2007 2:20 am
by Spintz

Posted: Mon Mar 05, 2007 3:40 am
by Midnight
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

I was referring to these.

but then again xml probably uses them also.

but you're not going to see ANY advantage on that level unless you remove irrXML from Irrlicht.

Posted: Mon Mar 05, 2007 6:21 am
by roxaz
um guys, what about changing stringc type to int? simple typecasting dont work

Posted: Sun Mar 18, 2007 6:28 pm
by Sylence
I realized that there's a bug when loading a file with comments in it...

inside the load()-method you have change

Code: Select all

if(strncmp(buffer,"##",2) == 0)
	continue;
to

Code: Select all

if(strncmp(buffer,"##",2) == 0)
{
	buffer = strtok(content,"\n");
	continue;
}
I have also updated the complete code in my previous post...
I should test my classes before showing them to anybody :D

Posted: Fri Mar 30, 2007 4:10 pm
by TheRLG
@Sylence, Any updates on the loading of key-codes in your class?

Posted: Fri Mar 30, 2007 5:24 pm
by Sylence
It is nothing special.

Header

Code: Select all

#ifndef _IRR_CONVERTER_H_
#define _IRR_CONVERTER_H_

#include "irrlicht.h"

class IrrCon
{
	public:
		static irr::EKEY_CODE Key(irr::core::stringc str);
		static const char* Key(irr::EKEY_CODE value);
};

#endif
Cpp

Code: Select all

EKEY_CODE IrrCon::Key(stringc str)
{
	if(str.equals_ignore_case("MOUSE_L"))
		return KEY_LBUTTON;
	else if(str.equals_ignore_case("MOUSE_R"))
		return KEY_RBUTTON;
	else if(str.equals_ignore_case("MOUSE_M"))
		return KEY_MBUTTON;
	else if(str.equals_ignore_case("XBUTTON_1"))
		return KEY_XBUTTON1;
	else if(str.equals_ignore_case("XBUTTON_2"))
		return KEY_XBUTTON2;
	else if(str.equals_ignore_case("BACK"))
		return KEY_BACK;
	else if(str.equals_ignore_case("TAB"))
		return KEY_TAB;
	else if(str.equals_ignore_case("RETURN"))
		return KEY_RETURN;
	else if(str.equals_ignore_case("CLEAR"))
		return KEY_CLEAR;
	else if(str.equals_ignore_case("SHIFT"))
		return KEY_SHIFT;
	else if(str.equals_ignore_case("CTRL"))
		return KEY_CONTROL;
	else if(str.equals_ignore_case("MENU"))
		return KEY_MENU;
	else if(str.equals_ignore_case("PAUSE"))
		return KEY_PAUSE;
	else if(str.equals_ignore_case("CAPITAL"))
		return KEY_CAPITAL;
	else if(str.equals_ignore_case("ESCAPE"))
		return KEY_ESCAPE;
	else if(str.equals_ignore_case("SPACE"))
		return KEY_SPACE;
	else if(str.equals_ignore_case("PRIOR"))
		return KEY_PRIOR;
	else if(str.equals_ignore_case("NEXT"))
		return KEY_NEXT;
	else if(str.equals_ignore_case("END"))
		return KEY_END;
	else if(str.equals_ignore_case("HOME"))
		return KEY_HOME;
	else if(str.equals_ignore_case("LEFT"))
		return KEY_LEFT;
	else if(str.equals_ignore_case("UP"))
		return KEY_UP;
	else if(str.equals_ignore_case("RIGHT"))
		return KEY_RIGHT;
	else if(str.equals_ignore_case("DOWN"))
		return KEY_DOWN;
	else if(str.equals_ignore_case("SELECT"))
		return KEY_SELECT;
	else if(str.equals_ignore_case("PRINT"))
		return KEY_PRINT;
	else if(str.equals_ignore_case("EXECUT"))
		return KEY_EXECUT;
	else if(str.equals_ignore_case("SNAPSHOT"))
		return KEY_SNAPSHOT;
	else if(str.equals_ignore_case("INSERT"))
		return KEY_INSERT;
	else if(str.equals_ignore_case("DELETE"))
		return KEY_DELETE;
	else if(str.equals_ignore_case("HELP"))
		return KEY_HELP;
	else if(str.equals_ignore_case("0"))
		return KEY_KEY_0;
	else if(str.equals_ignore_case("1"))
		return KEY_KEY_1;
	else if(str.equals_ignore_case("2"))
		return KEY_KEY_2;
	else if(str.equals_ignore_case("3"))
		return KEY_KEY_3;
	else if(str.equals_ignore_case("4"))
		return KEY_KEY_4;
	else if(str.equals_ignore_case("5"))
		return KEY_KEY_5;
	else if(str.equals_ignore_case("6"))
		return KEY_KEY_6;
	else if(str.equals_ignore_case("7"))
		return KEY_KEY_7;
	else if(str.equals_ignore_case("8"))
		return KEY_KEY_8;
	else if(str.equals_ignore_case("9"))
		return KEY_KEY_9;
	else if(str.equals_ignore_case("A"))
		return KEY_KEY_A;
	else if(str.equals_ignore_case("B"))
		return KEY_KEY_B;
	else if(str.equals_ignore_case("C"))
		return KEY_KEY_C;
	else if(str.equals_ignore_case("D"))
		return KEY_KEY_D;
	else if(str.equals_ignore_case("E"))
		return KEY_KEY_E;
	else if(str.equals_ignore_case("F"))
		return KEY_KEY_F;
	else if(str.equals_ignore_case("G"))
		return KEY_KEY_G;
	else if(str.equals_ignore_case("H"))
		return KEY_KEY_H;
	else if(str.equals_ignore_case("I"))
		return KEY_KEY_I;
	else if(str.equals_ignore_case("J"))
		return KEY_KEY_J;
	else if(str.equals_ignore_case("K"))
		return KEY_KEY_K;
	else if(str.equals_ignore_case("L"))
		return KEY_KEY_L;
	else if(str.equals_ignore_case("M"))
		return KEY_KEY_M;
	else if(str.equals_ignore_case("N"))
		return KEY_KEY_N;
	else if(str.equals_ignore_case("O"))
		return KEY_KEY_O;
	else if(str.equals_ignore_case("P"))
		return KEY_KEY_P;
	else if(str.equals_ignore_case("Q"))
		return KEY_KEY_Q;
	else if(str.equals_ignore_case("R"))
		return KEY_KEY_R;
	else if(str.equals_ignore_case("S"))
		return KEY_KEY_S;
	else if(str.equals_ignore_case("T"))
		return KEY_KEY_T;
	else if(str.equals_ignore_case("U"))
		return KEY_KEY_U;
	else if(str.equals_ignore_case("V"))
		return KEY_KEY_V;
	else if(str.equals_ignore_case("W"))
		return KEY_KEY_W;
	else if(str.equals_ignore_case("X"))
		return KEY_KEY_X;
	else if(str.equals_ignore_case("Y"))
		return KEY_KEY_Y;
	else if(str.equals_ignore_case("Z"))
		return KEY_KEY_Z;
	else if(str.equals_ignore_case("LWIN"))
		return KEY_LWIN;
	else if(str.equals_ignore_case("RWIN"))
		return KEY_RWIN;
	else if(str.equals_ignore_case("APPS"))
		return KEY_APPS;
	else if(str.equals_ignore_case("SLEEP"))
		return KEY_SLEEP;
	else if(str.equals_ignore_case("NUMPAD0"))
		return KEY_NUMPAD0;
	else if(str.equals_ignore_case("NUMPAD1"))
		return KEY_NUMPAD1;
	else if(str.equals_ignore_case("NUMPAD2"))
		return KEY_NUMPAD2;
	else if(str.equals_ignore_case("NUMPAD3"))
		return KEY_NUMPAD3;
	else if(str.equals_ignore_case("NUMPAD4"))
		return KEY_NUMPAD4;
	else if(str.equals_ignore_case("NUMPAD5"))
		return KEY_NUMPAD5;
	else if(str.equals_ignore_case("NUMPAD6"))
		return KEY_NUMPAD6;
	else if(str.equals_ignore_case("NUMPAD7"))
		return KEY_NUMPAD7;
	else if(str.equals_ignore_case("NUMPAD8"))
		return KEY_NUMPAD8;
	else if(str.equals_ignore_case("NUMPAD9"))
		return KEY_NUMPAD9;
	else if(str.equals_ignore_case("MULTIPLY"))
		return KEY_MULTIPLY;
	else if(str.equals_ignore_case("ADD"))
		return KEY_ADD;
	else if(str.equals_ignore_case("SEPARATOR"))
		return KEY_SEPARATOR;
	else if(str.equals_ignore_case("SUBTRACT"))
		return KEY_SUBTRACT;
	else if(str.equals_ignore_case("DECIMAL"))
		return KEY_DECIMAL;
	else if(str.equals_ignore_case("DIVIDE"))
		return KEY_DIVIDE;
	else if(str.equals_ignore_case("F1"))
		return KEY_F1;
	else if(str.equals_ignore_case("F2"))
		return KEY_F2;
	else if(str.equals_ignore_case("F3"))
		return KEY_F3;
	else if(str.equals_ignore_case("F4"))
		return KEY_F4;
	else if(str.equals_ignore_case("F5"))
		return KEY_F5;
	else if(str.equals_ignore_case("F6"))
		return KEY_F6;
	else if(str.equals_ignore_case("F7"))
		return KEY_F7;
	else if(str.equals_ignore_case("F8"))
		return KEY_F8;
	else if(str.equals_ignore_case("F9"))
		return KEY_F9;
	else if(str.equals_ignore_case("F10"))
		return KEY_F10;
	else if(str.equals_ignore_case("F11"))
		return KEY_F11;
	else if(str.equals_ignore_case("F12"))
		return KEY_F12;
	else if(str.equals_ignore_case("NUMLOCK"))
		return KEY_NUMLOCK;
	else if(str.equals_ignore_case("COMMA"))
		return KEY_COMMA;
	else if(str.equals_ignore_case("PLUS"))
		return KEY_PLUS;
	else if(str.equals_ignore_case("MINUS"))
		return KEY_MINUS;
	else if(str.equals_ignore_case("PERIOD"))
		return KEY_PERIOD;
	else if(str.equals_ignore_case("PLAY"))
		return KEY_PLAY;
	else if(str.equals_ignore_case("ZOOM"))
		return KEY_ZOOM;
	else 
		return (EKEY_CODE)0x0;
}

const char* IrrCon::Key(EKEY_CODE value)
{
	switch(value)
	{
		case KEY_LBUTTON: return "MOUSE_L";
		case KEY_RBUTTON: return "MOUSE_R";
		case KEY_CANCEL: return "MOUSE_M";
		case KEY_MBUTTON: return "MOUSE_M";
		case KEY_XBUTTON1: return "XBUTTON_1";
		case KEY_XBUTTON2: return "XBUTTON_2";
		case KEY_BACK: return "BACK";
		case KEY_TAB: return "TAB";
		case KEY_CLEAR: return "CLEAR";
		case KEY_RETURN: return "RETURN";
		case KEY_SHIFT: return "SHIFT";
		case KEY_CONTROL: return "CTRL";
		case KEY_MENU: return "MENU";
		case KEY_PAUSE: return "PAUSE";
		case KEY_CAPITAL: return "CAPITAL";
		case KEY_ESCAPE: return "ESCAPE";
		case KEY_SPACE: return "SPACE";
		case KEY_PRIOR: return "PRIOR";
		case KEY_NEXT: return "NEXT";
		case KEY_END: return "END";
		case KEY_HOME: return "HOME";
		case KEY_LEFT: return "LEFT";
		case KEY_UP: return "UP";
		case KEY_RIGHT: return "RIGHT";
		case KEY_DOWN: return "DOWN";
		case KEY_SELECT: return "SELECT"; 
		case KEY_PRINT: return "PRINT";
		case KEY_EXECUT: return "EXECUT";
		case KEY_SNAPSHOT: return "SNAPSHOT";
		case KEY_INSERT: return "INSERT";
		case KEY_DELETE: return "DELETE";
		case KEY_HELP: return "HELP";
		case KEY_KEY_0: return "0";
		case KEY_KEY_1: return "1"; 
		case KEY_KEY_2: return "2";
		case KEY_KEY_3: return "3";
		case KEY_KEY_4: return "4";
		case KEY_KEY_5: return "5";
		case KEY_KEY_6: return "6";
		case KEY_KEY_7: return "7";
		case KEY_KEY_8: return "8";
		case KEY_KEY_9: return "9";
		case KEY_KEY_A: return "A";
		case KEY_KEY_B: return "B";
		case KEY_KEY_C: return "C";
		case KEY_KEY_D: return "D";
		case KEY_KEY_E: return "E";
		case KEY_KEY_F: return "F";
		case KEY_KEY_G: return "G";
		case KEY_KEY_H: return "H";
		case KEY_KEY_I: return "I";
		case KEY_KEY_J: return "J";
		case KEY_KEY_K: return "K";
		case KEY_KEY_L: return "L";
		case KEY_KEY_M: return "M";
		case KEY_KEY_N: return "N";
		case KEY_KEY_O: return "O";
		case KEY_KEY_P: return "P";
		case KEY_KEY_Q: return "Q";
		case KEY_KEY_R: return "R";
		case KEY_KEY_S: return "S";
		case KEY_KEY_T: return "T";
		case KEY_KEY_U: return "U";
		case KEY_KEY_V: return "V";
		case KEY_KEY_W: return "W";
		case KEY_KEY_X: return "X";
		case KEY_KEY_Y: return "Y";
		case KEY_KEY_Z: return "Z";
		case KEY_LWIN: return "LWIN";
		case KEY_RWIN: return "RWIN";
		case KEY_APPS: return "APPS";
		case KEY_SLEEP: return "SLEEP";
		case KEY_NUMPAD0: return "NUMPAD0";
		case KEY_NUMPAD1: return "NUMPAD1";
		case KEY_NUMPAD2: return "NUMPAD2";
		case KEY_NUMPAD3: return "NUMPAD3";
		case KEY_NUMPAD4: return "NUMPAD4";
		case KEY_NUMPAD5: return "NUMPAD5";
		case KEY_NUMPAD6: return "NUMPAD6"; 
		case KEY_NUMPAD7: return "NUMPAD7";
		case KEY_NUMPAD8: return "NUMPAD8";
		case KEY_NUMPAD9: return "NUMPAD9";
		case KEY_MULTIPLY: return "MULTIPLY";
		case KEY_ADD: return "ADD";
		case KEY_SEPARATOR: return "SEPARATOR";
		case KEY_SUBTRACT: return "SUBTRACT";
		case KEY_DECIMAL: return "DECIMAL";
		case KEY_DIVIDE: return "DIVIDE";
		case KEY_F1: return "F1";
		case KEY_F2: return "F2";
		case KEY_F3: return "F3";
		case KEY_F4: return "F4";
		case KEY_F5: return "F5";
		case KEY_F6: return "F6";
		case KEY_F7: return "F7";
		case KEY_F8: return "F8";
		case KEY_F9: return "F9";
		case KEY_F10: return "F10";
		case KEY_F11: return "F11";
		case KEY_F12: return "F12";
		case KEY_NUMLOCK: return "NUMLOCK";
		case KEY_COMMA: return "COMMA";
		case KEY_PLUS: return "PLUS";
		case KEY_MINUS: return "MINUS";
		case KEY_PERIOD: return "PERIOD";
		case KEY_PLAY: return "PLAY";
		case KEY_ZOOM: return "ZOOM";
		default: return "NONE";
	}
}
You just have to include the header inside the CfgFile.cpp and remove the comments