1 // Created on: 2001-10-01
2 // Created by: Julia DOROVSKIKH
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 <LDOM_OSStream.hxx>
17 #include <NCollection_IncAllocator.hxx>
18 #include <Standard_Assert.hxx>
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))),
34 //=======================================================================
35 //function : LDOM_SBuffer()
37 //=======================================================================
38 LDOM_SBuffer::LDOM_SBuffer (const Standard_Integer theMaxBuf)
39 : myMaxBuf (theMaxBuf), myLength(0),
40 myAlloc (new NCollection_IncAllocator)
42 myFirstString = new (myAlloc) LDOM_StringElem (theMaxBuf, myAlloc);
43 myCurString = myFirstString;
46 //=======================================================================
47 //function : ~LDOM_SBuffer()
49 //=======================================================================
50 LDOM_SBuffer::~LDOM_SBuffer ()
52 //no destruction is required as IncAllocator is used
55 //=======================================================================
58 //=======================================================================
59 void LDOM_SBuffer::Clear ()
61 myAlloc = new NCollection_IncAllocator;
62 myFirstString = new (myAlloc) LDOM_StringElem (myMaxBuf, myAlloc);
64 myCurString = myFirstString;
67 //=======================================================================
70 //=======================================================================
71 Standard_CString LDOM_SBuffer::str () const
73 char* aRetStr = new char [myLength + 1];
75 LDOM_StringElem* aCurElem = myFirstString;
79 strncpy(aRetStr + aCurLen, aCurElem->buf, aCurElem->len);
80 aCurLen += aCurElem->len;
81 aCurElem = aCurElem->next;
83 *(aRetStr + myLength) = '\0';
88 //=======================================================================
89 //function : overflow()
90 //purpose : redefined virtual
91 //=======================================================================
92 int LDOM_SBuffer::overflow(int c)
99 //=======================================================================
100 //function : underflow
101 //purpose : redefined virtual
102 //=======================================================================
104 int LDOM_SBuffer::underflow()
109 //int LDOM_SBuffer::uflow()
112 //=======================================================================
113 //function : xsputn()
114 //purpose : redefined virtual
115 //=======================================================================
116 std::streamsize LDOM_SBuffer::xsputn (const char* aStr, std::streamsize n)
118 Standard_ASSERT_RAISE (n < IntegerLast(), "LDOM_SBuffer cannot work with strings greater than 2 Gb");
120 Standard_Integer aLen = static_cast<int>(n) + 1;
121 Standard_Integer freeLen = myMaxBuf - myCurString->len - 1;
124 strncpy(myCurString->buf + myCurString->len, aStr, aLen);
126 else if (freeLen <= 0)
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);
133 else // 0 < freeLen < n
135 // copy string by parts
136 strncpy(myCurString->buf + myCurString->len, aStr, freeLen);
137 myCurString->len += freeLen;
138 *(myCurString->buf + myCurString->len) = '\0';
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);
145 myCurString->len += aLen - 1;
146 *(myCurString->buf + myCurString->len) = '\0';
148 myLength += static_cast<int>(n);
152 //streamsize LDOM_SBuffer::xsgetn(char* s, streamsize n)
153 //{ return _IO_default_xsgetn(this, s, n); }
155 //=======================================================================
156 //function : LDOM_OSStream()
157 //purpose : Constructor
158 //=======================================================================
159 LDOM_OSStream::LDOM_OSStream (const Standard_Integer theMaxBuf)
160 : Standard_OStream (&myBuffer), myBuffer (theMaxBuf)