📄 properties.cpp
字号:
String strN; strN.Format(_T("%u"),p->GetValue()); str+=strN; } break; case CProperties::CProperty::Float: case CProperties::CProperty::Double: case CProperties::CProperty::szString: case CProperties::CProperty::GPString: case CProperties::CProperty::Void: str+=p->GetStringValue(); break; } str+=_TCHAR('\n'); _fputts(str,f); } fclose(f); } return (0!=f);}bool CProperties::LoadFromFile(LPCTSTR pszFileName,LPCTSTR pszPrefix){ int nPrefixlen=_tcslen(pszPrefix); FILE *f=_tfopen(pszFileName,_T("rt")); bool rc=(0!=f); if(rc){ TCHAR c[256]; while(_fgetts(c,sizeof(c)-1,f)){ if(_TCHAR('\0')!=c[0]){ c[_tcslen(c)-1]=_TCHAR('\0'); // remove trailing \n } if((signed)_tcslen(c)>nPrefixlen && 0==_tcsncmp(c,pszPrefix,nPrefixlen)){ TCHAR *pEq=_tcschr(c,_TCHAR('=')); if(pEq){ const String strName(c+nPrefixlen,pEq-c-nPrefixlen); CProperties::CProperty *p=Lookup(strName); if(p){ pEq++; rc&=p->SetValue(pEq); } else { //TRACE(_T("Failed to find %s\n"),(LPCTSTR)strName); rc=false; } } } } 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,int _nDefault) { CProperty *p=new CProperty(pszName,CProperty::Integer,&n); p->nDefault=_nDefault; ar.push_back(p);}void CProperties::Add(LPCTSTR pszName,unsigned int &n,unsigned int _nDefault){ CProperty *p=new CProperty(pszName,CProperty::Integer,&n); p->nDefault=_nDefault; ar.push_back(p);}void CProperties::Add(LPCTSTR pszName,bool &b,bool _bDefault){ CProperty *p=new CProperty(pszName,CProperty::Bool,&b); p->nDefault=_bDefault; ar.push_back(p);}void CProperties::Add(LPCTSTR pszName,char &c,char _cDefault){ CProperty *p=new CProperty(pszName,CProperty::Char,&c); p->nDefault=_cDefault; ar.push_back(p);}void CProperties::Add(LPCTSTR pszName,unsigned char &c,unsigned char _cDefault){ CProperty *p=new CProperty(pszName,CProperty::Char,&c); p->nDefault=_cDefault; ar.push_back(p);}void CProperties::Add(LPCTSTR pszName,short &s,short _sDefault){ CProperty *p=new CProperty(pszName,CProperty::Short,&s); p->nDefault=_sDefault; ar.push_back(p);}void CProperties::Add(LPCTSTR pszName,unsigned short &s,unsigned short _sDefault){ CProperty *p=new CProperty(pszName,CProperty::Short,&s); p->nDefault=_sDefault; ar.push_back(p);}void CProperties::Add(LPCTSTR pszName,float &f,float _fDefault){ CProperty *p=new CProperty(pszName,CProperty::Float,&f); p->dDefault=_fDefault; ar.push_back(p);}void CProperties::Add(LPCTSTR pszName,double &f,double dDefault) { CProperty *p=new CProperty(pszName,CProperty::Double,&f); p->dDefault=dDefault; ar.push_back(p);}void CProperties::Add(LPCTSTR pszName,void *pv,unsigned int _nLength,void *pvDefault){ CProperty *p=new CProperty(pszName,CProperty::Void,pv); p->nLength=_nLength; p->pvDefault=pvDefault; ar.push_back(p);}void CProperties::Add(LPCTSTR pszName,LPTSTR s,unsigned int _nLength,LPCTSTR _pszDefault){ CProperty *p=new CProperty(pszName,CProperty::szString,s); p->nLength=_nLength; p->strDefault=_pszDefault; ar.push_back(p);}void CProperties::Add (LPCTSTR pszName,void *pObj,getFn *getFn,putFn *putFn,LPCTSTR pszDefault){ CProperty *p=new CProperty(pszName,CProperty::GPString,pObj); p->strDefault=pszDefault; p->pgetFn=getFn; p->pputFn=putFn; p->strDefault=pszDefault; 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=(LPCTSTR)(pData); break; case GPString: str=pgetFn(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; long l; switch(Type){ case szString: _tcsncpy((LPTSTR)pData,psz,nLength); if(nLength<=_tcslen(psz)){ ((LPTSTR)pData)[nLength]=_TCHAR('\0'); } rc=true; break; case GPString: pputFn(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;}void CProperties::CProperty::SetDefault(){ switch(Type){ case Bool: case Integer: case Char: case Short: SetValue(nDefault); break; case Float: case Double: SetValue(dDefault); break; case szString: case GPString: SetValue(strDefault); break; case Void: if(pvDefault){ memcpy(pData,pvDefault,nLength); } break; default: assert(false); }}void CProperties::SetDefaults(){ for(int i=ar.size()-1;i>=0;--i){ ((CProperty*)ar[i])->SetDefault(); }}bool CProperties::Load(LPCTSTR pszPrefix){ #ifdef _WIN32 return m_hKey?LoadFromRegistry((HKEY)m_hKey,m_strName,pszPrefix):LoadFromFile(m_strName,pszPrefix); #else // UNIX return LoadFromFile(m_strName,pszPrefix); #endif}bool CProperties::Save(LPCTSTR pszPrefix){ #ifdef _WIN32 return m_hKey?SaveToRegistry((HKEY)m_hKey,m_strName,pszPrefix):SaveToFile(m_strName,pszPrefix); #else // UNIX return SaveToFile(m_strName,pszPrefix); #endif}/*bool CProperties::Remove(LPCTSTR pszName){ for(int i=ar.size()-1;i>=0;--i){ CProperties::CProperty *p=(CProperties::CProperty *)ar[i]; if(p->strName==pszName){ delete p; ar.RemoveAt(i); return true; } } return false;}*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -