summaryrefslogtreecommitdiff
path: root/parsing/location.ml
diff options
context:
space:
mode:
Diffstat (limited to 'parsing/location.ml')
-rw-r--r--parsing/location.ml131
1 files changed, 0 insertions, 131 deletions
diff --git a/parsing/location.ml b/parsing/location.ml
deleted file mode 100644
index 7abb855882..0000000000
--- a/parsing/location.ml
+++ /dev/null
@@ -1,131 +0,0 @@
-open Lexing
-
-type t =
- { loc_start: int; loc_end: int }
-
-let none = { loc_start = -1; loc_end = -1 }
-
-let symbol_loc () =
- { loc_start = Parsing.symbol_start(); loc_end = Parsing.symbol_end() }
-
-let rhs_loc n =
- { loc_start = Parsing.rhs_start n; loc_end = Parsing.rhs_end n }
-
-let input_name = ref ""
-
-let input_lexbuf = ref (None : lexbuf option)
-
-(* Determine line numbers and position of beginning of lines in a file *)
-
-let line_pos_file filename loc =
- let ic = open_in_bin filename in
- let pos = ref 0
- and linenum = ref 1
- and linebeg = ref 0 in
- begin try
- while !pos < loc do
- incr pos;
- if input_char ic = '\n' then begin
- incr linenum;
- linebeg := !pos
- end
- done
- with End_of_file -> ()
- end;
- close_in ic;
- (!linenum, !linebeg)
-
-(* Terminal info *)
-
-type terminal_info_status = Unknown | Bad_term | Good_term
-
-let status = ref Unknown
-and num_lines = ref 0
-and cursor_up = ref ""
-and start_standout = ref ""
-and end_standout = ref ""
-
-let setup_terminal_info() =
- try
- Terminfo.setupterm();
- num_lines := Terminfo.getnum "li";
- cursor_up := Terminfo.getstr "up";
- begin try
- start_standout := Terminfo.getstr "us";
- end_standout := Terminfo.getstr "ue"
- with Not_found ->
- start_standout := Terminfo.getstr "so";
- end_standout := Terminfo.getstr "se"
- end;
- status := Good_term
- with _ ->
- status := Bad_term
-
-(* Print the location using standout mode. *)
-
-let rec highlight_location loc =
- match !status with
- Unknown ->
- setup_terminal_info(); highlight_location loc
- | Bad_term ->
- false
- | Good_term ->
- match !input_lexbuf with
- None -> false
- | Some lb ->
- (* Char 0 is at offset -lb.lex_abs_pos in lb.lex_buffer. *)
- let pos0 = -lb.lex_abs_pos in
- (* Do nothing if the buffer does not contain the whole phrase. *)
- if pos0 < 0 then false else begin
- (* Count number of lines in phrase *)
- let lines = ref 0 in
- for i = pos0 to String.length lb.lex_buffer - 1 do
- if lb.lex_buffer.[i] = '\n' then incr lines
- done;
- (* If too many lines, give up *)
- if !lines >= !num_lines - 2 then false else begin
- (* Move cursor up that number of lines *)
- for i = 1 to !lines do
- Terminfo.puts stdout !cursor_up 1
- done;
- (* Print the input, switching to standout for the location *)
- let bol = ref true in
- for pos = 0 to String.length lb.lex_buffer - pos0 - 1 do
- if !bol then (print_char '#'; bol := false);
- if pos = loc.loc_start then
- Terminfo.puts stdout !start_standout 1;
- if pos = loc.loc_end then
- Terminfo.puts stdout !end_standout 1;
- let c = lb.lex_buffer.[pos + pos0] in
- print_char c;
- bol := (c = '\n')
- done;
- true
- end
- end
-
-(* Print the location in some way or another *)
-
-open Format
-
-let print loc =
- if String.length !input_name = 0 then
- if highlight_location loc then () else begin
- print_string "Characters ";
- print_int loc.loc_start; print_string "-";
- print_int loc.loc_end; print_string ":";
- force_newline()
- end
- else begin
- let (linenum, linebeg) = line_pos_file !input_name loc.loc_start in
- print_string "File \""; print_string !input_name;
- print_string "\", line "; print_int linenum;
- print_string ", characters "; print_int (loc.loc_start - linebeg);
- print_string "-"; print_int (loc.loc_end - linebeg);
- print_string ":";
- force_newline()
- end
-
-let print_warning loc msg =
- print loc;
- print_string "Warning: "; print_string msg; print_newline()