1f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)#!/usr/bin/perl
2f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)# Copyright (c) 2001-2009 International Business Machines
3f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)# Corporation and others. All Rights Reserved.
4f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
5f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)####################################################################################
6f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)# filterRFC3454.pl:
7f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)# This tool filters the RFC-3454 txt file for StringPrep tables and creates a table
8f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)# to be used in NamePrepProfile
9f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)#
10f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)# Author: Ram Viswanadha
11f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)#
12f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)####################################################################################
13f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
14f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)use File::Find;
15f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)use File::Basename;
16f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)use IO::File;
17f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)use Cwd;
18f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)use File::Copy;
19f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)use Getopt::Long;
20f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)use File::Path;
21f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)use File::Copy;
22f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)use Time::localtime;
23f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
24f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)$icu_copyright = "#####################################################################\n# Copyright (c) %d, International Business Machines Corporation and\n# others. All Rights Reserved.\n#####################################################################\n\n";
25f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)$copyright = "###################\n# This file was generated from RFC 3454 (http://www.ietf.org/rfc/rfc3454.txt)\n# Copyright (C) The Internet Society (2002).  All Rights Reserved. \n###################\n\n";
26f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)$warning = "###################\n# WARNING: This table is generated by filterRFC3454.pl tool with\n# options: @ARGV \n###################\n\n";
27f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)#run the program)
28f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)main();
29f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
30f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)#---------------------------------------------------------------------
31f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)# The main program
32f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
33f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)sub main(){
34f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)  GetOptions(
35f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)           "--sourcedir=s" => \$sourceDir,
36f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)           "--destdir=s" => \$destDir,
37f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)           "--src-filename=s" => \$srcFileName,
38f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)           "--dest-filename=s" => \$destFileName,
39f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)           "--A1"  => \$a1,
40f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)           "--B1"  => \$b1,
41f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)           "--B2"  => \$b2,
42f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)           "--B3"  => \$b3,
43f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)           "--C11" => \$c11,
44f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)           "--C12" => \$c12,
45f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)           "--C21" => \$c21,
46f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)           "--C22" => \$c22,
47f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)           "--C3"  => \$c3,
48f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)           "--C4"  => \$c4,
49f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)           "--C5"  => \$c5,
50f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)           "--C6"  => \$c6,
51f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)           "--C7"  => \$c7,
52f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)           "--C8"  => \$c8,
53f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)           "--C9"  => \$c9,
54f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)           "--iscsi" => \$writeISCSIProhibitedExtra,
55f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)           "--xmpp-node" => \$writeXMPPNodeProhibitedExtra,
56f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)           "--sasl" => \$writeSASLMap,
57f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)           "--ldap" => \$writeLDAPMap,
58f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)           "--normalize" => \$norm,
59f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)           "--check-bidi" => \$checkBidi,
60f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)           );
61f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)  usage() unless defined $sourceDir;
62f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)  usage() unless defined $destDir;
63f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)  usage() unless defined $srcFileName;
64f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)  usage() unless defined $destFileName;
65f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
66f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)  $infile = $sourceDir."/".$srcFileName;
67f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)  $inFH = IO::File->new($infile,"r")
68f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            or die  "could not open the file $infile for reading: $! \n";
69f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)  $outfile = $destDir."/".$destFileName;
70f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
71f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)  unlink($outfile);
72f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)  $outFH = IO::File->new($outfile,"a")
73f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            or die  "could not open the file $outfile for writing: $! \n";
74f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
75f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)  printf $outFH  $icu_copyright, localtime->year()+1900;
76f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)  print $outFH  $copyright;
77f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)  print $outFH  $warning;
78f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
79f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)  if(defined $norm) {
80f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)      print $outFH "\@normalize;;\n";
81f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)  }
82f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)  if(defined $checkBidi) {
83f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)      print $outFH "\@check-bidi;;\n";
84f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)  }
85f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)  print $outFH "\n";
86f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)  close($outFH);
87f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
88f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)  if(defined $b2 && defined $b3){
89f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)      die "ERROR: --B2 and --B3 are both specified\!\n";
90f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)  }
91f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
92f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)  while(defined ($line=<$inFH>)){
93f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)      next unless $line=~ /Start\sTable/;
94f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)      if($line =~ /A.1/){
95f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            createUnassignedTable($inFH,$outfile);
96f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)      }
97f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)      if($line =~ /B.1/ && defined $b1){
98f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            createMapToNothing($inFH,$outfile);
99f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)      }
100f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)      if($line =~ /B.2/ && defined $b2){
101f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            createCaseMapNorm($inFH,$outfile);
102f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)      }
103f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)      if($line =~ /B.3/ && defined $b3){
104f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            createCaseMapNoNorm($inFH,$outfile);
105f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)      }
106f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)      if($line =~ /C.1.1/ && defined $c11 ){
107f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            createProhibitedTable($inFH,$outfile,$line);
108f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)      }
109f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)      if($line =~ /C.1.2/ && defined $c12 ){
110f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            createProhibitedTable($inFH,$outfile,$line);
111f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)      }
112f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)      if($line =~ /C.2.1/ && defined $c21 ){
113f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            createProhibitedTable($inFH,$outfile,$line);
114f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)      }
115f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)      if($line =~ /C.2.2/ && defined $c22 ){
116f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            createProhibitedTable($inFH,$outfile,$line);
117f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)      }
118f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)      if($line =~ /C.3/ && defined $c3 ){
119f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            createProhibitedTable($inFH,$outfile,$line);
120f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)      }
121f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)      if($line =~ /C.4/ && defined $c4 ){
122f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            createProhibitedTable($inFH,$outfile,$line);
123f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)      }
124f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)      if($line =~ /C.5/ && defined $c5 ){
125f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            createProhibitedTable($inFH,$outfile,$line);
126f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)      }
127f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)      if($line =~ /C.6/ && defined $c6 ){
128f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            createProhibitedTable($inFH,$outfile,$line);
129f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)      }
130f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)      if($line =~ /C.7/ && defined $c7 ){
131f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            createProhibitedTable($inFH,$outfile,$line);
132f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)      }
133f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)      if($line =~ /C.8/ && defined $c8 ){
134f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            createProhibitedTable($inFH,$outfile,$line);
135f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)      }
136f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)      if($line =~ /C.9/ && defined $c9 ){
137f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            createProhibitedTable($inFH,$outfile,$line);
138f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)      }
139f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)  }
140f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)  if( defined $writeISCSIProhibitedExtra){
141f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)      create_iSCSIExtraProhibitedTable($inFH, $outfile);
142f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)  }
143f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)  if( defined $writeXMPPNodeProhitedExtra){
144f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)      create_XMPPNodeExtraProhibitedTable($inFH, $outfile);
145f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)  }
146f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)  if( defined $writeSASLMap){
147f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)      create_SASLMapTable($inFH, $outfile);
148f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)  }
149f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)  if( defined $writeLDAPMap){
150f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)      create_LDAPMapTable($inFH, $outfile);
151f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)  }
152f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)  close($inFH);
153f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)}
154f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
155f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)#-----------------------------------------------------------------------
156f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)sub readPrint{
157f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    local ($inFH, $outFH,$comment, $table) = @_;
158f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    $count = 0;
159f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH $comment."\n";
160f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    while(defined ($line = <$inFH>)){
161f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        next if $line =~ /Hoffman\s\&\sBlanchet/;  # ignore heading
162f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        next if $line =~ /RFC\s3454/; # ignore heading
163f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        next if $line =~ /\f/;  # ignore form feed
164f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        next if $line eq "\n";  # ignore blank lines
165f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        # break if "End Table" is found
166f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        if( $line =~ /End\sTable/){
167f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            print $outFH "\n# Total code points $count\n\n";
168f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            return;
169f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        }
170f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        if($print==1){
171f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            print $line;
172f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        }
173f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        $line =~ s/-/../;
174f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        $line =~ s/^\s+//;
175f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        if($line =~ /\;/){
176f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        }else{
177f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            $line =~ s/$/;/;
178f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        }
179f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        if($table =~ /A/ ){
180f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            ($code, $noise) = split /;/ , $line;
181f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            $line = $code."; ; UNASSIGNED\n";
182f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        }elsif ( $table =~ /B\.1/ ){
183f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            $line =~ s/Map to nothing/MAP/;
184f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        }elsif ( $table =~ /B\.[23]/ ){
185f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            $line =~ s/Case map/MAP/;
186f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            $line =~ s/Additional folding/MAP/;
187f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        }elsif ( $table =~ /C/ ) {
188f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            ($code, $noise) = split /;/ , $line;
189f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            $line = $code."; ; PROHIBITED\n";
190f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        }
191f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        if($line =~ /\.\./){
192f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            ($code, $noise) = split /;/ , $line;
193f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            ($startStr, $endStr ) = split /\.\./, $code;
194f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            $start = atoi($startStr);
195f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            $end   = atoi($endStr);
196f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            #print $start."     ".$end."\n";
197f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            while($start <= $end){
198f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                $count++;
199f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                $start++;
200f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            }
201f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        }else{
202f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)              $count++;
203f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        }
204f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        print $outFH $line;
205f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    }
206f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)}
207f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)#-----------------------------------------------------------------------
208f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)sub atoi {
209f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    my $t;
210f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    foreach my $d (split(//, shift())) {
211f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        $t = $t * 16 + $d;
212f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    }
213f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    return $t;
214f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)}
215f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)#-----------------------------------------------------------------------
216f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)sub createUnassignedTable{
217f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    ($inFH,$outfile) = @_;
218f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    $outFH = IO::File->new($outfile,"a")
219f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            or die  "could not open the file $outfile for writing: $! \n";
220f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    $comment = "# This table contains code points from Table A.1 from RFC 3454\n";
221f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    readPrint($inFH,$outFH, $comment, "A");
222f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    close($outFH);
223f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)}
224f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)#-----------------------------------------------------------------------
225f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)sub createMapToNothing{
226f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    ($inFH,$outfile) = @_;
227f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    $outFH = IO::File->new($outfile,"a")
228f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            or die  "could not open the file $outfile for writing: $! \n";
229f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    $comment = "# This table contains code points from Table B.1 from RFC 3454\n";
230f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    readPrint($inFH,$outFH,$comment, "B.1");
231f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    close($outFH);
232f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)}
233f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)#-----------------------------------------------------------------------
234f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)sub createCaseMapNorm{
235f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    ($inFH,$outfile) = @_;
236f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    $outFH = IO::File->new($outfile,"a")
237f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            or die  "could not open the file $outfile for writing: $! \n";
238f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    $comment = $warning."# This table contains code points from Table B.2 from RFC 3454\n";
239f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    readPrint($inFH,$outFH,$comment, "B.2");
240f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    close($outFH);
241f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)}
242f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)#-----------------------------------------------------------------------
243f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)sub createCaseMapNoNorm{
244f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    ($inFH,$outfile) = @_;
245f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    $outFH = IO::File->new($outfile,"a")
246f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            or die  "could not open the file $outfile for writing: $! \n";
247f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    $comment = $warning."# This table contains code points from Table B.3 from RFC 3454\n";
248f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    readPrint($inFH,$outFH,$comment, "B.3");
249f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    close($outFH);
250f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)}
251f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)#-----------------------------------------------------------------------
252f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)sub createProhibitedTable{
253f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    ($inFH,$outfile,$line) = @_;
254f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    $line =~ s/Start//;
255f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    $line =~ s/-//g;
256f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    $comment = "# code points from $line";
257f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
258f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    $outFH = IO::File->new($outfile, "a")
259f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            or die  "could not open the file $outfile for writing: $! \n";
260f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    readPrint($inFH,$outFH,$comment, "C");
261f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    close($outFH);
262f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)}
263f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
264f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)#-----------------------------------------------------------------------
265f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)sub create_iSCSIExtraProhibitedTable{
266f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    ($inFH,$outfile,$line) = @_;
267f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    $comment ="# Additional prohibitions from iSCSI profile (rfc3722.txt)\n\n";
268f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
269f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    $outFH = IO::File->new($outfile, "a")
270f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            or die  "could not open the file $outfile for writing: $! \n";
271f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH $comment;
272f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "0021..002C; ; PROHIBITED\n";
273f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "002F; ; PROHIBITED\n";
274f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "003B..0040; ; PROHIBITED\n";
275f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "005B..0060; ; PROHIBITED\n";
276f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "007B..007E; ; PROHIBITED\n";
277f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "3002; ; PROHIBITED\n";
278f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "\n# Total code points 30\n";
279f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    close($outFH);
280f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)}
281f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)#-----------------------------------------------------------------------
282f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)sub create_XMPPNodeExtraProhibitedTable{
283f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    ($inFH,$outfile,$line) = @_;
284f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    $comment ="# Additional prohibitions from XMPP Nodeprep profile (rfc3920.txt)\n\n";
285f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
286f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    $outFH = IO::File->new($outfile, "a")
287f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            or die  "could not open the file $outfile for writing: $! \n";
288f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH $comment;
289f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "0022; ; PROHIBITED\n";
290f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "0026; ; PROHIBITED\n";
291f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "0027; ; PROHIBITED\n";
292f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "002F; ; PROHIBITED\n";
293f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "003A; ; PROHIBITED\n";
294f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "003C; ; PROHIBITED\n";
295f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "003E; ; PROHIBITED\n";
296f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "0040; ; PROHIBITED\n";
297f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "\n# Total code points 8\n";
298f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    close($outFH);
299f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)}
300f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)#-----------------------------------------------------------------------
301f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)sub create_SASLMapTable{
302f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    ($inFH,$outfile,$line) = @_;
303f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    $comment ="# Map table for SASL profile (rfc4013.txt)\n\n";
304f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
305f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    $outFH = IO::File->new($outfile, "a")
306f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            or die  "could not open the file $outfile for writing: $! \n";
307f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH $comment;
308f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    # non-ASCII space characters [C.1.2] to SPACE
309f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "00A0; 0020; MAP\n";
310f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "1680; 0020; MAP\n";
311f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "2000; 0020; MAP\n";
312f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "2001; 0020; MAP\n";
313f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "2002; 0020; MAP\n";
314f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "2003; 0020; MAP\n";
315f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "2004; 0020; MAP\n";
316f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "2005; 0020; MAP\n";
317f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "2006; 0020; MAP\n";
318f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "2007; 0020; MAP\n";
319f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "2008; 0020; MAP\n";
320f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "2009; 0020; MAP\n";
321f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "200A; 0020; MAP\n";
322f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "200B; 0020; MAP\n";
323f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "202F; 0020; MAP\n";
324f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "205F; 0020; MAP\n";
325f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "3000; 0020; MAP\n";
326f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
327f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    # commonly mapped to nothing characters except U+200B to nothing
328f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "00AD; ; MAP\n";
329f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "034F; ; MAP\n";
330f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "1806; ; MAP\n";
331f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "180B; ; MAP\n";
332f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "180C; ; MAP\n";
333f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "180D; ; MAP\n";
334f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "200C; ; MAP\n";
335f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "200D; ; MAP\n";
336f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "2060; ; MAP\n";
337f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "FE00; ; MAP\n";
338f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "FE01; ; MAP\n";
339f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "FE02; ; MAP\n";
340f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "FE03; ; MAP\n";
341f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "FE04; ; MAP\n";
342f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "FE05; ; MAP\n";
343f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "FE06; ; MAP\n";
344f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "FE07; ; MAP\n";
345f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "FE08; ; MAP\n";
346f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "FE09; ; MAP\n";
347f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "FE0A; ; MAP\n";
348f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "FE0B; ; MAP\n";
349f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "FE0C; ; MAP\n";
350f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "FE0D; ; MAP\n";
351f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "FE0E; ; MAP\n";
352f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "FE0F; ; MAP\n";
353f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "FEFF; ; MAP\n";
354f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "\n# Total code points 43\n";
355f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    close($outFH);
356f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)}
357f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)#-----------------------------------------------------------------------
358f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)sub create_LDAPMapTable{
359f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    ($inFH,$outfile,$line) = @_;
360f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    $comment ="# Map table for LDAP profile (rfc4518.txt)\n\n";
361f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
362f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    $outFH = IO::File->new($outfile, "a")
363f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            or die  "could not open the file $outfile for writing: $! \n";
364f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH $comment;
365f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
366f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    #   SOFT HYPHEN (U+00AD) and MONGOLIAN TODO SOFT HYPHEN (U+1806) code
367f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    #   points are mapped to nothing.  COMBINING GRAPHEME JOINER (U+034F) and
368f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    #   VARIATION SELECTORs (U+180B-180D, FF00-FE0F) code points are also
369f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    #   mapped to nothing.  The OBJECT REPLACEMENT CHARACTER (U+FFFC) is
370f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    #   mapped to nothing.
371f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
372f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "00AD; ; MAP\n";
373f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "034F; ; MAP\n";
374f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "1806; ; MAP\n";
375f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "180B; ; MAP\n";
376f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "180C; ; MAP\n";
377f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "180D; ; MAP\n";
378f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "FE00; ; MAP\n";
379f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "FE01; ; MAP\n";
380f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "FE02; ; MAP\n";
381f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "FE03; ; MAP\n";
382f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "FE04; ; MAP\n";
383f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "FE05; ; MAP\n";
384f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "FE06; ; MAP\n";
385f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "FE07; ; MAP\n";
386f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "FE08; ; MAP\n";
387f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "FE09; ; MAP\n";
388f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "FE0A; ; MAP\n";
389f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "FE0B; ; MAP\n";
390f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "FE0C; ; MAP\n";
391f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "FE0D; ; MAP\n";
392f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "FE0E; ; MAP\n";
393f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "FE0F; ; MAP\n";
394f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "FFFC; ; MAP\n";
395f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
396f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)#   CHARACTER TABULATION (U+0009), LINE FEED (LF) (U+000A), LINE
397f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)#   TABULATION (U+000B), FORM FEED (FF) (U+000C), CARRIAGE RETURN (CR)
398f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)#   (U+000D), and NEXT LINE (NEL) (U+0085) are mapped to SPACE (U+0020).
399f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
400f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "0009; 0020; MAP\n";
401f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "000A; 0020; MAP\n";
402f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "000B; 0020; MAP\n";
403f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "000C; 0020; MAP\n";
404f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "000D; 0020; MAP\n";
405f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "0085; 0020; MAP\n";
406f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
407f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    #   All other control code (e.g., Cc) points or code points with a
408f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    #   control function (e.g., Cf) are mapped to nothing.  The following is
409f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    #   a complete list of these code points: U+0000-0008, 000E-001F, 007F-
410f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    #   0084, 0086-009F, 06DD, 070F, 180E, 200C-200F, 202A-202E, 2060-2063,
411f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    #   206A-206F, FEFF, FFF9-FFFB, 1D173-1D17A, E0001, E0020-E007F.
412f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
413f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "0000; ; MAP\n";
414f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "0001; ; MAP\n";
415f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "0002; ; MAP\n";
416f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "0003; ; MAP\n";
417f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "0004; ; MAP\n";
418f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "0005; ; MAP\n";
419f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "0006; ; MAP\n";
420f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "0007; ; MAP\n";
421f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "0008; ; MAP\n";
422f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "000E; ; MAP\n";
423f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "000F; ; MAP\n";
424f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "0010; ; MAP\n";
425f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "0011; ; MAP\n";
426f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "0012; ; MAP\n";
427f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "0013; ; MAP\n";
428f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "0014; ; MAP\n";
429f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "0015; ; MAP\n";
430f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "0016; ; MAP\n";
431f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "0017; ; MAP\n";
432f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "0018; ; MAP\n";
433f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "0019; ; MAP\n";
434f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "001A; ; MAP\n";
435f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "001B; ; MAP\n";
436f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "001C; ; MAP\n";
437f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "001D; ; MAP\n";
438f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "001E; ; MAP\n";
439f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "001F; ; MAP\n";
440f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "007F; ; MAP\n";
441f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "0080; ; MAP\n";
442f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "0081; ; MAP\n";
443f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "0082; ; MAP\n";
444f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "0083; ; MAP\n";
445f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "0084; ; MAP\n";
446f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "0086; ; MAP\n";
447f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "0087; ; MAP\n";
448f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "0088; ; MAP\n";
449f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "0089; ; MAP\n";
450f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "008A; ; MAP\n";
451f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "008B; ; MAP\n";
452f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "008C; ; MAP\n";
453f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "008D; ; MAP\n";
454f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "008E; ; MAP\n";
455f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "008F; ; MAP\n";
456f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "0090; ; MAP\n";
457f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "0091; ; MAP\n";
458f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "0092; ; MAP\n";
459f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "0093; ; MAP\n";
460f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "0094; ; MAP\n";
461f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "0095; ; MAP\n";
462f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "0096; ; MAP\n";
463f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "0097; ; MAP\n";
464f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "0098; ; MAP\n";
465f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "0099; ; MAP\n";
466f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "009A; ; MAP\n";
467f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "009B; ; MAP\n";
468f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "009C; ; MAP\n";
469f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "009D; ; MAP\n";
470f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "009E; ; MAP\n";
471f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "009F; ; MAP\n";
472f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "06DD; ; MAP\n";
473f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "070F; ; MAP\n";
474f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "180E; ; MAP\n";
475f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "200C; ; MAP\n";
476f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "200D; ; MAP\n";
477f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "200E; ; MAP\n";
478f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "200F; ; MAP\n";
479f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "202A; ; MAP\n";
480f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "202B; ; MAP\n";
481f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "202C; ; MAP\n";
482f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "202D; ; MAP\n";
483f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "202E; ; MAP\n";
484f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "2060; ; MAP\n";
485f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "2061; ; MAP\n";
486f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "2062; ; MAP\n";
487f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "2063; ; MAP\n";
488f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "206A; ; MAP\n";
489f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "206B; ; MAP\n";
490f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "206C; ; MAP\n";
491f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "206D; ; MAP\n";
492f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "206E; ; MAP\n";
493f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "206F; ; MAP\n";
494f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "FEFF; ; MAP\n";
495f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "FFF9; ; MAP\n";
496f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "FFFA; ; MAP\n";
497f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "FFFB; ; MAP\n";
498f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "1D173; ; MAP\n";
499f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "1D174; ; MAP\n";
500f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "1D175; ; MAP\n";
501f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "1D176; ; MAP\n";
502f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "1D177; ; MAP\n";
503f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "1D178; ; MAP\n";
504f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "1D179; ; MAP\n";
505f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "1D17A; ; MAP\n";
506f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "E0001; ; MAP\n";
507f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "E0020; ; MAP\n";
508f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "E0021; ; MAP\n";
509f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "E0022; ; MAP\n";
510f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "E0023; ; MAP\n";
511f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "E0024; ; MAP\n";
512f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "E0025; ; MAP\n";
513f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "E0026; ; MAP\n";
514f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "E0027; ; MAP\n";
515f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "E0028; ; MAP\n";
516f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "E0029; ; MAP\n";
517f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "E002A; ; MAP\n";
518f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "E002B; ; MAP\n";
519f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "E002C; ; MAP\n";
520f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "E002D; ; MAP\n";
521f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "E002E; ; MAP\n";
522f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "E002F; ; MAP\n";
523f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "E0030; ; MAP\n";
524f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "E0031; ; MAP\n";
525f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "E0032; ; MAP\n";
526f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "E0033; ; MAP\n";
527f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "E0034; ; MAP\n";
528f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "E0035; ; MAP\n";
529f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "E0036; ; MAP\n";
530f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "E0037; ; MAP\n";
531f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "E0038; ; MAP\n";
532f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "E0039; ; MAP\n";
533f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "E003A; ; MAP\n";
534f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "E003B; ; MAP\n";
535f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "E003C; ; MAP\n";
536f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "E003D; ; MAP\n";
537f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "E003E; ; MAP\n";
538f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "E003F; ; MAP\n";
539f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "E0040; ; MAP\n";
540f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "E0041; ; MAP\n";
541f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "E0042; ; MAP\n";
542f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "E0043; ; MAP\n";
543f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "E0044; ; MAP\n";
544f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "E0045; ; MAP\n";
545f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "E0046; ; MAP\n";
546f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "E0047; ; MAP\n";
547f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "E0048; ; MAP\n";
548f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "E0049; ; MAP\n";
549f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "E004A; ; MAP\n";
550f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "E004B; ; MAP\n";
551f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "E004C; ; MAP\n";
552f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "E004D; ; MAP\n";
553f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "E004E; ; MAP\n";
554f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "E004F; ; MAP\n";
555f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "E0050; ; MAP\n";
556f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "E0051; ; MAP\n";
557f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "E0052; ; MAP\n";
558f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "E0053; ; MAP\n";
559f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "E0054; ; MAP\n";
560f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "E0055; ; MAP\n";
561f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "E0056; ; MAP\n";
562f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "E0057; ; MAP\n";
563f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "E0058; ; MAP\n";
564f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "E0059; ; MAP\n";
565f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "E005A; ; MAP\n";
566f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "E005B; ; MAP\n";
567f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "E005C; ; MAP\n";
568f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "E005D; ; MAP\n";
569f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "E005E; ; MAP\n";
570f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "E005F; ; MAP\n";
571f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "E0060; ; MAP\n";
572f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "E0061; ; MAP\n";
573f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "E0062; ; MAP\n";
574f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "E0063; ; MAP\n";
575f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "E0064; ; MAP\n";
576f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "E0065; ; MAP\n";
577f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "E0066; ; MAP\n";
578f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "E0067; ; MAP\n";
579f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "E0068; ; MAP\n";
580f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "E0069; ; MAP\n";
581f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "E006A; ; MAP\n";
582f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "E006B; ; MAP\n";
583f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "E006C; ; MAP\n";
584f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "E006D; ; MAP\n";
585f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "E006E; ; MAP\n";
586f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "E006F; ; MAP\n";
587f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "E0070; ; MAP\n";
588f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "E0071; ; MAP\n";
589f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "E0072; ; MAP\n";
590f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "E0073; ; MAP\n";
591f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "E0074; ; MAP\n";
592f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "E0075; ; MAP\n";
593f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "E0076; ; MAP\n";
594f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "E0077; ; MAP\n";
595f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "E0078; ; MAP\n";
596f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "E0079; ; MAP\n";
597f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "E007A; ; MAP\n";
598f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "E007B; ; MAP\n";
599f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "E007C; ; MAP\n";
600f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "E007D; ; MAP\n";
601f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "E007E; ; MAP\n";
602f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "E007F; ; MAP\n";
603f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
604f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    #   ZERO WIDTH SPACE (U+200B) is mapped to nothing.  All other code
605f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    #   points with Separator (space, line, or paragraph) property (e.g., Zs,
606f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    #   Zl, or Zp) are mapped to SPACE (U+0020).  The following is a complete
607f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    #   list of these code points: U+0020, 00A0, 1680, 2000-200A, 2028-2029,
608f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    #   202F, 205F, 3000.
609f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
610f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "200B; ; MAP\n";
611f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "00A0; 0020; MAP\n";
612f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "1680; 0020; MAP\n";
613f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "2000; 0020; MAP\n";
614f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "2001; 0020; MAP\n";
615f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "2002; 0020; MAP\n";
616f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "2003; 0020; MAP\n";
617f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "2004; 0020; MAP\n";
618f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "2005; 0020; MAP\n";
619f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "2006; 0020; MAP\n";
620f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "2007; 0020; MAP\n";
621f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "2008; 0020; MAP\n";
622f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "2009; 0020; MAP\n";
623f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "200A; 0020; MAP\n";
624f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "2028; 0020; MAP\n";
625f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "2029; 0020; MAP\n";
626f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "202F; 0020; MAP\n";
627f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "205F; 0020; MAP\n";
628f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "3000; 0020; MAP\n";
629f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
630f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print $outFH "\n# Total code points 238\n";
631f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    close($outFH);
632f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)}
633f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)#-----------------------------------------------------------------------
634f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)sub usage {
635f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    print << "END";
636f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)Usage:
637f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)filterRFC3454.pl
638f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)Options:
639f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        --sourcedir=<directory>
640f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        --destdir=<directory>
641f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        --src-filename=<name of RFC file>
642f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        --dest-filename=<name of destination file>
643f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        --A1             Generate data for table A.1
644f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        --B1             Generate data for table B.1
645f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        --B2             Generate data for table B.2
646f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        --B3             Generate data for table B.3
647f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        --C11            Generate data for table C.1.1
648f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        --C12            Generate data for table C.1.2
649f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        --C21            Generate data for table C.2.1
650f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        --C22            Generate data for table C.2.2
651f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        --C3             Generate data for table C.3
652f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        --C4             Generate data for table C.4
653f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        --C5             Generate data for table C.5
654f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        --C6             Generate data for table C.6
655f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        --C7             Generate data for table C.7
656f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        --C8             Generate data for table C.8
657f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        --C9             Generate data for table C.9
658f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        --iscsi          Generate data for iSCSI extra prohibited table
659f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        --xmpp-node      Generate data for XMPP extra prohibited table
660f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        --sasl           Generate data for SASL map table
661f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        --ldap           Generate data for LDAP map table
662f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        --normalize      Embed the normalization directive in the output file
663f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        --check-bidi     Embed the check bidi directove in the output file
664f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
665f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)Note, --B2 and --B3 are mutually exclusive.
666f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
667f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)e.g.: filterRFC3454.pl --sourcedir=. --destdir=./output --src-filename=rfc3454.txt  --dest-filename=NamePrepProfile.txt --A1 --B1 --B2 --C12 --C22 --C3 --C4 --C5 --C6 --C7 --C8 --C9 --normalize --check-bidi
668f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
669f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)filterRFC3454.pl filters the RFC file and creates String prep table files.
670f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)The RFC text can be downloaded from ftp://ftp.rfc-editor.org/in-notes/rfc3454.txt
671f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
672f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)END
673f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)  exit(0);
674f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)}
675f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
676f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
677