adam@295: let read_line () = adam@295: try adam@295: Some (read_line ()) adam@295: with End_of_file -> None adam@295: adam@295: let strstr' p s n = adam@295: try adam@295: Some (Str.search_forward (Str.regexp_string p) s n) adam@295: with Not_found -> None adam@295: adam@295: let strstr p s = strstr' p s 0 adam@295: adam@295: let prefix s1 s2 = String.length s2 >= String.length s1 && Str.string_before s2 (String.length s1) = s1 adam@295: adam@295: let sanitize s = adam@295: let rec san n acc = adam@295: try adam@295: let pos = Str.search_forward (Str.regexp "\\[\\|%\\|#") s n in adam@295: let ender = match s.[pos] with adam@295: | '[' -> ']' adam@295: | _ -> s.[pos] in adam@295: let pos' = String.index_from s (pos+1) ender in adam@295: san (pos'+1) (acc ^ String.sub s n (pos-n)) adam@295: with Not_found -> acc ^ Str.string_after s n adam@295: in san 0 "" adam@295: adam@295: let rec initial () = adam@295: match read_line () with adam@295: | None -> () adam@295: | Some line -> adam@295: match strstr "(**" line with adam@295: | None -> initial () adam@295: | Some pos -> adam@295: match strstr "*)" line with adam@295: | None -> adam@295: begin match strstr "[[" line with adam@295: | None -> adam@295: print_endline (sanitize (Str.string_after line (pos+3))); adam@295: comment () adam@295: | Some _ -> runTo "]]" adam@295: end adam@295: | Some pos' -> adam@295: let rest = Str.string_after line (pos+3) in adam@295: if not (prefix " printing" rest || prefix " begin" rest || prefix " end" rest) then adam@295: print_endline (sanitize (String.sub line (pos+3) (pos' - (pos+3)))); adam@295: initial () adam@295: adam@295: and comment () = adam@295: match read_line () with adam@295: | None -> () adam@295: | Some line -> adam@295: match strstr "*)" line with adam@295: | None -> adam@295: begin match strstr "[[" line with adam@295: | None -> adam@295: begin match strstr "<<" line with adam@295: | None -> adam@295: print_endline (sanitize line); adam@295: comment () adam@295: | Some _ -> runTo ">>" adam@295: end adam@295: | Some _ -> runTo "]]" adam@295: end adam@295: | Some pos -> adam@295: print_endline (sanitize (Str.string_before line pos)); adam@295: initial () adam@295: adam@295: and runTo ender = adam@295: match read_line () with adam@295: | None -> () adam@295: | Some line -> adam@295: match strstr ender line with adam@295: | None -> runTo ender adam@295: | _ -> adam@295: match strstr "*)" line with adam@295: | None -> comment () adam@295: | _ -> initial () adam@295: adam@295: let () = initial ()