1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 
24 #ifndef ADC_TKPCHARS_HXX
25 #define ADC_TKPCHARS_HXX
26 
27 // USED SERVICES
28 	// BASE CLASSES
29 	// COMPONENTS
30 	// PARAMETRS
31 #include <adc_cl.hxx>
32 #include <stack>
33 
34 
35 
36 /**	@descr
37 
38 	dpSource:
39 
40 	1||||||||||||||||||||||a||||||||||||b|||c||||||||||||||||||||...
41 
42 
43 	1 := first character of Sourcecode.
44 	a := nLastTokenStart, there starts the last cut token.
45 	b := nLastCut, there is a '\0'-char which marks the end of
46 		 the last cut token. The original character at b is stored
47 		 in cCharAtLastCut and will replace the '\0'-char, when the
48 		 next token is cut.
49 	c := The current cursor position.
50 
51 
52 	@needs 	cosv.lib
53 
54 	@use    This class can be used by any parser to get the chars of a
55 			text one by one and separate them to tokens.
56 **/
57 
58 class CharacterSource
59 {
60 	public:
61 		// LIFECYCLE
62 						CharacterSource();
63 						~CharacterSource();
64 
65 		// OPERATIONS
66 		/** Loads the complete contents of in_rSource into the classes private memory.
67 			If in_rSource is a file, it has to be open of course.
68             After loading the text, the CurChar() is set on the begin of the text.
69 		**/
70 		void			LoadText(
71 							csv::bstream &		io_rSource);
72 
73         void            InsertTextAtCurPos(
74                             const char *        i_sText2Insert );
75 
76 		///	@return CurChar() after moving forward one char.
77             char            MoveOn();
78 		/** @return
79 			The token which starts at the char which was CurChar(), when
80 			CutToken() was called the last time - or at the beginning of the text.
81 			The token ends by the CurChar() being replaced by a '\0'.
82 
83 			Value is valid until the next call of CutToken() or ~CharacterSource().
84 		**/
85 		const char *	CutToken();
86 
87 		// INQUIRY
88         char            CurChar() const;
89 		/// @return The result of the last CutToken(). Or NULL, if there was none yet.
90 		const char *	CurToken() const;
91 
92 	// INQUIRY
93 		/// @return true, if
94 		bool			IsFinished() const;
95 
96 	private:
97         struct S_SourceState
98         {
99     		DYN char *		dpSource;
100 		    intt			nSourceSize;
101 
102 		    intt			nCurPos;
103 		    intt			nLastCut;
104 		    intt			nLastTokenStart;
105 		    char 			cCharAtLastCut;
106 
107                             S_SourceState(
108     		                    DYN char *		dpSource,
109 		                        intt			nSourceSize,
110 		                        intt			nCurPos,
111 		                        intt			nLastCut,
112 		                        intt			nLastTokenStart,
113 		                        char 			cCharAtLastCut );
114         };
115 
116         void            BeginSource();
117 		intt			CurPos() const;
118         char            MoveOn_OverStack();
119 
120         // DATA
121         std::stack< S_SourceState >
122                         aSourcesStack;
123 
124 		DYN char *		dpSource;
125 		intt			nSourceSize;
126 
127 		intt			nCurPos;
128 		intt			nLastCut;
129 		intt			nLastTokenStart;
130 		char 			cCharAtLastCut;
131 };
132 
133 
134 inline char
MoveOn()135 CharacterSource::MoveOn()
136 	{
137 if (DEBUG_ShowText())
138 {
139 		Cerr() << char(dpSource[nCurPos+1]) << Flush();
140 }
141         if ( nCurPos < nSourceSize-1 )
142     		return dpSource[++nCurPos];
143         else if ( aSourcesStack.size() > 0 )
144             return MoveOn_OverStack();
145         else
146             return dpSource[nCurPos = nSourceSize];
147 	}
148 inline char
CurChar() const149 CharacterSource::CurChar() const
150 	{ return nCurPos != nLastCut ? dpSource[nCurPos] : cCharAtLastCut; }
151 inline const char *
CurToken() const152 CharacterSource::CurToken() const
153 	{ return &dpSource[nLastTokenStart]; }
154 inline bool
IsFinished() const155 CharacterSource::IsFinished() const
156 	{ return nCurPos >= nSourceSize; }
157 inline intt
CurPos() const158 CharacterSource::CurPos() const
159 	{ return nCurPos; }
160 
161 
162 
163 
164 #endif
165 
166 
167