inifile.cpp
来自「开放源码的编译器open watcom 1.6.0版的源代码」· C++ 代码 · 共 133 行
CPP
133 行
/****************************************************************************
*
* Open Watcom Project
*
* Portions Copyright (c) 1983-2002 Sybase, Inc. All Rights Reserved.
*
* ========================================================================
*
* This file contains Original Code and/or Modifications of Original
* Code as defined in and that are subject to the Sybase Open Watcom
* Public License version 1.0 (the 'License'). You may not use this file
* except in compliance with the License. BY USING THIS FILE YOU AGREE TO
* ALL TERMS AND CONDITIONS OF THE LICENSE. A copy of the License is
* provided with the Original Code and Modifications, and is also
* available at www.sybase.com/developer/opensource.
*
* The Original Code and all software distributed under the License are
* distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
* EXPRESS OR IMPLIED, AND SYBASE AND ALL CONTRIBUTORS HEREBY DISCLAIM
* ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR
* NON-INFRINGEMENT. Please see the License for the specific language
* governing rights and limitations under the License.
*
* ========================================================================
*
* Description: Viper INI file access routines.
*
****************************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <direct.h>
#include <io.h>
#if defined( __WINDOWS__ ) || defined( __NT__ )
#include <windows.h>
#ifdef __NT__
#include <shlobj.h>
typedef HRESULT (WINAPI *GetFolderPath)(HWND, int, HANDLE, DWORD, LPTSTR);
#endif
#endif
#include "inifile.hpp"
#define IDE_INI_FILENAME "watcom.ini"
#define IDE_INI_DIR "Open Watcom"
#if defined( __OS2__ )
/* On OS/2, closing a profile is potentially expensive operation
* (buffer flushes and whatnot). Therefore we cache the ini handle
* to minimize the profile open/close operations.
*/
IniFile::IniFile()
{
char buff[FILENAME_MAX];
char *p = getenv( "USER_INI" );
strcpy( buff, p );
for( p = buff + strlen(buff) - 1; p >= buff; p-- ) {
if( *p == '\\' ) {
*p = 0;
break;
}
}
strcat( buff, "\\" IDE_INI_FILENAME);
_handle = PrfOpenProfile( NULL, (PSZ)buff );
}
IniFile::~IniFile( )
{
PrfCloseProfile( _handle );
}
int IniFile::read( const char *section, const char *key, const char *deflt,
char *buffer, int len )
{
return( PrfQueryProfileString( _handle, (PSZ)section, (PSZ)key, (PSZ)deflt,
buffer, len ) );
}
int IniFile::write( const char *section, const char *key, const char *string)
{
return( PrfWriteProfileString( _handle, (PSZ)section, (PSZ)key, (PSZ)string ) );
}
#elif defined( __WINDOWS__ ) || defined( __NT__ )
/*
* shfolder.dll is loaded explicitly for compatability with Win98 -- calling
* SHGetFolderPathA directly doesn't work, probably due to order of linking
*/
IniFile::IniFile()
{
char path[FILENAME_MAX];
#ifdef __NT__
HINSTANCE library = LoadLibrary( "shfolder.dll" );
if ( library ) {
GetFolderPath getpath = (GetFolderPath)GetProcAddress(library, "SHGetFolderPathA");
if( SUCCEEDED( getpath( NULL, CSIDL_APPDATA | CSIDL_FLAG_CREATE, NULL, 0, path ) ) ) {
if( strlen( path ) + strlen( "\\" IDE_INI_DIR ) + 12 < FILENAME_MAX) {
strcat( path, "\\" IDE_INI_DIR);
if( access(path, F_OK) ) // make sure CONFIG_DIR diretory is present
mkdir( path ); // if not, create it
}
}
FreeLibrary( library );
}
else // should only get here on old machines
GetWindowsDirectory( path, FILENAME_MAX ); // that don't have shfolder.dll
#else
GetWindowsDirectory( path, FILENAME_MAX );
#endif
strcat( path, "\\" IDE_INI_FILENAME );
_path = path;
}
IniFile::~IniFile( ) { }
int IniFile::read( const char *section, const char *key, const char *deflt,
char *buffer, int len )
{
return( GetPrivateProfileString( section, key, deflt, buffer, len, _path) );
}
int IniFile::write( const char *section, const char *key, const char *string)
{
return( WritePrivateProfileString( section, key, string, _path) );
}
#else
#error UNSUPPORTED OS
#endif
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?