Blame compiler/ppexec.ml

Packit bd2e5d
(***********************************************************************)
Packit bd2e5d
(*                                                                     *)
Packit bd2e5d
(*                 MLTk, Tcl/Tk interface of OCaml                     *)
Packit bd2e5d
(*                                                                     *)
Packit bd2e5d
(*    Francois Rouaix, Francois Pessaux, Jun Furuse and Pierre Weis    *)
Packit bd2e5d
(*               projet Cristal, INRIA Rocquencourt                    *)
Packit bd2e5d
(*            Jacques Garrigue, Kyoto University RIMS                  *)
Packit bd2e5d
(*                                                                     *)
Packit bd2e5d
(*  Copyright 2002 Institut National de Recherche en Informatique et   *)
Packit bd2e5d
(*  en Automatique and Kyoto University.  All rights reserved.         *)
Packit bd2e5d
(*  This file is distributed under the terms of the GNU Library        *)
Packit bd2e5d
(*  General Public License, with the special exception on linking      *)
Packit bd2e5d
(*  described in file LICENSE found in the OCaml source tree.          *)
Packit bd2e5d
(*                                                                     *)
Packit bd2e5d
(***********************************************************************)
Packit bd2e5d
Packit bd2e5d
open Code
Packit bd2e5d
Packit bd2e5d
let debug = ref false
Packit bd2e5d
let defined = ref []
Packit bd2e5d
let linenum = ref 1
Packit bd2e5d
Packit bd2e5d
let rec nop = function
Packit bd2e5d
  | Line _ -> incr linenum
Packit bd2e5d
  | Ifdef (_, _, c1, c2o) ->
Packit bd2e5d
      List.iter nop c1;
Packit bd2e5d
      begin match c2o with
Packit bd2e5d
      | Some c2 -> List.iter nop c2
Packit bd2e5d
      | None -> ()
Packit bd2e5d
      end
Packit bd2e5d
  | _ -> ()
Packit bd2e5d
;;
Packit bd2e5d
Packit bd2e5d
let rec exec lp f = function
Packit bd2e5d
  | Line line ->
Packit bd2e5d
      if !debug then
Packit bd2e5d
        prerr_endline (Printf.sprintf "%03d: %s" !linenum
Packit bd2e5d
                         (String.sub line 0 ((String.length line) - 1)));
Packit bd2e5d
      f line; incr linenum
Packit bd2e5d
  | Ifdef (sw, k, c1, c2o) ->
Packit bd2e5d
      if List.mem k !defined = sw then begin
Packit bd2e5d
        List.iter (exec lp f) c1;
Packit bd2e5d
        begin match c2o with
Packit bd2e5d
        | Some c2 -> List.iter nop c2
Packit bd2e5d
        | None -> ()
Packit bd2e5d
        end;
Packit bd2e5d
        lp !linenum
Packit bd2e5d
      end else begin
Packit bd2e5d
        List.iter nop c1;
Packit bd2e5d
        match c2o with
Packit bd2e5d
        | Some c2 ->
Packit bd2e5d
            lp !linenum;
Packit bd2e5d
            List.iter (exec lp f) c2
Packit bd2e5d
        | None -> ()
Packit bd2e5d
      end
Packit bd2e5d
  | Define k -> defined := k :: !defined
Packit bd2e5d
  | Undef k ->
Packit bd2e5d
      defined := List.fold_right (fun k' s ->
Packit bd2e5d
        if k = k' then s else k' :: s) [] !defined
Packit bd2e5d
;;