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

Post those lines of code you feel like sharing or find what you require for your project here; or simply use them as tutorials.
Sylence
Posts: 725
Joined: Sat Mar 03, 2007 9:01 pm
Location: Germany
Contact:

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

Post 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.
Last edited by Sylence on Sat Dec 27, 2008 8:04 pm, edited 6 times in total.
Software documentation is like sex. If it's good you want more. If it's bad it's better than nothing.
Spintz
Posts: 1688
Joined: Thu Nov 04, 2004 3:25 pm

Post by Spintz »

Last edited by Spintz on Mon Dec 10, 2007 1:29 pm, edited 1 time in total.
Sylence
Posts: 725
Joined: Sat Mar 03, 2007 9:01 pm
Location: Germany
Contact:

Post 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)
Software documentation is like sex. If it's good you want more. If it's bad it's better than nothing.
Spintz
Posts: 1688
Joined: Thu Nov 04, 2004 3:25 pm

Post by Spintz »

Last edited by Spintz on Mon Dec 10, 2007 1:30 pm, edited 2 times in total.
roxaz
Posts: 575
Joined: Tue Jan 23, 2007 8:35 pm
Location: LT

Post by roxaz »

this is very useful, thank you! ;]
Midnight
Posts: 1772
Joined: Fri Jul 02, 2004 2:37 pm
Location: Wonderland

Post 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?
BlindSide
Admin
Posts: 2821
Joined: Thu Dec 08, 2005 9:09 am
Location: NZ!

Post 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)
Spintz
Posts: 1688
Joined: Thu Nov 04, 2004 3:25 pm

Post by Spintz »

Last edited by Spintz on Mon Dec 10, 2007 1:30 pm, edited 1 time in total.
Midnight
Posts: 1772
Joined: Fri Jul 02, 2004 2:37 pm
Location: Wonderland

Post 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.
Spintz
Posts: 1688
Joined: Thu Nov 04, 2004 3:25 pm

Post by Spintz »

Last edited by Spintz on Mon Dec 10, 2007 1:30 pm, edited 2 times in total.
Midnight
Posts: 1772
Joined: Fri Jul 02, 2004 2:37 pm
Location: Wonderland

Post 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.
roxaz
Posts: 575
Joined: Tue Jan 23, 2007 8:35 pm
Location: LT

Post by roxaz »

um guys, what about changing stringc type to int? simple typecasting dont work
Sylence
Posts: 725
Joined: Sat Mar 03, 2007 9:01 pm
Location: Germany
Contact:

Post 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
Software documentation is like sex. If it's good you want more. If it's bad it's better than nothing.
TheRLG
Posts: 372
Joined: Thu Oct 07, 2004 11:20 pm

Post by TheRLG »

@Sylence, Any updates on the loading of key-codes in your class?
Sylence
Posts: 725
Joined: Sat Mar 03, 2007 9:01 pm
Location: Germany
Contact:

Post 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
Software documentation is like sex. If it's good you want more. If it's bad it's better than nothing.
Post Reply