24179a9aee1d3bfb48e34de2bb80418f9306bae6
[elisp/liece.git] / dcc / naddr.ml
1 (* Network address handling module.
2
3 This file is part of Liece.                                          
4
5 Author: Daiki Ueno <daiki@kake.info.waseda.ac.jp>                    
6 Created: 1998-09-28                                               
7 Revised: 1999-01-28                                               
8 Keywords: IRC, liece, DCC                                        
9
10 This program is free software; you can redistribute it and/or modify 
11 it under the terms of the GNU General Public License as published by 
12 the Free Software Foundation; either version 2, or (at your option)  
13 any later version.                                                   
14                                                                       
15 This program is distributed in the hope that it will be useful,      
16 but WITHOUT ANY WARRANTY; without even the implied warranty of       
17 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.     See the      
18 GNU General Public License for more details.                         
19                                                                       
20 You should have received a copy of the GNU General Public License    
21 along with GNU Emacs; see the file COPYING.  If not, write to the    
22 Free Software Foundation, Inc., 59 Temple Place - Suite 330,         
23 Boston, MA 02111-1307, USA.  *)
24
25 open Num
26 open Big_int
27 open Str
28
29 let encode str =
30   let _ = string_match 
31       (regexp "\([0-9]+\)\.\([0-9]+\)\.\([0-9]+\)\.\([0-9]+\)") str 0 in
32   let (a1, a2, a3, a4) = 
33     try 
34       int_of_string (matched_group 1 str), 
35       int_of_string (matched_group 2 str), 
36       int_of_string (matched_group 3 str), 
37       int_of_string (matched_group 4 str)
38     with
39       _ -> 
40         Printf.eprintf "Invalid address\n"; flush Pervasives.stdout; exit 1;
41   in
42   let (s1, s2, s3, s4) =
43     Int (1 lsl 24), 
44     Int (1 lsl 16), 
45     Int (1 lsl 8), 
46     Int 1
47   in
48   let ul =
49     ((Int a1) */ s1) +/ ((Int a2) */ s2) +/ ((Int a3) */ s3) +/ (Int a4)
50   in
51   string_of_num ul
52
53 let decode str =
54   let ul = 
55     try
56       num_of_string str 
57     with
58       _ ->
59         Printf.eprintf "Invalid address\n"; flush Pervasives.stdout; exit 1;
60   in
61   let (s1, s2, s3, s4) =
62     Int (1 lsl 24), 
63     Int (1 lsl 16), 
64     Int (1 lsl 8), 
65     Int 1
66   in
67   let (a1, a2, a3, a4) = 
68     floor_num (ul // s1), 
69     floor_num ((mod_num ul s1) // s2), 
70     floor_num ((mod_num (mod_num ul s1) s2) // s3), 
71     (mod_num (mod_num (mod_num ul s1) s2) s3)
72   in
73   Printf.sprintf "%s.%s.%s.%s" 
74     (string_of_num a1) 
75     (string_of_num a2) 
76     (string_of_num a3) 
77     (string_of_num a4)