[C++] Implement subst and strip
diff --git a/func.cc b/func.cc
index e243d33..e9fa0d7 100644
--- a/func.cc
+++ b/func.cc
@@ -14,22 +14,35 @@
   shared_ptr<string> pat = args[0]->Eval(ev);
   shared_ptr<string> repl = args[1]->Eval(ev);
   shared_ptr<string> str = args[2]->Eval(ev);
-  bool needs_space = false;
+  WordWriter ww(s);
   for (StringPiece tok : WordScanner(*str)) {
-    if (needs_space)
-      s->push_back(' ');
-    else
-      needs_space = true;
+    ww.MaybeAddWhitespace();
     AppendSubstPattern(tok, *pat, *repl, s);
   }
 }
 
-void StripFunc(const vector<Value*>&, Evaluator*, string*) {
-  printf("TODO(strip)");
+void StripFunc(const vector<Value*>& args, Evaluator* ev, string* s) {
+  shared_ptr<string> str = args[0]->Eval(ev);
+  WordWriter ww(s);
+  for (StringPiece tok : WordScanner(*str)) {
+    ww.Write(tok);
+  }
 }
 
-void SubstFunc(const vector<Value*>&, Evaluator*, string*) {
-  printf("TODO(subst)");
+void SubstFunc(const vector<Value*>& args, Evaluator* ev, string* s) {
+  shared_ptr<string> pat = args[0]->Eval(ev);
+  shared_ptr<string> repl = args[1]->Eval(ev);
+  shared_ptr<string> str = args[2]->Eval(ev);
+  size_t index = 0;
+  while (index < str->size()) {
+    size_t found = str->find(*pat, index);
+    if (found == string::npos)
+      break;
+    AppendString(StringPiece(*str).substr(index, found - index), s);
+    AppendString(*repl, s);
+    index = found + pat->size();
+  }
+  AppendString(StringPiece(*str).substr(index), s);
 }
 
 void FindstringFunc(const vector<Value*>&, Evaluator*, string*) {