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

📄 inifile.c

📁 Unix/Linux下的INI文件读取、设置函数
💻 C
📖 第 1 页 / 共 3 页
字号:
/******************************************************************************* * class for reading Ini File on Unix/Linux/Window*******************************************************************************/#ifndef ALLOW_OS_CODE#define ALLOW_OS_CODE 1#endif  // ALLOW_OS_CODE//*************************  begin of -- include  ******************************#include  <stdlib.h>#include  <string.h>//#include  <strings.h>               // for strncasecmp#include  <sys/stat.h>#include  "common.h"#include  "inifile.h"//*************************  **end of -- include  ******************************//*************************  begin of -- macro definitions  ********************//*************************  **end of -- macro definitions  ********************//*************************  begin of -- variable definitions  *****************IniFileData_TS	f_inifile;//*************************  **end of -- variable definitions  *****************/******************************************************************************* *   desc: initialize member vars *------------------------------------------------------------------------------ *  param: none *------------------------------------------------------------------------------ * return: TRUE   -- ok*******************************************************************************/int IniInit( void ){  f_inifile.p_inifile       = NULL;  f_inifile.i_filesize      = 0;  memset( f_inifile.sz_filebuffer, 0, sizeof(f_inifile.sz_filebuffer) );  f_inifile.b_bufferchanged = FALSE;  memset( f_inifile.sz_lastsection, 0, sizeof(f_inifile.sz_lastsection) );  f_inifile.b_sectionfound  = FALSE;  f_inifile.i_sc_startpos   = 0;  f_inifile.i_sc_endpos     = 0;  f_inifile.i_value_startpos  = 0;  f_inifile.i_value_endpos    = 0;  return  TRUE;}/******************************************************************************* *   desc: open ini file *------------------------------------------------------------------------------ *  param: char *psz_file       -- file to open *------------------------------------------------------------------------------ * return:  0   -- file succefully opened *         -1   -- fail to open ini file *         -2   -- fail to read file to buffer*******************************************************************************/int IniOpenFile( const char * psz_file ){  struct stat   statbuf;  IniCloseFile();  IniInit();  stat( psz_file, &statbuf );	DBGPRINT(( "OpenFile -- ini file size = %d\n", statbuf.st_size ));  // open file  f_inifile.p_inifile = fopen( psz_file, "r+" );  if( f_inifile.p_inifile == NULL )    return  -1;  // read file to buffer  if( fread(f_inifile.sz_filebuffer, statbuf.st_size, 1, f_inifile.p_inifile) != 1 )  {    if( f_inifile.p_inifile != NULL )      fclose( f_inifile.p_inifile );    f_inifile.p_inifile = NULL;    return  -2;  }  rewind( f_inifile.p_inifile );  f_inifile.i_filesize  = statbuf.st_size;              // save file size  return  0;}/******************************************************************************* *   desc: close ini file *------------------------------------------------------------------------------ *  param: none *------------------------------------------------------------------------------ * return:  0   -- file succefully closed *         -1   -- fail to close the opened file*******************************************************************************/int IniCloseFile( void ){  // file not opened	if( f_inifile.p_inifile == NULL )    return  TRUE;  // save file if buffer changed  if( f_inifile.b_bufferchanged ) {    DBGPRINT(( "\nCloseFile -- wrtie file, file size = %d\n", f_inifile.i_filesize ));    //rewind( p_inifile );    fwrite( f_inifile.sz_filebuffer, f_inifile.i_filesize, 1, f_inifile.p_inifile );    f_inifile.b_bufferchanged = FALSE;  }  // close file  if( fclose(f_inifile.p_inifile) != -1 ) {    f_inifile.p_inifile = NULL;    return  TRUE;  } else {    return  FALSE;  }}/******************************************************************************* *   desc: get a string value by key *------------------------------------------------------------------------------ *  param: const char * psz_section     -- section name *         const char * psz_key         -- key name *         char *       psz_value       -- key value *------------------------------------------------------------------------------ * return: TRUE   -- key value found *         FALSE  -- key value not found*******************************************************************************/int IniGetString( const char * psz_section, const char * psz_key,                   char * psz_value ){	long i = 0;  long j = 0;  int b_skip = FALSE;  // key name can't be null  if( strlen(psz_key) == 0 )    return	FALSE;  // return if section not found  if( IniSearchSection(psz_section) == FALSE )    return	FALSE;  DBGPRINT(( "\nGetString -- to get value of %s\n", psz_key ));  i = f_inifile.i_sc_startpos;  while( i < f_inifile.i_sc_endpos ) {    // skip space, tab and \n    while( i < f_inifile.i_filesize && (f_inifile.sz_filebuffer[i]==' ' ||           f_inifile.sz_filebuffer[i]=='\t' || f_inifile.sz_filebuffer[i]=='\n'  ) )      i++;    // return if reach end of section    if( i >= f_inifile.i_sc_endpos )      return  FALSE;    b_skip  = FALSE;    switch( f_inifile.sz_filebuffer[i] ) {    case  '#':        // a comment line      b_skip = TRUE;      break;#if 0    case  '[':        // next section begin mark -- [      // we can't continue if we run into next '[' of next section      return  FALSE;#endif    default:      if( strnicmp(f_inifile.sz_filebuffer+i, psz_key, strlen(psz_key)) == 0 ) {        //======================================================================        // key matched, try to find value        //======================================================================        i += strlen(psz_key);        // 1. skip space and tab        while( i < f_inifile.i_sc_endpos &&               (f_inifile.sz_filebuffer[i]==' ' || f_inifile.sz_filebuffer[i]=='\t') )          i++;        if( i >= f_inifile.i_sc_endpos )          return  FALSE;        // 2. try to find '='        if( f_inifile.sz_filebuffer[i] == '=' ) {          //====================================================================          // '=' found, get kay value          //====================================================================          i++;          // skip space and tab          while( i < f_inifile.i_sc_endpos &&                 (f_inifile.sz_filebuffer[i]==' ' || f_inifile.sz_filebuffer[i]=='\t') )            i++;          if( i >= f_inifile.i_sc_endpos )            return  TRUE;          // search the end of the key value          j = i;          while( j < f_inifile.i_sc_endpos && f_inifile.sz_filebuffer[j] != '\n' )            j++;          j--;          while( f_inifile.sz_filebuffer[j] == ' ' || f_inifile.sz_filebuffer[j] == '\t' )            j--;          // copy the key value          strncpy( psz_value, f_inifile.sz_filebuffer+i, j-i+1 );          *(psz_value+j-i+1) = '\0';          f_inifile.i_value_startpos  = i;          f_inifile.i_value_endpos    = j;          DBGPRINT(( "GetString -- value of %s is: %s\n", psz_key, psz_value ));          return  TRUE;        }        else {          //====================================================================          // no matching '=', ignore the line          //====================================================================          b_skip  = TRUE;        }      }      else {        //======================================================================        // key not matched, ignore the line and forward        //======================================================================        b_skip  = TRUE;      }      break;    }    if ( b_skip ) {      // ignore the line and forward      while( i < f_inifile.i_filesize && f_inifile.sz_filebuffer[i] != '\n' )        i++;      if( i >= f_inifile.i_filesize)        return  FALSE;      i++;                          // Jump to the next line    }  }  return  FALSE;}/******************************************************************************* *   desc: set a string value by key *------------------------------------------------------------------------------ *  param: const char * psz_section     -- section name *         const char * psz_key         -- key name *         const char * psz_value       -- key value *------------------------------------------------------------------------------ * return: TRUE   -- key value writen to buffer*******************************************************************************/int IniSetString( const char * psz_section, const char * psz_key,                   const char * psz_value ){	char  sz_value[M_MAX_VALUE_BUFFER_SIZE];  int   i_oldvaluelen = 0;                    // lenght of old value  int   i_newvaluelen = 0;                    // lenght of new value  long  i = 0;  long  i_temp = 0;  //DBGPRINT(( "\nSetString -- to search section: %s\n", psz_section ));  if( IniSearchSection(psz_section) == FALSE ) {    //==========================================================================    // section not found, we append the section and key value    // at the end of buffer    //==========================================================================    memset( sz_value, 0, sizeof(sz_value) );    sprintf( sz_value, "\n\n\n[%s]\n%s = %s\n\n\n", psz_section,             psz_key, psz_value );    i_temp  = strlen( sz_value );    strncpy( f_inifile.sz_filebuffer+f_inifile.i_filesize, sz_value, strlen(sz_value) );    f_inifile.i_filesize += i_temp;    f_inifile.b_bufferchanged = TRUE;    return  TRUE;  }  if( IniGetString(psz_section, psz_key, sz_value) ) {    //==========================================================================    // section and key found, replace value    //==========================================================================    i_oldvaluelen = f_inifile.i_value_endpos - f_inifile.i_value_startpos + 1;    i_newvaluelen = strlen( psz_value );    //DBGPRINT(( "SetString -- before update, file size = %d\n", i_filesize ));    if( i_newvaluelen > i_oldvaluelen ) {      // new value is longer than old value ************************************      // 1. get more space by moving content backward      i_temp  = i_newvaluelen - i_oldvaluelen;      for( i=f_inifile.i_filesize-1; i>=f_inifile.i_value_endpos; i-- ) {        f_inifile.sz_filebuffer[i+i_temp] = f_inifile.sz_filebuffer[i];      }      f_inifile.i_filesize  += i_temp;      f_inifile.sz_filebuffer[f_inifile.i_filesize+1] = '\0';      // 2. write new value to buffer      strncpy( f_inifile.sz_filebuffer+f_inifile.i_value_startpos, psz_value, strlen(psz_value) );    } else if( i_newvaluelen < i_oldvaluelen ) {      // new value is shorter than old value ***********************************      // 1. write new value to buffer      strncpy( f_inifile.sz_filebuffer+f_inifile.i_value_startpos, psz_value, strlen(psz_value) );#if 0      // 2. cut some space by moving content forward      i_temp  = i_oldvaluelen - i_newvaluelen;      for( i=f_inifile.i_value_endpos+1; i<f_inifile.i_filesize; i++ ) {        f_inifile.sz_filebuffer[i-i_temp] = f_inifile.sz_filebuffer[i];      }

⌨️ 快捷键说明

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