1
(* $Id: unimap.ml,v 1.12 2003/12/19 17:24:34 yori Exp $ *)
2
(* Copyright 2002 Yamagata Yoriyuki *)
4
type mapping = {no_char : int; tbl : Tbl31.Bytes.t}
6
let read_map map i = Tbl31.Bytes.get map.tbl i
8
type mapping_rw = {rw_no_char : int; mutable rw_tbl : int IMap.t}
10
let create_mapping_rw no_char =
11
{rw_no_char = no_char;
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}
18
let add_mapping map i n = map.rw_tbl <- IMap.add i n map.rw_tbl
20
type t = {enc_to_ucs : mapping; ucs_to_enc : mapping}
22
type rw = {rw_enc_to_ucs : mapping_rw; rw_ucs_to_enc : mapping_rw}
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}
29
add_mapping map.rw_enc_to_ucs enc ucs;
30
add_mapping map.rw_ucs_to_enc ucs enc
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}
36
let no_char_ucs map = map.enc_to_ucs.no_char
37
let no_char_enc map = map.ucs_to_enc.no_char
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
42
let loaded = Hashtbl.create 0
46
let b = Hashtbl.find loaded name in
47
match Weak.get b 0 with
49
Hashtbl.remove loaded name;
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
57
let b = Weak.create 1 in
58
Weak.set b 0 (Some map);
59
Hashtbl.add loaded name b;