Root Zanli
Home
Console
Upload
information
Create File
Create Folder
About
Tools
:
/
proc
/
thread-self
/
root
/
usr
/
share
/
doc
/
re2c
/
examples
/
c
/
fill
/
Filename :
01_fill.re
back
Copy
// re2c $INPUT -o $OUTPUT #include <assert.h> #include <stdio.h> #include <string.h> #define SIZE 4096 typedef struct { FILE *file; char buf[SIZE + 1], *lim, *cur, *mar, *tok; int eof; } Input; static int fill(Input *in) { if (in->eof) { return 1; } const size_t free = in->tok - in->buf; if (free < 1) { return 2; } memmove(in->buf, in->tok, in->lim - in->tok); in->lim -= free; in->cur -= free; in->mar -= free; in->tok -= free; in->lim += fread(in->lim, 1, free, in->file); in->lim[0] = 0; in->eof |= in->lim < in->buf + SIZE; return 0; } static void init(Input *in, FILE *file) { in->file = file; in->cur = in->mar = in->tok = in->lim = in->buf + SIZE; in->eof = 0; fill(in); } static int lex(Input *in) { int count = 0; loop: in->tok = in->cur; /*!re2c re2c:eof = 0; re2c:api:style = free-form; re2c:define:YYCTYPE = char; re2c:define:YYCURSOR = in->cur; re2c:define:YYMARKER = in->mar; re2c:define:YYLIMIT = in->lim; re2c:define:YYFILL = "fill(in) == 0"; * { return -1; } $ { return count; } ['] ([^'\\] | [\\][^])* ['] { ++count; goto loop; } [ ]+ { goto loop; } */ } int main() { const char *fname = "input"; const char str[] = "'qu\0tes' 'are' 'fine: \\'' "; FILE *f; Input in; // prepare input file: a few times the size of the buffer, // containing strings with zeroes and escaped quotes f = fopen(fname, "w"); for (int i = 0; i < SIZE; ++i) { fwrite(str, 1, sizeof(str) - 1, f); } fclose(f); f = fopen(fname, "r"); init(&in, f); assert(lex(&in) == SIZE * 3); fclose(f); remove(fname); return 0; }