windows-nt/Source/XPSP1/NT/sdktools/ini/ini.c
2020-09-26 16:20:57 +08:00

493 lines
14 KiB
C

/*
* Utility program to dump the contents of a Windows .ini file.
* one form to another. Usage:
*
* ini [-f FileSpec] [SectionName | SectionName.KeywordName [= Value]]
*
*
*/
#include "ini.h"
BOOL fRefresh;
BOOL fSummary;
BOOL fUnicode;
void
DumpIniFileA(
char *IniFile
)
{
char *Sections, *Section;
char *Keywords, *Keyword;
char *KeyValue;
Sections = LocalAlloc( 0, 8192 );
if (Sections) {
memset( Sections, 0xFF, 8192 );
} else {
return;
}
Keywords = LocalAlloc( 0, 8192 );
if (Keywords) {
memset( Keywords, 0xFF, 8192 );
} else {
LocalFree(Sections);
return;
}
KeyValue = LocalAlloc( 0, 2048 );
if (KeyValue) {
memset( KeyValue, 0xFF, 2048 );
} else {
LocalFree(Keywords);
LocalFree(Sections);
return;
}
*Sections = '\0';
if (!GetPrivateProfileStringA( NULL, NULL, NULL,
Sections, 8192,
IniFile
)
) {
printf( "*** Unable to read - rc == %d\n", GetLastError() );
}
Section = Sections;
while (*Section) {
printf( "[%s]\n", Section );
if (!fSummary) {
*Keywords = '\0';
GetPrivateProfileStringA( Section, NULL, NULL,
Keywords, 4096,
IniFile
);
Keyword = Keywords;
while (*Keyword) {
GetPrivateProfileStringA( Section, Keyword, NULL,
KeyValue, 2048,
IniFile
);
printf( " %s=%s\n", Keyword, KeyValue );
while (*Keyword++) {
}
}
}
while (*Section++) {
}
}
LocalFree( Sections );
LocalFree( Keywords );
LocalFree( KeyValue );
return;
}
void
DumpIniFileW(
WCHAR *IniFileW
)
{
WCHAR *Sections, *Section;
WCHAR *Keywords, *Keyword;
WCHAR *KeyValue;
Sections = LocalAlloc( 0, 8192 );
if (Sections) {
memset( Sections, 0xFF, 8192 );
} else {
return;
}
Keywords = LocalAlloc( 0, 8192 );
if (Keywords) {
memset( Keywords, 0xFF, 8192 );
} else {
LocalFree(Sections);
return;
}
KeyValue = LocalAlloc( 0, 2048 );
if (KeyValue) {
memset( KeyValue, 0xFF, 2048 );
} else {
LocalFree(Keywords);
LocalFree(Sections);
return;
}
*Sections = '\0';
if (!GetPrivateProfileStringW( NULL, NULL, NULL,
Sections, 8192,
IniFileW
)
) {
wprintf( L"*** Unable to read - rc == %d\n", GetLastError() );
}
Section = Sections;
while (*Section) {
wprintf( L"[%s]\n", Section );
if (!fSummary) {
*Keywords = '\0';
GetPrivateProfileStringW( Section, NULL, NULL,
Keywords, 4096,
IniFileW
);
Keyword = Keywords;
while (*Keyword) {
GetPrivateProfileStringW( Section, Keyword, NULL,
KeyValue, 2048,
IniFileW
);
wprintf( L" %s=%s\n", Keyword, KeyValue );
while (*Keyword++) {
}
}
}
while (*Section++) {
}
}
LocalFree( Sections );
LocalFree( Keywords );
LocalFree( KeyValue );
return;
}
void
DumpIniFileSectionA(
char *IniFile,
char *SectionName
)
{
DWORD cb;
char *SectionValue;
char *s;
cb = 4096;
while (TRUE) {
SectionValue = LocalAlloc( 0, cb );
if (!SectionValue) {
return;
}
*SectionValue = '\0';
if (GetPrivateProfileSection( SectionName,
SectionValue,
cb,
IniFile
) == cb-2
) {
LocalFree( SectionValue );
cb *= 2;
} else {
break;
}
}
printf( "[%s]\n", SectionName );
s = SectionValue;
while (*s) {
printf( " %s\n", s );
while (*s++) {
}
}
LocalFree( SectionValue );
return;
}
void
DumpIniFileSectionW(
WCHAR *IniFile,
WCHAR *SectionName
)
{
DWORD cb;
WCHAR *SectionValue;
WCHAR *s;
cb = 4096;
while (TRUE) {
SectionValue = LocalAlloc( 0, cb );
if (!SectionValue) {
return;
}
*SectionValue = L'\0';
if (GetPrivateProfileSectionW( SectionName,
SectionValue,
cb,
IniFile
) == cb-2
) {
LocalFree( SectionValue );
cb *= 2;
} else {
break;
}
}
wprintf( L"[%s]\n", SectionName );
s = SectionValue;
while (*s) {
wprintf( L" %s\n", s );
while (*s++) {
}
}
LocalFree( SectionValue );
return;
}
void
Usage( void )
{
fputs( "usage: INI | [-f FileSpec] [-r | [SectionName | SectionName.KeywordName [ = Value]]]\n"
"Where...\n"
" -f Specifies the name of the .ini file. WIN.INI is the default.\n"
" -s Print only the sections in the .ini file\n"
" -u Use the Unicode version of GetPrivateProfileString\n"
"\n"
" -r Refresh the .INI file migration information for the specified file.\n"
"\n"
" blanks around = sign are required when setting the value.\n",
stderr);
exit( 1 );
}
char KeyValueBuffer[ 4096 ];
int __cdecl
main( argc, argv )
int argc;
char *argv[];
{
int i, n;
LPSTR s, IniFile, SectionName, KeywordName, KeywordValue;
WCHAR IniFileW[_MAX_PATH];
WCHAR SectionNameW[_MAX_PATH];
BOOL rc;
ConvertAppToOem( argc, argv );
if (argc < 1) {
Usage();
}
IniFile = "win.ini";
SectionName = NULL;
KeywordName = NULL;
KeywordValue = NULL;
argc -= 1;
argv += 1;
while (argc--) {
s = *argv++;
if (*s == '-' || *s == '/') {
while (*++s) {
switch ( tolower( *s ) ) {
case 'r': fRefresh = TRUE;
break;
case 's': fSummary = TRUE;
break;
case 'u': fUnicode = TRUE;
break;
case 'f': if (argc) {
argc -= 1;
IniFile = *argv++;
break;
}
default: Usage();
}
}
} else
if (SectionName == NULL) {
if (argc && !strcmp( *argv, ".")) {
SectionName = s;
argc -= 1;
argv += 1;
if (argc) {
if (!strcmp( *argv, "=" )) {
argc -= 1;
argv += 1;
KeywordName = NULL;
if (argc) {
KeywordValue = calloc( 1, 4096 );
s = KeywordValue;
while (argc) {
strcpy( s, *argv++ );
s += strlen( s ) + 1;
argc -= 1;
}
} else {
KeywordValue = (LPSTR)-1;
}
} else {
argc -= 1;
KeywordName = *argv++;
}
} else {
KeywordName = NULL;
}
} else
if (KeywordName = strchr( s, '.' )) {
*KeywordName++ = '\0';
SectionName = s;
} else {
SectionName = s;
}
} else
if (!strcmp( s, "=" )) {
if (argc) {
argc -= 1;
KeywordValue = *argv++;
} else {
KeywordValue = (LPSTR)-1;
}
} else {
Usage();
}
}
if (fRefresh) {
printf( "Refreshing .INI file mapping information for %s\n", IniFile );
WritePrivateProfileString( NULL, NULL, NULL, IniFile );
exit( 0 );
}
printf( "%s contents of %s\n", KeywordValue ? "Modifying" : "Displaying", IniFile );
MultiByteToWideChar(GetACP(), 0, IniFile, strlen(IniFile)+1, IniFileW, sizeof(IniFileW)/sizeof(WCHAR));
if (SectionName)
MultiByteToWideChar(GetACP(), 0, SectionName, strlen(SectionName)+1, SectionNameW, sizeof(SectionNameW)/sizeof(WCHAR));
if (SectionName == NULL) {
if (fUnicode)
DumpIniFileW( IniFileW );
else
DumpIniFileA( IniFile );
} else
if (KeywordName == NULL) {
if (fUnicode)
DumpIniFileSectionW( IniFileW, SectionNameW );
else
DumpIniFileSectionA( IniFile, SectionName );
if (KeywordValue != NULL) {
printf( "Above application variables are being deleted" );
if (KeywordValue != (LPSTR)-1) {
printf( " and rewritten" );
} else {
KeywordValue = NULL;
}
if (fUnicode) {
WCHAR KeywordNameW[4096];
WCHAR KeywordValueW[4096];
MultiByteToWideChar(GetACP(), 0, KeywordName, strlen(KeywordName)+1, KeywordNameW, sizeof(KeywordNameW)/sizeof(WCHAR));
if (KeywordValue)
MultiByteToWideChar(GetACP(), 0, KeywordValue, strlen(KeywordValue)+1, KeywordValueW, sizeof(KeywordValueW)/sizeof(WCHAR));
rc = WritePrivateProfileStringW( SectionNameW,
KeywordNameW,
KeywordValue ? KeywordValueW : NULL,
IniFileW
);
} else {
rc = WritePrivateProfileStringA( SectionName,
KeywordName,
KeywordValue,
IniFile
);
}
if (!rc) {
printf( " *** failed, ErrorCode -== %u\n", GetLastError() );
} else {
printf( " [ok]\n", GetLastError() );
}
}
} else {
printf( "[%s]\n %s == ", SectionName, KeywordName );
if (fUnicode) {
WCHAR KeywordNameW[4096];
MultiByteToWideChar(GetACP(), 0, KeywordName, strlen(KeywordName)+1, KeywordNameW, sizeof(KeywordNameW)/sizeof(WCHAR));
n = GetPrivateProfileStringW( SectionNameW,
KeywordNameW,
L"*** Section or keyword not found ***",
(LPWSTR)KeyValueBuffer,
sizeof( KeyValueBuffer ),
IniFileW
);
} else {
n = GetPrivateProfileStringA( SectionName,
KeywordName,
"*** Section or keyword not found ***",
KeyValueBuffer,
sizeof( KeyValueBuffer ),
IniFile
);
}
if (KeywordValue == NULL && n == 0 && GetLastError() != NO_ERROR) {
printf( " (ErrorCode == %u)\n", GetLastError() );
} else {
if (fUnicode)
wprintf( L"%s", KeyValueBuffer );
else
printf( "%s", KeyValueBuffer );
if (KeywordValue == NULL) {
printf( "\n" );
} else {
if (KeywordValue == (LPSTR)-1) {
printf( " (deleted)" );
KeywordValue = NULL;
} else {
printf( " (set to %s)", KeywordValue );
}
if (fUnicode) {
WCHAR KeywordNameW[4096];
WCHAR KeywordValueW[4096];
MultiByteToWideChar(GetACP(), 0, KeywordName, strlen(KeywordName)+1, KeywordNameW, sizeof(KeywordNameW)/sizeof(WCHAR));
if (KeywordValue)
MultiByteToWideChar(GetACP(), 0, KeywordValue, strlen(KeywordValue)+1, KeywordValueW, sizeof(KeywordValueW)/sizeof(WCHAR));
rc = WritePrivateProfileStringW( SectionNameW,
KeywordNameW,
KeywordValue ? KeywordValueW : NULL,
IniFileW
);
} else {
rc = WritePrivateProfileStringA( SectionName,
KeywordName,
KeywordValue,
IniFile
);
}
if (!rc) {
printf( " *** failed, ErrorCode -== %u", GetLastError() );
}
printf( "\n" );
}
}
}
return ( 0 );
}