Next: How do I use my own I/O classes in a C++ scanner?, Previous: Memory leak - 16386 bytes allocated by malloc., Up: FAQ [Contents][Index]
> We thought that it would be possible to have this number through the > evaluation of the following expression: > > seek_position = (no_buffers)*YY_READ_BUF_SIZE + yy_c_buf_p - YY_CURRENT_BUFFER->yy_ch_buf
While this is the right idea, it has two problems. The first is that
it’s possible that flex
will request less than YY_READ_BUF_SIZE
during
an invocation of YY_INPUT
(or that your input source will return less
even though YY_READ_BUF_SIZE
bytes were requested). The second problem
is that when refilling its internal buffer, flex
keeps some characters
from the previous buffer (because usually it’s in the middle of a match,
and needs those characters to construct yytext
for the match once it’s
done). Because of this, yy_c_buf_p - YY_CURRENT_BUFFER->yy_ch_buf
won’t
be exactly the number of characters already read from the current buffer.
An alternative solution is to count the number of characters you’ve matched
since starting to scan. This can be done by using YY_USER_ACTION
. For
example,
#define YY_USER_ACTION num_chars += yyleng;
(You need to be careful to update your bookkeeping if you use yymore(
),
yyless()
, unput()
, or input()
.)