📄 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 + -