37 lines
870 B
C
37 lines
870 B
C
|
/* The "get_next_char" routine for lexers generated by camllex. */
|
||
|
|
||
|
#include "interp.h"
|
||
|
#include "mlvalues.h"
|
||
|
#include "stacks.h"
|
||
|
#include "str.h"
|
||
|
|
||
|
struct lexer_buffer {
|
||
|
value refill_buff;
|
||
|
value lex_buffer;
|
||
|
value lex_abs_pos;
|
||
|
value lex_start_pos;
|
||
|
value lex_curr_pos;
|
||
|
value lex_last_pos;
|
||
|
value lex_last_action;
|
||
|
};
|
||
|
|
||
|
value get_next_char(lexbuf) /* ML */
|
||
|
struct lexer_buffer * lexbuf;
|
||
|
{
|
||
|
mlsize_t buffer_len, curr_pos;
|
||
|
|
||
|
buffer_len = string_length(lexbuf->lex_buffer);
|
||
|
curr_pos = Long_val(lexbuf->lex_curr_pos);
|
||
|
if (curr_pos >= buffer_len) {
|
||
|
Push_roots (r, 1);
|
||
|
r[0] = (value) lexbuf;
|
||
|
callback(lexbuf->refill_buff, (value) lexbuf);
|
||
|
lexbuf = (struct lexer_buffer *) r[0];
|
||
|
curr_pos = Long_val(lexbuf->lex_curr_pos);
|
||
|
Pop_roots ();
|
||
|
}
|
||
|
lexbuf->lex_curr_pos += 2;
|
||
|
return Val_int(Byte_u(lexbuf->lex_buffer, curr_pos));
|
||
|
}
|
||
|
|