~ubuntu-branches/ubuntu/hardy/ocaml-doc/hardy

« back to all changes in this revision

Viewing changes to examples/tools/address_book.new.ml

  • Committer: Bazaar Package Importer
  • Author(s): Samuel Mimram
  • Date: 2007-09-08 01:49:22 UTC
  • mfrom: (0.1.3 upstream)
  • Revision ID: james.westby@ubuntu.com-20070908014922-lvihyehz0ndq7suu
Tags: 3.10-1
* New upstream release.
* Removed camlp4 documentation since it is not up-to-date.
* Updated to standards version 3.7.2, no changes needed.
* Updated my email address.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
(***********************************************************************)
2
 
(*                                                                     *)
3
 
(*                           Objective Caml                            *)
4
 
(*                                                                     *)
5
 
(*               Pierre Weis, projet Cristal, INRIA Rocquencourt       *)
6
 
(*                                                                     *)
7
 
(*  Copyright 2001 Institut National de Recherche en Informatique et   *)
8
 
(*  en Automatique.  All rights reserved.  This file is distributed    *)
9
 
(*  only by permission.                                                *)
10
 
(*                                                                     *)
11
 
(***********************************************************************)
12
 
 
13
 
open Printf;;
14
 
 
15
 
type entry = {
16
 
  ident : string;
17
 
  first_name : string;
18
 
  last_name : string;
19
 
  address : string;
20
 
  tel : string;
21
 
  url : string;
22
 
};;
23
 
 
24
 
type address_book = {
25
 
  file : string;
26
 
  entries : (string, entry) Hashtbl.t
27
 
};;
28
 
 
29
 
let print_entry e =
30
 
 printf "First name : %s\n" e.first_name;
31
 
 printf "Last name : %s\n" e.last_name;
32
 
 printf "Addr : %s\n" e.address;
33
 
 printf "Tel  : %s\n" e.tel;
34
 
 printf "URL  : %s\n" e.url;;
35
 
 
36
 
let print_address_book ab =
37
 
 print_string "Adresse book from ";
38
 
 print_string ab.file;
39
 
 print_newline ();
40
 
 Hashtbl.iter (fun k e -> print_entry e; print_newline ()) ab.entries;;
41
 
 
42
 
let read_address_book_ic ic =
43
 
 (input_value ic : address_book);;
44
 
 
45
 
let save_address_book_oc oc ab =
46
 
 (output_value oc (ab : address_book));;
47
 
 
48
 
let read_address_book ab =
49
 
 let ic = open_in_bin ab in
50
 
 read_address_book_ic ic;
51
 
 close_in ic;;
52
 
 
53
 
let save_address_book ab =
54
 
 let oc = open_out_bin ab.file in
55
 
 save_address_book_oc oc ab;
56
 
 close_out oc;;
57
 
 
58
 
let make_entry id fn ln a t u = {
59
 
 ident = id;
60
 
 first_name = fn;
61
 
 last_name = ln;
62
 
 address = a;
63
 
 tel = t;
64
 
 url = u
65
 
};;
66
 
 
67
 
let dummy_entry = make_entry "" "" "" "" "" "";;
68
 
 
69
 
let dummy_file = "book";;
70
 
 
71
 
let the_book =
72
 
 ref {file = dummy_file; entries = Hashtbl.create 100};;
73
 
 
74
 
let init_address_book ab =
75
 
 if ab <> "" then read_address_book ab else read_address_book dummy_file;;
76
 
 
77
 
let verify_absent ab e =
78
 
 let es = ab.entries in
79
 
 if Hashtbl.mem es e.ident &&
80
 
    List.mem e (Hashtbl.find_all es e.ident) then
81
 
 failwith
82
 
  (sprintf "Entry %s is already stored in adress book %s" e.last_name ab.file);;
83
 
 
84
 
let verify_present ab e =
85
 
 let es = ab.entries in
86
 
 let id = e.ident in
87
 
 if not (Hashtbl.mem es id) || not (List.mem e (Hashtbl.find_all es id)) then
88
 
 failwith
89
 
  (sprintf "Entry %s is not stored in adress book %s" n ab.file);;
90
 
 
91
 
let add_entry ab n e =
92
 
 verify_absent ab e;
