2020-09-30 17:12:29 +02:00

209 lines
6.3 KiB
C

/*******************************************************************************
*
* (C) COPYRIGHT MICROSOFT CORP., 1995
*
* TITLE: GUIDLIB
*
* VERSION: 1.0
*
* AUTHOR: Tracy Sharpe
*
* DATE: 18 Apr 1995
*
* Takes an OLE header file containing GUIDs declared using DEFINE_GUID or
* optionally a form like DEFINE_OLEGUID and outputs a library where each GUID
* is in a different object entry. Modules using these generated libraries
* will only suck in the GUIDs that they use, not the entire set like #define
* INITGUID/#include <header.h> would do.
*
* Because I hate commandline processing, many of the parameters to this
* application actually come from environment variables which are so easy to set
* via make files.
*
* GL_SHORTNAME By default, this program will scan for lines
* containing the long DEFINE_GUID form. The OLE and
* shell headers also use a shorter form where several
* bytes of the GUID are constant. Just see basetyps.h
* for an example of what I mean.
* GL_SHORTNAMEDATA What the constant bytes from the above short form
* are equal to. Should be a set of ten comma
* delimited integers.
* GL_SPAWNSTRING This program will call system() with the
* GL_SPAWNSTRING for each temporary source file
* generated.
* GL_TEMPNAME This variable is set by this program to the path
* to the temporary source file. You can expect it
* to have the .c extension.
*
*******************************************************************************/
#include <windows.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
const char szDefineGuid[] = "DEFINE_GUID";
int
__cdecl
oldmain(
int argc,
char* argv[]
)
{
FILE* pIn;
FILE* pOut;
char SpawnString[256];
char ShortName[256]; // e.g., DEFINE_OLEGUID
BOOL fHaveShortName;
char ShortNameData[256]; // e.g., 0xC0,0,0,0,0,0,0,0x46
char TempName[256];
UINT CurrentTempNumber;
char Buffer[512]; // better be enough
UINT Index;
BOOL fLineUsesShortForm;
char *pIdentifier;
char *pData;
char SecondaryBuffer[512]; // better be enough
printf("Microsoft (R) GUID Header to Library Tool Version 1.1\n");
printf("Copyright (C) Microsoft Corp. 1995-96. All rights reserved.\n\n");
// See what we're supposed to do with each
if (GetEnvironmentVariable("GL_SPAWNSTRING", SpawnString,
sizeof(SpawnString)) == 0)
return 1;
fHaveShortName = (BOOL) GetEnvironmentVariable("GL_SHORTNAME", ShortName,
sizeof(ShortName));
GetEnvironmentVariable("GL_SHORTNAMEDATA", ShortNameData,
sizeof(ShortNameData));
CurrentTempNumber = 0;
while (argc-- > 1) {
if ((pIn = fopen(argv[argc], "r")) == NULL) {
printf("failed to open '%s'\n", argv[argc]);
continue;
}
fgets(Buffer, sizeof(Buffer), pIn);
while (!feof(pIn)) {
Index = 0;
while (Buffer[Index] == ' ')
Index++;
if (fHaveShortName &&
memcmp(&Buffer[Index], ShortName, strlen(ShortName)) == 0) {
fLineUsesShortForm = TRUE;
Index += strlen(ShortName);
}
else if (memcmp(&Buffer[Index], szDefineGuid, strlen(szDefineGuid)) == 0) {
fLineUsesShortForm = FALSE;
Index += strlen(szDefineGuid);
}
else
goto nextline;
while (Buffer[Index] == ' ')
Index++;
if (Buffer[Index] != '(')
goto nextline;
Index++;
while (Buffer[Index] == ' ')
Index++;
pIdentifier = &Buffer[Index];
// Skip past the identifier to the first comma.
while (Buffer[Index] != ',' && Buffer[Index] != '\n' && Buffer[Index] != '\0')
Index++;
if (Buffer[Index] != ',')
goto nextline;
Buffer[Index++] = '\0';
while (Buffer[Index] == ' ')
Index++;
if (Buffer[Index] != '\n')
pData = strtok(&Buffer[Index], ")");
else {
// This is an attempt at handling lines of the form:
// DEFINE_GUID(IID_Interface,
// ...);
fgets(SecondaryBuffer, sizeof(SecondaryBuffer), pIn);
if (feof(pIn))
goto closefile;
pData = strtok(SecondaryBuffer, ")");
}
wsprintf(TempName, "guid%d.c", CurrentTempNumber);
if ((pOut = fopen(TempName, "w")) == NULL)
goto nextline;
fprintf(pOut, "typedef struct _GUID {\n");
fprintf(pOut, " unsigned long Data1;\n");
fprintf(pOut, " unsigned short Data2;\n");
fprintf(pOut, " unsigned short Data3;\n");
fprintf(pOut, " unsigned char Data4_0;\n");
fprintf(pOut, " unsigned char Data4_1;\n");
fprintf(pOut, " unsigned char Data4_2;\n");
fprintf(pOut, " unsigned char Data4_3;\n");
fprintf(pOut, " unsigned char Data4_4;\n");
fprintf(pOut, " unsigned char Data4_5;\n");
fprintf(pOut, " unsigned char Data4_6;\n");
fprintf(pOut, " unsigned char Data4_7;\n");
fprintf(pOut, "} GUID;\n");;
fprintf(pOut, "const GUID __cdecl %s = {\n", pIdentifier);
if (fLineUsesShortForm)
fprintf(pOut, "%s , %s };\n", pData, ShortNameData);
else
fprintf(pOut, "%s };\n", pData);
fclose(pOut);
strtok(pIdentifier, " "); // Hack off trailing whitespace
printf("Adding '%s'\n", pIdentifier);
SetEnvironmentVariable("GL_TEMPNAME", TempName);
system(SpawnString);
DeleteFile(TempName);
CurrentTempNumber++;
nextline:
fgets(Buffer, sizeof(Buffer), pIn);
}
closefile:
fclose(pIn);
}
return 0;
}