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
![Cool 8)](./images/smilies/icon_cool.gif)
(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
![Very Happy :D](./images/smilies/icon_biggrin.gif)
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