adam@571: let read_line () = adamc@22: try adamc@23: Some (read_line ()) adamc@22: with End_of_file -> None adamc@22: adamc@22: let rec initial last_was_empty = adamc@23: match read_line () with adamc@22: | None -> () adamc@22: | Some "(* begin thide *)" -> thide last_was_empty adamc@22: | Some "" -> adam@571: if not (last_was_empty) then adam@571: print_newline (); adam@571: initial true adamc@22: | Some line -> adam@571: let idx = try Some (String.index line '(') with Not_found -> None in adam@571: match idx with adam@571: | Some idx -> adam@571: if String.length line > idx+1 && line.[idx+1] = '*' adam@571: && not (String.length line > idx+4 && String.sub line (idx+2) 3 = " EX") then adam@571: if line.[String.length line - 2] = '*' && line.[String.length line - 1] = ')' then adam@571: initial last_was_empty adam@571: else adam@571: comment 1 last_was_empty adam@571: else begin adam@571: print_endline line; adam@571: initial false adam@571: end adam@571: | None -> adam@571: print_endline line; adam@571: initial false adamc@22: adamc@77: and comment count last_was_empty = adamc@23: match read_line () with adamc@22: | None -> () adamc@22: | Some line -> adam@571: if String.length line >= 2 && line.[0] = '(' && line.[1] = '*' then adam@571: if String.length line >= 2 && line.[String.length line - 2] = '*' adam@571: && line.[String.length line - 1] = ')' then adam@571: comment count last_was_empty adamc@22: else adam@571: comment (count+1) last_was_empty adam@571: else if String.length line >= 2 && line.[String.length line - 2] = '*' adam@571: && line.[String.length line - 1] = ')' then adam@571: if try adam@571: let idx = String.index line '(' in adam@571: idx < String.length line - 1 && line.[idx + 1] = '*' adam@571: with Not_found -> false then adam@571: comment count last_was_empty adam@571: else if count = 1 then adam@571: initial last_was_empty adam@571: else adam@571: comment (count-1) last_was_empty adam@571: else adam@571: comment count last_was_empty adamc@22: adamc@22: and thide last_was_empty = adamc@23: match read_line () with adamc@22: | None -> () adamc@22: | Some "(* end thide *)" -> initial last_was_empty adamc@22: | Some _ -> thide last_was_empty adamc@22: adamc@22: let () = initial false