1 /************************************************************************* 2 * 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * Copyright 2000, 2010 Oracle and/or its affiliates. 6 * 7 * OpenOffice.org - a multi-platform office productivity suite 8 * 9 * This file is part of OpenOffice.org. 10 * 11 * OpenOffice.org is free software: you can redistribute it and/or modify 12 * it under the terms of the GNU Lesser General Public License version 3 13 * only, as published by the Free Software Foundation. 14 * 15 * OpenOffice.org is distributed in the hope that it will be useful, 16 * but WITHOUT ANY WARRANTY; without even the implied warranty of 17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 18 * GNU Lesser General Public License version 3 for more details 19 * (a copy is included in the LICENSE file that accompanied this code). 20 * 21 * You should have received a copy of the GNU Lesser General Public License 22 * version 3 along with OpenOffice.org. If not, see 23 * <http://www.openoffice.org/license.html> 24 * for a copy of the LGPLv3 License. 25 * 26 ************************************************************************/ 27 28 #ifndef ADC_TKPCHARS_HXX 29 #define ADC_TKPCHARS_HXX 30 31 // USED SERVICES 32 // BASE CLASSES 33 // COMPONENTS 34 // PARAMETRS 35 #include <adc_cl.hxx> 36 #include <stack> 37 38 39 40 /** @descr 41 42 dpSource: 43 44 1||||||||||||||||||||||a||||||||||||b|||c||||||||||||||||||||... 45 46 47 1 := first character of Sourcecode. 48 a := nLastTokenStart, there starts the last cut token. 49 b := nLastCut, there is a '\0'-char which marks the end of 50 the last cut token. The original character at b is stored 51 in cCharAtLastCut and will replace the '\0'-char, when the 52 next token is cut. 53 c := The current cursor position. 54 55 56 @needs cosv.lib 57 58 @use This class can be used by any parser to get the chars of a 59 text one by one and separate them to tokens. 60 **/ 61 62 class CharacterSource 63 { 64 public: 65 // LIFECYCLE 66 CharacterSource(); 67 ~CharacterSource(); 68 69 // OPERATIONS 70 /** Loads the complete contents of in_rSource into the classes private memory. 71 If in_rSource is a file, it has to be open of course. 72 After loading the text, the CurChar() is set on the begin of the text. 73 **/ 74 void LoadText( 75 csv::bstream & io_rSource); 76 77 void InsertTextAtCurPos( 78 const char * i_sText2Insert ); 79 80 /// @return CurChar() after moving forward one char. 81 char MoveOn(); 82 /** @return 83 The token which starts at the char which was CurChar(), when 84 CutToken() was called the last time - or at the beginning of the text. 85 The token ends by the CurChar() being replaced by a '\0'. 86 87 Value is valid until the next call of CutToken() or ~CharacterSource(). 88 **/ 89 const char * CutToken(); 90 91 // INQUIRY 92 char CurChar() const; 93 /// @return The result of the last CutToken(). Or NULL, if there was none yet. 94 const char * CurToken() const; 95 96 // INQUIRY 97 /// @return true, if 98 bool IsFinished() const; 99 100 private: 101 struct S_SourceState 102 { 103 DYN char * dpSource; 104 intt nSourceSize; 105 106 intt nCurPos; 107 intt nLastCut; 108 intt nLastTokenStart; 109 char cCharAtLastCut; 110 111 S_SourceState( 112 DYN char * dpSource, 113 intt nSourceSize, 114 intt nCurPos, 115 intt nLastCut, 116 intt nLastTokenStart, 117 char cCharAtLastCut ); 118 }; 119 120 void BeginSource(); 121 intt CurPos() const; 122 char MoveOn_OverStack(); 123 124 // DATA 125 std::stack< S_SourceState > 126 aSourcesStack; 127 128 DYN char * dpSource; 129 intt nSourceSize; 130 131 intt nCurPos; 132 intt nLastCut; 133 intt nLastTokenStart; 134 char cCharAtLastCut; 135 }; 136 137 138 inline char 139 CharacterSource::MoveOn() 140 { 141 if (DEBUG_ShowText()) 142 { 143 Cerr() << char(dpSource[nCurPos+1]) << Flush(); 144 } 145 if ( nCurPos < nSourceSize-1 ) 146 return dpSource[++nCurPos]; 147 else if ( aSourcesStack.size() > 0 ) 148 return MoveOn_OverStack(); 149 else 150 return dpSource[nCurPos = nSourceSize]; 151 } 152 inline char 153 CharacterSource::CurChar() const 154 { return nCurPos != nLastCut ? dpSource[nCurPos] : cCharAtLastCut; } 155 inline const char * 156 CharacterSource::CurToken() const 157 { return &dpSource[nLastTokenStart]; } 158 inline bool 159 CharacterSource::IsFinished() const 160 { return nCurPos >= nSourceSize; } 161 inline intt 162 CharacterSource::CurPos() const 163 { return nCurPos; } 164 165 166 167 168 #endif 169 170 171