4925bfe9921d6bb05cc630ae96a49d481ccfa47b
[occt.git] / src / Interface / Interface_LineBuffer.cxx
1 // Copyright (c) 1999-2014 OPEN CASCADE SAS
2 //
3 // This file is part of Open CASCADE Technology software library.
4 //
5 // This library is free software; you can redistribute it and/or modify it under
6 // the terms of the GNU Lesser General Public License version 2.1 as published
7 // by the Free Software Foundation, with special exception defined in the file
8 // OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
9 // distribution for complete text of the license and disclaimer of any warranty.
10 //
11 // Alternatively, this file may be used under the terms of Open CASCADE
12 // commercial license or contractual agreement.
13
14
15 #include <Interface_LineBuffer.hxx>
16 #include <Standard_OutOfRange.hxx>
17 #include <TCollection_AsciiString.hxx>
18 #include <TCollection_HAsciiString.hxx>
19
20 //  LineBuffer, c est une String avec une Longueur reservee fixe au depart
21 //  et une longueur effective <thelen>. theline(thelen+1) vaut '\0'
22 Interface_LineBuffer::Interface_LineBuffer (const Standard_Integer size)
23     : theline (size+1,' ')
24 {
25   theline.SetValue(1,'\0');
26   themax = size;  theinit = thelen = theget = thekeep = thefriz = 0;
27 }
28
29     void  Interface_LineBuffer::SetMax (const Standard_Integer max)
30 {
31   if (max > theline.Length()) throw Standard_OutOfRange("Interface LineBuffer : SetMax");
32   if (max <= 0) themax = theline.Length();
33   else themax = max;
34 }
35
36
37     void  Interface_LineBuffer::SetInitial (const Standard_Integer initial)
38 {
39   if (thefriz > 0) return;
40   if (initial >= themax) throw Standard_OutOfRange("Interface LineBuffer : SetInitial");
41   if (initial <= 0) theinit = 0;
42   else theinit = initial;
43 }
44
45     void  Interface_LineBuffer::SetKeep ()
46       {  thekeep = -thelen;  }
47
48     Standard_Boolean  Interface_LineBuffer::CanGet (const Standard_Integer more)
49 {
50   theget = more;
51   if ((thelen + theinit + more) <= themax) return Standard_True;
52   if (thekeep < 0) thekeep = -thekeep;
53   return Standard_False;
54 }
55
56     Standard_CString  Interface_LineBuffer::Content () const 
57       {  return theline.ToCString();  }
58
59     Standard_Integer  Interface_LineBuffer::Length () const 
60       {  return thelen + theinit;  }  // +theinit : longueur vraie avec blancs
61
62     void  Interface_LineBuffer::FreezeInitial ()
63       {  thefriz = theinit+1;  theinit = 0;  }
64
65     void  Interface_LineBuffer::Clear ()
66 {
67   theget = thekeep = thelen = thefriz = 0;
68   theline.SetValue(1,'\0');
69 }
70
71 // ....                        RESULTATS                        ....
72
73     void  Interface_LineBuffer::Prepare ()
74 {
75 //  ATTENTION aux blanx initiaux
76   if (theinit > 0) {
77     Standard_Integer i; // svv Jan11 2000 : porting on DEC
78     // pdn Protection
79     if( (thelen +theinit) > themax)
80       return;
81     
82     for (i = thelen + 1; i > 0; i --) {
83       theline.SetValue(i + theinit, theline.Value(i));
84     }
85     for (i = 1; i <= theinit; i ++)  theline.SetValue(i,' ');
86   }
87 //  GERER KEEP : est-il jouable ? sinon, annuler. sioui, noter la jointure
88   if (thekeep > 0) thekeep += (theinit+1);  // theinit, et +1 car Keep INCLUS
89   if (thekeep > 0)
90     {  if ((thelen + theget + theinit - thekeep) >= themax) thekeep = 0;  }
91   if (thekeep > 0)
92     { thekept = theline.Value(thekeep); theline.SetValue(thekeep,'\0');  }
93 }
94
95     void  Interface_LineBuffer::Keep ()
96 {
97 //  Si Keep, sauver de thekeep + 1  a  thelen (+1 pour 0 final)
98   if (thekeep > 0) {
99     theline.SetValue(1,thekept);
100     for (Standard_Integer i = thekeep+1; i <= thelen+theinit+1; i ++) {
101       theline.SetValue(i-thekeep+1, theline.Value(i));
102     }
103     thelen = thelen+theinit-thekeep+1;
104   }
105   else Clear();
106   theget = thekeep = 0;
107   if (thefriz > 0) {  theinit = thefriz - 1;  thefriz = 0;  }
108 }
109
110
111     void  Interface_LineBuffer::Move (TCollection_AsciiString& str)
112 {
113   Prepare();
114   str.AssignCat(theline.ToCString());
115   Keep();
116 }
117
118     void  Interface_LineBuffer::Move (const Handle(TCollection_HAsciiString)& str)
119 {
120   Prepare();
121   str->AssignCat(theline.ToCString());
122   Keep();
123 }
124
125     Handle(TCollection_HAsciiString)  Interface_LineBuffer::Moved ()
126 {
127   Prepare();
128   Handle(TCollection_HAsciiString) R =
129     new TCollection_HAsciiString(theline.ToCString());
130   Keep();
131   return R;
132 }
133
134 // ....                        AJOUTS                        ....
135
136     void  Interface_LineBuffer::Add (const Standard_CString text)
137       {  Add (text,(Standard_Integer)strlen(text));  }
138
139     void  Interface_LineBuffer::Add
140   (const Standard_CString text, const Standard_Integer lntext)
141 {
142   Standard_Integer lnt =
143     (lntext > (themax-thelen-theinit) ? (themax-thelen-theinit) : lntext);
144   for (Standard_Integer i = 1; i <= lnt; i ++)
145     theline.SetValue (thelen+i, text[i-1]);
146   thelen += lnt;
147   theline.SetValue (thelen+1, '\0');
148 }
149
150     void  Interface_LineBuffer::Add (const TCollection_AsciiString& text)
151       {  Add ( text.ToCString() , text.Length() );  }
152
153     void  Interface_LineBuffer::Add (const Standard_Character text)
154 {
155   theline.SetValue (thelen+1,text);
156   thelen ++;
157   theline.SetValue (thelen+1,'\0');
158 }