291 lines
9 KiB
C++
291 lines
9 KiB
C++
|
#include <windows.h>
|
||
|
#include <string.h>
|
||
|
#include <stdio.h>
|
||
|
#include <process.h> // for system()
|
||
|
void ProcessGuidFile( char *pszFileName, DWORD*, BOOL );
|
||
|
CHAR* ProcessChunk( CHAR*, CHAR*, int* );
|
||
|
|
||
|
int main(void)
|
||
|
{
|
||
|
CHAR *pbuff = NULL, *pStart;
|
||
|
HANDLE hFile, hChecksumFile, hExistingFile;
|
||
|
DWORD dwSize, dw, i;
|
||
|
DWORD dwOrigCheckSum, dwNewCheckSum = 0;
|
||
|
CHAR szCurDir[512], szBuildDir[512], *pDir;
|
||
|
|
||
|
// Change the current directory to the build directory
|
||
|
dw = GetCurrentDirectory( 512, szCurDir );
|
||
|
if( !dw ) return -1;
|
||
|
strcpy( szBuildDir, szCurDir );
|
||
|
|
||
|
strcat(szBuildDir, "\\..\\..\\build");
|
||
|
/*
|
||
|
// 1st try to find a "build" directory below the root and 1st level
|
||
|
pDir = szBuildDir;
|
||
|
i = 0;
|
||
|
while( pDir < &szBuildDir[dw] )
|
||
|
{
|
||
|
if( *pDir++ == '\\' )
|
||
|
{
|
||
|
i++;
|
||
|
if( i == 2 ) break;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
strcpy( pDir, "build" );
|
||
|
*(pDir+5) = '\0';
|
||
|
*/
|
||
|
if( !SetCurrentDirectory( szBuildDir ) )
|
||
|
{
|
||
|
// now search for a build directory under "sapi" or "sapi5"
|
||
|
strcpy( szBuildDir, szCurDir );
|
||
|
_strlwr( szBuildDir );
|
||
|
pDir = strstr( szBuildDir, "sapi" );
|
||
|
if( !pDir )
|
||
|
{
|
||
|
return -1;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
if( *(pDir+4) == '5' )
|
||
|
{
|
||
|
strcpy( pDir+5, "\\build" );
|
||
|
*(pDir+11) = '\0';
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
strcpy( pDir+4, "\\build" );
|
||
|
*(pDir+10) = '\0';
|
||
|
}
|
||
|
if( !SetCurrentDirectory( szBuildDir ) )
|
||
|
{
|
||
|
return -1;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// read checksum information if available
|
||
|
hChecksumFile = CreateFile( "checksum.bin", GENERIC_READ | GENERIC_WRITE,
|
||
|
FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_HIDDEN, NULL );
|
||
|
if( hChecksumFile != INVALID_HANDLE_VALUE )
|
||
|
{
|
||
|
ReadFile( hChecksumFile, &dwOrigCheckSum, sizeof(dwOrigCheckSum), &dw, NULL );
|
||
|
CloseHandle( hChecksumFile );
|
||
|
|
||
|
// make sure sapiguid.lib exists - BUGBUG - change to i386 for intel
|
||
|
hExistingFile = CreateFile( "..\\sdk\\lib\\i386\\sapiguid.lib", GENERIC_READ,
|
||
|
FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL );
|
||
|
if( hExistingFile == INVALID_HANDLE_VALUE )
|
||
|
{
|
||
|
dwOrigCheckSum = 0;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
CloseHandle( hExistingFile );
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
dwOrigCheckSum = 0;
|
||
|
}
|
||
|
|
||
|
// open file that contains the list of files to process
|
||
|
hFile = CreateFile( "guidfiles.txt", GENERIC_READ,
|
||
|
FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL );
|
||
|
if( hFile != INVALID_HANDLE_VALUE )
|
||
|
{
|
||
|
dwSize = GetFileSize( hFile, NULL );
|
||
|
if( dwSize != 0xFFFFFFFF )
|
||
|
{
|
||
|
pbuff = new CHAR [dwSize];
|
||
|
}
|
||
|
|
||
|
if( pbuff )
|
||
|
{
|
||
|
// read the names of the files we want to process
|
||
|
ReadFile( hFile, pbuff, dwSize, &dw, NULL );
|
||
|
pStart = pbuff;
|
||
|
for( i = 0; i < dwSize; i++ )
|
||
|
{
|
||
|
// parse file names form the file and process each one
|
||
|
if( *(pbuff+i) == 13 )
|
||
|
{
|
||
|
*(pbuff+i) = '\0';
|
||
|
ProcessGuidFile( pStart, &dwNewCheckSum, true );
|
||
|
pStart = pbuff + i + 2;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if( dwOrigCheckSum != dwNewCheckSum )
|
||
|
{
|
||
|
pStart = pbuff;
|
||
|
for( i = 0; i < dwSize; i++ )
|
||
|
{
|
||
|
// parse file names form the file and process each one
|
||
|
if( *(pbuff+i) == '\0' )
|
||
|
{
|
||
|
ProcessGuidFile( pStart, 0, false );
|
||
|
pStart = pbuff + i + 2;
|
||
|
}
|
||
|
}
|
||
|
hChecksumFile = CreateFile( "checksum.bin", GENERIC_READ | GENERIC_WRITE,
|
||
|
FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_HIDDEN, NULL );
|
||
|
if( hChecksumFile != INVALID_HANDLE_VALUE )
|
||
|
{
|
||
|
WriteFile( hChecksumFile, &dwNewCheckSum, sizeof(dwNewCheckSum), &dw, NULL );
|
||
|
CloseHandle( hChecksumFile );
|
||
|
}
|
||
|
system( "cl /c /Ycprecomp.h GuidSep\\precomp.c" );
|
||
|
system( "cl /c /Zl /Yuprecomp.h GuidSep\\*.c" );
|
||
|
system( "link /lib *.obj /out:..\\sdk\\lib\\i386\\sapiguid.lib" ); // BUGBUG - change this to i386 for intel
|
||
|
system( "del *.obj" );
|
||
|
system( "del *.pch" );
|
||
|
system( "del GuidSep\\SAPI5_guid_*.c" );
|
||
|
}
|
||
|
delete [] pbuff;
|
||
|
}
|
||
|
CloseHandle( hFile );
|
||
|
|
||
|
}
|
||
|
|
||
|
// reset working directory
|
||
|
SetCurrentDirectory( szCurDir );
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
void ProcessGuidFile( char *pszFileName, DWORD *pdwCheckSum, BOOL bDoCheckSum )
|
||
|
{
|
||
|
static int count = 0;
|
||
|
CHAR *pbuff = NULL, *pTmp, *pEndStream;
|
||
|
HANDLE hFile;
|
||
|
DWORD dwSize, dw, i;
|
||
|
hFile = CreateFile( pszFileName, GENERIC_READ,
|
||
|
FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL );
|
||
|
if( hFile != INVALID_HANDLE_VALUE )
|
||
|
{
|
||
|
dwSize = GetFileSize( hFile, NULL );
|
||
|
if( dwSize != 0xFFFFFFFF )
|
||
|
{
|
||
|
pbuff = new CHAR [dwSize];
|
||
|
}
|
||
|
|
||
|
if( pbuff )
|
||
|
{
|
||
|
pEndStream = pbuff + dwSize;
|
||
|
ReadFile( hFile, pbuff, dwSize, &dw, NULL );
|
||
|
if( bDoCheckSum )
|
||
|
{
|
||
|
for( i = 0; i < dwSize; i++ )
|
||
|
{
|
||
|
// checksum must skip over comments because midl places a time stamp
|
||
|
// in generated files
|
||
|
if( *(pbuff+i) == '/' )
|
||
|
{
|
||
|
if( *(pbuff+i+1) == '*' )
|
||
|
{
|
||
|
i+=2;
|
||
|
if( i >= dwSize ) break;
|
||
|
do
|
||
|
{
|
||
|
while( *(pbuff+i) != '*' )
|
||
|
i++;
|
||
|
if( i >= dwSize ) break;
|
||
|
} while (*(pbuff+i+1) != '/' );
|
||
|
i += 2;
|
||
|
}
|
||
|
}
|
||
|
(*pdwCheckSum) += *(pbuff + i);
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
pTmp = pbuff;
|
||
|
while( pTmp = ProcessChunk( pTmp, pEndStream, &count ) )
|
||
|
;
|
||
|
}
|
||
|
delete [] pbuff;
|
||
|
}
|
||
|
CloseHandle( hFile );
|
||
|
}
|
||
|
}
|
||
|
|
||
|
CHAR* ProcessChunk( CHAR* pStream, CHAR * pEndStream, int *pCount )
|
||
|
{
|
||
|
if( pStream >= pEndStream ) return NULL;
|
||
|
CHAR *pTmp = pStream;
|
||
|
CHAR szOutputName[50];
|
||
|
HANDLE hOutputFile;
|
||
|
DWORD dw;
|
||
|
|
||
|
// remove leading or trailing white space
|
||
|
while( *pTmp == ' ' || *pTmp == '\t' || *pTmp == 10 || *pTmp == 13 )
|
||
|
pTmp++;
|
||
|
if( pStream >= pEndStream ) return NULL;
|
||
|
|
||
|
// search for the keyword "const"
|
||
|
if( !strncmp( pTmp, "const ", 6 ) )
|
||
|
{
|
||
|
pTmp += 6;
|
||
|
// remove additional white space
|
||
|
while( *pTmp == ' ' || *pTmp == '\t' )
|
||
|
pTmp++;
|
||
|
|
||
|
// search for keywords "IID" or "CLSID" or "GUID"
|
||
|
if( !strncmp( pTmp, "IID ", 4 ) || !strncmp( pTmp, "CLSID ", 6 ) || !strncmp( pTmp, "GUID ", 5 ) )
|
||
|
{
|
||
|
sprintf( szOutputName,"GuidSep\\SAPI5_guid_%03d.c", *pCount );
|
||
|
(*pCount)++;
|
||
|
hOutputFile = CreateFile( szOutputName, GENERIC_READ | GENERIC_WRITE,
|
||
|
FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, CREATE_ALWAYS,
|
||
|
FILE_ATTRIBUTE_NORMAL, NULL );
|
||
|
if( hOutputFile != INVALID_HANDLE_VALUE )
|
||
|
{
|
||
|
WriteFile( hOutputFile, "#include \"precomp.h\"\n", strlen("#include \"precomp.h\"\n"), &dw, NULL );
|
||
|
while( *pTmp != ';' )
|
||
|
{
|
||
|
pTmp++;
|
||
|
if( pTmp > pEndStream ) return NULL;
|
||
|
}
|
||
|
WriteFile( hOutputFile, pStream, pTmp - pStream + 1, &dw, NULL );
|
||
|
CloseHandle( hOutputFile );
|
||
|
while( *pTmp != 10 )
|
||
|
*pTmp++;
|
||
|
pTmp++;
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
// next line
|
||
|
while( *pTmp != 10 )
|
||
|
*pTmp++;
|
||
|
pTmp++;
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
// next line
|
||
|
while( *pTmp != '\n' )
|
||
|
{
|
||
|
// eliminate any comment blocks
|
||
|
if( *pTmp == '/' )
|
||
|
{
|
||
|
if( pTmp+1 <= pEndStream && (*(pTmp+1) == '*') )
|
||
|
{
|
||
|
pTmp += 2;
|
||
|
do
|
||
|
{
|
||
|
while( *pTmp != '*' )
|
||
|
pTmp++;
|
||
|
if( pTmp > pEndStream ) return NULL;
|
||
|
} while (*(pTmp+1) != '/' );
|
||
|
pTmp+=2;
|
||
|
continue;
|
||
|
}
|
||
|
}
|
||
|
pTmp++;
|
||
|
if( pTmp > pEndStream ) return NULL;
|
||
|
}
|
||
|
}
|
||
|
return pTmp;
|
||
|
}
|