93
 
 let es = ab.entries in
94
 
 Hashtbl.add es n e;;
95
 
 
96
 
let rec list_remove x = function
97
 
  | [] -> []
98
 
  | y :: l -> if y = x then l else y :: list_remove x l;; 
99
 
 
100
 
let remove_entry ab e =
101
 
 let es = ab.entries in
102
 
 let eqs = Hashtbl.find_all es e.name in
103
 
 let but_e = list_remove e eqs in
104
 
 List.iter (fun e -> Hashtbl.remove es e.name) eqs;
105
 
 List.iter (fun e -> Hashtbl.add es e.name e) but_e;;
106
 
 
107
 
let modify_entry ab e new_e =
108
 
 verify_present ab e;
109
 
 verify_absent ab new_e;
110
 
 remove_entry ab e;
111
 
 add_entry ab e.name new_e;;
112
 
 
113
 
let delete_entry ab e =
114
 
 verify_present ab e;
115
 
 remove_entry ab e;;
116
 
 
117
 
let search_named_entry ab n =
118
 
 Hashtbl.find_all ab.entries n;;
119
 
 
120
 
let search ab p =
121
 
 let res = ref [] in
122
 
 Hashtbl.iter (fun k v -> if p k v then res := v :: !res) ab.entries;
123
 
 !res;;
124
 
 
125
 
let search_regexp_entry foldp ab pat =
126
 
 let re = if foldp then Str.regexp_case_fold pat else Str.regexp pat in
127
 
 search ab (fun k v -> Str.string_match re k 0);;
128
 
 
129
 
let full_text_regexp_search foldp ab pat =
130
 
 let re = if foldp then Str.regexp_case_fold pat else Str.regexp pat in
131
 
 search ab
132
 
  (fun k v ->
133
 
    Str.string_match re v.name 0 ||
134
 
    Str.string_match re v.address 0 ||
135
 
    Str.string_match re v.tel 0 ||
136
 
    Str.string_match re v.url 0);;
137
 
 
138
 
type search_entry_predicate = {
139
 
  name_pred : string -> bool;
140
 
  address_pred : string -> bool;
141
 
  tel_pred : string -> bool;
142
 
  url_pred : string -> bool;
143
 
};;
144
 
 
145
 
type search_entry_pattern = {
146
 
  name_pat : string;
147
 
  address_pat : string;
148
 
  tel_pat : string;
149
 
  url_pat : string;
150
 
};;
151
 
 
152
 
let full_search ab se =
153
 
 search ab
154
 
  (fun k v ->
155
 
    se.name_pred v.name ||
156
 
    se.address_pred v.address ||
157
 
    se.tel_pred v.tel ||
158
 
    se.url_pred v.url);;
159
 
 
160
 
let full_text_regexp_search foldp ab pat =
161
 
 let regexp = if foldp then Str.regexp_case_fold else Str.regexp in
162
 
 let str_match p s = Str.string_match (regexp p) s 0 in
163
 
 let se = {
164
 
  name_pred = str_match pat.name_pat;
165
 
  address_pred = str_match pat.address_pat;
166
 
  tel_pred = str_match pat.tel_pat;
167
 
  url_pred = str_match pat.url_pat;
168
 
 } in
169
 
 full_search ab se;;
170
 
 
171
 
let make_name_entry_pattern pat = {
172
 
  name_pat = pat;
173
 
  address_pat = "";
174
 
  tel_pat = "";
175
 
  url_pat = "";
176
 
};;
177
 
 
178
 
let make_full_text_entry_pattern pat = {
179
 
  name_pat = pat;
180
 
  address_pat = pat;
181
 
  tel_pat = pat;
182
 
  url_pat = pat;
183
 
};;
184
 
 
185
 
let full_search ab pat =
186
 
 full_text_regexp_search true ab (make_full_text_entry_pattern pat);;
187
 
 
188
 
let enter_new_entry n a t u = add_entry !the_book n (make_entry n a t u);;
189
 
 
190
 
enter_new_entry
191
 
 "Weis"
192
 
 "Domaine de Voluceau"
193
 
 "5738"
194
 
 "http://pauillac.inria.fr/~weis/";;
195
 
 
196
 
print_address_book !the_book;;