/* (C) 2003 XDA Developers itsme@xs4all.nl * * $Header$ */ #ifndef __ARGS_H__ #ifndef _WIN32 #define _strtoi64 strtoll #endif #define HANDLEULOPTION(var, type) (argv[i][2] ? var= (type)strtoul(argv[i]+2, 0, 0) : i+1 #include #include "vectorutils.h" #include "stringutils.h" template void parsearg(const char*arg, T& value) { value= static_cast(strtol(arg, 0, 0)); } template<> void parsearg(const char*arg, std::string& value) { value= arg; } template<> void parsearg(const char*arg, ByteVector& value) { hex2binary(std::string(arg), value); } template void parsecsvarg(const char*arg, std::vector& list) { const char *p= arg; while (*p) { char *q; T value= static_cast(strtol(p, &q, 0)); if (p==q) break; list.push_back(value); // note: not actually checking for comma. p= q+1; } } ////////////////////////////////////////////////////////////////////////////// // void getarg(..., T& value) style functions ////////////////////////////////////////////////////////////////////////////// template void getarg(char **argv, int& i, int argc, T& value) { if (argv[i][2]) { parsearg(argv[i]+2, value); } else if (++i void getarg(StringList::iterator &i, StringList::iterator end, T& value) { if ((*i).size()>2 && (*i).c_str()[2]) { parsearg((*i).c_str()+2, value); } else if (++i!=end) { parsearg((*i).c_str(), value); } else { throw "missing arg"; } } ////////////////////////////////////////////////////////////////////////////// // return csv list arguments ////////////////////////////////////////////////////////////////////////////// template void getcsvarg(char **argv, int& i, int argc, std::vector& list) { if (argv[i][2]) { parsecsvarg(argv[i]+2, list); } else if (++i void getcsvarg(StringList::iterator &i, StringList::iterator end, std::vector& list) { if ((*i).size()>2 && (*i).c_str()[2]) { parsecsvarg((*i).c_str()+2, list); } else if (++i!=end) { parsecsvarg((*i).c_str(), list); } else { throw "missing arg"; } } ////////////////////////////////////////////////////////////////////////////// // return hex list arguments as binary ////////////////////////////////////////////////////////////////////////////// template void gethexarg(char **argv, int& i, int argc, T& list) { if (argv[i][2]) { hex2binary(std::string(argv[i]+2), list); } else if (++i void gethexarg(StringList::iterator &i, StringList::iterator end, T& list) { if ((*i).size()>2 && (*i).c_str()[2]) { hex2binary((*i).c_str()+2, list); } else if (++i!=end) { parsehexarg((*i).c_str(), list); hex2binary((*i).c_str(), list); } else { throw "missing arg"; } } /* try { for (int i=1 ; iarg(argv,i,argc) style functions ////////////////////////////////////////////////////////////////////////////// inline std::string getstrarg(char **argv, int& i, int argc) { std::string str; getarg(argv, i, argc, str); return str; } inline uint64_t getuintarg(char **argv, int& i, int argc) { uint64_t val; getarg(argv, i, argc, val); return val; } inline int64_t getintarg(char **argv, int& i, int argc) { int64_t val; getarg(argv, i, argc, val); return val; } inline ByteVector gethexarg(char **argv, int& i, int argc) { ByteVector bytes; gethexarg(argv, i, argc, bytes); return bytes; } inline DwordVector getnumsarg(char **argv, int& i, int argc) { DwordVector dwords; getcsvarg(argv, i, argc, dwords); return dwords; } #define __ARGS_H__ #endif