Fix util::tokenizeString() to work in a similar manner of strtok 37/122837/1
authorMu-Woong Lee <muwoong.lee@samsung.com>
Mon, 3 Apr 2017 13:32:23 +0000 (22:32 +0900)
committerMu-Woong Lee <muwoong.lee@samsung.com>
Mon, 3 Apr 2017 13:32:23 +0000 (22:32 +0900)
Change-Id: I0970308a1de7751f6daec829ef9c6b0bad64d564
Signed-off-by: Mu-Woong Lee <muwoong.lee@samsung.com>
include/SharedUtil.h
src/shared/SharedUtil.cpp

index ea0f638..e691959 100644 (file)
@@ -32,7 +32,7 @@ namespace ctx { namespace util {
 
        GQuark dbusErrorQuark(void);
 
-       std::vector<std::string> tokenizeString(std::string& in, const char* delim);
+       std::vector<std::string> tokenizeString(const std::string& in, const char* delim);
 
 } }
 
index 7031264..ac8855b 100644 (file)
@@ -14,6 +14,7 @@
  * limitations under the License.
  */
 
+#include <cstring>
 #include <SharedUtil.h>
 
 #define ERROR_PREFIX   CTX_DBUS_IFACE "Error."
@@ -61,17 +62,21 @@ EXPORT_API GQuark util::dbusErrorQuark(void)
        return (GQuark)quarkVolatile;
 }
 
-EXPORT_API std::vector<std::string> util::tokenizeString(std::string& in, const char* delim)
+EXPORT_API std::vector<std::string> util::tokenizeString(const std::string& in, const char* delim)
 {
        std::vector<std::string> tokens;
-       std::size_t begin = 0;
-       std::size_t end = in.find(delim, 0);
+       char* inputStr = g_strdup(in.c_str());
 
-       while (end != std::string::npos) {
-               tokens.push_back(in.substr(begin, end - begin));
-               begin = end + 1;
-               end = in.find(delim, begin);
+       IF_FAIL_RETURN_TAG(inputStr, tokens, _E, "Memory allocation failed");
+
+       char* savePtr = NULL;
+       char* token = strtok_r(inputStr, delim, &savePtr);
+
+       while (token != NULL) {
+               tokens.push_back(token);
+               token = strtok_r(NULL, delim, &savePtr);
        }
 
+       g_free(inputStr);
        return tokens;
 }