1
0
mirror of https://git.dev.opencascade.org/repos/occt.git synced 2025-04-21 10:13:43 +03:00
occt/src/LDOM/LDOMBasicString.cxx
tiv 0423218095 0030895: Coding Rules - specify std namespace explicitly for std::cout and streams
"endl" manipulator for Message_Messenger is renamed to "Message_EndLine".

The following entities from std namespace are now used
with std:: explicitly specified (from Standard_Stream.hxx):
std::istream,std::ostream,std::ofstream,std::ifstream,std::fstream,
std::filebuf,std::streambuf,std::streampos,std::ios,std::cout,std::cerr,
std::cin,std::endl,std::ends,std::flush,std::setw,std::setprecision,
std::hex,std::dec.
2019-08-16 12:16:38 +03:00

364 lines
11 KiB
C++

// Created on: 2001-06-26
// Created by: Alexander GRIGORIEV
// Copyright (c) 2001-2014 OPEN CASCADE SAS
//
// This file is part of Open CASCADE Technology software library.
//
// This library is free software; you can redistribute it and/or modify it under
// the terms of the GNU Lesser General Public License version 2.1 as published
// by the Free Software Foundation, with special exception defined in the file
// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
// distribution for complete text of the license and disclaimer of any warranty.
//
// Alternatively, this file may be used under the terms of Open CASCADE
// commercial license or contractual agreement.
#include <LDOMBasicString.hxx>
#include <LDOM_MemManager.hxx>
#include <TCollection_AsciiString.hxx>
#include <TCollection_ExtendedString.hxx>
#include <errno.h>
//=======================================================================
//function : LDOMString
//purpose : Create a free string (not connected to any type of container)
//=======================================================================
LDOMBasicString::LDOMBasicString (const char * aValue)
{
if (aValue == NULL /*|| aValue[0] == '\0'*/) {
myType = LDOM_NULL;
myVal.ptr = NULL;
} else {
myType = LDOM_AsciiFree;
Standard_Size aLen = strlen (aValue) + 1;
myVal.ptr = new char [aLen];
memcpy (myVal.ptr, aValue, aLen);
}
}
//=======================================================================
//function : LDOMString
//purpose : Create an Ascii string managed by LDOM_Document
//=======================================================================
LDOMBasicString::LDOMBasicString (const char * aValue,
const Handle(LDOM_MemManager)& aDoc)
{
if (aValue == NULL /*|| aValue[0] == '\0'*/) {
myType = LDOM_NULL;
myVal.ptr = NULL;
} else {
myType = LDOM_AsciiDoc;
Standard_Integer aLen = (Standard_Integer) strlen (aValue) + 1;
myVal.ptr = aDoc -> Allocate (aLen);
memcpy (myVal.ptr, aValue, aLen);
}
}
//=======================================================================
//function : LDOMString
//purpose : Create an Ascii string managed by LDOM_Document
//=======================================================================
LDOMBasicString::LDOMBasicString (const char * aValue,
const Standard_Integer aLen,
const Handle(LDOM_MemManager)& aDoc)
{
if (aValue == NULL || aLen == 0) {
myType = LDOM_NULL;
myVal.ptr = NULL;
} else {
myType = LDOM_AsciiDoc;
myVal.ptr = aDoc -> Allocate (aLen + 1);
memcpy (myVal.ptr, aValue, aLen);
((char *)myVal.ptr)[aLen] = '\0';
}
}
//=======================================================================
//function : LDOMBasicString
//purpose : Copy constructor
//=======================================================================
LDOMBasicString::LDOMBasicString (const LDOMBasicString& anOther)
: myType (anOther.Type())
{
switch (myType) {
case LDOM_AsciiFree:
if (anOther.myVal.ptr) {
Standard_Size aLen = strlen ((const char *)anOther.myVal.ptr) + 1;
myVal.ptr = new char [aLen];
memcpy (myVal.ptr, anOther.myVal.ptr, aLen);
break;
}
Standard_FALLTHROUGH
case LDOM_AsciiDoc:
case LDOM_AsciiDocClear:
case LDOM_AsciiHashed:
myVal.ptr = anOther.myVal.ptr;
break;
case LDOM_Integer:
myVal.i = anOther.myVal.i;
default: ;
}
}
//=======================================================================
//function : ~LDOMString()
//purpose : Destructor
//=======================================================================
LDOMBasicString::~LDOMBasicString ()
{
if (myType == LDOM_AsciiFree) {
if (myVal.ptr)
delete [] (char *) myVal.ptr;
}
}
//=======================================================================
//function : operator =
//purpose : Assignment to NULL
//=======================================================================
LDOMBasicString& LDOMBasicString::operator = (const LDOM_NullPtr *)
{
if (myType == LDOM_AsciiFree && myVal.ptr)
delete [] (char *) myVal.ptr;
myType = LDOM_NULL;
myVal.ptr = NULL;
return * this;
}
//=======================================================================
//function : operator =
//purpose : Assignment
//=======================================================================
LDOMBasicString& LDOMBasicString::operator = (const LDOMBasicString& anOther)
{
if (myType == LDOM_AsciiFree && myVal.ptr)
delete [] (char *) myVal.ptr;
myType = anOther.Type();
switch (myType) {
case LDOM_AsciiFree:
if (anOther.myVal.ptr) {
Standard_Size aLen = strlen ((const char *)anOther.myVal.ptr) + 1;
myVal.ptr = new char [aLen];
memcpy (myVal.ptr, anOther.myVal.ptr, aLen);
break;
}
Standard_FALLTHROUGH
case LDOM_AsciiDoc:
case LDOM_AsciiDocClear:
case LDOM_AsciiHashed:
myVal.ptr = anOther.myVal.ptr;
break;
case LDOM_Integer:
myVal.i = anOther.myVal.i;
default: ;
}
return * this;
}
//=======================================================================
//function : equals
//purpose : Compare two strings by content
//=======================================================================
Standard_Boolean LDOMBasicString::equals (const LDOMBasicString& anOther) const
{
Standard_Boolean aResult = Standard_False;
switch (myType)
{
case LDOM_NULL:
return (anOther == NULL);
case LDOM_Integer:
switch (anOther.Type())
{
case LDOM_Integer:
return (myVal.i == anOther.myVal.i);
case LDOM_AsciiFree:
case LDOM_AsciiDoc:
case LDOM_AsciiDocClear:
case LDOM_AsciiHashed:
{
long aLongOther = strtol ((const char *) anOther.myVal.ptr, NULL, 10);
return (errno == 0 && aLongOther == long(myVal.i));
}
case LDOM_NULL:
default:
;
}
break;
default:
switch (anOther.Type())
{
case LDOM_Integer:
{
long aLong = strtol ((const char *) myVal.ptr, NULL, 10);
return (errno == 0 && aLong == long(anOther.myVal.i));
}
case LDOM_AsciiFree:
case LDOM_AsciiDoc:
case LDOM_AsciiDocClear:
case LDOM_AsciiHashed:
return (strcmp ((const char *) myVal.ptr,
(const char *) anOther.myVal.ptr) == 0);
case LDOM_NULL:
default:
;
}
}
return aResult;
}
//=======================================================================
//function : operator TCollection_AsciiString
//purpose :
//=======================================================================
LDOMBasicString::operator TCollection_AsciiString () const
{
switch (myType) {
case LDOM_Integer:
return TCollection_AsciiString (myVal.i);
case LDOM_AsciiFree:
case LDOM_AsciiDoc:
case LDOM_AsciiDocClear:
case LDOM_AsciiHashed:
return TCollection_AsciiString (Standard_CString(myVal.ptr));
default: ;
}
return TCollection_AsciiString ();
}
//=======================================================================
//function : operator TCollection_ExtendedString
//purpose :
//=======================================================================
LDOMBasicString::operator TCollection_ExtendedString () const
{
switch (myType) {
case LDOM_Integer:
return TCollection_ExtendedString (myVal.i);
case LDOM_AsciiFree:
case LDOM_AsciiDoc:
case LDOM_AsciiDocClear:
case LDOM_AsciiHashed:
{
char buf[6] = {'\0','\0','\0','\0','\0','\0'};
const long aUnicodeHeader = 0xfeff;
Standard_CString ptr = Standard_CString (myVal.ptr);
errno = 0;
// Check if ptr is ascii string
if (ptr[0] != '#' || ptr[1] != '#')
return TCollection_ExtendedString (ptr);
buf[0] = ptr[2];
buf[1] = ptr[3];
buf[2] = ptr[4];
buf[3] = ptr[5];
if (strtol (&buf[0], NULL, 16) != aUnicodeHeader)
return TCollection_ExtendedString (ptr);
// convert Unicode to Extended String
ptr += 2;
Standard_Size aLength = (strlen(ptr) / 4), j = 0;
Standard_ExtCharacter * aResult = new Standard_ExtCharacter[aLength--];
while (aLength--) {
ptr += 4;
buf[0] = ptr[0];
buf[1] = ptr[1];
buf[2] = ptr[2];
buf[3] = ptr[3];
aResult[j++] = Standard_ExtCharacter (strtol (&buf[0], NULL, 16));
if (errno) {
delete [] aResult;
return TCollection_ExtendedString();
}
}
aResult[j] = 0;
TCollection_ExtendedString aResultStr (aResult);
delete [] aResult;
return aResultStr;
}
default: ;
}
return TCollection_ExtendedString();
}
//=======================================================================
//function : GetInteger
//purpose : Conversion to Integer
//=======================================================================
Standard_Boolean LDOMBasicString::GetInteger (Standard_Integer& aResult) const
{
switch (myType) {
case LDOM_Integer:
aResult = myVal.i;
break;
case LDOM_AsciiFree:
case LDOM_AsciiDoc:
case LDOM_AsciiDocClear:
case LDOM_AsciiHashed:
{
char * ptr;
long aValue = strtol ((const char *)myVal.ptr, &ptr, 10);
if (ptr == myVal.ptr || errno == ERANGE || errno == EINVAL)
return Standard_False;
aResult = Standard_Integer (aValue);
break;
}
default:
return Standard_False;
}
return Standard_True;
}
#ifdef OCCT_DEBUG
#ifndef _MSC_VER
//=======================================================================
// Debug Function for DBX: use "print -p <Variable> or pp <Variable>"
//=======================================================================
#include <LDOM_OSStream.hxx>
#define FLITERAL 0x10
char * db_pretty_print (const LDOMBasicString * aString, int fl, char *)
{
LDOM_OSStream out (128);
const char * str;
switch (aString -> myType) {
case LDOMBasicString::LDOM_Integer:
if ((fl & FLITERAL) == 0) out << "LDOM_Integer: ";
out << '\"' << aString -> myVal.i << '\"'; goto finis;
case LDOMBasicString::LDOM_AsciiFree:
if ((fl & FLITERAL) == 0) out << "LDOM_AsciiFree: ";
break;
case LDOMBasicString::LDOM_AsciiDoc:
if ((fl & FLITERAL) == 0) out << "LDOM_AsciiDoc: ";
break;
case LDOMBasicString::LDOM_AsciiDocClear:
if ((fl & FLITERAL) == 0) out << "LDOM_AsciiDocClear: ";
break;
case LDOMBasicString::LDOM_AsciiHashed:
if ((fl & FLITERAL) == 0) out << "LDOM_AsciiHashed: ";
break;
default:
out << "Unknown type";
}
str = (const char *) aString -> myVal.ptr;
out << '\"';
if (strlen (str) > 512)
out.rdbuf() -> sputn (str, 512);
else
out << str;
out << '\"';
finis:
out << std::ends;
return (char *)out.str();
}
#endif
#endif