0031668: Visualization - WebGL sample doesn't work on Emscripten 1.39
[occt.git] / src / LDOM / LDOM_OSStream.cxx
1 // Created on: 2001-10-01
2 // Created by: Julia DOROVSKIKH
3 // Copyright (c) 2001-2014 OPEN CASCADE SAS
4 //
5 // This file is part of Open CASCADE Technology software library.
6 //
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.
12 //
13 // Alternatively, this file may be used under the terms of Open CASCADE
14 // commercial license or contractual agreement.
15
16 #include <LDOM_OSStream.hxx>
17 #include <NCollection_IncAllocator.hxx>
18 #include <Standard_Assert.hxx>
19
20 #include <string.h>
21
22 //=======================================================================
23 //function : LDOM_StringElem()
24 //purpose  : Constructor
25 //=======================================================================
26 LDOM_SBuffer::LDOM_StringElem::LDOM_StringElem
27   ( const int theLength, const Handle(NCollection_BaseAllocator)& theAlloc )
28 : buf (reinterpret_cast<char*>(theAlloc->Allocate (theLength))),
29   len (0),
30   next(0)
31 {
32 }
33
34 //=======================================================================
35 //function : LDOM_SBuffer()
36 //purpose  : 
37 //=======================================================================
38 LDOM_SBuffer::LDOM_SBuffer (const Standard_Integer theMaxBuf)
39      : myMaxBuf (theMaxBuf), myLength(0),
40        myAlloc (new NCollection_IncAllocator)
41 {
42   myFirstString = new (myAlloc) LDOM_StringElem (theMaxBuf, myAlloc);
43   myCurString   = myFirstString;
44 }
45
46 //=======================================================================
47 //function : ~LDOM_SBuffer()
48 //purpose  : 
49 //=======================================================================
50 LDOM_SBuffer::~LDOM_SBuffer ()
51 {
52   //no destruction is required as IncAllocator is used
53 }
54
55 //=======================================================================
56 //function : Clear()
57 //purpose  : 
58 //=======================================================================
59 void LDOM_SBuffer::Clear ()
60 {
61   myAlloc       = new NCollection_IncAllocator;
62   myFirstString = new (myAlloc) LDOM_StringElem (myMaxBuf, myAlloc);
63   myLength      = 0;
64   myCurString   = myFirstString;
65 }
66
67 //=======================================================================
68 //function : str()
69 //purpose  : 
70 //=======================================================================
71 Standard_CString LDOM_SBuffer::str () const
72 {
73   char* aRetStr = new char [myLength + 1];
74
75   LDOM_StringElem* aCurElem = myFirstString;
76   int aCurLen = 0;
77   while (aCurElem)
78   {
79     strncpy(aRetStr + aCurLen, aCurElem->buf, aCurElem->len);
80     aCurLen += aCurElem->len;
81     aCurElem = aCurElem->next;
82   }
83   *(aRetStr + myLength) = '\0';
84
85   return aRetStr;
86 }
87
88 //=======================================================================
89 //function : overflow()
90 //purpose  : redefined virtual
91 //=======================================================================
92 int LDOM_SBuffer::overflow(int c)
93 {
94   char cc = (char)c;
95   xsputn(&cc,1);
96   return c;
97 }
98
99 //=======================================================================
100 //function : underflow
101 //purpose  : redefined virtual
102 //=======================================================================
103
104 int LDOM_SBuffer::underflow()
105 {
106   return EOF;
107 }
108
109 //int LDOM_SBuffer::uflow()
110 //{ return EOF; }
111
112 //=======================================================================
113 //function : xsputn()
114 //purpose  : redefined virtual
115 //=======================================================================
116 std::streamsize LDOM_SBuffer::xsputn (const char* aStr, std::streamsize n)
117 {
118   Standard_ASSERT_RAISE (n < IntegerLast(), "LDOM_SBuffer cannot work with strings greater than 2 Gb");
119
120   Standard_Integer aLen = static_cast<int>(n) + 1;
121   Standard_Integer freeLen = myMaxBuf - myCurString->len - 1;
122   if (freeLen >= n)
123   {
124     strncpy(myCurString->buf + myCurString->len, aStr, aLen);
125   }
126   else if (freeLen <= 0)
127   {
128     LDOM_StringElem* aNextElem = new (myAlloc) LDOM_StringElem(Max(aLen, myMaxBuf), myAlloc);
129     myCurString->next = aNextElem;
130     myCurString = aNextElem;
131     strncpy(myCurString->buf + myCurString->len, aStr, aLen);
132   }
133   else // 0 < freeLen < n
134   {
135     // copy string by parts
136     strncpy(myCurString->buf + myCurString->len, aStr, freeLen);
137     myCurString->len += freeLen;
138     *(myCurString->buf + myCurString->len) = '\0';
139     aLen -= freeLen;
140     LDOM_StringElem* aNextElem = new (myAlloc) LDOM_StringElem(Max(aLen, myMaxBuf), myAlloc);
141     myCurString->next = aNextElem;
142     myCurString = aNextElem;
143     strncpy(myCurString->buf + myCurString->len, aStr + freeLen, aLen);
144   }
145   myCurString->len += aLen - 1;
146   *(myCurString->buf + myCurString->len) = '\0';
147
148   myLength += static_cast<int>(n);
149   return n;
150 }
151
152 //streamsize LDOM_SBuffer::xsgetn(char* s, streamsize n)
153 //{ return _IO_default_xsgetn(this, s, n); }
154
155 //=======================================================================
156 //function : LDOM_OSStream()
157 //purpose  : Constructor
158 //=======================================================================
159 LDOM_OSStream::LDOM_OSStream (const Standard_Integer theMaxBuf)
160      : Standard_OStream (&myBuffer), myBuffer (theMaxBuf)
161 {
162   init(&myBuffer);
163 }