20
20
#define __CScanBuffer_h__
22
22
#include "Puma/ScanBuffer.h"
23
#include "Puma/Array.h"
29
ScanBuffer *next_buffer;
27
class CScanBuffer : public ScanBuffer {
36
void decorate (ScanBuffer *nb) { next_buffer = nb; }
33
CScanBuffer () : _new_line_pos (-1) {}
37
34
inline char next ();
38
35
inline void reset ();
39
37
inline void accept (int len);
41
bool new_line () const { return on_new_line; }
42
char *token () { return next_buffer->token (); }
43
int len () const { return next_buffer->len (); }
44
void more (int len) { next_buffer->more (len); }
45
ScanBuffer::State state () const { return next_buffer->state (); }
38
inline bool new_line (int len) const;
49
42
inline char CScanBuffer::next () {
50
char character = next_buffer->next ();
51
if (character == '\n' && nl_pos == -1)
43
char character = ScanBuffer::next ();
44
if (character == '\n' && _new_line_pos == -1)
45
_new_line_pos = len ();
46
if (ScanBuffer::state () == ScanBuffer::STATE_OK &&
47
ScanBuffer::lookahead () == '\\')
57
52
inline void CScanBuffer::reset () {
58
next_buffer->reset ();
65
58
inline void CScanBuffer::retry () {
67
next_buffer->retry ();
71
63
inline void CScanBuffer::accept (int len) {
72
on_new_line = (nl_pos >= 0 && nl_pos < len);
74
next_buffer->accept (len);
64
ScanBuffer::accept (len);
68
inline bool CScanBuffer::new_line (int len) const {
69
return _new_line_pos != -1 && _new_line_pos <= len;
77
72
} // namespace Puma