You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
137 lines
3.4 KiB
137 lines
3.4 KiB
15 years ago
|
/* configfile.cpp
|
||
|
*
|
||
|
* Copyright (c) 1998, 2000, Alexander Neundorf
|
||
|
* neundorf@kde.org
|
||
|
*
|
||
|
* You may distribute under the terms of the GNU General Public
|
||
|
* License as specified in the COPYING file.
|
||
|
*
|
||
|
* This program is distributed in the hope that it will be useful,
|
||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||
|
* GNU General Public License for more details.
|
||
|
*
|
||
|
*/
|
||
|
|
||
|
#include "configfile.h"
|
||
|
|
||
|
#include <iostream>
|
||
|
#include <fstream>
|
||
|
#include <ctype.h>
|
||
|
#include <stdlib.h>
|
||
|
#include <stdio.h>
|
||
|
#include <string.h>
|
||
|
|
||
|
#ifdef LISA_DEBUG
|
||
|
#undef LISA_DEBUG
|
||
|
#endif
|
||
|
#define LISA_DEBUG 0
|
||
|
|
||
|
#ifdef dcerr
|
||
|
#undef dcerr
|
||
|
#endif
|
||
|
|
||
|
#define dcerr if (LISA_DEBUG==1) std::cerr<<"Config::"
|
||
|
|
||
|
|
||
|
#define CFGBUFSIZE 16*1024
|
||
|
|
||
|
Config::Config(const MyString& name/*,String path*/)
|
||
|
{
|
||
|
char buff[CFGBUFSIZE],c;
|
||
|
/* String s,empty="#############################################################################################################################################################";
|
||
|
String home=getenv("HOME");
|
||
|
|
||
|
if (!home.empty()) home+=String("/")+name;
|
||
|
if (fexists(home)==0)
|
||
|
{
|
||
|
home=path+"/"+name;
|
||
|
if (fexists(home)==0)
|
||
|
{
|
||
|
home=name;
|
||
|
if (fexists(home)==0) return;
|
||
|
};
|
||
|
};*/
|
||
|
std::ifstream inf(name.data());
|
||
|
if (!inf)
|
||
|
{
|
||
|
std::cout<<"could not open file "<<name<<std::endl;
|
||
|
return;
|
||
|
}
|
||
|
dcerr<<"Config(): opened file "<<name<<std::endl;
|
||
|
//read the file
|
||
|
char key[CFGBUFSIZE], value[CFGBUFSIZE];
|
||
|
do
|
||
|
{
|
||
|
char* buffStart=buff;
|
||
|
//inf.getline(buff,16*1024,'\n');
|
||
|
int bufSize(CFGBUFSIZE);
|
||
|
int lineBroken(0);
|
||
|
do
|
||
|
{
|
||
|
lineBroken=0;
|
||
|
inf.get(buffStart,bufSize,'\n');
|
||
|
inf.get(c);
|
||
|
int l=strlen(buffStart);
|
||
|
if (l==0)
|
||
|
break;
|
||
|
if (buffStart[l-1]=='\\')
|
||
|
{
|
||
|
buffStart=buffStart+l-1;
|
||
|
bufSize=bufSize+1-l;
|
||
|
lineBroken=1;
|
||
|
}
|
||
|
} while ((lineBroken) && (!inf.eof()));
|
||
|
//make it ignore comments
|
||
|
char *theChar=strchr(buff,'#');
|
||
|
if (theChar!=0)
|
||
|
*theChar='\0';
|
||
|
//now divide the line into key and value
|
||
|
theChar=strchr(buff,'=');
|
||
|
if (theChar!=0)
|
||
|
{
|
||
|
*theChar='\0';
|
||
|
key[0]='\0';
|
||
|
sscanf(buff,"%8000s",key);
|
||
|
//do we have something valid ?
|
||
|
if (key[0]!='\0')
|
||
|
{
|
||
|
//the char behind the = should be at least the terminating \0
|
||
|
// so I can be sure to access valid memory here, IMO
|
||
|
value[0]='\0';
|
||
|
|
||
|
strncpy(value,theChar+1,CFGBUFSIZE);
|
||
|
if (value[0]!='\0')
|
||
|
{
|
||
|
//here we can be sure that the list will only contain
|
||
|
//strings which are at least one char long
|
||
|
dcerr<<"Config(): adding "<<key<<std::endl;
|
||
|
m_entries[key]=value;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
while (!inf.eof());
|
||
|
}
|
||
|
|
||
|
MyString Config::getEntry(const char *key, const char* defaultValue)
|
||
|
{
|
||
|
if ((key==0) || (key[0]=='\0'))
|
||
|
return defaultValue;
|
||
|
if (m_entries.find(key)==m_entries.end())
|
||
|
return defaultValue;
|
||
|
return m_entries[key];
|
||
|
}
|
||
|
|
||
|
int Config::getEntry(const char *key, int defaultValue)
|
||
|
{
|
||
|
char def[100];
|
||
|
sprintf(def,"%d",defaultValue);
|
||
|
MyString tmp=stripWhiteSpace(getEntry(key,def));
|
||
|
int i(0);
|
||
|
int ok=sscanf(tmp.c_str(),"%d",&i);
|
||
|
if (ok==1) return i;
|
||
|
return defaultValue;
|
||
|
}
|
||
|
|