let analyze_ocaml_compilation on_problem text =
  let lines = Ed_misc.split_string text ['\n'in
  let rec iter = function
    [] | [_] -> ()
  | line1 :: line2 :: q ->
      let f file line start stop =
        let kind =
          try
            let f c =
              let line_len = String.length line2 in
              let warn_len = String.length "Warning X: " in
              let msg = String.sub line2 warn_len (line_len - warn_len) in
              `Warning (c, msg)
            in
            Scanf.sscanf line2 "Warning %c: " f
          with _ -> `Error line2
        in
        let pb =
          { pb_file = file ;
            pb_line = line ;
            pb_start = start ;
            pb_stop = stop ;
            pb_kind = kind ;
          }
        in
        if on_problem pb then iter q else ()
      in
      try Scanf.sscanf line1 "File %S, line %d, characters %d-%d:" f
      with Scanf.Scan_failure _ -> iter (line2 :: q)
  in
  iter lines