mirror of
https://github.com/Kitware/CMake.git
synced 2025-06-16 17:03:54 +08:00

On some compilers 'char' is signed and is therefore always equal to or less than 0x7f. In order to avoid the compiler warning we perform the comparison with an unsigned char type.
93 lines
2.7 KiB
C++
93 lines
2.7 KiB
C++
/*=========================================================================
|
|
|
|
Program: CMake - Cross-Platform Makefile Generator
|
|
Module: $RCSfile$
|
|
Language: C++
|
|
Date: $Date$
|
|
Version: $Revision$
|
|
|
|
Copyright (c) 2002 Kitware, Inc., Insight Consortium. All rights reserved.
|
|
See Copyright.txt or http://www.cmake.org/HTML/Copyright.html for details.
|
|
|
|
This software is distributed WITHOUT ANY WARRANTY; without even
|
|
the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
|
|
PURPOSE. See the above copyright notices for more information.
|
|
|
|
=========================================================================*/
|
|
#include "cmXMLSafe.h"
|
|
|
|
#include <cmsys/ios/iostream>
|
|
#include <cmsys/ios/sstream>
|
|
|
|
#include <string.h>
|
|
#include <stdio.h>
|
|
|
|
//----------------------------------------------------------------------------
|
|
cmXMLSafe::cmXMLSafe(const char* s):
|
|
Data(s),
|
|
Size(static_cast<unsigned long>(strlen(s))),
|
|
DoQuotes(true)
|
|
{
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
cmXMLSafe::cmXMLSafe(cmsys_stl::string const& str):
|
|
Data(str.c_str()),
|
|
Size(static_cast<unsigned long>(str.length())),
|
|
DoQuotes(true)
|
|
{
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
cmXMLSafe& cmXMLSafe::Quotes(bool b)
|
|
{
|
|
this->DoQuotes = b;
|
|
return *this;
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
cmsys_stl::string cmXMLSafe::str()
|
|
{
|
|
cmsys_ios::ostringstream ss;
|
|
ss << *this;
|
|
return ss.str();
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
cmsys_ios::ostream& operator<<(cmsys_ios::ostream& os, cmXMLSafe const& self)
|
|
{
|
|
char const* first = self.Data;
|
|
char const* last = self.Data + self.Size;
|
|
for(char const* ci = first; ci != last; ++ci)
|
|
{
|
|
unsigned char c = static_cast<unsigned char>(*ci);
|
|
switch(c)
|
|
{
|
|
case '&': os << "&"; break;
|
|
case '<': os << "<"; break;
|
|
case '>': os << ">"; break;
|
|
case '"': os << (self.DoQuotes? """ : "\""); break;
|
|
case '\'': os << (self.DoQuotes? "'" : "'"); break;
|
|
case '\t': os << "\t"; break;
|
|
case '\n': os << "\n"; break;
|
|
case '\r': break; // Ignore CR
|
|
default:
|
|
if(c >= 0x20 && c <= 0x7f)
|
|
{
|
|
os.put(static_cast<char>(c));
|
|
}
|
|
else
|
|
{
|
|
// TODO: More complete treatment of program output character
|
|
// encoding. Instead of escaping these bytes, we should
|
|
// handle the current locale and its encoding.
|
|
char buf[16];
|
|
sprintf(buf, "&#x%hx;", static_cast<unsigned short>(c));
|
|
os << buf;
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
return os;
|
|
}
|