(flex.info)How do I track the byte offset for lseek()?


Next: How do I use my own I/O classes in a C++ scanner? Prev: Memory leak - 16386 bytes allocated by malloc. Up: FAQ
Enter node , (file) or (file)node

How do I track the byte offset for lseek()?
===========================================

     >   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()'.)


automatically generated by info2www version 1.2.2.9