Add string un-escaping, and fix the statcache reader to use it.
authorMichael Vrable <mvrable@cs.ucsd.edu>
Tue, 17 Jul 2007 23:29:14 +0000 (16:29 -0700)
committerMichael Vrable <mvrable@turin.ucsd.edu>
Tue, 17 Jul 2007 23:29:14 +0000 (16:29 -0700)
format.cc
format.h
statcache.cc

index 1fccf4e..9e985af 100644 (file)
--- a/format.cc
+++ b/format.cc
@@ -39,6 +39,38 @@ string uri_encode(const string &in)
     return out;
 }
 
+/* Decoding of strings produced by uri_encode. */
+string uri_decode(const string &in)
+{
+    char *buf = new char[in.size() + 1];
+
+    const char *input = in.c_str();
+    char *output = buf;
+
+    while (*input != '\0') {
+        if (*input == '%') {
+            char hexbuf[4];
+            if (isxdigit(input[1]) && isxdigit(input[2])) {
+                hexbuf[0] = input[1];
+                hexbuf[1] = input[2];
+                hexbuf[2] = '\0';
+                *output++ = strtol(hexbuf, NULL, 16);
+                input += 3;
+            } else {
+                input++;
+            }
+        } else {
+            *output++ = *input++;
+        }
+    }
+
+    *output = '\0';
+
+    string result(buf);
+    delete buf;
+    return result;
+}
+
 /* Return the string representation of an integer. */
 string encode_int(long long n)
 {
index 519bceb..7cb9bf4 100644 (file)
--- a/format.h
+++ b/format.h
@@ -13,6 +13,7 @@
 #include <string>
 
 std::string uri_encode(const std::string &in);
+std::string uri_decode(const std::string &in);
 std::string encode_int(long long n);
 void dict_output(std::ostream &o, std::map<std::string, std::string> dict);
 
index cccbf5b..5a8d26c 100644 (file)
@@ -125,12 +125,13 @@ void StatCache::ReadNext()
     old_checksum = "";
     old_contents.clear();
 
-    /* First, read in the filename.  TODO: Unescaping. */
+    /* First, read in the filename. */
     getline(cache, old_name);
     if (!cache) {
         end_of_cache = true;
         return;
     }
+    old_name = uri_decode(old_name);
 
     /* Start reading in the fields which follow the filename. */
     string field = "";