void __cdecl main(int argc, char **argv) { int GlobalKeys[GLOBAL_KEYS+1]; int Key; int n; DWORD Disposition; long RegStatus; memset( GlobalKeys, 0, sizeof(GlobalKeys) ); ArgsLeft = argc - 1; Args = argv + 1; if ( (argc > 1) && ((strcmp( "/?", argv[1] ) == 0) || (strcmp( "-?", argv[1] ) == 0)) ) { DisplayHelp(); return; } // // With no arguments, display the global registry activation values. // if ( ArgsLeft == 0 ) { DisplayGlobalSettings(); return; } // // Look for specified global registry keys and operations // for ( ; ArgsLeft > 0; ) { if ( _stricmp( *Args, "EnableDCOM" ) == 0 ) Key = ENABLE_NETWORK_OLE; else if ( _stricmp( *Args, "DefaultLaunchPermission" ) == 0 ) Key = DEFAULT_LAUNCH_PERMISSION; else if ( _stricmp( *Args, "DefaultAccessPermission" ) == 0 ) Key = DEFAULT_ACCESS_PERMISSION; else if ( _stricmp( *Args, "LegacyAuthenticationLevel" ) == 0 ) Key = LEGACY_AUTHENTICATION_LEVEL; else break; EAT_ARG(); if ( Key >= 100 ) { if ( Key == MERGE ) { MergeHives( ); } else if ( Key == SAVE_USER ) { SaveChangesToUser( ); } else if ( Key == SAVE_COMMON ) { SaveChangesToCommon( ); } continue; } if ( Key == DEFAULT_ACCESS_PERMISSION ) { GlobalKeys[Key] = YES; continue; } if ( Key == LEGACY_AUTHENTICATION_LEVEL ) { if ( ! IsDigit(**Args) || (**Args < '1') || (**Args > '6') ) { printf( "LegacyAuthenticationLevel must be followed by a 1 to 6.\n" ); return; } GlobalKeys[Key] = **Args; } else if ( (GlobalKeys[Key] = ReadYesOrNo()) == INVALID ) { printf( "%s must be followed by 'y' or 'n'\n", Args[-1] ); return; } EAT_ARG(); } // // Set global keys on or off. // for ( Key = 1; Key < sizeof(GlobalKeys)/sizeof(int); Key++ ) { if ( (Key == LEGACY_AUTHENTICATION_LEVEL) && (GlobalKeys[Key] != 0) ) { if ( ! SetGlobalKey( Key, GlobalKeys[Key] - '0' ) ) return; continue; } if ( (GlobalKeys[Key] == YES) || (GlobalKeys[Key] == NO) ) if ( ! SetGlobalKey( Key, GlobalKeys[Key] ) ) return; } // // Process any CLSID/ProgID specification. // ParseClsidProgId(); if ( hRegOle ) RegCloseKey( hRegOle ); if ( hRegClsid ) RegCloseKey( hRegClsid ); }
void ReadParameters() { char *Line, *Keyword, *Token, *Name; unsigned int i; ProblemFileName = PiFileName = InputTourFileName = OutputTourFileName = TourFileName = 0; CandidateFiles = MergeTourFiles = 0; AscentCandidates = 50; BackboneTrials = 0; Backtracking = 0; CandidateSetSymmetric = 0; CandidateSetType = ALPHA; Crossover = ERXT; DelaunayPartitioning = 0; DelaunayPure = 0; Excess = -1; ExtraCandidates = 0; ExtraCandidateSetSymmetric = 0; ExtraCandidateSetType = QUADRANT; Gain23Used = 1; GainCriterionUsed = 1; InitialPeriod = -1; InitialStepSize = 0; InitialTourAlgorithm = WALK; InitialTourFraction = 1.0; KarpPartitioning = 0; KMeansPartitioning = 0; Kicks = 1; KickType = 0; MaxBreadth = INT_MAX; MaxCandidates = 5; MaxPopulationSize = 0; MaxSwaps = -1; MaxTrials = -1; MoorePartitioning = 0; MoveType = 5; NonsequentialMoveType = -1; Optimum = MINUS_INFINITY; PatchingA = 1; PatchingC = 0; PatchingAExtended = 0; PatchingARestricted = 0; PatchingCExtended = 0; PatchingCRestricted = 0; Precision = 100; RestrictedSearch = 1; RohePartitioning = 0; Runs = 0; Seed = 1; SierpinskiPartitioning = 0; StopAtOptimum = 1; Subgradient = 1; SubproblemBorders = 0; SubproblemsCompressed = 0; SubproblemSize = 0; SubsequentMoveType = 0; SubsequentPatching = 1; TimeLimit = DBL_MAX; TraceLevel = 1; if (ParameterFileName) { if (!(ParameterFile = fopen(ParameterFileName, "r"))) eprintf("Cannot open PARAMETER_FILE: \"%s\"", ParameterFileName); printff("PARAMETER_FILE = %s\n", ParameterFileName); } else { while (1) { printff("PARAMETER_FILE = "); if (!(ParameterFileName = GetFileName(ReadLine(stdin)))) { do { printff("PROBLEM_FILE = "); ProblemFileName = GetFileName(ReadLine(stdin)); } while (!ProblemFileName); return; } else if (!(ParameterFile = fopen(ParameterFileName, "r"))) printff("Cannot open \"%s\". Please try again.\n", ParameterFileName); else break; } } while ((Line = ReadLine(ParameterFile))) { if (!(Keyword = strtok(Line, Delimiters))) continue; if (Keyword[0] == '#') continue; for (i = 0; i < strlen(Keyword); i++) Keyword[i] = (char) toupper(Keyword[i]); if (!strcmp(Keyword, "ASCENT_CANDIDATES")) { if (!(Token = strtok(0, Delimiters)) || !sscanf(Token, "%d", &AscentCandidates)) eprintf("ASCENT_CANDIDATES: integer expected"); if (AscentCandidates < 2) eprintf("ASCENT_CANDIDATES: >= 2 expected"); } else if (!strcmp(Keyword, "BACKBONE_TRIALS")) { if (!(Token = strtok(0, Delimiters)) || !sscanf(Token, "%d", &BackboneTrials)) eprintf("BACKBONE_TRIALS: integer expected"); if (BackboneTrials < 0) eprintf("BACKBONE_TRIALS: non-negative integer expected"); } else if (!strcmp(Keyword, "BACKTRACKING")) { if (!ReadYesOrNo(&Backtracking)) eprintf("RESTRICTED_SEARCH: YES or NO expected"); } else if (!strcmp(Keyword, "CANDIDATE_FILE")) { if (!(Name = GetFileName(0))) eprintf("CANDIDATE_FILE: string expected"); if (CandidateFiles == 0) { assert(CandidateFileName = (char **) malloc(sizeof(char *))); CandidateFileName[CandidateFiles++] = Name; } else { int i; for (i = 0; i < CandidateFiles; i++) if (!strcmp(Name, CandidateFileName[i])) break; if (i == CandidateFiles) { assert(CandidateFileName = (char **) realloc(CandidateFileName, (CandidateFiles + 1) * sizeof(char *))); CandidateFileName[CandidateFiles++] = Name; } } } else if (!strcmp(Keyword, "CANDIDATE_SET_TYPE")) { if (!(Token = strtok(0, Delimiters))) eprintf("%s", "CANDIDATE_SET_TYPE: " "ALPHA, DELAUNAY, NEAREST-NEIGHBOR, " "or QUADRANT expected"); for (i = 0; i < strlen(Token); i++) Token[i] = (char) toupper(Token[i]); if (!strncmp(Token, "ALPHA", strlen(Token))) CandidateSetType = ALPHA; else if (!strncmp(Token, "DELAUNAY", strlen(Token))) { CandidateSetType = DELAUNAY; } else if (!strncmp(Token, "NEAREST-NEIGHBOR", strlen(Token))) CandidateSetType = NN; else if (!strncmp(Token, "QUADRANT", strlen(Token))) CandidateSetType = QUADRANT; else eprintf("%s", "CANDIDATE_SET_TYPE: " "ALPHA, DELAUNAY, NEAREST-NEIGHBOR, " "or QUADRANT expected"); if (CandidateSetType == DELAUNAY) { if ((Token = strtok(0, Delimiters))) { for (i = 0; i < strlen(Token); i++) Token[i] = (char) toupper(Token[i]); if (strncmp(Token, "PURE", strlen(Token))) eprintf("%s", "CANDIDATE_SET_TYPE (DELAUNAY): " "PURE or no token expected"); DelaunayPure = 1; } } } else if (!strcmp(Keyword, "COMMENT")) continue; else if (!strcmp(Keyword, "EOF")) break; else if (!strcmp(Keyword, "EXCESS")) { if (!(Token = strtok(0, Delimiters)) || !sscanf(Token, "%lf", &Excess)) eprintf("EXCESS: real expected"); if (Excess < 0) eprintf("EXCESS: non-negeative real expected"); } else if (!strcmp(Keyword, "EXTRA_CANDIDATES")) { if (!(Token = strtok(0, Delimiters)) || !sscanf(Token, "%d", &ExtraCandidates)) eprintf("EXTRA_CANDIDATES: integer expected"); if (ExtraCandidates < 0) eprintf("EXTRA_CANDIDATES: non-negative integer expected"); if ((Token = strtok(0, Delimiters))) { for (i = 0; i < strlen(Token); i++) Token[i] = (char) toupper(Token[i]); if (strncmp(Token, "SYMMETRIC", strlen(Token))) eprintf ("(EXTRA_CANDIDATES) Illegal SYMMETRIC specification"); ExtraCandidateSetSymmetric = 1; } } else if (!strcmp(Keyword, "EXTRA_CANDIDATE_SET_TYPE")) { if (!(Token = strtok(0, Delimiters))) eprintf("%s", "EXTRA_CANDIDATE_SET_TYPE: " "NEAREST-NEIGHBOR, or QUADRANT expected"); for (i = 0; i < strlen(Token); i++) Token[i] = (char) toupper(Token[i]); if (!strncmp(Token, "NEAREST-NEIGHBOR", strlen(Token))) ExtraCandidateSetType = NN; else if (!strncmp(Token, "QUADRANT", strlen(Token))) ExtraCandidateSetType = QUADRANT; else eprintf("%s", "EXTRA_CANDIDATE_SET_TYPE: " "NEAREST-NEIGHBOR or QUADRANT expected"); } else if (!strcmp(Keyword, "GAIN23")) { if (!ReadYesOrNo(&Gain23Used)) eprintf("GAIN23: YES or NO expected"); } else if (!strcmp(Keyword, "GAIN_CRITERION")) { if (!ReadYesOrNo(&GainCriterionUsed)) eprintf("GAIN_CRITERION: YES or NO expected"); } else if (!strcmp(Keyword, "INITIAL_PERIOD")) { if (!(Token = strtok(0, Delimiters)) || !sscanf(Token, "%d", &InitialPeriod)) eprintf("INITIAL_PERIOD: integer expected"); if (InitialPeriod < 0) eprintf("INITIAL_PERIOD: non-negative integer expected"); } else if (!strcmp(Keyword, "INITIAL_STEP_SIZE")) { if (!(Token = strtok(0, Delimiters)) || !sscanf(Token, "%d", &InitialStepSize)) eprintf("INITIAL_STEP_SIZE: integer expected"); if (InitialStepSize <= 0) eprintf("INITIAL_STEP_SIZE: positive integer expected"); } else if (!strcmp(Keyword, "INITIAL_TOUR_ALGORITHM")) { if (!(Token = strtok(0, Delimiters))) eprintf("INITIAL_TOUR_ALGORITHM: " "BORUVKA, GREEDY, MOORE, NEAREST-NEIGHBOR,\n" "QUICK-BORUVKA, SIERPINSKI, or WALK expected"); for (i = 0; i < strlen(Token); i++) Token[i] = (char) toupper(Token[i]); if (!strncmp(Token, "BORUVKA", strlen(Token))) InitialTourAlgorithm = BORUVKA; else if (!strncmp(Token, "GREEDY", strlen(Token))) InitialTourAlgorithm = GREEDY; else if (!strncmp(Token, "MOORE", strlen(Token))) InitialTourAlgorithm = MOORE; else if (!strncmp(Token, "NEAREST-NEIGHBOR", strlen(Token))) InitialTourAlgorithm = NEAREST_NEIGHBOR; else if (!strncmp(Token, "QUICK-BORUVKA", strlen(Token))) InitialTourAlgorithm = QUICK_BORUVKA; else if (!strncmp(Token, "SIERPINSKI", strlen(Token))) InitialTourAlgorithm = SIERPINSKI; else if (!strncmp(Token, "WALK", strlen(Token))) InitialTourAlgorithm = WALK; else eprintf("INITIAL_TOUR_ALGORITHM: " "BORUVKA, GREEDY, MOORE, NEAREST-NEIGHBOR,\n" "QUICK-BORUVKA, SIERPINSKI or WALK expected"); } else if (!strcmp(Keyword, "INITIAL_TOUR_FILE")) { if (!(InitialTourFileName = GetFileName(0))) eprintf("INITIAL_TOUR_FILE: string expected"); } else if (!strcmp(Keyword, "INITIAL_TOUR_FRACTION")) { if (!(Token = strtok(0, Delimiters)) || !sscanf(Token, "%lf", &InitialTourFraction)) eprintf("INITIAL_TOUR_FRACTION: real expected"); if (InitialTourFraction < 0 || InitialTourFraction > 1) eprintf("INITIAL_TOUR_FRACTION: >= 0 or <= 1 expected"); } else if (!strcmp(Keyword, "INPUT_TOUR_FILE")) { if (!(InputTourFileName = GetFileName(0))) eprintf("INPUT_TOUR_FILE: string expected"); } else if (!strcmp(Keyword, "KICK_TYPE")) { if (!(Token = strtok(0, Delimiters)) || !sscanf(Token, "%d", &KickType)) eprintf("KICK_TYPE: integer expected"); if (KickType != 0 && KickType < 4) eprintf("KICK_TYPE: integer >= 4 expected"); } else if (!strcmp(Keyword, "KICKS")) { if (!(Token = strtok(0, Delimiters)) || !sscanf(Token, "%d", &Kicks)) eprintf("KICKS: integer expected"); if (Kicks < 0) eprintf("KICKS: non-negative integer expected"); } else if (!strcmp(Keyword, "MAX_BREADTH")) { if (!(Token = strtok(0, Delimiters)) || !sscanf(Token, "%d", &MaxBreadth)) eprintf("MAX_BREADTH: integer expected"); if (MaxBreadth < 0) eprintf("MAX_BREADTH: non-negative integer expected"); } else if (!strcmp(Keyword, "MAX_CANDIDATES")) { if (!(Token = strtok(0, Delimiters)) || !sscanf(Token, "%d", &MaxCandidates)) eprintf("MAX_CANDIDATES: integer expected"); if (MaxCandidates < 0) eprintf("MAX_CANDIDATES: non-negative integer expected"); if ((Token = strtok(0, Delimiters))) { for (i = 0; i < strlen(Token); i++) Token[i] = (char) toupper(Token[i]); if (!strncmp(Token, "SYMMETRIC", strlen(Token))) CandidateSetSymmetric = 1; else eprintf ("(MAX_CANDIDATES) Illegal SYMMETRIC specification"); } } else if (!strcmp(Keyword, "MAX_SWAPS")) { if (!(Token = strtok(0, Delimiters)) || !sscanf(Token, "%d", &MaxSwaps)) eprintf("MAX_SWAPS: integer expected"); if (MaxSwaps < 0) eprintf("MAX_SWAPS: non-negative integer expected"); } else if (!strcmp(Keyword, "MAX_TRIALS")) { if (!(Token = strtok(0, Delimiters)) || !sscanf(Token, "%d", &MaxTrials)) eprintf("MAX_TRIALS: integer expected"); if (MaxTrials < 0) eprintf("MAX_TRIALS: non-negative integer expected"); } else if (!strcmp(Keyword, "MERGE_TOUR_FILE")) { if (!(Name = GetFileName(0))) eprintf("MERGE_TOUR_FILE: string expected"); if (MergeTourFiles == 0) { assert(MergeTourFileName = (char **) malloc(sizeof(char *))); MergeTourFileName[MergeTourFiles++] = Name; } else { int i; for (i = 0; i < MergeTourFiles; i++) if (!strcmp(Name, MergeTourFileName[i])) break; if (i == MergeTourFiles) { assert(MergeTourFileName = (char **) realloc(MergeTourFileName, (MergeTourFiles + 1) * sizeof(char *))); MergeTourFileName[MergeTourFiles++] = Name; } } } else if (!strcmp(Keyword, "MOVE_TYPE")) { if (!(Token = strtok(0, Delimiters)) || !sscanf(Token, "%d", &MoveType)) eprintf("MOVE_TYPE: integer expected"); if (MoveType < 2) eprintf("MOVE_TYPE: >= 2 expected"); } else if (!strcmp(Keyword, "NONSEQUENTIAL_MOVE_TYPE")) { if (!(Token = strtok(0, Delimiters)) || !sscanf(Token, "%d", &NonsequentialMoveType)) eprintf("NONSEQUENTIAL_MOVE_TYPE: integer expected"); if (NonsequentialMoveType < 4) eprintf("NONSEQUENTIAL_MOVE_TYPE: >= 4 expected"); } else if (!strcmp(Keyword, "OPTIMUM")) { if (!(Token = strtok(0, Delimiters)) || !sscanf(Token, GainInputFormat, &Optimum)) eprintf("OPTIMUM: integer expected"); } else if (!strcmp(Keyword, "OUTPUT_TOUR_FILE")) { if (!(OutputTourFileName = GetFileName(0))) eprintf("OUTPUT_TOUR_FILE: string expected"); } else if (!strcmp(Keyword, "PATCHING_A")) { if (!(Token = strtok(0, Delimiters)) || !sscanf(Token, "%d", &PatchingA)) eprintf("PATCHING_A: integer expected"); if (PatchingA < 0) eprintf("PATCHING_A: non-negative integer expected"); if ((Token = strtok(0, Delimiters))) { for (i = 0; i < strlen(Token); i++) Token[i] = (char) toupper(Token[i]); if (!strncmp(Token, "RESTRICTED", strlen(Token))) PatchingARestricted = 1; else if (!strncmp(Token, "EXTENDED", strlen(Token))) PatchingAExtended = 1; else eprintf("%s", "(PATCHING_A) " "Illegal RESTRICTED or EXTENDED specification"); } } else if (!strcmp(Keyword, "PATCHING_C")) { if (!(Token = strtok(0, Delimiters)) || !sscanf(Token, "%d", &PatchingC)) eprintf("PATCHING_C: integer expected"); if (PatchingC < 0) eprintf("PATCHING_C: non-negative integer expected"); if ((Token = strtok(0, Delimiters))) { for (i = 0; i < strlen(Token); i++) Token[i] = (char) toupper(Token[i]); if (!strncmp(Token, "RESTRICTED", strlen(Token))) PatchingCRestricted = 1; else if (!strncmp(Token, "EXTENDED", strlen(Token))) PatchingCExtended = 1; else eprintf("%s", "(PATCHING_C) ", "Illegal RESTRICTED or EXTENDED specification"); } } else if (!strcmp(Keyword, "PI_FILE")) { if (!(PiFileName = GetFileName(0))) eprintf("PI_FILE: string expected"); } else if (!strcmp(Keyword, "POPULATION_SIZE")) { if (!(Token = strtok(0, Delimiters)) || !sscanf(Token, "%d", &MaxPopulationSize)) eprintf("POPULATION_SIZE: integer expected"); } else if (!strcmp(Keyword, "PRECISION")) { if (!(Token = strtok(0, Delimiters)) || !sscanf(Token, "%d", &Precision)) eprintf("PRECISION: integer expected"); } else if (!strcmp(Keyword, "PROBLEM_FILE")) { if (!(ProblemFileName = GetFileName(0))) eprintf("PROBLEM_FILE: string expected"); } else if (!strcmp(Keyword, "RESTRICTED_SEARCH")) { if (!ReadYesOrNo(&RestrictedSearch)) eprintf("RESTRICTED_SEARCH: YES or NO expected"); } else if (!strcmp(Keyword, "RUNS")) { if (!(Token = strtok(0, Delimiters)) || !sscanf(Token, "%d", &Runs)) eprintf("RUNS: integer expected"); if (Runs <= 0) eprintf("RUNS: positive integer expected"); } else if (!strcmp(Keyword, "SEED")) { if (!(Token = strtok(0, Delimiters)) || !sscanf(Token, "%u", &Seed)) eprintf("SEED: integer expected"); } else if (!strcmp(Keyword, "STOP_AT_OPTIMUM")) { if (!ReadYesOrNo(&StopAtOptimum)) eprintf("STOP_AT_OPTIMUM: YES or NO expected"); } else if (!strcmp(Keyword, "SUBGRADIENT")) { if (!ReadYesOrNo(&Subgradient)) eprintf("SUBGRADIENT: YES or NO expected"); } else if (!strcmp(Keyword, "SUBPROBLEM_TOUR_FILE")) { if (!(SubproblemTourFileName = GetFileName(0))) eprintf("SUBPROBLEM_TOUR_FILE: string expected"); } else if (!strcmp(Keyword, "SUBPROBLEM_SIZE")) { if (!(Token = strtok(0, Delimiters)) || !sscanf(Token, "%d", &SubproblemSize)) eprintf("SUBPROBLEM_SIZE: integer expected"); if (SubproblemSize < 3) eprintf("SUBPROBLEM_SIZE: >= 3 expected"); if ((Token = strtok(0, Delimiters))) { for (i = 0; i < strlen(Token); i++) Token[i] = (char) toupper(Token[i]); if (!strncmp(Token, "DELAUNAY", strlen(Token))) DelaunayPartitioning = 1; else if (!strncmp(Token, "KARP", max(strlen(Token), 2))) KarpPartitioning = 1; else if (!strncmp(Token, "K-MEANS", max(strlen(Token), 2))) KMeansPartitioning = 1; else if (!strncmp(Token, "MOORE", strlen(Token))) MoorePartitioning = 1; else if (!strncmp(Token, "ROHE", strlen(Token))) RohePartitioning = 1; else if (!strncmp(Token, "SIERPINSKI", strlen(Token))) SierpinskiPartitioning = 1; else if (!strncmp(Token, "BORDERS", strlen(Token))) SubproblemBorders = 1; else if (!strncmp(Token, "COMPRESSED", strlen(Token))) SubproblemsCompressed = 1; else eprintf ("(SUBPROBLEM_SIZE) Illegal DELAUNAY, KARP, K-MEANS, " "MOORE, ROHE,\n SIERPINSKI, BORDERS or COMPRESSED " "specification"); while ((Token = strtok(0, Delimiters))) { for (i = 0; i < strlen(Token); i++) Token[i] = (char) toupper(Token[i]); if (!strncmp(Token, "BORDERS", strlen(Token))) SubproblemBorders = 1; else if (!strncmp(Token, "COMPRESSED", strlen(Token))) SubproblemsCompressed = 1; else eprintf ("(SUBPROBLEM_SIZE) Illegal BORDERS or " "COMPRESSED specification"); } } } else if (!strcmp(Keyword, "SUBSEQUENT_MOVE_TYPE")) { if (!(Token = strtok(0, Delimiters)) || !sscanf(Token, "%d", &SubsequentMoveType)) eprintf("SUBSEQUENT_MOVE_TYPE: integer expected"); if (SubsequentMoveType != 0 && SubsequentMoveType < 2) eprintf("SUBSEQUENT_MOVE_TYPE: 0 or >= 2 expected"); } else if (!strcmp(Keyword, "SUBSEQUENT_PATCHING")) { if (!ReadYesOrNo(&SubsequentPatching)) eprintf("SUBSEQUENT_PATCHING: YES or NO expected"); } else if (!strcmp(Keyword, "TIME_LIMIT")) { if (!(Token = strtok(0, Delimiters)) || !sscanf(Token, "%lf", &TimeLimit)) eprintf("TIME_LIMIT: real expected"); if (TimeLimit < 0) eprintf("TIME_LIMIT: >= 0 expected"); } else if (!strcmp(Keyword, "TOUR_FILE")) { if (!(TourFileName = GetFileName(0))) eprintf("TOUR_FILE: string expected"); } else if (!strcmp(Keyword, "TRACE_LEVEL")) { if (!(Token = strtok(0, Delimiters)) || !sscanf(Token, "%d", &TraceLevel)) eprintf("TRACE_LEVEL: integer expected"); } else eprintf("Unknown keyword: %s", Keyword); if ((Token = strtok(0, Delimiters))) eprintf("Junk at end of line: %s", Token); } if (!ProblemFileName) eprintf("Problem file name is missing"); if (SubproblemSize == 0 && SubproblemTourFileName != 0) eprintf("SUBPROBLEM_SIZE specification is missing"); if (SubproblemSize > 0 && SubproblemTourFileName == 0) eprintf("SUBPROBLEM_TOUR_FILE specification is missing"); fclose(ParameterFile); free(LastLine); LastLine = 0; }
void ParseClsidProgId() { CLSID_INFO ClsidInfo; BOOL NoKeys; int ClsidKey; if ( ArgsLeft == 0 ) return; memset( &ClsidInfo, 0, sizeof(CLSID_INFO) ); NoKeys = TRUE; if ( (ArgsLeft > 0) && (**Args != '{') ) { ClsidInfo.ProgId = *Args; EAT_ARG(); if ( (ArgsLeft > 0) && (**Args != '{') && (NextClsidKey() == UNKNOWN) ) { ClsidInfo.ProgIdDescription = *Args; EAT_ARG(); } } if ( (ArgsLeft > 0) && (**Args == '{') ) { ClsidInfo.Clsid = *Args; EAT_ARG(); if ( (ArgsLeft > 0) && (NextClsidKey() == UNKNOWN) ) { ClsidInfo.ClsidDescription = *Args; EAT_ARG(); } } for (; ArgsLeft > 0;) { ClsidKey = NextClsidKey(); if ( (1 <= ClsidKey) && (ClsidKey <= CLSID_KEYS) ) NoKeys = FALSE; EAT_ARG(); switch ( ClsidKey ) { case LAUNCH_PERMISSION : if ( (ClsidInfo.LaunchPermission = ReadYesOrNo()) == INVALID ) { printf( "%s must be followed by 'y' or 'n'\n", ClsidKeyNames[LAUNCH_PERMISSION] ); goto ErrorReturn; } EAT_ARG(); break; case ACCESS_PERMISSION : ClsidInfo.AccessPermission = YES; break; case ACTIVATE_AT_STORAGE : if ( (ClsidInfo.ActivateAtStorage = ReadYesOrNo()) == INVALID ) { printf( "%s must be followed by 'y' or 'n'\n", ClsidKeyNames[ACTIVATE_AT_STORAGE] ); goto ErrorReturn; } EAT_ARG(); break; case INPROC_HANDLER32 : case INPROC_SERVER32 : case LOCAL_SERVER32 : case LOCAL_SERVICE : if ( NextClsidKey() == UNKNOWN ) { ClsidInfo.ServerPaths[ClsidKey] = *Args; EAT_ARG(); } else { ClsidInfo.ServerPaths[ClsidKey] = ""; } break; case REMOTE_SERVER_NAME : if ( NextClsidKey() == UNKNOWN ) { ClsidInfo.RemoteServerName = *Args; EAT_ARG(); } else { ClsidInfo.RemoteServerName = ""; } break; case RUN_AS : if ( NextClsidKey() == UNKNOWN ) { ClsidInfo.RunAsUserName = *Args; EAT_ARG(); if ( _stricmp(ClsidInfo.RunAsUserName,"Interactive User") == 0 ) break; if ( _stricmp(ClsidInfo.RunAsUserName,"Interactive") == 0 ) { if ( (ArgsLeft > 0) && (_stricmp(*Args,"User") == 0) ) { EAT_ARG(); ClsidInfo.RunAsUserName = "******"; break; } } if ( NextClsidKey() != UNKNOWN ) { printf( "RunAs password or '*' must follow the user name.\n" ); goto ErrorReturn; } ClsidInfo.RunAsPassword = *Args; EAT_ARG(); } else { ClsidInfo.RunAsUserName = ""; } break; default : printf( "Invalid CLSID/ProgID specification given (%s)\n", Args[-1] ); goto ErrorReturn; break; } // switch } // for // // Display current CLSID/ProgID settings if no keys were specified and // only a CLSID or ProgID (but not both) was given. // if ( NoKeys && (ClsidInfo.ProgIdDescription == 0) && (ClsidInfo.ClsidDescription == 0) && ((ClsidInfo.Clsid == 0) || (ClsidInfo.ProgId == 0)) ) DisplayClsidKeys( &ClsidInfo ); else UpdateClsidKeys( &ClsidInfo ); return; ErrorReturn: printf( "No CLSID/ProgID entries were modified\n" ); }