Blame frx/frx_misc.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
(* Delayed global, a.k.a cache&carry *)
Packit bd2e5d
let autodef f =
Packit bd2e5d
  let v = ref None in
Packit bd2e5d
  (function () ->
Packit bd2e5d
     match !v with
Packit bd2e5d
       None ->
Packit bd2e5d
         let x = f() in
Packit bd2e5d
           v := Some x;
Packit bd2e5d
           x
Packit bd2e5d
     | Some x -> x)
Packit bd2e5d
Packit bd2e5d
open Camltk
Packit bd2e5d
Packit bd2e5d
(* allows Data in options *)
Packit bd2e5d
let create_photo options =
Packit bd2e5d
  let hasopt = ref None in
Packit bd2e5d
  (* Check options *)
Packit bd2e5d
  List.iter (function
Packit bd2e5d
      Data s ->
Packit bd2e5d
        begin match !hasopt with
Packit bd2e5d
          None -> hasopt := Some (Data s)
Packit bd2e5d
        | Some _ -> raise (Protocol.TkError "two data sources in options")
Packit bd2e5d
        end
Packit bd2e5d
    | File f ->
Packit bd2e5d
        begin match !hasopt with
Packit bd2e5d
          None -> hasopt := Some (File f)
Packit bd2e5d
        | Some _ -> raise (Protocol.TkError "two data sources in options")
Packit bd2e5d
        end
Packit bd2e5d
    | o -> ())
Packit bd2e5d
    options;
Packit bd2e5d
  match !hasopt with
Packit bd2e5d
    None -> raise (Protocol.TkError "no data source in options")
Packit bd2e5d
  | Some (Data s) ->
Packit bd2e5d
      begin
Packit bd2e5d
        let tmpfile = Filename.temp_file "img" "" in
Packit bd2e5d
        let oc = open_out_bin tmpfile in
Packit bd2e5d
        output_string oc s;
Packit bd2e5d
        close_out oc;
Packit bd2e5d
        let newopts =
Packit bd2e5d
          List.map (function
Packit bd2e5d
            | Data s -> File tmpfile
Packit bd2e5d
            | o -> o)
Packit bd2e5d
            options in
Packit bd2e5d
        try
Packit bd2e5d
          let i = Imagephoto.create newopts in
Packit bd2e5d
          (try Sys.remove tmpfile with Sys_error _ -> ());
Packit bd2e5d
          i
Packit bd2e5d
        with
Packit bd2e5d
          e ->
Packit bd2e5d
            (try Sys.remove tmpfile with Sys_error _ -> ());
Packit bd2e5d
            raise e
Packit bd2e5d
      end
Packit bd2e5d
  | Some (File s) -> Imagephoto.create options
Packit bd2e5d
  | _ -> assert false