0030997: Foundation Classes - name correction of dump macros
[occt.git] / src / Standard / Standard_Dump.cxx
1 // Copyright (c) 2019 OPEN CASCADE SAS
2 //
3 // This file is part of Open CASCADE Technology software library.
4 //
5 // This library is free software; you can redistribute it and/or modify it under
6 // the terms of the GNU Lesser General Public License version 2.1 as published
7 // by the Free Software Foundation, with special exception defined in the file
8 // OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
9 // distribution for complete text of the license and disclaimer of any warranty.
10 //
11 // Alternatively, this file may be used under the terms of Open CASCADE
12 // commercial license or contractual agreement.
13
14 #include <Standard_Dump.hxx>
15
16 #include <stdarg.h>
17
18 // =======================================================================
19 // function : Constructor
20 // purpose :
21 // =======================================================================
22 Standard_DumpSentry::Standard_DumpSentry (Standard_OStream& theOStream, const char* theClassName)
23 : myOStream (&theOStream)
24 {
25   (*myOStream) << "\"" << theClassName << "\": {";
26 }
27
28 // =======================================================================
29 // function : Destructor
30 // purpose :
31 // =======================================================================
32 Standard_DumpSentry::~Standard_DumpSentry()
33 {
34   (*myOStream) << "}";
35 }
36
37 // =======================================================================
38 // function : AddValuesSeparator
39 // purpose :
40 // =======================================================================
41 void Standard_Dump::AddValuesSeparator (Standard_OStream& theOStream)
42 {
43   Standard_SStream aStream;
44   aStream << theOStream.rdbuf();
45   TCollection_AsciiString aStreamStr = Standard_Dump::Text (aStream);
46   if (!aStreamStr.EndsWith ("{"))
47     theOStream << ", ";
48 }
49
50 //=======================================================================
51 //function : DumpKeyToClass
52 //purpose  : 
53 //=======================================================================
54 void Standard_Dump::DumpKeyToClass (Standard_OStream& theOStream,
55                                     const char* theKey,
56                                     const TCollection_AsciiString& theField)
57 {
58   AddValuesSeparator (theOStream);
59   theOStream << "\"" << theKey << "\": {" << theField << "}";
60 }
61
62 //=======================================================================
63 //function : DumpCharacterValues
64 //purpose  : 
65 //=======================================================================
66 void Standard_Dump::DumpCharacterValues (Standard_OStream& theOStream, int theCount, ...)
67 {
68   va_list  vl;
69   va_start(vl, theCount);
70   for(int i = 0; i < theCount; ++i)
71   {
72     if (i > 0)
73       theOStream << ", ";
74     theOStream << "\"" << va_arg(vl, char*) << "\"";
75   }
76   va_end(vl);
77 }
78
79 //=======================================================================
80 //function : DumpRealValues
81 //purpose  : 
82 //=======================================================================
83 void Standard_Dump::DumpRealValues (Standard_OStream& theOStream, int theCount, ...)
84 {
85   va_list  vl;
86   va_start(vl, theCount);
87   for(int i = 0; i < theCount; ++i)
88   {
89     if (i > 0)
90       theOStream << ", ";
91     theOStream << va_arg(vl, Standard_Real);
92   }
93   va_end(vl);
94 }
95
96 // =======================================================================
97 // function : GetPointerInfo
98 // purpose :
99 // =======================================================================
100 TCollection_AsciiString Standard_Dump::GetPointerInfo (const Handle(Standard_Transient)& thePointer,
101                                                        const bool isShortInfo)
102 {
103   if (thePointer.IsNull())
104     return TCollection_AsciiString();
105
106   return GetPointerInfo (thePointer.get(), isShortInfo);
107 }
108
109 // =======================================================================
110 // function : GetPointerInfo
111 // purpose :
112 // =======================================================================
113 TCollection_AsciiString Standard_Dump::GetPointerInfo (const void* thePointer, const bool isShortInfo)
114 {
115   std::ostringstream aPtrStr;
116   aPtrStr << thePointer;
117   if (!isShortInfo)
118     return aPtrStr.str().c_str();
119
120   TCollection_AsciiString anInfoPtr (aPtrStr.str().c_str());
121   for (int aSymbolId = 1; aSymbolId < anInfoPtr.Length(); aSymbolId++)
122   {
123     if (anInfoPtr.Value(aSymbolId) != '0')
124     {
125       anInfoPtr = anInfoPtr.SubString (aSymbolId, anInfoPtr.Length());
126       anInfoPtr.Prepend (GetPointerPrefix());
127       return anInfoPtr;
128     }
129   }
130   return aPtrStr.str().c_str();
131 }
132
133 // =======================================================================
134 // DumpFieldToName
135 // =======================================================================
136 const char* Standard_Dump::DumpFieldToName (const char* theField)
137 {
138   const char* aName = theField;
139
140   if (aName[0] == '&')
141   {
142     aName = aName + 1;
143   }
144   if (::LowerCase (aName[0]) == 'm' && aName[1] == 'y')
145   {
146     aName = aName + 2;
147   }
148   return aName;
149 }
150
151 // =======================================================================
152 // Text
153 // =======================================================================
154 TCollection_AsciiString Standard_Dump::Text (const Standard_SStream& theStream)
155 {
156   return TCollection_AsciiString (theStream.str().c_str());
157 }
158
159 // =======================================================================
160 // FormatJson
161 // =======================================================================
162 TCollection_AsciiString Standard_Dump::FormatJson (const Standard_SStream& theStream,
163                                                    const Standard_Integer theIndent)
164 {
165   TCollection_AsciiString aStreamStr = Text (theStream);
166   TCollection_AsciiString anIndentStr;
167   for (Standard_Integer anIndentId = 0; anIndentId < theIndent; anIndentId++)
168     anIndentStr.AssignCat (' ');
169
170   TCollection_AsciiString aText;
171
172   Standard_Integer anIndentCount = 0;
173   Standard_Boolean isMassiveValues = Standard_False;
174   for (Standard_Integer anIndex = 1; anIndex < aStreamStr.Length(); anIndex++)
175   {
176     Standard_Character aSymbol = aStreamStr.Value (anIndex);
177     if (aSymbol == '{')
178     {
179       anIndentCount++;
180
181       aText += aSymbol;
182       aText += '\n';
183
184       for (int anIndent = 0; anIndent < anIndentCount; anIndent++)
185         aText += anIndentStr;
186     }
187     else if (aSymbol == '}')
188     {
189       anIndentCount--;
190
191       aText += '\n';
192       for (int anIndent = 0; anIndent < anIndentCount; anIndent++)
193         aText += anIndentStr;
194       aText += aSymbol;
195     }
196     else if (aSymbol == '[')
197     {
198       isMassiveValues = Standard_True;
199       aText += aSymbol;
200     }
201     else if (aSymbol == ']')
202     {
203       isMassiveValues = Standard_False;
204       aText += aSymbol;
205     }
206     else if (aSymbol == ',')
207     {
208       if (!isMassiveValues)
209       {
210         aText += aSymbol;
211         aText += '\n';
212         for (int anIndent = 0; anIndent < anIndentCount; anIndent++)
213           aText += anIndentStr;
214         if (anIndex + 1 < aStreamStr.Length() && aStreamStr.Value (anIndex + 1) == ' ')
215           anIndex++; // skip empty value after comma
216       }
217       else
218         aText += aSymbol;
219     }
220     else
221       aText += aSymbol;
222   }
223   return aText;
224 }