Commit | Line | Data |
---|---|---|
b311480e | 1 | // Created on: 2001-10-01 |
2 | // Created by: Julia DOROVSKIKH | |
973c2be1 | 3 | // Copyright (c) 2001-2014 OPEN CASCADE SAS |
b311480e | 4 | // |
973c2be1 | 5 | // This file is part of Open CASCADE Technology software library. |
b311480e | 6 | // |
d5f74e42 | 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 | |
973c2be1 | 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. | |
b311480e | 12 | // |
973c2be1 | 13 | // Alternatively, this file may be used under the terms of Open CASCADE |
14 | // commercial license or contractual agreement. | |
7fd59977 | 15 | |
16 | #include <LDOM_OSStream.hxx> | |
70167e69 | 17 | #include <NCollection_IncAllocator.hxx> |
7fd59977 | 18 | #include <string.h> |
70167e69 | 19 | #include <Standard.hxx> |
7fd59977 | 20 | #include <Standard_Integer.hxx> |
21 | ||
6a38ff48 | 22 | //======================================================================= |
23 | //function : LDOM_StringElem() | |
24 | //purpose : Constructor | |
25 | //======================================================================= | |
26 | LDOM_SBuffer::LDOM_StringElem::LDOM_StringElem | |
35c0599a | 27 | ( const int theLength, const Handle(NCollection_BaseAllocator)& theAlloc ) |
6a38ff48 | 28 | : buf (reinterpret_cast<char*>(theAlloc->Allocate (theLength))), |
29 | len (0), | |
30 | next(0) | |
7fd59977 | 31 | { |
6a38ff48 | 32 | } |
7fd59977 | 33 | |
34 | //======================================================================= | |
35 | //function : LDOM_SBuffer() | |
36 | //purpose : | |
37 | //======================================================================= | |
38 | LDOM_SBuffer::LDOM_SBuffer (const Standard_Integer theMaxBuf) | |
70167e69 RL |
39 | : myMaxBuf (theMaxBuf), myLength(0), |
40 | myAlloc (new NCollection_IncAllocator) | |
7fd59977 | 41 | { |
70167e69 RL |
42 | myFirstString = new (myAlloc) LDOM_StringElem (theMaxBuf, myAlloc); |
43 | myCurString = myFirstString; | |
7fd59977 | 44 | } |
45 | ||
46 | //======================================================================= | |
47 | //function : ~LDOM_SBuffer() | |
48 | //purpose : | |
49 | //======================================================================= | |
50 | LDOM_SBuffer::~LDOM_SBuffer () | |
51 | { | |
70167e69 | 52 | //no destruction is required as IncAllocator is used |
7fd59977 | 53 | } |
54 | ||
55 | //======================================================================= | |
56 | //function : Clear() | |
57 | //purpose : | |
58 | //======================================================================= | |
59 | void LDOM_SBuffer::Clear () | |
60 | { | |
70167e69 RL |
61 | myAlloc = new NCollection_IncAllocator; |
62 | myFirstString = new (myAlloc) LDOM_StringElem (myMaxBuf, myAlloc); | |
63 | myLength = 0; | |
64 | myCurString = myFirstString; | |
7fd59977 | 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 | { | |
8263fcd3 | 94 | char cc = (char)c; |
7fd59977 | 95 | return xsputn(&cc,1); |
96 | } | |
97 | ||
98 | //======================================================================= | |
99 | //function : underflow | |
100 | //purpose : redefined virtual | |
101 | //======================================================================= | |
102 | ||
103 | int LDOM_SBuffer::underflow() | |
104 | { | |
105 | return EOF; | |
106 | } | |
107 | ||
108 | //int LDOM_SBuffer::uflow() | |
109 | //{ return EOF; } | |
110 | ||
111 | //======================================================================= | |
112 | //function : xsputn() | |
113 | //purpose : redefined virtual | |
114 | //======================================================================= | |
115 | int LDOM_SBuffer::xsputn(const char* aStr, int n) | |
116 | { | |
117 | int aLen = n + 1; | |
118 | int freeLen = myMaxBuf - myCurString->len - 1; | |
119 | if (freeLen >= n) | |
120 | { | |
121 | strncpy(myCurString->buf + myCurString->len, aStr, aLen); | |
122 | } | |
123 | else if (freeLen <= 0) | |
124 | { | |
70167e69 | 125 | LDOM_StringElem* aNextElem = new (myAlloc) LDOM_StringElem(Max(aLen, myMaxBuf), myAlloc); |
7fd59977 | 126 | myCurString->next = aNextElem; |
127 | myCurString = aNextElem; | |
128 | strncpy(myCurString->buf + myCurString->len, aStr, aLen); | |
129 | } | |
130 | else // 0 < freeLen < n | |
131 | { | |
132 | // copy string by parts | |
133 | strncpy(myCurString->buf + myCurString->len, aStr, freeLen); | |
134 | myCurString->len += freeLen; | |
135 | *(myCurString->buf + myCurString->len) = '\0'; | |
136 | aLen -= freeLen; | |
70167e69 | 137 | LDOM_StringElem* aNextElem = new (myAlloc) LDOM_StringElem(Max(aLen, myMaxBuf), myAlloc); |
7fd59977 | 138 | myCurString->next = aNextElem; |
139 | myCurString = aNextElem; | |
140 | strncpy(myCurString->buf + myCurString->len, aStr + freeLen, aLen); | |
141 | } | |
142 | myCurString->len += aLen - 1; | |
143 | *(myCurString->buf + myCurString->len) = '\0'; | |
144 | ||
145 | myLength += n; | |
146 | return n; | |
147 | } | |
148 | ||
149 | //streamsize LDOM_SBuffer::xsgetn(char* s, streamsize n) | |
150 | //{ return _IO_default_xsgetn(this, s, n); } | |
151 | ||
152 | //======================================================================= | |
153 | //function : LDOM_OSStream() | |
154 | //purpose : Constructor | |
155 | //======================================================================= | |
156 | LDOM_OSStream::LDOM_OSStream (const Standard_Integer theMaxBuf) | |
157 | : Standard_OStream (&myBuffer), myBuffer (theMaxBuf) | |
158 | { | |
159 | init(&myBuffer); | |
160 | } |