mirror of
https://github.com/EQEmu/Server.git
synced 2026-01-07 14:33:52 +00:00
118 lines
2.0 KiB
C++
118 lines
2.0 KiB
C++
#include "ini.h"
|
|
|
|
INIParser::INIParser(const char *filename)
|
|
{
|
|
memset(file, 0, 128);
|
|
if(strlen(filename) > 128)
|
|
{
|
|
strncpy(file, filename, 128);
|
|
}
|
|
else
|
|
{
|
|
strncpy(file, filename, strlen(filename));
|
|
}
|
|
Parse();
|
|
}
|
|
|
|
INIParser::~INIParser()
|
|
{
|
|
|
|
}
|
|
|
|
void INIParser::Parse()
|
|
{
|
|
FILE *fp;
|
|
if(fp = fopen(file, "r"))
|
|
{
|
|
char Option[255], Param[255];
|
|
while(!feof(fp))
|
|
{
|
|
ReadLine(fp, Option, Param);
|
|
AddOption(std::string(Option), std::string(Param));
|
|
}
|
|
fclose(fp);
|
|
}
|
|
}
|
|
|
|
void INIParser::ReadLine(FILE *fp, char *Option, char *Param)
|
|
{
|
|
typedef enum ReadingState { ReadingOption, ReadingParameter };
|
|
|
|
ReadingState State = ReadingOption;
|
|
|
|
int StrIndex = 0;
|
|
char ch;
|
|
|
|
strcpy(Option, "");
|
|
strcpy(Param, "");
|
|
|
|
while(true) {
|
|
ch = fgetc(fp);
|
|
if((ch=='#')&&(StrIndex==0)) { // Discard comment lines beginning with a hash
|
|
while((ch!=EOF)&&(ch!='\n'))
|
|
ch = fgetc(fp);
|
|
|
|
continue;
|
|
}
|
|
if(ch=='\r') continue;
|
|
if((ch==EOF)||(ch=='\n')) {
|
|
switch(State) {
|
|
case ReadingOption: {
|
|
Option[StrIndex]='\0';
|
|
break;
|
|
}
|
|
case ReadingParameter: {
|
|
Param[StrIndex] = '\0';
|
|
break;
|
|
}
|
|
}
|
|
|
|
break;
|
|
}
|
|
if(ch=='=') {
|
|
if(State==ReadingOption) {
|
|
Option[StrIndex] = '\0';
|
|
State = ReadingParameter;
|
|
StrIndex = 0;
|
|
continue;
|
|
}
|
|
}
|
|
switch(State) {
|
|
case ReadingOption: {
|
|
Option[StrIndex++]=tolower(ch);
|
|
break;
|
|
}
|
|
case ReadingParameter: {
|
|
Param[StrIndex++]=ch;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
if(!strcmp(Param,"true")) strcpy(Param,"1");
|
|
if(!strcmp(Param,"false")) strcpy(Param,"0");
|
|
}
|
|
|
|
void INIParser::AddOption(std::string option, std::string param)
|
|
{
|
|
for(unsigned int x = 0; x < options.size(); ++x)
|
|
{
|
|
if(options[x].option == option)
|
|
return;
|
|
}
|
|
|
|
iniData d;
|
|
d.option = option;
|
|
d.param = param;
|
|
options.push_back(d);
|
|
}
|
|
|
|
std::string INIParser::GetOption(std::string option)
|
|
{
|
|
for(unsigned int x = 0; x < options.size(); ++x)
|
|
{
|
|
if(options[x].option == option)
|
|
return options[x].param;
|
|
}
|
|
return std::string("Not Found");
|
|
} |