185 lines
3.5 KiB
C
185 lines
3.5 KiB
C
#include <windows.h>
|
|
#include <stdio.h>
|
|
|
|
|
|
#define KEYWORD_BUF_SIZE 100
|
|
#define STRINGS_BUF_SIZE 8096
|
|
|
|
|
|
typedef struct _ITEM {
|
|
TCHAR szKeyword[KEYWORD_BUF_SIZE];
|
|
struct _ITEM * pNext;
|
|
} ITEM, *LPITEM;
|
|
|
|
|
|
|
|
LPITEM g_KeywordList = NULL;
|
|
|
|
|
|
LPTSTR GetStringSection (LPCTSTR lpFileName)
|
|
{
|
|
DWORD dwSize, dwRead;
|
|
LPTSTR lpStrings;
|
|
|
|
|
|
//
|
|
// Read in the default strings section
|
|
//
|
|
|
|
dwSize = STRINGS_BUF_SIZE;
|
|
lpStrings = (TCHAR *) GlobalAlloc (GPTR, dwSize * sizeof(TCHAR));
|
|
|
|
if (!lpStrings)
|
|
{
|
|
printf("(1) Failed to allocate memory with %d\n", GetLastError());
|
|
return NULL;
|
|
}
|
|
|
|
|
|
do {
|
|
dwRead = GetPrivateProfileSection (TEXT("Strings"),
|
|
lpStrings,
|
|
dwSize, lpFileName);
|
|
|
|
if (dwRead != (dwSize - 2))
|
|
{
|
|
break;
|
|
}
|
|
|
|
GlobalFree (lpStrings);
|
|
|
|
dwSize *= 2;
|
|
lpStrings = (TCHAR *) GlobalAlloc (GPTR, dwSize * sizeof(TCHAR));
|
|
|
|
if (!lpStrings)
|
|
{
|
|
printf("(2) Failed to allocate memory with %d\n", GetLastError());
|
|
return FALSE;
|
|
}
|
|
|
|
} while (TRUE);
|
|
|
|
|
|
if (dwRead == 0)
|
|
{
|
|
GlobalFree (lpStrings);
|
|
lpStrings = NULL;
|
|
}
|
|
|
|
return lpStrings;
|
|
}
|
|
|
|
BOOL DoesKeywordExist (LPTSTR lpKeyword)
|
|
{
|
|
LPITEM lpTemp;
|
|
|
|
lpTemp = g_KeywordList;
|
|
|
|
while (lpTemp) {
|
|
|
|
if (!lstrcmpi(lpKeyword, lpTemp->szKeyword)) {
|
|
return TRUE;
|
|
}
|
|
|
|
lpTemp = lpTemp->pNext;
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
BOOL AddKeywordToList (LPTSTR lpKeyword)
|
|
{
|
|
LPITEM lpTemp;
|
|
|
|
|
|
lpTemp = LocalAlloc (LPTR, sizeof(ITEM));
|
|
|
|
if (!lpTemp) {
|
|
printf("(3) Failed to allocate memory with %d\n", GetLastError());
|
|
return FALSE;
|
|
}
|
|
|
|
|
|
lstrcpyn (lpTemp->szKeyword, lpKeyword, KEYWORD_BUF_SIZE);
|
|
lpTemp->pNext = g_KeywordList;
|
|
|
|
g_KeywordList = lpTemp;
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
int __cdecl main( int argc, char *argv[])
|
|
{
|
|
LPTSTR lpStrings, lpTemp, lpChar, lpEnd;
|
|
TCHAR szKeyword [KEYWORD_BUF_SIZE];
|
|
DWORD dwIndex;
|
|
|
|
|
|
if (argc != 2) {
|
|
printf("usage: chkadm admfile\n");
|
|
return 1;
|
|
}
|
|
|
|
|
|
lpStrings = GetStringSection(argv[1]);
|
|
|
|
if (!lpStrings) {
|
|
printf("No strings, or failure reading strings\n");
|
|
return 1;
|
|
}
|
|
|
|
|
|
|
|
lpTemp = lpStrings;
|
|
|
|
while (*lpTemp)
|
|
{
|
|
|
|
lpChar = szKeyword;
|
|
dwIndex = 0;
|
|
|
|
while (*lpTemp && (*lpTemp != TEXT('=')) && (*lpTemp != TEXT('\r'))
|
|
&& (*lpTemp != TEXT('\n')) && (dwIndex < (KEYWORD_BUF_SIZE - 1)) ) {
|
|
*lpChar = *lpTemp;
|
|
lpChar++;
|
|
lpTemp++;
|
|
dwIndex++;
|
|
}
|
|
|
|
*lpChar = TEXT('\0');
|
|
|
|
|
|
if (*lpTemp == TEXT('=')) {
|
|
|
|
if (DoesKeywordExist (szKeyword)) {
|
|
printf(TEXT("Duplicate string name for: %s\n"), szKeyword);
|
|
} else {
|
|
if (!AddKeywordToList(szKeyword)) {
|
|
return 1;
|
|
}
|
|
}
|
|
|
|
} else {
|
|
printf("==================\n");
|
|
printf("\nThe following entry in the [Strings] section does not start with a variable name:\n\n%s\n\n", szKeyword);
|
|
printf("==================\n");
|
|
}
|
|
|
|
|
|
lpEnd = lpTemp += lstrlen (lpTemp) - 1;
|
|
lpTemp += lstrlen (lpTemp) + 1;
|
|
|
|
while (*lpEnd == TEXT('\\')) {
|
|
lpEnd = lpTemp += lstrlen (lpTemp) - 1;
|
|
lpTemp += lstrlen (lpTemp) + 1;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
GlobalFree (lpStrings);
|
|
|
|
return 0;
|
|
}
|