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>
19 #include <Standard.hxx>
20 #include <Standard_Integer.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)
98 //=======================================================================
99 //function : underflow
100 //purpose : redefined virtual
101 //=======================================================================
103 int LDOM_SBuffer::underflow()
108 //int LDOM_SBuffer::uflow()
111 //=======================================================================
112 //function : xsputn()
113 //purpose : redefined virtual
114 //=======================================================================
115 int LDOM_SBuffer::xsputn(const char* aStr, int n)
118 int freeLen = myMaxBuf - myCurString->len - 1;
121 strncpy(myCurString->buf + myCurString->len, aStr, aLen);
123 else if (freeLen <= 0)
125 LDOM_StringElem* aNextElem = new (myAlloc) LDOM_StringElem(Max(aLen, myMaxBuf), myAlloc);
126 myCurString->next = aNextElem;
127 myCurString = aNextElem;
128 strncpy(myCurString->buf + myCurString->len, aStr, aLen);
130 else // 0 < freeLen < n
132 // copy string by parts
133 strncpy(myCurString->buf + myCurString->len, aStr, freeLen);
134 myCurString->len += freeLen;
135 *(myCurString->buf + myCurString->len) = '\0';
137 LDOM_StringElem* aNextElem = new (myAlloc) LDOM_StringElem(Max(aLen, myMaxBuf), myAlloc);
138 myCurString->next = aNextElem;
139 myCurString = aNextElem;
140 strncpy(myCurString->buf + myCurString->len, aStr + freeLen, aLen);
142 myCurString->len += aLen - 1;
143 *(myCurString->buf + myCurString->len) = '\0';
149 //streamsize LDOM_SBuffer::xsgetn(char* s, streamsize n)
150 //{ return _IO_default_xsgetn(this, s, n); }
152 //=======================================================================
153 //function : LDOM_OSStream()
154 //purpose : Constructor
155 //=======================================================================
156 LDOM_OSStream::LDOM_OSStream (const Standard_Integer theMaxBuf)
157 : Standard_OStream (&myBuffer), myBuffer (theMaxBuf)