INIFILE.C
上传用户:sunrenlu
上传日期:2022-06-13
资源大小:1419k
文件大小:6k
源码类别:

操作系统开发

开发平台:

DOS

  1. #include <stdio.h>
  2. #include <ctype.h>
  3. #include <string.h>
  4. #include <conio.h>
  5. #include <rtos.h>
  6. #include <stdlib.h>
  7. #include <filename.h>
  8. #include <inifile.h>
  9. #ifdef __DJGPP__
  10. #include <unistd.h>
  11. #endif
  12. #define INIBUFSIZE ( 512 + 1 )
  13. #define FILELENGTH ( 80 + 1 ) /* dos file length limit */
  14. //----------------------------------------------------------------------
  15. void trim( char *s )
  16. {
  17.     char *p, *q;
  18.     /* trim left spaces */
  19.     for ( p = s ; (*p) && isspace(*p) ; p++ );
  20.     for ( q = s ; *p ; ) *q++ = *p++;
  21.     *q = 0;
  22.     /* trim right spaces */
  23.     if ( q != s ) {
  24.         while ( isspace( *(--q) ))
  25.            *q = 0;
  26.     }
  27. }
  28. //----------------------------------------------------------------------
  29. /* GetSectionName destructive */
  30. static char *GetSectionName( char *line )
  31. {
  32.     char *p;
  33.     if ( *line == '[') {
  34.         if ( (p = strchr( line , ']' )) != NULL ) {
  35.             *p = 0;
  36.             *line = ' ';
  37.             trim( line );
  38.             return( line );
  39.         }
  40.     }
  41.     return( NULL );
  42. }
  43. //----------------------------------------------------------------------
  44. static char *GetKeyData( char *line )
  45. {
  46.     char *p;
  47.     if ( *line == '[' ) return( NULL );
  48.     if ((p = strchr(line,'='))!=NULL ) {
  49.         *p++ = 0;
  50.         trim( line );
  51.         trim( p );
  52.         return( p );
  53.     }
  54.     return( NULL );
  55. }
  56. //----------------------------------------------------------------------
  57. char * GetIniString( const char *filename, const char *section,
  58.                      const char *key, const char *def )
  59. {
  60.     FILE *f = NULL;
  61.     char *result = NULL;
  62.     char *buf = NULL;
  63.     char *p;
  64.     int insection = 0;
  65.     dos_enter();
  66.     do {
  67.         if ((buf = kcalloc( INIBUFSIZE , 1 )) == NULL ) break;
  68.         if ((f = fopen( filename, "rt")) != NULL ) {
  69.             while ( fgets( buf, INIBUFSIZE - 1, f ) != NULL ) {
  70.                 buf[ INIBUFSIZE - 1 ] = 0;
  71.                 trim( buf );
  72.                 if ( (*buf != '#') && ( *buf != ';' )) {
  73.                     /* check if section name */
  74.                     if ( ( p = GetSectionName( buf )) != NULL )
  75.                         insection = !stricmp( p, section );
  76.                     else {
  77.                         /* data line */
  78.                         if ( insection != 0 ) {
  79.                             if ( (p = GetKeyData( buf )) != NULL ) {
  80.                                 if ( !stricmp( buf, key )) {
  81.                                     result = kstrdup( p );
  82.                                     break;
  83.                                 }
  84.                             }
  85.                         }
  86.                     }
  87.                 }
  88.             }
  89.         }
  90.     } while ( 0 );
  91.     if ( f != NULL ) fclose( f );
  92.     if ( buf != NULL ) kfree( buf );
  93.     dos_exit();
  94.     /* didn't find it, use default */
  95.     if ( result == NULL )
  96.         if ( def != NULL )
  97.             result = kstrdup( def );
  98.     return( result );
  99. }
  100. //----------------------------------------------------------------------
  101. int SetIniString( const char *filename, const char *section,
  102.                   const char *key, const char *value )
  103. {
  104.     char *name2;
  105.     FILE *in = NULL, *out = NULL;
  106.     int result = 0;
  107.     char *buf = NULL;
  108.     char *p;
  109.     int insection = 0;
  110.     dos_enter();
  111.     /* terminate values with CR or LF */
  112.     if ( ( p = strchr( value , 13 )) != NULL ) *p = 0;
  113.     if ( ( p = strchr( value , 10 )) != NULL ) *p = 0;
  114.     do {
  115.         if ((buf = kcalloc( INIBUFSIZE , 1 )) == NULL ) break;
  116.         if ((name2 = kcalloc( FILELENGTH, 1 )) == NULL ) break;
  117.         FileChangeExt(filename, ".TMP", name2 );
  118.         if ( FileExists( name2 )) unlink( name2 );
  119.         if (( out = fopen( name2, "wt" )) == NULL ) break;
  120.         if (( in = fopen( filename, "rt" )) == NULL ) {
  121.             fprintf( out, "[%s]n", section );
  122.             fprintf( out, "%s=%sn", key, value );
  123.             result = 1;
  124.             break;
  125.         }
  126.         while ( fgets( buf, INIBUFSIZE - 1, in ) != NULL ) {
  127.             buf[ INIBUFSIZE - 1 ] = 0;
  128.             trim( buf );
  129.             /* preserve comments */
  130.             if ( (*buf == '#') || ( *buf == ';' )) {
  131.                 fprintf( out, "%sn", buf );
  132.                 continue;
  133.             }
  134.             /* look for section names */
  135.             if ( ( p = GetSectionName( buf )) != NULL ) {
  136.                 fprintf( out, "n[%s]n", p );
  137.                 if ( (insection = !stricmp( p, section )) != 0 ) {
  138.                     /* write our new data */
  139.                     fprintf( out , "%s=%sn", key, value );
  140.                     result = 1;
  141.                 }
  142.                 continue;
  143.             }
  144.             /* look for x=y */
  145.             if ( ( p = GetKeyData( buf )) != NULL ) {
  146.                 if ( !insection || stricmp( buf, key )) {
  147.                     fprintf(out,"%s=%sn", buf, p );
  148.                 }
  149.             }
  150.             continue;
  151.         }
  152.         if ( result == 0 ) {
  153.             fprintf( out, "[%s]n", section );
  154.             fprintf( out, "%s=%sn", key, value );
  155.             result = 1 ;
  156.         }
  157.     } while ( 0 );
  158.     if ( in    != NULL ) fclose( in );
  159.     if ( out   != NULL ) fclose( out );
  160.     if ( result ) {
  161.         if ( FileExists( filename ) )
  162.             FileRenameExt( filename, ".BAK" );
  163.         result = FileRenameExt( name2, FileGetExt( filename ));
  164.     }
  165.     if ( buf   != NULL ) kfree( buf );
  166.     if ( name2 != NULL ) kfree( name2 );
  167.     dos_exit();
  168.     return( result );
  169. }
  170. //----------------------------------------------------------------------
  171. DWORD GetIniDWORD( const char *filename, const char *section,
  172.                    const char *key, DWORD def )
  173. {
  174.     char *s;
  175.     DWORD x = def;
  176.     if ( ( s = GetIniString( filename, section, key, NULL )) != NULL ) {
  177.         trim( s );  /* get rid of leading spaces */
  178.         x = atol( s );
  179.         kfree( s );
  180.     }
  181.     return( x );
  182. }
  183. //----------------------------------------------------------------------
  184. DWORD SetIniDWORD( const char *filename, const char *section,
  185.                    const char *key, DWORD value )
  186. {
  187.     char s[32];
  188.     sprintf( s, "%lu" , value );
  189.     return( SetIniString( filename, section, key, s ));
  190. }