]> git.saurik.com Git - apple/security.git/blobdiff - Security/libsecurity_codesigning/antlr2/antlr/InputBuffer.hpp
Security-57031.1.35.tar.gz
[apple/security.git] / Security / libsecurity_codesigning / antlr2 / antlr / InputBuffer.hpp
diff --git a/Security/libsecurity_codesigning/antlr2/antlr/InputBuffer.hpp b/Security/libsecurity_codesigning/antlr2/antlr/InputBuffer.hpp
new file mode 100644 (file)
index 0000000..f557f40
--- /dev/null
@@ -0,0 +1,146 @@
+#ifndef INC_InputBuffer_hpp__
+#define INC_InputBuffer_hpp__
+
+/* ANTLR Translator Generator
+ * Project led by Terence Parr at http://www.jGuru.com
+ * Software rights: http://www.antlr.org/license.html
+ *
+ * $Id: //depot/code/org.antlr/release/antlr-2.7.7/lib/cpp/antlr/InputBuffer.hpp#2 $
+ */
+
+#include <antlr/config.hpp>
+#include <antlr/CircularQueue.hpp>
+#include <string>
+
+#ifdef ANTLR_CXX_SUPPORTS_NAMESPACE
+namespace antlr {
+#endif
+
+/** A Stream of characters fed to the lexer from a InputStream that can
+ * be rewound via mark()/rewind() methods.
+ * <p>
+ * A dynamic array is used to buffer up all the input characters.  Normally,
+ * "k" characters are stored in the buffer.  More characters may be stored during
+ * guess mode (testing syntactic predicate), or when LT(i>k) is referenced.
+ * Consumption of characters is deferred.  In other words, reading the next
+ * character is not done by conume(), but deferred until needed by LA or LT.
+ * <p>
+ *
+ * @see antlr.CharQueue
+ */
+class ANTLR_API InputBuffer {
+public:
+       /** Create a character buffer */
+       InputBuffer()
+       : nMarkers(0)
+       , markerOffset(0)
+       , numToConsume(0)
+       {
+       }
+
+       virtual ~InputBuffer()
+       {
+       }
+
+       /// Reset the input buffer to empty state
+       virtual inline void reset( void )
+       {
+               nMarkers = 0;
+               markerOffset = 0;
+               numToConsume = 0;
+               queue.clear();
+       }
+
+       /** This method updates the state of the input buffer so that
+        * the text matched since the most recent mark() is no longer
+        * held by the buffer.  So, you either do a mark/rewind for
+        * failed predicate or mark/commit to keep on parsing without
+        * rewinding the input.
+        */
+       inline void commit( void )
+       {
+               nMarkers--;
+       }
+
+       /** Mark another character for deferred consumption */
+       virtual inline void consume()
+       {
+               numToConsume++;
+       }
+
+       /** Ensure that the character buffer is sufficiently full */
+       virtual void fill(unsigned int amount);
+
+       /** Override this in subclasses to get the next character */
+       virtual int getChar()=0;
+
+       /** Get a lookahead character */
+       virtual inline int LA(unsigned int i)
+       {
+               fill(i);
+               return queue.elementAt(markerOffset + i - 1);
+       }
+
+       /** Return an integer marker that can be used to rewind the buffer to
+        * its current state.
+        */
+       virtual unsigned int mark();
+       /// Are there any marks active in the InputBuffer
+       virtual inline bool isMarked() const
+       {
+               return (nMarkers != 0);
+       }
+       /** Rewind the character buffer to a marker.
+        * @param mark Marker returned previously from mark()
+        */
+       virtual void rewind(unsigned int mark);
+
+       /** Get the number of non-consumed characters
+        */
+       virtual unsigned int entries() const;
+
+       ANTLR_USE_NAMESPACE(std)string getLAChars() const;
+
+       ANTLR_USE_NAMESPACE(std)string getMarkedChars() const;
+
+protected:
+       // char source
+       // leave to subclasses
+
+       // Number of active markers
+       unsigned int nMarkers; // = 0;
+
+       // Additional offset used when markers are active
+       unsigned int markerOffset; // = 0;
+
+       // Number of calls to consume() since last LA() or LT() call
+       unsigned int numToConsume; // = 0;
+
+       // Circular queue
+       CircularQueue<int> queue;
+
+       /** Sync up deferred consumption */
+       void syncConsume();
+
+private:
+       InputBuffer(const InputBuffer& other);
+       InputBuffer& operator=(const InputBuffer& other);
+};
+
+/** Sync up deferred consumption */
+inline void InputBuffer::syncConsume() {
+       if (numToConsume > 0)
+       {
+               if (nMarkers > 0)
+                       markerOffset += numToConsume;
+               else
+                       queue.removeItems( numToConsume );
+               numToConsume = 0;
+       }
+}
+
+#ifdef ANTLR_CXX_SUPPORTS_NAMESPACE
+}
+#endif
+
+#endif //INC_InputBuffer_hpp__