void parseArguments(int argc, char **argv) { std::vector<std::string> arguments; for (int i = 1; i < argc; i++) { if (!strcmp(argv[i], "--read-args") && i + 1 < argc) { readArgumentsFromFile(argv[++i], arguments); } else { arguments.push_back(argv[i]); } } int numArgs = arguments.size() + 1; const char **argArray = new const char *[numArgs + 1]; argArray[0] = argv[0]; argArray[numArgs] = 0; for (int i = 1; i < numArgs; i++) { argArray[i] = arguments[i - 1].c_str(); } llvm::cl::ParseCommandLineOptions(numArgs, (const char **)argArray, " LAV\n"); delete[] argArray; }
int loggerJavacParserCollectActions( const char* prog_, const char* toolName_, const char* const argv_[], LoggerVector* actions_) { ParserData data; size_t i; assert(prog_ == prog_); /* suppress unused variable */ data.hasSourcePath = 0; data.state = Normal; loggerVectorInit(&data.commonArgs); loggerVectorInit(&data.sources); memset(data.classdir, 0, sizeof(data.classdir)); loggerVectorAdd(&data.commonArgs, loggerStrDup(toolName_)); for (i = 1; argv_[i]; ++i) { if (argv_[i][0] == '@') { size_t j; LoggerVector fargs; loggerVectorInit(&fargs); readArgumentsFromFile(argv_[i] + 1, &fargs); for (j = 0; j < fargs.size; ++j) { processArg((const char*) fargs.data[j], &data); } loggerVectorClear(&fargs); } else { processArg(argv_[i], &data); } } if (!data.hasSourcePath) { char workdir[PATH_MAX]; if (loggerMakePathAbs(".", workdir, 0)) { loggerVectorAdd(&data.commonArgs, loggerStrDup("-sourcepath")); loggerVectorAdd(&data.commonArgs, loggerStrDup(workdir)); } } for (i = 0; i < data.sources.size; ++i) { char outputFile[PATH_MAX]; const char* src = (char*) data.sources.data[i]; LoggerAction* action = loggerActionNew(toolName_); if (!action) { continue; } loggerVectorAddFrom(&action->arguments, &data.commonArgs, NULL, (LoggerDupFuc) &loggerStrDup); loggerVectorAdd(&action->arguments, loggerStrDup(src)); loggerVectorAdd(&action->sources, loggerStrDup(src)); if (data.classdir[0] != 0) { char* fname = loggerGetFileName(src, 1); strcpy(outputFile, data.classdir); strcat(outputFile, "/"); strcat(outputFile, fname); strcat(outputFile, ".class"); free(fname); } else { char* path = loggerGetFilePathWithoutExt(src); strcpy(outputFile, path); strcat(outputFile, ".class"); free(path); } loggerFileInitFromPath(&action->output, outputFile); loggerVectorAdd(actions_, action); } loggerVectorClear(&data.commonArgs); loggerVectorClear(&data.sources); return 1; }