windows-nt/Source/XPSP1/NT/com/rpc/uuidgen/uuidfmt.c
2020-09-26 16:20:57 +08:00

256 lines
5.8 KiB
C

/*++
Copyright (C) Microsoft Corporation, 1992 - 1999
Module Name:
uuidfmt.c {v1.00}
Abstract:
This module contains I_UuidStringGenerate, which coalesces
the procedures UuidCreate and UuidToString to create a UUID
in one of the formats IDL, C struct, or plain.
Author:
Joev Dubach (t-joevd) 6/11/92
Revision History:
--*/
//
// Defines
//
#define IDL_STR "[\nuuid(%s),\nversion(1.0)\n]\ninterface %s\n{\n\n}\n"
//
// Inclusions
//
// The order in which these includes are performed seems, after
// extensive testing and analysis, to be highly crucial to a
// successful NT build.
#include <sysinc.h>
#include <rpc.h>
#include <uuidfmt.h>
#include <stdio.h>
#include <stdlib.h>
//
// Function prototypes.
//
void GenUuidAsIDL (
char PAPI * MyUuidString,
char PAPI * UuidFormattedString,
char PAPI * InterfaceName
);
void GenUuidAsCStruct (
char PAPI * MyUuidString,
char PAPI * UuidFormattedString,
char PAPI * InterfaceName
);
void GenUuidPlain (
char PAPI * MyUuidString,
char PAPI * UuidFormattedString
);
void __RPC_FAR * __RPC_API
MIDL_user_allocate(
size_t size
)
{
return malloc(size);
}
void __RPC_API
MIDL_user_free(
void __RPC_FAR * pvBuf
)
{
free(pvBuf);
}
/*
Routine Description:
This routine creates a UUID in one of several string representations.
Arguments:
Flag - UUIDGEN_FORMAT_IDL gives an IDL template;
UUIDGEN_FORMAT_CSTRUCT gives a C Struct;
UUIDGEN_FORMAT_PLAIN gives a plain UUID.
UuidFormattedString - Must be preinitialized; will contain result.
InterfaceName - Name of desired interface; used for IDL and C Structs.
Return Value:
RPC_S_OK - We successfully converted the UUID into its string
representation.
RPC_S_OUT_OF_MEMORY - Insufficient memory is available to allocate
a string.
RPC_S_UUID_NO_ADDRESS - We were unable to obtain the ethernet or
token ring address for this machine.
*/
RPC_STATUS I_UuidStringGenerate(
int Flag,
int Sequential,
int AllCaps,
char PAPI * UuidFormattedString,
char PAPI * InterfaceName
)
{
UUID MyUuid; // Storage for a retrieved UUID.
char PAPI * MyUuidString;
RPC_STATUS Result;
int LocalOnly = 0;
ASSERT( (Flag == UUIDGEN_FORMAT_IDL)
|| (Flag == UUIDGEN_FORMAT_CSTRUCT)
|| (Flag == UUIDGEN_FORMAT_PLAIN));
if (Sequential)
{
Result = UuidCreateSequential(&MyUuid);
}
else
{
Result = UuidCreate(&MyUuid);
}
ASSERT( (Result == RPC_S_UUID_NO_ADDRESS)
|| (Result == RPC_S_OK)
|| (Result == RPC_S_UUID_LOCAL_ONLY) );
if (Result == RPC_S_UUID_LOCAL_ONLY)
{
Result = RPC_S_OK;
LocalOnly = 1;
}
if (Result == RPC_S_OK)
{
Result = UuidToString(
&MyUuid,
&MyUuidString
);
ASSERT((Result == RPC_S_OK) || (Result == RPC_S_OUT_OF_MEMORY));
if (Result == RPC_S_OK)
{
if (AllCaps) {
char *p = MyUuidString;
while (*p)
{
*p= (char)toupper(*p);
p++;
}
}
switch(Flag)
{
case UUIDGEN_FORMAT_IDL:
GenUuidAsIDL(
MyUuidString,
UuidFormattedString,
InterfaceName
);
break;
case UUIDGEN_FORMAT_CSTRUCT:
GenUuidAsCStruct(
MyUuidString,
UuidFormattedString,
InterfaceName
);
break;
case UUIDGEN_FORMAT_PLAIN:
GenUuidPlain(
MyUuidString,
UuidFormattedString
);
} // end switch
RpcStringFree(&MyUuidString);
} // end if
} // end if
if ( (Result == RPC_S_OK)
&& (LocalOnly) )
{
return(RPC_S_UUID_LOCAL_ONLY);
}
return(Result);
} // end I_UuidStringGenerate
void GenUuidAsIDL (
char PAPI * MyUuidString,
char PAPI * UuidFormattedString,
char PAPI * InterfaceName
)
{
sprintf(
UuidFormattedString,
IDL_STR,
MyUuidString,
InterfaceName
);
}
void GenUuidAsCStruct (
char PAPI * MyUuidString,
char PAPI * UuidFormattedString,
char PAPI * InterfaceName
)
{
int i;
char temp[157] =
"%s = { /* ........-....-....-....-............ */\n"
" 0x........,\n"
" 0x....,\n"
" 0x....,\n"
" {0x.., 0x.., 0x.., 0x.., 0x.., 0x.., 0x.., 0x..}\n"
" };\n\0";
for (i=0; i<36; i++) temp[10+i] = MyUuidString[i];
for (i=0; i<8; i++) temp[56+i] = MyUuidString[i];
for (i=0; i<4; i++) temp[72+i] = MyUuidString[9+i];
for (i=0; i<4; i++) temp[84+i] = MyUuidString[14+i];
for (i=0; i<2; i++) temp[97+i] = MyUuidString[19+i];
for (i=0; i<2; i++) temp[103+i] = MyUuidString[21+i];
for (i=0; i<2; i++) temp[109+i] = MyUuidString[24+i];
for (i=0; i<2; i++) temp[115+i] = MyUuidString[26+i];
for (i=0; i<2; i++) temp[121+i] = MyUuidString[28+i];
for (i=0; i<2; i++) temp[127+i] = MyUuidString[30+i];
for (i=0; i<2; i++) temp[133+i] = MyUuidString[32+i];
for (i=0; i<2; i++) temp[139+i] = MyUuidString[34+i];
sprintf(UuidFormattedString, temp, InterfaceName);
}
void GenUuidPlain (
char PAPI * MyUuidString,
char PAPI * UuidFormattedString
)
{
strcpy(UuidFormattedString, MyUuidString);
strcat(UuidFormattedString, "\n");
}