📄 inifile.c
字号:
/******************************************************************************* * 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 + -