libzypp  10.5.0
xml_escape_parser.cpp
Go to the documentation of this file.
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, "&lt;"); i += 3; break;
00029           case '>': str.replace(i, 1, "&gt;"); i += 3; break;
00030           case '&': str.replace(i, 1, "&amp;"); i += 4; break;
00031           case '\'': str.replace(i, 1, "&apos;"); i += 5; break;
00032           case '"': str.replace(i, 1, "&quot;"); 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