/************************************************************** * * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. * *************************************************************/ #ifndef ADC_TKPCHARS_HXX #define ADC_TKPCHARS_HXX // USED SERVICES // BASE CLASSES // COMPONENTS // PARAMETRS #include #include /** @descr dpSource: 1||||||||||||||||||||||a||||||||||||b|||c||||||||||||||||||||... 1 := first character of Sourcecode. a := nLastTokenStart, there starts the last cut token. b := nLastCut, there is a '\0'-char which marks the end of the last cut token. The original character at b is stored in cCharAtLastCut and will replace the '\0'-char, when the next token is cut. c := The current cursor position. @needs cosv.lib @use This class can be used by any parser to get the chars of a text one by one and separate them to tokens. **/ class CharacterSource { public: // LIFECYCLE CharacterSource(); ~CharacterSource(); // OPERATIONS /** Loads the complete contents of in_rSource into the classes private memory. If in_rSource is a file, it has to be open of course. After loading the text, the CurChar() is set on the begin of the text. **/ void LoadText( csv::bstream & io_rSource); void InsertTextAtCurPos( const char * i_sText2Insert ); /// @return CurChar() after moving forward one char. char MoveOn(); /** @return The token which starts at the char which was CurChar(), when CutToken() was called the last time - or at the beginning of the text. The token ends by the CurChar() being replaced by a '\0'. Value is valid until the next call of CutToken() or ~CharacterSource(). **/ const char * CutToken(); // INQUIRY char CurChar() const; /// @return The result of the last CutToken(). Or NULL, if there was none yet. const char * CurToken() const; // INQUIRY /// @return true, if bool IsFinished() const; private: struct S_SourceState { DYN char * dpSource; intt nSourceSize; intt nCurPos; intt nLastCut; intt nLastTokenStart; char cCharAtLastCut; S_SourceState( DYN char * dpSource, intt nSourceSize, intt nCurPos, intt nLastCut, intt nLastTokenStart, char cCharAtLastCut ); }; void BeginSource(); intt CurPos() const; char MoveOn_OverStack(); // DATA std::stack< S_SourceState > aSourcesStack; DYN char * dpSource; intt nSourceSize; intt nCurPos; intt nLastCut; intt nLastTokenStart; char cCharAtLastCut; }; inline char CharacterSource::MoveOn() { if (DEBUG_ShowText()) { Cerr() << char(dpSource[nCurPos+1]) << Flush(); } if ( nCurPos < nSourceSize-1 ) return dpSource[++nCurPos]; else if ( aSourcesStack.size() > 0 ) return MoveOn_OverStack(); else return dpSource[nCurPos = nSourceSize]; } inline char CharacterSource::CurChar() const { return nCurPos != nLastCut ? dpSource[nCurPos] : cCharAtLastCut; } inline const char * CharacterSource::CurToken() const { return &dpSource[nLastTokenStart]; } inline bool CharacterSource::IsFinished() const { return nCurPos >= nSourceSize; } inline intt CharacterSource::CurPos() const { return nCurPos; } #endif