summaryrefslogtreecommitdiffstats
path: root/libutil
diff options
context:
space:
mode:
Diffstat (limited to 'libutil')
-rw-r--r--libutil/CMakeLists.txt2
-rw-r--r--libutil/include/cmdutils.h9
-rw-r--r--libutil/src/cmdutils.cpp50
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;