1(* Auxiliaries for the lexical analyzer *)
2
3local
4  open Fnlib Lexing;
5in
6
7val brace_depth = ref 0;
8val comment_depth = ref 0;
9
10exception Lexical_error of string;
11
12val initial_string_buffer = CharArray.array(256, #" ");
13val string_buff = ref initial_string_buffer;
14val string_index = ref 0;
15
16fun reset_string_buffer () =
17(
18  string_buff := initial_string_buffer;
19  string_index := 0
20);
21
22fun store_string_char c =
23  let open CharArray
24      val len = length (!string_buff)
25  in
26    if !string_index >= len then
27      let val new_buff = array(len * 2, #" ") in
28        copy { src= !string_buff, dst= new_buff, di=0 };
29        string_buff := new_buff
30      end
31    else ();
32    update(!string_buff, !string_index, c);
33    incr string_index
34  end
35;
36
37fun get_stored_string () =
38  let open CharArraySlice
39      val s = vector(slice(!string_buff, 0, SOME (!string_index)))
40  in
41      string_buff := initial_string_buffer;
42      s
43  end;
44
45val char_for_backslash = fn
46    #"n" => #"\010" (* #"\n" *)
47  | #"t" => #"\009" (* #"\t" *)
48  | #"b" => #"\008" (* #"\b" *)
49  | #"r" => #"\013" (* #"\r" *)
50  | c   => c
51;
52
53fun char_for_decimal_code lexbuf i =
54  Char.chr(100 * (Char.ord(getLexemeChar lexbuf i) - 48) +
55            10 * (Char.ord(getLexemeChar lexbuf (i+1)) - 48) +
56                 (Char.ord(getLexemeChar lexbuf (i+2)) - 48))
57;
58
59end;
60