⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 properties.cpp

📁 移植到WLIT项目的redboot源代码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
#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 + -