libzypp
10.5.0
|
00001 /*---------------------------------------------------------------------\ 00002 | ____ _ __ __ ___ | 00003 | |__ / \ / / . \ . \ | 00004 | / / \ V /| _/ _/ | 00005 | / /__ | | | | | | | 00006 | /_____||_| |_| |_| | 00007 | | 00008 \---------------------------------------------------------------------*/ 00013 #include <string> 00014 #include "xml_escape_parser.hpp" 00015 00016 namespace iobind{ 00017 namespace parser{ 00018 00019 std::string xml_escape_parser::escape(const std::string &istr) const 00020 { 00021 size_t i; 00022 std::string str = istr; 00023 i = str.find_first_of("<>&'\""); 00024 while (i != std::string::npos) 00025 { 00026 switch (str[i]) 00027 { 00028 case '<': str.replace(i, 1, "<"); i += 3; break; 00029 case '>': str.replace(i, 1, ">"); i += 3; break; 00030 case '&': str.replace(i, 1, "&"); i += 4; break; 00031 case '\'': str.replace(i, 1, "'"); i += 5; break; 00032 case '"': str.replace(i, 1, """); i += 5; break; 00033 } 00034 i = str.find_first_of("<>&'\"", i + 1); 00035 } 00036 return str; 00037 } 00038 00039 std::string xml_escape_parser::unescape(const std::string &istr) const 00040 { 00041 size_t i; 00042 std::string str = istr; 00043 i = str.find_first_of("&"); 00044 while (i != std::string::npos) 00045 { 00046 if (str[i] == '&') 00047 { 00048 if (!str.compare(i + 1, 3, "lt;")) 00049 str.replace(i, 4, 1, '<'); 00050 else if (!str.compare(i + 1, 3, "gt;")) 00051 str.replace(i, 4, 1, '>'); 00052 else if (!str.compare(i + 1, 4, "amp;")) 00053 str.replace(i, 5, 1, '&'); 00054 else if (!str.compare(i + 1, 5, "apos;")) 00055 str.replace(i, 6, 1, '\''); 00056 else if (!str.compare(i + 1, 5, "quot;")) 00057 str.replace(i, 6, 1, '"'); 00058 } 00059 i = str.find_first_of("&", i + 1); 00060 } 00061 return str; 00062 } 00063 }; // parser 00064 }; // iobind