~ubuntu-branches/ubuntu/lucid/camomile/lucid

« back to all changes in this revision

Viewing changes to internal/unimap.ml

  • Committer: Bazaar Package Importer
  • Author(s): Sylvain Le Gall
  • Date: 2005-12-03 01:18:55 UTC
  • Revision ID: james.westby@ubuntu.com-20051203011855-qzvwlld1xyqnl62t
Tags: upstream-0.6.3
ImportĀ upstreamĀ versionĀ 0.6.3

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
(* $Id: unimap.ml,v 1.12 2003/12/19 17:24:34 yori Exp $ *)
 
2
(* Copyright 2002 Yamagata Yoriyuki *)
 
3
 
 
4
type mapping = {no_char : int; tbl : Tbl31.Bytes.t}
 
5
 
 
6
let read_map map i = Tbl31.Bytes.get map.tbl i
 
7
 
 
8
type mapping_rw = {rw_no_char : int; mutable rw_tbl : int IMap.t}
 
9
 
 
10
let create_mapping_rw no_char = 
 
11
  {rw_no_char = no_char; 
 
12
   rw_tbl = IMap.empty}
 
13
 
 
14
let mapping_rw_to_ro rw =
 
15
  {no_char = rw.rw_no_char;
 
16
   tbl = Tbl31.Bytes.of_map rw.rw_no_char rw.rw_tbl}
 
17
 
 
18
let add_mapping map i n = map.rw_tbl <- IMap.add i n map.rw_tbl
 
19
 
 
20
type t = {enc_to_ucs : mapping; ucs_to_enc : mapping}
 
21
 
 
22
type rw = {rw_enc_to_ucs : mapping_rw; rw_ucs_to_enc : mapping_rw}
 
23
 
 
24
let create_rw unused_enc unused_ucs =
 
25
  {rw_enc_to_ucs = create_mapping_rw unused_ucs;
 
26
   rw_ucs_to_enc = create_mapping_rw unused_enc}
 
27
 
 
28
let add map enc ucs =
 
29
  add_mapping map.rw_enc_to_ucs enc ucs;
 
30
  add_mapping map.rw_ucs_to_enc ucs enc
 
31
 
 
32
let rw_to_ro map =
 
33
  {enc_to_ucs = mapping_rw_to_ro map.rw_enc_to_ucs;
 
34
   ucs_to_enc = mapping_rw_to_ro map.rw_ucs_to_enc}
 
35
 
 
36
let no_char_ucs map = map.enc_to_ucs.no_char
 
37
let no_char_enc map = map.ucs_to_enc.no_char
 
38
 
 
39
let enc_to_ucs map enc = read_map map.enc_to_ucs enc
 
40
let ucs_to_enc map ucs = read_map map.ucs_to_enc ucs
 
41
 
 
42
let loaded = Hashtbl.create 0
 
43
 
 
44
let of_name name =
 
45
  try 
 
46
    let b = Hashtbl.find loaded name in
 
47
    match Weak.get b 0 with
 
48
      None ->
 
49
        Hashtbl.remove loaded name;
 
50
        raise Not_found
 
51
    | Some x -> x
 
52
  with Not_found ->
 
53
    let filename = Filename.concat Camomileconfig.unimapdir (name^".mar") in
 
54
    let c = try open_in_bin filename with Sys_error _ -> raise Not_found in
 
55
    let map : t = input_value c in
 
56
    close_in c;
 
57
    let b = Weak.create 1 in
 
58
    Weak.set b 0 (Some map);
 
59
    Hashtbl.add loaded name b;
 
60
    map