Move separate_args function from header to source file.
authorDavin McCall <davmac@davmac.org>
Thu, 11 Jan 2018 18:09:32 +0000 (18:09 +0000)
committerDavin McCall <davmac@davmac.org>
Thu, 11 Jan 2018 18:09:32 +0000 (18:09 +0000)
This avoids potential ODR violations. The function isn't worth making
inline, it's large enough and not on a critical path so just compile it
once.

src/proc-service.cc
src/proc-service.h

index 0aeb9e3ee85b6cf56f0aff3688438ac6eea7557f..c0efb5235a3b1973efc2df83cfa71937d9795337 100644 (file)
@@ -11,6 +11,30 @@ using clock_type = dasynq::clock_type;
 using rearm = dasynq::rearm;
 using time_val = dasynq::time_val;
 
+// Given a string and a list of pairs of (start,end) indices for each argument in that string,
+// store a null terminator for the argument. Return a `char *` vector containing the beginning
+// of each argument and a trailing nullptr. (The returned array is invalidated if the string is later modified).
+std::vector<const char *> separate_args(std::string &s, std::list<std::pair<unsigned,unsigned>> &arg_indices)
+{
+    std::vector<const char *> r;
+    r.reserve(arg_indices.size() + 1);
+
+    // First store nul terminator for each part:
+    for (auto index_pair : arg_indices) {
+        if (index_pair.second < s.length()) {
+            s[index_pair.second] = 0;
+        }
+    }
+
+    // Now we can get the C string (c_str) and store offsets into it:
+    const char * cstr = s.c_str();
+    for (auto index_pair : arg_indices) {
+        r.push_back(cstr + index_pair.first);
+    }
+    r.push_back(nullptr);
+    return r;
+}
+
 rearm exec_status_pipe_watcher::fd_event(eventloop_t &loop, int fd, int flags) noexcept
 {
     base_process_service *sr = service;
index edba90e63896869345fe9ab05c9e7e498fb307e1..c23b997751c45fa9ecfda27417f64a876cab54a7 100644 (file)
@@ -3,26 +3,7 @@
 // Given a string and a list of pairs of (start,end) indices for each argument in that string,
 // store a null terminator for the argument. Return a `char *` vector containing the beginning
 // of each argument and a trailing nullptr. (The returned array is invalidated if the string is later modified).
-static std::vector<const char *> separate_args(std::string &s, std::list<std::pair<unsigned,unsigned>> &arg_indices)
-{
-    std::vector<const char *> r;
-    r.reserve(arg_indices.size() + 1);
-
-    // First store nul terminator for each part:
-    for (auto index_pair : arg_indices) {
-        if (index_pair.second < s.length()) {
-            s[index_pair.second] = 0;
-        }
-    }
-
-    // Now we can get the C string (c_str) and store offsets into it:
-    const char * cstr = s.c_str();
-    for (auto index_pair : arg_indices) {
-        r.push_back(cstr + index_pair.first);
-    }
-    r.push_back(nullptr);
-    return r;
-}
+std::vector<const char *> separate_args(std::string &s, std::list<std::pair<unsigned,unsigned>> &arg_indices);
 
 class base_process_service;