summaryrefslogtreecommitdiff
path: root/autodoc/source/inc/tools/tkpchars.hxx
diff options
context:
space:
mode:
Diffstat (limited to 'autodoc/source/inc/tools/tkpchars.hxx')
-rw-r--r--autodoc/source/inc/tools/tkpchars.hxx170
1 files changed, 170 insertions, 0 deletions
diff --git a/autodoc/source/inc/tools/tkpchars.hxx b/autodoc/source/inc/tools/tkpchars.hxx
new file mode 100644
index 000000000000..2ebe0d000e84
--- /dev/null
+++ b/autodoc/source/inc/tools/tkpchars.hxx
@@ -0,0 +1,170 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#ifndef ADC_TKPCHARS_HXX
+#define ADC_TKPCHARS_HXX
+
+// USED SERVICES
+ // BASE CLASSES
+ // COMPONENTS
+ // PARAMETRS
+#include <adc_cl.hxx>
+#include <stack>
+
+
+
+/** @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
+
+