diff options
Diffstat (limited to 'libutil')
-rw-r--r-- | libutil/CMakeLists.txt | 2 | ||||
-rw-r--r-- | libutil/include/cmdutils.h | 9 | ||||
-rw-r--r-- | libutil/src/cmdutils.cpp | 50 |
3 files changed, 59 insertions, 2 deletions
diff --git a/libutil/CMakeLists.txt b/libutil/CMakeLists.txt index 864c7714..d3f90a1d 100644 --- a/libutil/CMakeLists.txt +++ b/libutil/CMakeLists.txt @@ -51,5 +51,5 @@ SET(LIBUTIL_INCLUDE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/include" PARENT_SCOPE) add_definitions(-DLIBUTIL_LIBRARY) add_library(libUtil SHARED ${LIBUTIL_SOURCES} ${LIBUTIL_HEADERS}) -qt5_use_modules(libUtil Core) +qt5_use_modules(libUtil Core Network) target_link_libraries(libUtil) diff --git a/libutil/include/cmdutils.h b/libutil/include/cmdutils.h index 83397e73..a6379397 100644 --- a/libutil/include/cmdutils.h +++ b/libutil/include/cmdutils.h @@ -29,13 +29,20 @@ /** * @file libutil/include/cmdutils.h - * @brief commandline parsing utilities + * @brief commandline parsing and processing utilities */ namespace Util { namespace Commandline { /** + * @brief split a string into argv items like a shell would do + * @param args the argument string + * @return a QStringList containing all arguments + */ +LIBUTIL_EXPORT QStringList splitArgs(QString args); + +/** * @brief The FlagStyle enum * Specifies how flags are decorated */ diff --git a/libutil/src/cmdutils.cpp b/libutil/src/cmdutils.cpp index 13db503d..80ba719d 100644 --- a/libutil/src/cmdutils.cpp +++ b/libutil/src/cmdutils.cpp @@ -24,6 +24,56 @@ namespace Util { namespace Commandline { +// commandline splitter +QStringList splitArgs(QString args) +{ + QStringList argv; + QString current; + bool escape = false; + QChar inquotes; + for (int i=0; i<args.length(); i++) + { + QChar cchar = args.at(i); + + // \ escaped + if (escape) + { + current += cchar; + escape = false; + // in "quotes" + } + else if (!inquotes.isNull()) + { + if (cchar == 0x5C) + escape = true; + else if (cchar == inquotes) + inquotes = 0; + else + current += cchar; + // otherwise + } + else + { + if (cchar == 0x20) + { + if (!current.isEmpty()) + { + argv << current; + current.clear(); + } + } + else if (cchar == 0x22 || cchar == 0x27) + inquotes = cchar; + else + current += cchar; + } + } + if (!current.isEmpty()) + argv << current; + return argv; +} + + Parser::Parser(FlagStyle::Enum flagStyle, ArgumentStyle::Enum argStyle) { m_flagStyle = flagStyle; |