c++: Fix possible string truncation
[awesomized/libmemcached] / libtest / formatter.cc
index ad5b163541b4f14a11e003431331f7facc79ea79..7cb3ea0ab8fb55ca8b7e0083b66638527128017a 100644 (file)
@@ -52,39 +52,41 @@ std::string& escape4XML(std::string const& arg, std::string& escaped_string)
   for (std::string::const_iterator x= arg.begin(), end= arg.end(); x != end; ++x)
   {
     unsigned char c= *x;
-    if (' ' <= c and c <= '~' and c != '\\' and c != '"' and c != '>' and c != '<')
+    if (c == '&')
     {
-      escaped_string+= c;
+      escaped_string+= "&amp;";
     }
     else if (c == '>')
     {
-      escaped_string+= '&';
-      escaped_string+= 'g';
-      escaped_string+= 't';
-      escaped_string+= ';';
+      escaped_string+= "&gt;";
     }
     else if (c == '<')
     {
-      escaped_string+= '&';
-      escaped_string+= 'l';
-      escaped_string+= 't';
-      escaped_string+= ';';
+      escaped_string+= "&lt;";
+    }
+    else if (c == '\'')
+    {
+      escaped_string+= "&apos;";  break;
+    }
+    else if (c == '"')
+    {
+      escaped_string+= "&quot;";
+    }
+    else if (c == ' ')
+    {
+      escaped_string+= ' ';
+    }
+    else if (isalnum(c))
+    {
+      escaped_string+= c;
     }
     else 
     {
-      escaped_string+= '\\';
-      switch (c) {
-        case '"':  escaped_string+= '"';  break;
-        case '\\': escaped_string+= '\\'; break;
-        case '\t': escaped_string+='t';  break;
-        case '\r': escaped_string+='r';  break;
-        case '\n': escaped_string+='n';  break;
-        default:
-                   char const* const hexdig= "0123456789ABCDEF";
-                   escaped_string+= 'x';
-                   escaped_string+= hexdig[c >> 4];
-                   escaped_string+= hexdig[c & 0xF];
-      }
+      char const* const hexdig= "0123456789ABCDEF";
+      escaped_string+= "&#x";
+      escaped_string+= hexdig[c >> 4];
+      escaped_string+= hexdig[c & 0xF];
+      escaped_string+= ';';
     }
   }
   escaped_string+= '"';
@@ -206,8 +208,10 @@ void Formatter::xml(libtest::Framework& framework_, std::ofstream& output)
   {
     output << "\t<testsuite name=" 
       << escape4XML((*framework_iter)->name(), escaped_string)
-      << "  classname=\"\" package=\"\">" 
-      << std::endl;
+#if 0
+      << "  classname=\"\" package=\"\"" 
+#endif
+      << ">" << std::endl;
 
     for (TestCases::iterator case_iter= (*framework_iter)->formatter()->testcases().begin();
          case_iter != (*framework_iter)->formatter()->testcases().end();
@@ -217,23 +221,26 @@ void Formatter::xml(libtest::Framework& framework_, std::ofstream& output)
         << escape4XML((*case_iter)->name(), escaped_string)
         << " time=\"" 
         << (*case_iter)->timer().elapsed_milliseconds() 
-        << "\">" 
-        << std::endl;
+        << "\""; 
 
       switch ((*case_iter)->result())
       {
         case TEST_SKIPPED:
+        output << ">" << std::endl;
         output << "\t\t <skipped/>" << std::endl;
+        output << "\t\t</testcase>" << std::endl;
         break;
 
         case TEST_FAILURE:
+        output << ">" << std::endl;
         output << "\t\t <failure message=\"\" type=\"\"/>"<< std::endl;
+        output << "\t\t</testcase>" << std::endl;
         break;
 
         case TEST_SUCCESS:
+        output << "/>" << std::endl;
         break;
       }
-      output << "\t\t</testcase>" << std::endl;
     }
     output << "\t</testsuite>" << std::endl;
   }