File: compr.ml

package info (click to toggle)
ocaml-doc 3.09-1
  • links: PTS
  • area: non-free
  • in suites: etch, etch-m68k
  • size: 10,428 kB
  • ctags: 4,963
  • sloc: ml: 9,244; makefile: 2,413; ansic: 122; sh: 49; asm: 17
file content (69 lines) | stat: -rw-r--r-- 2,665 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
(***********************************************************************)
(*                                                                     *)
(*                           Objective Caml                            *)
(*                                                                     *)
(*               Pierre Weis, projet Cristal, INRIA Rocquencourt       *)
(*                                                                     *)
(*  Copyright 2001 Institut National de Recherche en Informatique et   *)
(*  en Automatique.  All rights reserved.  This file is distributed    *)
(*  only by permission.                                                *)
(*                                                                     *)
(***********************************************************************)
open Sys;;

exception Erreur;;

let traite_fichier traitement nom_entre nom_sortie =
  let entre =
    try open_in_bin nom_entre
    with Sys_error message ->
      prerr_endline ("Erreur  l'ouverture de " ^ nom_entre
                     ^ " : " ^ message);
      raise Erreur in
  let sortie =
    try open_out_bin nom_sortie
    with Sys_error message ->
      close_in entre;
      prerr_endline ("Erreur  la cration de " ^ nom_sortie
                     ^ " : " ^ message);
      raise Erreur in
  try
    traitement entre sortie;
    close_in entre; close_out sortie; remove nom_entre
  with Sys_error message ->
    close_in entre; close_out sortie; remove nom_sortie;
    prerr_endline ("Erreur pendant le traitement de "
                   ^ nom_entre ^ " : " ^ message);
    raise Erreur;;

let compresse_fichier nom_fichier =
  traite_fichier Huffman.compresse
                 nom_fichier (nom_fichier ^ ".cpr");;

let dcompresse_fichier nom_fichier =
  let longueur = String.length nom_fichier in
  if longueur < 4
  || String.sub nom_fichier (longueur - 4) 4 <> ".cpr" then
    let nom_entre = nom_fichier ^ ".cpr"
    and nom_sortie = nom_fichier in
    traite_fichier Huffman.dcompresse nom_entre nom_sortie
  else
    let nom_entre = nom_fichier
    and nom_sortie = String.sub nom_fichier 0 (longueur - 4) in
    traite_fichier Huffman.dcompresse nom_entre nom_sortie;;

if !interactive then () else
  begin
    let erreur = ref false in
    if Array.length argv >= 2 && argv.(1) = "-d" then
      for i = 2 to Array.length argv - 1 do
        try dcompresse_fichier argv.(i)
        with Erreur -> erreur := true
      done
    else
      for i = 1 to Array.length argv - 1 do
        try compresse_fichier argv.(i)
        with Erreur -> erreur := true
      done;
    exit (if !erreur then 2 else 0)
  end;;