/*++ Copyright (C) Microsoft Corporation, 1992 - 1999 Module Name: uuidgen.c {v1.00} Abstract: usage: uuidgen [-xisconvh?] x - Generate sequential (V1) UUIDs i - Output UUID in an IDL interface template s - Output UUID as an initialized C struct c - Output UUID in upper case o - redirect output to a file, specified immediately after o n - Number of UUIDs to generate, specified immediately after n v - display version information about uuidgen h,? - Display command option summary This command-line program simply uses the procedure I_UuidStringGenerate to output one or more UUIDs in one of the formats normal, IDL, or C struct. This code should build under nt to nt and nmake under os2 to dos. Requires uuidfmt.c. Author: Joev Dubach (t-joevd) 6/11/92 Revision History: --*/ // // Inclusions // // The order in which these includes are performed seems, after // extensive testing and analysis, to be highly crucial to an // NT build. #include #include #include #include #include #include // // Defines // #define IDL_BIT_FLAG 0x01 #define CSTRUCT_BIT_FLAG 0x02 #define SEQUENTIAL_UUIDS 0x04 #define UPPER_CASE_UUIDS 0x08 #define BAD_SWITCH_STR "Invalid Switch Usage: %s\n\n" #define CANNOT_OPEN_STR "Cannot open output file: %s\n\n" #define TOO_SMALL_STR "Argument to %s must be an integer greater than 0.\n\n" #define VERSION_INFO_STR \ "Microsoft UUID Generator v1.01 " \ VER_LEGALCOPYRIGHT_STR \ "\n\n" #define BAD_ARGS_STR "The arguments i and s are mutually exclusive.\n\n" #define NO_ADDRESS_STR \ "Cannot find the RPC End Point Mapper (RPCSS.EXE); Unable to allocate UUIDs.\n\n" #define OUT_OF_MEMORY_STR \ "Unable to allocate enough memory to create string.\n\n" #define LOCAL_ONLY_STR \ "Warning: Unable to determine your network address. The UUID generated is\n" \ "unique on this computer only. It should not be used on another computer.\n" // // Function prototypes. // #ifdef NTENV int __cdecl #else // NTENV int #endif // NTENV main( int argc, char **argv ); void Usage(void); void ErrorUsageAndExit(void); void NoErrorUsageAndExit(void); // // Global variables // FILE * OutputFile = stdout; #ifdef NTENV int __cdecl #else // NTENV int #endif // NTENV main( int argc, char **argv ) { int ConditionFlags = 0; // Holds conditions IDL_BIT_FLAG and // CSTRUCT_BIT_FLAG. char MyUuidString[255]; // The UUID string returned by // I_UuidStringGenerate. int NumberOfUuids = 1; // How many to make. int i; // Current arg#. int Flag; // UUID Format requested. RPC_STATUS Result; int FirstTime = 1; // // Parse the command line. // for (i=1;argc-i;i++) { // // Make sure arg is in proper format. // if ( (argv[i][0] != '/') && (argv[i][0] != '-') ) { fprintf(stderr, BAD_SWITCH_STR, argv[i]); ErrorUsageAndExit(); } // // Which arg is it? // switch (argv[i][1]) { case 'c': case 'C': ConditionFlags |= UPPER_CASE_UUIDS; break; case 'I': case 'i': ConditionFlags |= IDL_BIT_FLAG; break; case 'S': case 's': ConditionFlags |= CSTRUCT_BIT_FLAG; break; case 'O': case 'o': OutputFile = fopen(argv[i]+2, "wt"); if (OutputFile == NULL) { fprintf(stderr,CANNOT_OPEN_STR, argv[i]+2); exit(1); } break; case 'N': case 'n': NumberOfUuids = atoi(argv[i]+2); if (NumberOfUuids <= 0) { fprintf(stderr, TOO_SMALL_STR, argv[i-1]); ErrorUsageAndExit(); } break; case 'x': case 'X': ConditionFlags |= SEQUENTIAL_UUIDS; break; case 'V': case 'v': fprintf(OutputFile, VERSION_INFO_STR); exit(0); case 'H': case 'h': case '?': NoErrorUsageAndExit(); default: fprintf(stderr, BAD_SWITCH_STR, argv[i]); ErrorUsageAndExit(); } // switch } // for // // Fulfill the user's request // if ((ConditionFlags & IDL_BIT_FLAG) && (ConditionFlags & CSTRUCT_BIT_FLAG)) { fprintf(stderr,BAD_ARGS_STR); ErrorUsageAndExit(); } if (ConditionFlags & IDL_BIT_FLAG) { Flag = UUIDGEN_FORMAT_IDL; } else if (ConditionFlags & CSTRUCT_BIT_FLAG) { Flag = UUIDGEN_FORMAT_CSTRUCT; } else { Flag = UUIDGEN_FORMAT_PLAIN; } for (;NumberOfUuids;NumberOfUuids--) { Result = I_UuidStringGenerate( Flag, (ConditionFlags & SEQUENTIAL_UUIDS) != 0, (ConditionFlags & UPPER_CASE_UUIDS) != 0, MyUuidString, "INTERFACENAME" ); ASSERT((Result == RPC_S_OK) || (Result == RPC_S_UUID_LOCAL_ONLY) || (Result == RPC_S_OUT_OF_MEMORY) || (Result == RPC_S_UUID_NO_ADDRESS)); switch(Result) { case RPC_S_OUT_OF_MEMORY: fprintf(stderr,OUT_OF_MEMORY_STR); exit(1); case RPC_S_UUID_NO_ADDRESS: fprintf(stderr,NO_ADDRESS_STR); exit(1); case RPC_S_UUID_LOCAL_ONLY: if (FirstTime) { fprintf(stderr,LOCAL_ONLY_STR); FirstTime = 0; } // Fall through to the valid case. case RPC_S_OK: fprintf( OutputFile, MyUuidString ); } // end switch } // end for return(0); } void Usage(void) { fprintf(OutputFile, VERSION_INFO_STR "usage: uuidgen [-xisconvh?]\n" "\tx - Generate sequential (V1) UUIDs\n" "\ti - Output UUID in an IDL interface template\n" "\ts - Output UUID as an initialized C struct\n" "\tc - Output UUID in upper case\n" "\to - redirect output to a file, specified immediately after o\n" "\tn - Number of UUIDs to generate, specified immediately after n\n" "\tv - display version information about uuidgen\n" "\th,? - Display command option summary\n" ); } void ErrorUsageAndExit(void) { OutputFile = stderr; Usage(); exit(1); } void NoErrorUsageAndExit(void) { Usage(); exit(0); }