diff options
Diffstat (limited to 'Src/Wasabi/bfc/util/profile.c')
-rw-r--r-- | Src/Wasabi/bfc/util/profile.c | 288 |
1 files changed, 288 insertions, 0 deletions
diff --git a/Src/Wasabi/bfc/util/profile.c b/Src/Wasabi/bfc/util/profile.c new file mode 100644 index 00000000..3049945a --- /dev/null +++ b/Src/Wasabi/bfc/util/profile.c @@ -0,0 +1,288 @@ +#pragma warn -aus +//---------------------------------------------------------------------------- +// MS Windows Style .ini File Interface for C++ +// This is the first version. +// Programed by xuyifeng, 1995.10, china +//---------------------------------------------------------------------------- +// Test history: +// Compiler OS TEST +// --------------------------------------------------------------- +// Watcom C++ 10.0a Rational System DOS4GW 100% tested +// Borland C++ 3.1 DOS 100% tested +// 10/4/97 - Bugfix: added fclose(is); at the end of getProfileString -lonerunnr/ags +//---------------------------------------------------------------------------- +#include <stdio.h> +#include <stdlib.h> +#include <sys/io.h> +#include <string.h> +#include <ctype.h> +#ifdef LINUX +#include <X11/Xos.h> +#define _strnicmp strncasecmp +#endif + +#include "profile.h" + +#define False 0 +#define True 1 + +//------------------------------------------------------------------------------ +// titlePos: get a section title position & length in a string. +//------------------------------------------------------------------------------ +static char *titlePos( char *buf, int *len ) +{ + char *p = buf, *q; + + while( *p && isspace(*p) ) p++; + if( *p != '[' ) + return 0; + + q = p+1; + while( *q && *q != ']' ) q++; + if( *q != ']' ) + return 0; + if( len ) + *len = (int)(q - p - 1); + return p+1; +} + +//------------------------------------------------------------------------------ +// isTitleLine: check if a string is a section title line +//------------------------------------------------------------------------------ +static int isTitleLine( char *bufPtr ) +{ + return titlePos( bufPtr, 0 ) != 0; +} + +//------------------------------------------------------------------------------ +// containTitle: check if a string contain a section a title +//------------------------------------------------------------------------------ +static int containTitle( char *buf, const char *section ) +{ + int len = 0; + char *p = titlePos(buf, &len); + if (p) + { + if( strlen( section ) == len && _strnicmp( section, p, len ) == 0 ) + return True; + } + return False; +} + +//------------------------------------------------------------------------------ +// gotoSection: move file position to start line of a section +//------------------------------------------------------------------------------ +static int gotoSection( FILE *is, const char *section ) +{ + char line[256] = {0}; + while( fgets(line, 256, is) != NULL) + if( containTitle( line, section ) ) + return True; + return False; +} + +//------------------------------------------------------------------------------ +// textPos: get content's position of a entry +//------------------------------------------------------------------------------ +static char *textPos( char *buf, const char *entry ) +{ + if( buf[0] == ';' ) // it is comment line + return 0; + + char *p = strchr( buf, '=' ); + if (!p) + return 0; + + int len = (int)(p - buf); + if( strlen(entry) == len && _strnicmp( buf, entry, len ) == 0 ) + return p+1; + + return 0; +} + +//------------------------------------------------------------------------------ +// stripQuotationChar: strip a pair of quotation chars in a string +//------------------------------------------------------------------------------ +static void stripQuotationChar( char *buf ) +{ + char *p = buf; + while( *p && isspace(*p) ) p++; + + if( !(*p == '\"' || *p == '\'') ) + return; + + char *q = p+strlen(p); + while( *q != *p && q > p ) q--; + if( q == p ) + return; + int len = (int)(q - p - 1); + memmove( buf, p+1, len ); + buf[len] = 0; +} + +//------------------------------------------------------------------------------ +// readEntry: read content of entry +//------------------------------------------------------------------------------ +static int readEntry( FILE *is, const char *entry, char *buf, int bufSize, + int strip ) +{ + char lineBuf[256] = {0}; + char *cur = buf; + *cur = '\0'; + int len = -1; + while( fgets(lineBuf, 256, is) != NULL) + { + if (lineBuf[strlen(lineBuf)-1] == '\n') + lineBuf[strlen(lineBuf)-1] = 0; + + if( isTitleLine( lineBuf ) ) // section is ended + break; + + char *p = textPos( lineBuf, entry ); // not equal this entry + if( p == 0 ) + continue; + + if( strip ) + stripQuotationChar( p ); + + len = strlen(p); + if( bufSize-1 < len ) + len = bufSize-1; + + strncpy( cur, p, len ); + cur[len] = 0; + break; + } + + return len; +} + +//------------------------------------------------------------------------------ +// getProfileString: +//------------------------------------------------------------------------------ +int GetPrivateProfileString( const char *section, + const char *entry, + const char *defaultString, + char *buffer, + int bufLen, + const char *fileName ) +{ + FILE *is; + int len = -1; + + is = fopen(fileName, "rt"); + + if( is && gotoSection( is, section ) ) + len = readEntry(is, entry, buffer, bufLen, True); + + if (len < 0) //can not read entry, use default string + { + strncpy( buffer, defaultString, bufLen-1 ); + buffer[bufLen-1] = 0; + len = strlen(buffer); + } + if (is) fclose(is); + return len; +} + +//---------------------------------------------------------------------------- +// getProfileInt: +//---------------------------------------------------------------------------- +long GetPrivateProfileInt( const char *section, + const char *entry, + long defaultInt, + const char *fileName ) +{ + char buf[256]; + char iBuf[34]; //"34" is max space "_itoa" required under 32 bit C++ + + sprintf(iBuf, "%d", defaultInt); + GetPrivateProfileString( section, entry, iBuf, buf, 256, fileName ); + return atol( buf ); +} + +static void writeEntry( FILE *os, const char *entry, const char *string ) +{ + fprintf(os, "%s=%s\n", entry, string); +} + +//------------------------------------------------------------------------------ +// writeProfileString: +//------------------------------------------------------------------------------ +int WritePrivateProfileString( const char *section, + const char *entry, + const char *string, + const char *fileName ) +{ + char path [8192] = {0}; + char drive[256] = {0}; + char dir [256] = {0}; + char file [256] = {0}; + char ext [256] = {0}; + char buf [256] = {0}; + + int titleFound; + + // work better on network! + _splitpath( path, drive, dir, file, ext ); + _makepath( path, drive, dir, mkstemp("iniXXXXXX"), "" ); + + FILE *is = fopen(fileName, "rt"); + FILE *os = fopen(path, "wt"); + + if(!is || !os || entry == 0) // maybe can not create file or invalid entry + { + if (is) fclose(is); + if (os) fclose(os); + return 0; + } + + titleFound = False; + if (is) + { + while (fgets(buf, 256, is) != NULL) + { + fputs(buf, os); + if( containTitle(buf, section) ) + { + titleFound = True; + break; + } + } + } + + if (!titleFound) // add section + { + fprintf(os, "[%s]\n", section); + writeEntry( os, entry, string ); + } + else + { + while (fgets(buf, 256, is) != NULL) + { + if (isTitleLine(buf)) // section ended, but still not found the entry + break; + + if (textPos(buf, entry)) // entry found, so rewrite it + { + break; + } + fputs(buf, os); + } + + writeEntry(os, entry, string); + + if (is) + { + while(fgets(buf, 256, is) != NULL) // copy left lines + fputs(buf, os); + } + } + if (is) fclose(is); + if (os) fclose(os); + unlink(fileName); + rename(path, fileName); + return strlen(string); +} + +#pragma warn .aus
\ No newline at end of file |