1 // Created on: 2001-06-26
2 // Created by: Alexander GRIGORIEV
3 // Copyright (c) 2001-2014 OPEN CASCADE SAS
5 // This file is part of Open CASCADE Technology software library.
7 // This library is free software; you can redistribute it and/or modify it under
8 // the terms of the GNU Lesser General Public License version 2.1 as published
9 // by the Free Software Foundation, with special exception defined in the file
10 // OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
11 // distribution for complete text of the license and disclaimer of any warranty.
13 // Alternatively, this file may be used under the terms of Open CASCADE
14 // commercial license or contractual agreement.
16 #include <LDOMBasicString.hxx>
17 #include <LDOM_MemManager.hxx>
18 #include <TCollection_AsciiString.hxx>
19 #include <TCollection_ExtendedString.hxx>
22 //=======================================================================
23 //function : LDOMString
24 //purpose : Create a free string (not connected to any type of container)
25 //=======================================================================
27 LDOMBasicString::LDOMBasicString (const char * aValue)
29 if (aValue == NULL /*|| aValue[0] == '\0'*/) {
33 myType = LDOM_AsciiFree;
34 Standard_Size aLen = strlen (aValue) + 1;
35 myVal.ptr = new char [aLen];
36 memcpy (myVal.ptr, aValue, aLen);
40 //=======================================================================
41 //function : LDOMString
42 //purpose : Create an Ascii string managed by LDOM_Document
43 //=======================================================================
45 LDOMBasicString::LDOMBasicString (const char * aValue,
46 const Handle(LDOM_MemManager)& aDoc)
48 if (aValue == NULL /*|| aValue[0] == '\0'*/) {
52 myType = LDOM_AsciiDoc;
53 Standard_Integer aLen = (Standard_Integer) strlen (aValue) + 1;
54 myVal.ptr = aDoc -> Allocate (aLen);
55 memcpy (myVal.ptr, aValue, aLen);
59 //=======================================================================
60 //function : LDOMString
61 //purpose : Create an Ascii string managed by LDOM_Document
62 //=======================================================================
64 LDOMBasicString::LDOMBasicString (const char * aValue,
65 const Standard_Integer aLen,
66 const Handle(LDOM_MemManager)& aDoc)
68 if (aValue == NULL || aLen == 0) {
72 myType = LDOM_AsciiDoc;
73 myVal.ptr = aDoc -> Allocate (aLen + 1);
74 memcpy (myVal.ptr, aValue, aLen);
75 ((char *)myVal.ptr)[aLen] = '\0';
79 //=======================================================================
80 //function : LDOMBasicString
81 //purpose : Copy constructor
82 //=======================================================================
84 LDOMBasicString::LDOMBasicString (const LDOMBasicString& anOther)
85 : myType (anOther.Type())
89 if (anOther.myVal.ptr) {
90 Standard_Size aLen = strlen ((const char *)anOther.myVal.ptr) + 1;
91 myVal.ptr = new char [aLen];
92 memcpy (myVal.ptr, anOther.myVal.ptr, aLen);
96 case LDOM_AsciiDocClear:
97 case LDOM_AsciiHashed:
98 myVal.ptr = anOther.myVal.ptr;
101 myVal.i = anOther.myVal.i;
106 //=======================================================================
107 //function : ~LDOMString()
108 //purpose : Destructor
109 //=======================================================================
111 LDOMBasicString::~LDOMBasicString ()
113 if (myType == LDOM_AsciiFree) {
115 delete [] (char *) myVal.ptr;
119 //=======================================================================
120 //function : operator =
121 //purpose : Assignment to NULL
122 //=======================================================================
124 LDOMBasicString& LDOMBasicString::operator = (const LDOM_NullPtr *)
126 if (myType == LDOM_AsciiFree && myVal.ptr)
127 delete [] (char *) myVal.ptr;
133 //=======================================================================
134 //function : operator =
135 //purpose : Assignment
136 //=======================================================================
138 LDOMBasicString& LDOMBasicString::operator = (const LDOMBasicString& anOther)
140 if (myType == LDOM_AsciiFree && myVal.ptr)
141 delete [] (char *) myVal.ptr;
142 myType = anOther.Type();
145 if (anOther.myVal.ptr) {
146 Standard_Size aLen = strlen ((const char *)anOther.myVal.ptr) + 1;
147 myVal.ptr = new char [aLen];
148 memcpy (myVal.ptr, anOther.myVal.ptr, aLen);
152 case LDOM_AsciiDocClear:
153 case LDOM_AsciiHashed:
154 myVal.ptr = anOther.myVal.ptr;
157 myVal.i = anOther.myVal.i;
163 //=======================================================================
165 //purpose : Compare two strings by content
166 //=======================================================================
168 Standard_Boolean LDOMBasicString::equals (const LDOMBasicString& anOther) const
170 Standard_Boolean aResult = Standard_False;
174 return (anOther == NULL);
176 switch (anOther.Type())
179 return (myVal.i == anOther.myVal.i);
182 case LDOM_AsciiDocClear:
183 case LDOM_AsciiHashed:
185 long aLongOther = strtol ((const char *) anOther.myVal.ptr, NULL, 10);
186 return (errno == 0 && aLongOther == long(myVal.i));
194 switch (anOther.Type())
198 long aLong = strtol ((const char *) myVal.ptr, NULL, 10);
199 return (errno == 0 && aLong == long(anOther.myVal.i));
203 case LDOM_AsciiDocClear:
204 case LDOM_AsciiHashed:
205 return (strcmp ((const char *) myVal.ptr,
206 (const char *) anOther.myVal.ptr) == 0);
215 //=======================================================================
216 //function : operator TCollection_AsciiString
218 //=======================================================================
220 LDOMBasicString::operator TCollection_AsciiString () const
224 return TCollection_AsciiString (myVal.i);
227 case LDOM_AsciiDocClear:
228 case LDOM_AsciiHashed:
229 return TCollection_AsciiString (Standard_CString(myVal.ptr));
232 return TCollection_AsciiString ();
235 //=======================================================================
236 //function : operator TCollection_ExtendedString
238 //=======================================================================
240 LDOMBasicString::operator TCollection_ExtendedString () const
244 return TCollection_ExtendedString (myVal.i);
247 case LDOM_AsciiDocClear:
248 case LDOM_AsciiHashed:
250 char buf[6] = {'\0','\0','\0','\0','\0','\0'};
251 const long aUnicodeHeader = 0xfeff;
252 Standard_CString ptr = Standard_CString (myVal.ptr);
254 // Check if ptr is ascii string
255 if (ptr[0] != '#' || ptr[1] != '#')
256 return TCollection_ExtendedString (ptr);
261 if (strtol (&buf[0], NULL, 16) != aUnicodeHeader)
262 return TCollection_ExtendedString (ptr);
264 // convert Unicode to Extended String
266 Standard_Size aLength = (strlen(ptr) / 4), j = 0;
267 Standard_ExtCharacter * aResult = new Standard_ExtCharacter[aLength--];
274 aResult[j++] = Standard_ExtCharacter (strtol (&buf[0], NULL, 16));
277 return TCollection_ExtendedString();
281 TCollection_ExtendedString aResultStr (aResult);
287 return TCollection_ExtendedString();
290 //=======================================================================
291 //function : GetInteger
292 //purpose : Conversion to Integer
293 //=======================================================================
295 Standard_Boolean LDOMBasicString::GetInteger (Standard_Integer& aResult) const
303 case LDOM_AsciiDocClear:
304 case LDOM_AsciiHashed:
307 long aValue = strtol ((const char *)myVal.ptr, &ptr, 10);
308 if (ptr == myVal.ptr || errno == ERANGE || errno == EINVAL)
309 return Standard_False;
310 aResult = Standard_Integer (aValue);
314 return Standard_False;
316 return Standard_True;
321 //=======================================================================
322 // Debug Function for DBX: use "print -p <Variable> or pp <Variable>"
323 //=======================================================================
324 #include <LDOM_OSStream.hxx>
325 #define FLITERAL 0x10
326 char * db_pretty_print (const LDOMBasicString * aString, int fl, char *)
328 LDOM_OSStream out (128);
330 switch (aString -> myType) {
331 case LDOMBasicString::LDOM_Integer:
332 if ((fl & FLITERAL) == 0) out << "LDOM_Integer: ";
333 out << '\"' << aString -> myVal.i << '\"'; goto finis;
334 case LDOMBasicString::LDOM_AsciiFree:
335 if ((fl & FLITERAL) == 0) out << "LDOM_AsciiFree: ";
337 case LDOMBasicString::LDOM_AsciiDoc:
338 if ((fl & FLITERAL) == 0) out << "LDOM_AsciiDoc: ";
340 case LDOMBasicString::LDOM_AsciiDocClear:
341 if ((fl & FLITERAL) == 0) out << "LDOM_AsciiDocClear: ";
343 case LDOMBasicString::LDOM_AsciiHashed:
344 if ((fl & FLITERAL) == 0) out << "LDOM_AsciiHashed: ";
347 out << "Unknown type";
349 str = (const char *) aString -> myVal.ptr;
351 if (strlen (str) > 512)
352 out.rdbuf() -> sputn (str, 512);
358 return (char *)out.str();