/** * Search all locations for argument defaults and parse them. * These locations may be environment variables to read argument varues * from, or files to read. * @sa addDefaultArgumentLocation * * @note If you use this function your normal argc (passed into main()) will * have been modified, and won't reflect reality anymore. You'll have to use * getArgc() to get the actual original argument count. This is a little wierd but is * this way so lots of people don't have to change lots of code. */ AREXPORT void ArArgumentParser::loadDefaultArguments(int position) { std::list<std::string>::iterator it; std::list<bool>::iterator bIt; const char *str; char *argumentsPtr; char arguments[1024]; if (!myUsingBuilder) { myBuilder = new ArArgumentBuilder; myBuilder->addStringsAsIs(*myArgc, myArgv); myOwnBuilder = true; myUsingBuilder = true; } for (it = ourDefaultArgumentLocs.begin(), bIt = ourDefaultArgumentLocIsFile.begin(); it != ourDefaultArgumentLocs.end(); it++, bIt++) { str = (*it).c_str(); // see if its an environmental variable if (!(*bIt) && (argumentsPtr = getenv(str)) != NULL) { ArArgumentBuilder compressed; compressed.add(argumentsPtr); compressed.compressQuoted(true); myBuilder->addStringsAsIs(compressed.getArgc(), compressed.getArgv(), position); ArLog::log(ArLog::Normal, "Added arguments from environmental variable '%s'", str); } // see if we have a file else if ((*bIt) && ArUtil::getStringFromFile(str, arguments, sizeof(arguments))) { ArArgumentBuilder compressed; compressed.add(arguments); compressed.compressQuoted(true); myBuilder->addStringsAsIs(compressed.getArgc(), compressed.getArgv(), position); ArLog::log(ArLog::Normal, "Added arguments from file '%s'", str); } // the file or env didn't exit // this'll return true otherwise it'll return false) else { ArLog::log(ArLog::Verbose, "Could not load from environmental variable or file '%s'", str); } } }
AREXPORT ArArgumentBuilder::ArArgumentBuilder(const ArArgumentBuilder & builder) { size_t i; myFullString = builder.myFullString; myExtraString = builder.myExtraString; myArgc = builder.getArgc(); myArgvLen = builder.getArgvLen(); myOrigArgc = myArgc; myArgv = new char *[myArgvLen]; for (i = 0; i < myArgc; i++) myArgv[i] = strdup(builder.getArg(i)); }
AREXPORT ArArgumentBuilder::ArArgumentBuilder(const ArArgumentBuilder & builder) { size_t i; myFullString = builder.myFullString; myExtraString = builder.myExtraString; myArgc = builder.getArgc(); myArgvLen = builder.getArgvLen(); myOrigArgc = myArgc; myArgv = new char *[myArgvLen]; for (i = 0; i < myArgc; i++) myArgv[i] = cppstrdup(builder.getArg(i)); //myArgv[i] = strdup(builder.getArg(i)); myIsQuiet = builder.myIsQuiet; myExtraSpace = builder.myExtraSpace; myIgnoreNormalSpaces = builder.myIgnoreNormalSpaces; myIsPreCompressQuotes = builder.myIsPreCompressQuotes; }
int main(int argc, char **argv) { Aria::init(); char *worldName; char *mapName; if (argc != 3) { ArLog::log(ArLog::Normal, "Usage: %s <WorldFile> <MapFile>", argv[0]); ArLog::log(ArLog::Normal, "Example: %s columbia.wld columbia.map", argv[0]); exit(1); } worldName = argv[1]; mapName = argv[2]; FILE *file; if ((file = ArUtil::fopen(worldName, "r")) == NULL) { ArLog::log(ArLog::Normal, "Could not open world file '%s' to convert", worldName); exit(1); } char line[10000]; std::vector<ArLineSegment> lines; bool haveHome = false; ArPose homePose; // read until the end of the file while (fgets(line, sizeof(line), file) != NULL) { ArArgumentBuilder builder; builder.add(line); // Four ints is a line if (builder.getArgc() == 4 && builder.isArgInt(0) && builder.isArgInt(1) && builder.isArgInt(2) && builder.isArgInt(3)) { lines.push_back( ArLineSegment(builder.getArgInt(0), builder.getArgInt(1), builder.getArgInt(2), builder.getArgInt(3))); } // "position X Y Th" becomes a RobotHome if( !strcmp(builder.getArg(0), "position") && builder.getArgc() == 4 && builder.isArgInt(1) && builder.isArgInt(2) && builder.isArgInt(3) ) { haveHome = true; homePose.setX(builder.getArgInt(1)); homePose.setY(builder.getArgInt(2)); homePose.setTh(builder.getArgInt(3)); printf("Will make a Home point out of start position: "); homePose.log(); } } ArMap armap; armap.setLines(&lines); ArPose nopose; ArMapObject home("RobotHome", homePose, NULL, "ICON", "Home", false, nopose, nopose); std::list<ArMapObject*> objects; if(haveHome) { objects.push_back(&home); armap.setMapObjects(&objects); } if (!armap.writeFile(mapName)) { ArLog::log(ArLog::Normal, "Could not save map file '%s'", mapName); exit(1); } ArLog::log(ArLog::Normal, "Converted %s world file to %s map file.", worldName, mapName); exit(0); }