[C++] Fix envvar.mk
diff --git a/log.h b/log.h
index e1afe44..000d8db 100644
--- a/log.h
+++ b/log.h
@@ -6,32 +6,27 @@
 #include <stdlib.h>
 #include <string.h>
 
-#define LOG(args...) do {                       \
-    char log_buf[999];                          \
-    sprintf(log_buf, args);                     \
-    fprintf(stderr, "*kati*: %s\n", log_buf);   \
+#include "stringprintf.h"
+
+#define LOG(args...) do {                                           \
+    fprintf(stderr, "*kati*: %s\n", StringPrintf(args).c_str());    \
   } while(0)
 
-#define PERROR(...) do {                                        \
-    char log_buf[999];                                          \
-    sprintf(log_buf, __VA_ARGS__);                              \
-    fprintf(stderr, "%s: %s\n", log_buf, strerror(errno));      \
+#define PERROR(...) do {                                            \
+    fprintf(stderr, "%s: %s\n", StringPrintf(__VA_ARGS__).c_str(),  \
+            strerror(errno));                                       \
+    exit(1);                                                        \
+  } while (0)
+
+#define WARN(...) do {                                          \
+    fprintf(stderr, "%s\n", StringPrintf(__VA_ARGS__).c_str()); \
+  } while (0)
+
+#define ERROR(...) do {                                         \
+    fprintf(stderr, "%s\n", StringPrintf(__VA_ARGS__).c_str()); \
     exit(1);                                                    \
   } while (0)
 
-#define WARN(...) do {                          \
-    char log_buf[999];                          \
-    sprintf(log_buf, __VA_ARGS__);              \
-    fprintf(stderr, "%s\n", log_buf);           \
-  } while (0)
-
-#define ERROR(...) do {                         \
-    char log_buf[999];                          \
-    sprintf(log_buf, __VA_ARGS__);              \
-    fprintf(stderr, "%s\n", log_buf);           \
-    exit(1);                                    \
-  } while (0)
-
 #define CHECK(c) if (!(c)) ERROR("%s:%d: %s", __FILE__, __LINE__, #c)
 
 #endif  // LOG_H_
diff --git a/main.cc b/main.cc
index 1a5e0cf..000fd28 100644
--- a/main.cc
+++ b/main.cc
@@ -21,7 +21,8 @@
 static const char* g_makefile;
 
 static void ParseCommandLine(int argc, char* argv[],
-                             vector<StringPiece>* targets) {
+                             vector<StringPiece>* targets,
+                             vector<StringPiece>* cl_vars) {
   for (int i = 1; i < argc; i++) {
     const char* arg = argv[i];
     if (!strcmp(arg, "-f")) {
@@ -29,7 +30,11 @@
     } else if (arg[0] == '-') {
       ERROR("Unknown flag: %s", arg);
     } else {
-      targets->push_back(Intern(arg));
+      if (strchr(arg, '=')) {
+        cl_vars->push_back(arg);
+      } else {
+        targets->push_back(Intern(arg));
+      }
     }
   }
 }
@@ -93,11 +98,30 @@
   Parse(Intern(bootstrap), Loc("*bootstrap*", 0), asts);
 }
 
-static int Run(const vector<StringPiece>& targets) {
+static void SetVar(StringPiece l, const char* origin, Vars* vars) {
+  size_t found = l.find('=');
+  CHECK(found != string::npos);
+  StringPiece lhs = Intern(l.substr(0, found));
+  StringPiece rhs = l.substr(found + 1);
+  vars->Assign(lhs, new RecursiveVar(NewLiteral(rhs.data()), origin));
+}
+
+extern "C" char** environ;
+static void FillDefaultVars(const vector<StringPiece>& cl_vars, Vars* vars) {
+  for (char** p = environ; *p; p++) {
+    SetVar(*p, "environment", vars);
+  }
+  for (StringPiece l : cl_vars) {
+    SetVar(l, "command line", vars);
+  }
+}
+
+static int Run(const vector<StringPiece>& targets,
+               const vector<StringPiece>& cl_vars) {
   MakefileCacheManager* cache_mgr = NewMakefileCacheManager();
 
-  // TODO: Fill env, etc.
   Vars* vars = new Vars();
+  FillDefaultVars(cl_vars, vars);
   Evaluator* ev = new Evaluator(vars);
 
   vector<AST*> bootstrap_asts;
@@ -133,14 +157,15 @@
   delete vars;
   delete cache_mgr;
 
-  return mk != 0;
+  return mk == 0;
 }
 
 int main(int argc, char* argv[]) {
   Init();
   vector<StringPiece> targets;
-  ParseCommandLine(argc, argv, &targets);
-  int r = Run(targets);
+  vector<StringPiece> cl_vars;
+  ParseCommandLine(argc, argv, &targets, &cl_vars);
+  int r = Run(targets, cl_vars);
   Quit();
   return r;
 }