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

📄 cinifileimpl.cpp

📁 一个用于跨操作系统平台的INI配置文件操作模块。
💻 CPP
字号:
/*cinifileimpl.cpp*/
/*
*  Common Ini file
*
*  Copyright (c) 2003 xuyeli2002@vip.sina.com
*  History:
*  Author         Date
*  -------------------------------------------------
*  Yeli Xu        2003-01-24
*/

#include <stdio.h>
#include <time.h>

#include "cinierr.h"
#include "cinifileimpl.h"


tm_CINI_IniFile_Impl::tm_CINI_IniFile_Impl(const char * filename)
{
  switchInifile(filename);
}

tm_CINI_IniFile_Impl::~tm_CINI_IniFile_Impl()
{
  return;
}


tm_return tm_CINI_IniFile_Impl::readString(const char *section, 
    const char *ident, char *buffer, unsigned int *length)
{
  if (_isEmpty())
    return TM_CINI_NO_FILE;

  if ( (buffer == NULL) || (length == NULL) 
      || (section == NULL) || (ident == NULL) )
    return TM_CINI_PARAM_ERROR;

  if (*length == 0)
    return TM_CINI_BUFFER_LENGTH_ERROR;

  tm_return ret = TM_CINI_SUCCESS;

  unsigned int count = GetPrivateProfileString(section, ident, "", 
      buffer, *length, _filename);
  *length = count;
  if (*length == 0)
    ret = TM_CINI_NOT_FOUND_IN_FILE;
  
  return ret;
}
tm_return tm_CINI_IniFile_Impl::writeString(const char *section, 
    const char *ident, const char *valstring)
{  
  if (_isEmpty())
    return TM_CINI_NO_FILE;
  if ( (section == NULL) || (ident == NULL) || (valstring == NULL) )
    return TM_CINI_PARAM_ERROR;

  if (WritePrivateProfileString(section, ident, valstring ,_filename) )
    return TM_CINI_SUCCESS;
  else
    return TM_CINI_FILE_WRITE_ERROR;
}

tm_return tm_CINI_IniFile_Impl::readInt(const char *section, 
    const char *ident, int * valint)
{
  char buffer[MAXLENGTHONELINE];
  unsigned int buflen = MAXLENGTHONELINE;

  tm_return ret = readString(section, ident, buffer, &buflen);
  if (ret == TM_CINI_SUCCESS)
  {
    size_t len = strlen(buffer);
    if (len == 0)
      ret = TM_CINI_NOT_INT;
    else if ( (len == 1) &&(buffer[0] = '0') )
      *valint = 0;
    else
    {
      int res = atoi(buffer);
      if (res == 0)
        ret = TM_CINI_NOT_INT;
      else
        *valint = res;
    }
  }
  return ret;
}

tm_return tm_CINI_IniFile_Impl::writeInt(const char *section, 
    const char *ident, int valint)
{
  /*length enough for int64 use*/
  #define MAXINT32STRING 21
  char buffer[MAXINT32STRING];
  sprintf(buffer, "%d", valint);
  return writeString(section, ident, buffer);
}

tm_return tm_CINI_IniFile_Impl::readBool(const char *section, 
    const char *ident, bool *valbool)
{
  int tmp;
  tm_return ret = readInt(section, ident, &tmp);
  if (ret == TM_CINI_SUCCESS)
    *valbool = (tmp !=0);
  return ret;
}

tm_return tm_CINI_IniFile_Impl::writeBool(const char *section, 
    const char *ident, bool valbool)
{
  int tmp = (valbool ? 1 : 0 );
  return writeInt(section, ident, tmp);
}

tm_return tm_CINI_IniFile_Impl::readFloat(const char *section, 
    const char *ident, double *valdbl)
{
  char buffer[MAXLENGTHONELINE];

  unsigned int buflen = MAXLENGTHONELINE;
  tm_return ret = readString(section, ident, buffer, &buflen);
  if (ret == TM_CINI_SUCCESS)
  {
    size_t len = strlen(buffer);
    if (len == 0)
      ret = TM_CINI_NOT_INT;
    else if ( (len == 1) &&(buffer[0] = '0') )
      *valdbl = 0.0;
    else if ( (len == 2) &&(strcmp(buffer, ".0") == 0) )
      *valdbl = 0.0;
    else if ( (len == 3) &&(strcmp(buffer, "0.0") == 0) )
      *valdbl = 0.0;
    else
    {
      double res = atof(buffer);
      if (res == 0.0)//todo: need modify
        ret = TM_CINI_NOT_DOUBLE;
      else
        *valdbl = res;
    }
  }
  return ret;
}


