📄 properties.cpp
字号:
#ifdef _WIN32
if(c==pszDir+2 && _istalpha(pszDir[0]) && _TCHAR(':')==pszDir[1]){
continue; // don't attempt to create "C:"
}
#endif
String strDir(pszDir,c-pszDir);
struct _stat buf;
if(!(0==_tstat(strDir,&buf) && (S_IFDIR&buf.st_mode))){
// Need to create directory
bool b=(0==_tmkdir(strDir));
TRACE(_T("Create directory %s rc=%d\n"),(LPCTSTR)strDir,b);
if(!b){
return false;
}
}
}
return true;
}
bool CProperties::SaveToFile(LPCTSTR pszFileName) const
{
CreatePathToFile(pszFileName);
FILE *f=_tfopen(pszFileName,_T("w") MODE_TEXT);
if(f){
for(int i=ar.size()-1;i>=0;--i){
const CProperty &p=ar[i];
String str(p.strName);
str+=_TCHAR('=');
switch(p.Type){
case CProperties::CProperty::Integer:
case CProperties::CProperty::Bool:
case CProperties::CProperty::Char:
case CProperties::CProperty::Short:
str+=String::SFormat(_T("%u"),p.GetValue());
break;
case CProperties::CProperty::Float:
case CProperties::CProperty::Double:
case CProperties::CProperty::szString:
case CProperties::CProperty::Void:
str+=p.GetStringValue();
break;
}
str+=_TCHAR('\n');
_fputts(str,f);
}
fclose(f);
}
return (0!=f);
}
bool CProperties::LoadFromFile(LPCTSTR pszFileName)
{
FILE *f=_tfopen(pszFileName,_T("r") MODE_TEXT);
bool rc=(0!=f);
if(rc){
TCHAR buf[4096];
int nLine=0;
String str;
while(_fgetts(buf,sizeof(buf)-1,f)){
nLine++;
int nLen=_tcslen(buf);
if(nLen>0){
// Remove trailing '\n'
if(_TCHAR('\n')==buf[nLen-1]){
buf[--nLen]=_TCHAR('\0');
}
// Check for continuation lines
if(_TCHAR('\\')==buf[nLen-1]){
buf[--nLen]=_TCHAR('\0');
str+=buf;
} else {
str+=buf;
LPCTSTR c=(LPCTSTR)str;
const TCHAR *pEq=_tcschr(c,_TCHAR('='));
if(pEq){
const String strName(c,pEq-c);
CProperties::CProperty *p=Lookup(strName);
if(p){
pEq++;
rc&=p->SetValue(pEq);
} else {
ERROR(_T("Unknown attribute %s found in %s line %d\n"),(LPCTSTR)strName,pszFileName,nLine);
rc=false;
}
}
str=_T("");
}
}
}
fclose(f);
}
return rc;
}
CProperties::CProperty::CProperty(LPCTSTR pszName,Typetype type,void *_pData):
strName(pszName),
Type(type),
pData(_pData)
{
}
CProperties::CProperty::~CProperty()
{
}
void CProperties::Add(LPCTSTR pszName,int &n)
{
CProperty p(pszName,CProperty::Integer,&n);
ar.push_back(p);
}
void CProperties::Add(LPCTSTR pszName,unsigned int &n)
{
CProperty p(pszName,CProperty::Integer,&n);
ar.push_back(p);
}
void CProperties::Add(LPCTSTR pszName,bool &b)
{
CProperty p(pszName,CProperty::Bool,&b);
ar.push_back(p);
}
void CProperties::Add(LPCTSTR pszName,char &c)
{
CProperty p(pszName,CProperty::Char,&c);
ar.push_back(p);
}
void CProperties::Add(LPCTSTR pszName,unsigned char &c)
{
CProperty p(pszName,CProperty::Char,&c);
ar.push_back(p);
}
void CProperties::Add(LPCTSTR pszName,short &s)
{
CProperty p(pszName,CProperty::Short,&s);
ar.push_back(p);
}
void CProperties::Add(LPCTSTR pszName,unsigned short &s)
{
CProperty p(pszName,CProperty::Short,&s);
ar.push_back(p);
}
void CProperties::Add(LPCTSTR pszName,float &f)
{
CProperty p(pszName,CProperty::Float,&f);
ar.push_back(p);
}
void CProperties::Add(LPCTSTR pszName,double &f)
{
CProperty p(pszName,CProperty::Double,&f);
ar.push_back(p);
}
void CProperties::Add(LPCTSTR pszName,void *pv,unsigned int _nLength)
{
CProperty p(pszName,CProperty::Void,pv);
p.nLength=_nLength;
ar.push_back(p);
}
void CProperties::Add(LPCTSTR pszName,String &s)
{
CProperty p(pszName,CProperty::szString,(void *)&s);
ar.push_back(p);
}
unsigned long CProperties::CProperty::GetValue() const
{
unsigned long dw;
switch(Type){
case Integer:
dw=*(int *)pData;
break;
case Bool:
dw=*(bool *)pData;
break;
case Char:
dw=*(char *)pData;
break;
case Short:
dw=*(short *)pData;
break;
default:
dw=0;
assert(false);
}
return dw;
}
const String CProperties::CProperty::GetStringValue() const
{
String str;
switch(Type){
case szString:
str=*(String *)pData;
break;
case CProperties::CProperty::Integer:
case CProperties::CProperty::Bool:
case CProperties::CProperty::Char:
case CProperties::CProperty::Short:
str.Format(_T("%u"),GetValue());
break;
case CProperties::CProperty::Float:
str.Format(_T("%e"),*(float *)(pData));
break;
case CProperties::CProperty::Double:
str.Format(_T("%e"),*(double *)(pData));
break;
case CProperties::CProperty::Void:
{
unsigned char *c=(unsigned char *)pData;
for(unsigned int i=0;i<nLength;i++){
TCHAR buf[3];
_tprintf(buf,_T("%02x"),c[i]);
str+=buf;
}
}
break;
default:
break;
}
return str;
}
bool CProperties::CProperty::SetValue(int n)
{
bool rc=true;
switch(Type){
case Integer:
*(int *)(pData)=n;
break;
case Bool:
*(bool *)(pData)=(0!=n);
break;
case Char:
*(char *)(pData)=(char)n; //FIXME: range checks
break;
case Short:
*(short *)(pData)=(short)n;//FIXME: range checks
break;
default:
TRACE(_T("Failed to set '%s' to integer value '%d'\n"),(LPCTSTR)strName,n);
break;
}
return rc;
}
bool CProperties::CProperty::SetValue(double n)
{
bool rc=true;
switch(Type){
case Double:
*(float *)(pData)=(float)n;//FIXME: range checks?
break;
case Float:
*(double *)(pData)=n;
break;
default:
TRACE(_T("Failed to set '%s' to double value '%f'\n"),(LPCTSTR)strName,n);
rc=false;
break;
}
return rc;
}
bool CProperties::CProperty::SetValue(LPCTSTR psz)
{
bool rc=false;
TCHAR *pEnd;
double d=0.0;
long l=0;
switch(Type){
case szString:
*(String *)pData=psz;
rc=true;
break;
case Float:
d=_tcstod(psz,&pEnd);
rc=(_TCHAR('\0')==*pEnd);
if(rc){
SetValue((float)d);
}
break;
case Double:
d=_tcstod(psz,&pEnd);
rc=(_TCHAR('\0')==*pEnd);
if(rc){
SetValue(d);
}
break;
case Integer:
case Bool:
case Char:
case Short:
l=_tcstol(psz,&pEnd,10);
rc=(_TCHAR('\0')==*pEnd);
if(rc){
SetValue((int)l);
}
break;
default:
TRACE(_T("Failed to set '%s' to string value '%s'\n"),(LPCTSTR)strName,psz);
break;
}
return rc;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -