Had to modify .gitignore to unmask README in subfolders.
autom4te.cache
configure
install-sh
-README
+/README
aclocal.m4
Makefile
Makefile.in
--- /dev/null
+// Build with "--input custom" re2c switch.
+//
+// This is an example of handling fixed-length buffer with "--input custom":
+// on each YYPEEK we check for the end of input, thus YYFILL generation
+// can be safely suppressed.
+//
+// Note that YYLIMIT points not to terminating NULL, but to the previous
+// character: we emulate the case when input has no terminating NULL.
+//
+// For a real-life example see https://github.com/sopyer/mjson
+// or mjson.re from re2c test collection.
+
+bool lex (const char * cursor, const char * const limit)
+{
+ const char * marker;
+ const char * ctxmarker;
+# define YYCTYPE char
+# define YYPEEK() (cursor >= limit ? 0 : *cursor)
+# define YYSKIP() ++cursor
+# define YYBACKUP() marker = cursor
+# define YYBACKUPCTX() ctxmarker = cursor
+# define YYRESTORE() cursor = marker
+# define YYRESTORECTX() cursor = ctxmarker
+ /*!re2c
+ re2c:yyfill:enable = 0;
+ "int buffer " / "[" [0-9]+ "]" { return true; }
+ * { return false; }
+ */
+}
+
+int main ()
+{
+ char buffer [] = "int buffer [1024]";
+ return !lex (buffer, buffer + sizeof (buffer) - 1);
+}
--- /dev/null
+Build with "--input custom" re2c switch.
+
+These are three examples of "--input custom" usage:
+
+- input_custom_default.re:
+ implements default re2c input model (pointers to plain buffer)
+
+- input_custom_fgetc:
+ implements C-style file input (using <stdio.h>)
+
+- input_custom_fgetc:
+ implements std::istringstream input
+
+Note that these examples are very simple and don't need
+to implement YYFILL; the only reason they don't use
+"re2c:yyfill:enable = 0;" is to keep YYEOI and YYLIMIT
+(for the sake of example).
+
+In real-life programs one will need to care for correct
+end-of-input handling.
--- /dev/null
+bool lex (const char * cursor, const char * const limit)
+{
+ const char * marker;
+ const char * ctxmarker;
+# define YYCTYPE char
+# define YYPEEK() *cursor
+# define YYSKIP() ++cursor
+# define YYBACKUP() marker = cursor
+# define YYBACKUPCTX() ctxmarker = cursor
+# define YYRESTORE() cursor = marker
+# define YYRESTORECTX() cursor = ctxmarker
+# define YYEOI(n) limit - cursor < n
+# define YYFILL(n) {}
+ /*!re2c
+ "int buffer " / "[" [0-9]+ "]" { return true; }
+ * { return false; }
+ */
+}
+
+int main ()
+{
+ char buffer [] = "int buffer [1024]";
+ return !lex (buffer, buffer + sizeof (buffer));
+}
--- /dev/null
+#include <stdio.h>
+
+char peek (FILE * f)
+{
+ char c = fgetc (f);
+ ungetc (c, f);
+ return c;
+}
+
+bool lex (FILE * f, const long limit)
+{
+ long marker;
+ long ctxmarker;
+# define YYCTYPE char
+# define YYPEEK() peek (f)
+# define YYSKIP() fgetc (f)
+# define YYBACKUP() marker = ftell (f)
+# define YYBACKUPCTX() ctxmarker = ftell (f)
+# define YYRESTORE() fseek (f, marker, SEEK_SET)
+# define YYRESTORECTX() fseek (f, ctxmarker, SEEK_SET)
+# define YYEOI(n) limit - ftell (f) < n
+# define YYFILL(n) {}
+ /*!re2c
+ "int buffer " / "[" [0-9]+ "]" { return true; }
+ * { return false; }
+ */
+}
+
+int main ()
+{
+ const char buffer [] = "int buffer [1024]";
+ const char fn [] = "input.txt";
+
+ FILE * f = fopen (fn, "w");
+ fwrite (buffer, 1, sizeof (buffer), f);
+ fclose (f);
+
+ f = fopen (fn, "rb");
+ int result = !lex (f, sizeof (buffer));
+ fclose (f);
+
+ return result;
+}
--- /dev/null
+#include <sstream>
+
+bool lex (std::istringstream & is, const std::streampos limit)
+{
+ std::streampos marker;
+ std::streampos ctxmarker;
+# define YYCTYPE char
+# define YYPEEK() is.peek ()
+# define YYSKIP() is.ignore ()
+# define YYBACKUP() marker = is.tellg ()
+# define YYBACKUPCTX() ctxmarker = is.tellg ()
+# define YYRESTORE() is.seekg (marker)
+# define YYRESTORECTX() is.seekg (ctxmarker)
+# define YYEOI(n) limit - is.tellg () < n
+# define YYFILL(n) {}
+ /*!re2c
+ "int buffer " / "[" [0-9]+ "]" { return true; }
+ * { return false; }
+ */
+}
+
+int main ()
+{
+ const char buffer [] = "int buffer [1024]";
+ std::istringstream is (buffer);
+ return !lex (is, sizeof (buffer));
+}