tm_return tm_CINI_IniFile_Impl::writeFloat(const char *section, 
    const char *ident, double valdbl)
{
  /*length enough for int64 use*/
  #define MAXDOUBLESTRING 128;
  char buffer[MAXINT32STRING];
  sprintf(buffer, "%f", valdbl);
  return writeString(section, ident, buffer);
}

tm_return tm_CINI_IniFile_Impl::readSection(const char *section, 
    char *strings, unsigned int *length)
{
  if (_isEmpty())
    return TM_CINI_NO_FILE;
  if ( (section == NULL) || (strings == NULL) )
    return TM_CINI_PARAM_ERROR;
  
  if (*length == 0)
    return TM_CINI_BUFFER_LENGTH_ERROR;

  tm_return ret = TM_CINI_SUCCESS;

  unsigned int count = GetPrivateProfileString(section, NULL, NULL, 
      strings, *length, _filename);
  *length = count;
  if (*length == 0)
    ret = TM_CINI_NOT_FOUND_IN_FILE;
  
  return ret;
}

tm_return tm_CINI_IniFile_Impl::readSections(char *strings, 
    unsigned int *length)
{
  if (_isEmpty())
    return TM_CINI_NO_FILE;
  if (strings == NULL)
    return TM_CINI_PARAM_ERROR;
  
  if (*length == 0)
    return TM_CINI_BUFFER_LENGTH_ERROR;

  tm_return ret = TM_CINI_SUCCESS;

  unsigned int count = GetPrivateProfileString(NULL, NULL, NULL, 
      strings, *length, _filename);
  *length = count;
  if (*length == 0)
    ret = TM_CINI_NOT_FOUND_IN_FILE;
  
  return ret;
}


tm_return tm_CINI_IniFile_Impl::eraseSection(const char *section)
{
  if (_isEmpty())
    return TM_CINI_NO_FILE;
  if (section == NULL)
    return TM_CINI_PARAM_ERROR;

  if (WritePrivateProfileString(section, NULL, NULL, _filename) )
    return TM_CINI_SUCCESS;
  else
    return TM_CINI_FILE_WRITE_ERROR;
}

tm_return tm_CINI_IniFile_Impl::eraseKey(const char *section, 
    const char *ident)
{
  if (_isEmpty())
    return TM_CINI_NO_FILE;
  if ( (section == NULL) || (ident == NULL) )
    return TM_CINI_PARAM_ERROR;

  if (WritePrivateProfileString(section, ident, NULL, _filename) )
    return TM_CINI_SUCCESS;
  else
    return TM_CINI_FILE_WRITE_ERROR;
}

tm_return tm_CINI_IniFile_Impl::sectionExists(const char *section)
{
  char *buffer = new char[MAXLENGTHONESECTION];
  if (buffer == NULL )
    return TM_CINI_MEMORY_ALLOC_ERROR;

  unsigned int length = MAXLENGTHONESECTION;
  
  tm_return ret = readSection(section, buffer, &length);
  delete [] buffer;
  return ret;
}
tm_return tm_CINI_IniFile_Impl::valueExists(const char *section, 
    const char *ident)
{
  char *buffer = new char[MAXLENGTHONESECTION];
  if (buffer == NULL )
    return TM_CINI_MEMORY_ALLOC_ERROR;

  unsigned int length = MAXLENGTHONESECTION;
  
  tm_return ret = readSection(section, buffer, &length);
  delete [] buffer;
  return ret;
}

//switch ini file
tm_return tm_CINI_IniFile_Impl::switchInifile(const char *filename)
{
  if (filename == NULL)
    _filename[0] = '\0';
  else
  {
    size_t inlen = strlen(filename);
    if (inlen == 0)
      _filename[0] = '\0';
    else
    {
      size_t copylen = (inlen < _MAX_PATH) ? inlen : (_MAX_PATH-1);
      strncpy(_filename, filename, copylen);
      _filename[copylen] = '\0';
    }
  }
  return TM_CINI_SUCCESS;
}
    
//get ini filename
tm_return tm_CINI_IniFile_Impl::getInifile(char *filename, 
    unsigned int *length)
{
  if ( (filename == NULL) || (length == NULL) )
    return TM_CINI_PARAM_ERROR;

  if (*length == 0)
    return TM_CINI_BUFFER_LENGTH_ERROR;
  
  unsigned int len = strlen(_filename);
  unsigned int copied = ( len <= *length ? len : *length );
  strncpy(filename, _filename, copied);
  filename[copied] = '\0';
  *length = copied;

  return TM_CINI_SUCCESS;
}

//internal functions
bool tm_CINI_IniFile_Impl::_isEmpty()
{
  return (strlen(_filename) == 0);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -