1 // File: LDOM_OSStream.cxx
2 // Created: 01.10.01 10:57:37
3 // Author: Julia DOROVSKIKH
4 // Copyright: Open Cascade 2001
7 #include <LDOM_OSStream.hxx>
9 #include <Standard_Integer.hxx>
11 // One element of sequence
14 char* buf; // pointer on data string
15 int len; // quantity of really written data
16 LDOM_StringElem* next; // pointer on the next element of a sequence
18 LDOM_StringElem (int aLen)
28 if (next) delete next;
30 friend class LDOM_SBuffer;
33 //=======================================================================
34 //function : LDOM_SBuffer()
36 //=======================================================================
37 LDOM_SBuffer::LDOM_SBuffer (const Standard_Integer theMaxBuf)
38 : myMaxBuf (theMaxBuf), myLength(0)
40 myFirstString = new LDOM_StringElem (theMaxBuf);
41 myCurString = myFirstString;
44 //=======================================================================
45 //function : ~LDOM_SBuffer()
47 //=======================================================================
48 LDOM_SBuffer::~LDOM_SBuffer ()
50 if (myFirstString) delete myFirstString;
53 //=======================================================================
56 //=======================================================================
57 void LDOM_SBuffer::Clear ()
59 if (myFirstString->next) delete myFirstString->next;
60 myFirstString->next = 0;
61 myFirstString->len = 0;
63 myCurString = myFirstString;
66 //=======================================================================
69 //=======================================================================
70 Standard_CString LDOM_SBuffer::str () const
72 char* aRetStr = new char [myLength + 1];
74 LDOM_StringElem* aCurElem = myFirstString;
78 strncpy(aRetStr + aCurLen, aCurElem->buf, aCurElem->len);
79 aCurLen += aCurElem->len;
80 aCurElem = aCurElem->next;
82 *(aRetStr + myLength) = '\0';
87 //=======================================================================
88 //function : overflow()
89 //purpose : redefined virtual
90 //=======================================================================
91 int LDOM_SBuffer::overflow(int c)
97 //=======================================================================
98 //function : underflow
99 //purpose : redefined virtual
100 //=======================================================================
102 int LDOM_SBuffer::underflow()
107 //int LDOM_SBuffer::uflow()
110 //=======================================================================
111 //function : xsputn()
112 //purpose : redefined virtual
113 //=======================================================================
114 int LDOM_SBuffer::xsputn(const char* aStr, int n)
117 int freeLen = myMaxBuf - myCurString->len - 1;
120 strncpy(myCurString->buf + myCurString->len, aStr, aLen);
122 else if (freeLen <= 0)
124 LDOM_StringElem* aNextElem = new LDOM_StringElem(Max(aLen, myMaxBuf));
125 myCurString->next = aNextElem;
126 myCurString = aNextElem;
127 strncpy(myCurString->buf + myCurString->len, aStr, aLen);
129 else // 0 < freeLen < n
131 // copy string by parts
132 strncpy(myCurString->buf + myCurString->len, aStr, freeLen);
133 myCurString->len += freeLen;
134 *(myCurString->buf + myCurString->len) = '\0';
136 LDOM_StringElem* aNextElem = new LDOM_StringElem(Max(aLen, myMaxBuf));
137 myCurString->next = aNextElem;
138 myCurString = aNextElem;
139 strncpy(myCurString->buf + myCurString->len, aStr + freeLen, aLen);
141 myCurString->len += aLen - 1;
142 *(myCurString->buf + myCurString->len) = '\0';
148 //streamsize LDOM_SBuffer::xsgetn(char* s, streamsize n)
149 //{ return _IO_default_xsgetn(this, s, n); }
151 //=======================================================================
152 //function : LDOM_OSStream()
153 //purpose : Constructor
154 //=======================================================================
155 LDOM_OSStream::LDOM_OSStream (const Standard_Integer theMaxBuf)
156 : Standard_OStream (&myBuffer), myBuffer (theMaxBuf)