View Javadoc

1   /* This file is part of the project "Hilbert II" - http://www.qedeq.org" target="alexandria_uri">http://www.qedeq.org
2    *
3    * Copyright 2000-2014,  Michael Meyling <mime@qedeq.org>.
4    *
5    * "Hilbert II" is free software; you can redistribute
6    * it and/or modify it under the terms of the GNU General Public
7    * License as published by the Free Software Foundation; either
8    * version 2 of the License, or (at your option) any later version.
9    *
10   * This program is distributed in the hope that it will be useful,
11   * but WITHOUT ANY WARRANTY; without even the implied warranty of
12   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13   * GNU General Public License for more details.
14   */
15  
16  package org.qedeq.kernel.bo.parser;
17  
18  import java.util.Stack;
19  
20  import org.qedeq.base.io.TextInput;
21  
22  /**
23   * Remember TextInput positions.
24   *
25   * @author  Michael Meyling
26   */
27  public class MementoTextInput {
28  
29      /** For remembering input positions. */
30      private final Stack stack = new Stack();
31  
32      /** Input source to parse. */
33      private final TextInput input;
34  
35      /**
36       * Constructor.
37       *
38       * @param   input   Input source to parse.
39       */
40      public MementoTextInput(final TextInput input) {
41          this.input = input;
42      }
43  
44      /**
45       * Remember current position.
46       */
47      public void markPosition() {
48          stack.push(new Integer(input.getPosition()));
49      }
50  
51      /**
52       * Rewind to previous marked position. Also clears the mark.
53       *
54       * @return  Current position before pop.
55       */
56      public long rewindPosition() {
57          final long oldPosition = getPosition();
58          input.setPosition(((Integer) stack.pop()).intValue());
59          return oldPosition;
60      }
61  
62      /**
63       * Forget last remembered position.
64       */
65      public void clearMark() {
66          stack.pop();
67      }
68  
69      /**
70       * Get byte position.
71       *
72       * @return  Position.
73       */
74      public long getPosition() {
75          return input.getPosition();
76      }
77  
78      /**
79       * Reads a single character and does not change the reading
80       * position.
81       *
82       * @return  character read, if there are no more chars
83       *          <code>-1</code> is returned
84       */
85      public int getChar() {
86          return input.getChar();
87      }
88  
89      /**
90       * Reads a single character and increments the reading position
91       * by one.
92       *
93       * @return  character read, if there are no more chars
94       *          <code>-1</code> is returned
95       */
96      public int read() {
97          return input.read();
98      }
99  
100     /**
101      * Are there still any characters to read?
102      *
103      * @return  Anything left for reading further?
104      */
105     public final boolean isEmpty() {
106         return input.isEmpty();
107     }
108 
109     /**
110      * Get rewind stack size.
111      *
112      * @return  Rewind stack size.
113      */
114     public int getRewindStackSize() {
115         return stack.size();
116     }
117 
118     /**
119      * Returns the current column number.
120      *
121      * @return  Current column number (starting with line 1).
122      */
123     public int getColumn() {
124         return input.getColumn();
125     }
126 
127     /**
128      * Returns the current line number.
129      *
130      * @return  Current line number (starting with line 1).
131      */
132     public int getRow() {
133         return input.getRow();
134     }
135 
136     /**
137      * Returns the current line.
138      *
139      * @return  Current line.
140      */
141     public String getLine() {
142         return input.getLine();
143     }
144 
145     /**
146      * Decrements the reading position by one and reads a single character.
147      * If no characters are left, <code>-1</code> is returned.
148      * Otherwise a cast to <code>char</code> gives the character read.
149      *
150      * @return  Character read, if there are no more chars
151      *          <code>-1</code> is returned.
152      */
153     public int readInverse() {
154         return input.readInverse();
155     }
156 
157 }