blob: fc52836f97f463b5642721d51f9cb7aa816e8563 [file] [log] [blame]
#/usr/bin/perl
# Copyright (c) 2001-2004 International Business Machines
# Corporation and others. All Rights Reserved.
####################################################################################
# filterRFC3454.pl:
# This tool filters the RFC-3454 txt file for StringPrep tables and creates a table
# to be used in NamePrepProfile
#
# Author: Ram Viswanadha
#
####################################################################################
use File::Find;
use File::Basename;
use IO::File;
use Cwd;
use File::Copy;
use Getopt::Long;
use File::Path;
use File::Copy;
$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";
$warning = "###################\n# WARNING: This table is generated by filterRFC3454.pl tool. DO NOT EDIT \n###################\n\n";
#run the program)
main();
#---------------------------------------------------------------------
# The main program
sub main(){
GetOptions(
"--sourcedir=s" => \$sourceDir,
"--destdir=s" => \$destDir,
"--src-filename=s" => \$srcFileName,
"--dest-filename=s" => \$destFileName,
"--A1" => \$a1,
"--B1" => \$b1,
"--B2" => \$b2,
"--B3" => \$b3,
"--C11" => \$c11,
"--C12" => \$c12,
"--C21" => \$c21,
"--C22" => \$c22,
"--C3" => \$c3,
"--C4" => \$c4,
"--C5" => \$c5,
"--C6" => \$c6,
"--C7" => \$c7,
"--C8" => \$c8,
"--C9" => \$c9,
"--ldh-chars" => \$writeLDHChars,
"--iscsi" => \$writeISCSIChars,
);
usage() unless defined $sourceDir;
usage() unless defined $destDir;
usage() unless defined $srcFileName;
usage() unless defined $destFileName;
$infile = $sourceDir."/".$srcFileName;
$inFH = IO::File->new($infile,"r")
or die "could not open the file $infile for reading: $! \n";
$outfile = $destDir."/".$destFileName;
unlink($outfile);
$outFH = IO::File->new($outfile,"a")
or die "could not open the file $outfile for writing: $! \n";
print $outFH $copyright;
print $outFH $warning;
close($outFH);
if(defined $b2 && defined $b3){
die "ERROR: --B2 and --B3 are both specified\!\n";
}
while(defined ($line=<$inFH>)){
next unless $line=~ /Start\sTable/;
if($line =~ /A.1/){
createUnassignedTable($inFH,$outfile);
}
if($line =~ /B.1/ && defined $b1){
createMapToNothing($inFH,$outfile);
}
if($line =~ /B.2/ && defined $b2){
createCaseMapNorm($inFH,$outfile);
}
if($line =~ /B.3/ && defined $b3){
createCaseMapNoNorm($inFH,$outfile);
}
if($line =~ /C.1.1/ && defined $c11 ){
createProhibitedTable($inFH,$outfile,$line);
}
if($line =~ /C.1.2/ && defined $c12 ){
createProhibitedTable($inFH,$outfile,$line);
}
if($line =~ /C.2.1/ && defined $c21 ){
createProhibitedTable($inFH,$outfile,$line);
}
if($line =~ /C.2.2/ && defined $c22 ){
createProhibitedTable($inFH,$outfile,$line);
}
if($line =~ /C.3/ && defined $c3 ){
createProhibitedTable($inFH,$outfile,$line);
}
if($line =~ /C.4/ && defined $c4 ){
createProhibitedTable($inFH,$outfile,$line);
}
if($line =~ /C.5/ && defined $c5 ){
createProhibitedTable($inFH,$outfile,$line);
}
if($line =~ /C.6/ && defined $c6 ){
createProhibitedTable($inFH,$outfile,$line);
}
if($line =~ /C.7/ && defined $c7 ){
createProhibitedTable($inFH,$outfile,$line);
}
if($line =~ /C.8/ && defined $c8 ){
createProhibitedTable($inFH,$outfile,$line);
}
if($line =~ /C.9/ && defined $c9 ){
createProhibitedTable($inFH,$outfile,$line);
}
}
if( defined $writeISCSIChars){
create_iSCSIExtraProhibitedTable($inFH, $outfile);
}
close($inFH);
}
#-----------------------------------------------------------------------
sub readPrint{
local ($inFH, $outFH,$comment, $table) = @_;
$count = 0;
print $outFH $comment."\n";
while(defined ($line = <$inFH>)){
next if $line =~ /Hoffman\s\&\sBlanchet/; # ignore heading
next if $line =~ /RFC\s3454/; # ignore heading
next if $line =~ /\f/; # ignore form feed
next if $line eq "\n"; # ignore blank lines
# break if "End Table" is found
if( $line =~ /End\sTable/){
print $outFH "\n# Total code points $count\n\n";
return;
}
if($print==1){
print $line;
}
$line =~ s/-/../;
$line =~ s/^\s+//;
if($line =~ /\;/){
}else{
$line =~ s/$/;/;
}
if($table =~ /A/ ){
($code, $noise) = split /;/ , $line;
$line = $code."; ; UNASSIGNED\n";
}elsif ( $table =~ /B\.1/ ){
$line =~ s/Map to nothing/MAP/;
}elsif ( $table =~ /B\.[23]/ ){
$line =~ s/Case map/MAP/;
$line =~ s/Additional folding/MAP/;
}elsif ( $table =~ /C/ ) {
($code, $noise) = split /;/ , $line;
$line = $code."; ; PROHIBITED\n";
}
if($line =~ /\.\./){
($code, $noise) = split /;/ , $line;
($startStr, $endStr ) = split /\.\./, $code;
$start = atoi($startStr);
$end = atoi($endStr);
#print $start." ".$end."\n";
while($start <= $end){
$count++;
$start++;
}
}else{
$count++;
}
print $outFH $line;
}
}
#-----------------------------------------------------------------------
sub atoi {
my $t;
foreach my $d (split(//, shift())) {
$t = $t * 16 + $d;
}
return $t;
}
#-----------------------------------------------------------------------
sub createUnassignedTable{
($inFH,$outfile) = @_;
$outFH = IO::File->new($outfile,"a")
or die "could not open the file $outfile for writing: $! \n";
$comment = "# This table contains code points from Table A.1 from RFC 3454\n";
readPrint($inFH,$outFH, $comment, "A");
close($outFH);
}
#-----------------------------------------------------------------------
sub createMapToNothing{
($inFH,$outfile) = @_;
$outFH = IO::File->new($outfile,"a")
or die "could not open the file $outfile for writing: $! \n";
$comment = "# This table contains code points from Table B.1 from RFC 3454\n";
readPrint($inFH,$outFH,$comment, "B.1");
close($outFH);
}
#-----------------------------------------------------------------------
sub createCaseMapNorm{
($inFH,$outfile) = @_;
$outFH = IO::File->new($outfile,"a")
or die "could not open the file $outfile for writing: $! \n";
$comment = $warning."# This table contains code points from Table B.2 from RFC 3454\n";
readPrint($inFH,$outFH,$comment, "B.2");
close($outFH);
}
#-----------------------------------------------------------------------
sub createCaseMapNoNorm{
($inFH,$outfile) = @_;
$outFH = IO::File->new($outfile,"a")
or die "could not open the file $outfile for writing: $! \n";
$comment = $warning."# This table contains code points from Table B.3 from RFC 3454\n";
readPrint($inFH,$outFH,$comment, "B.3");
close($outFH);
}
#-----------------------------------------------------------------------
sub createProhibitedTable{
($inFH,$outfile,$line) = @_;
$line =~ s/Start//;
$line =~ s/-//g;
$comment = "# code points from $line";
$outFH = IO::File->new($outfile, "a")
or die "could not open the file $outfile for writing: $! \n";
readPrint($inFH,$outFH,$comment, "C");
close($outFH);
}
#-----------------------------------------------------------------------
sub create_iSCSIExtraProhibitedTable{
($inFH,$outfile,$line) = @_;
$comment ="# Additional prohibitions from draft-ietf-ips-iscsi-string-prep-06.txt\n";
$outFH = IO::File->new($outfile, "a")
or die "could not open the file $outfile for writing: $! \n";
print $outFH $comment;
print $outFH "0021..002C; ; PROHIBITED\n";
print $outFH "002F; ; PROHIBITED\n";
print $outFH "003B..0040; ; PROHIBITED\n";
print $outFH "005B..0060; ; PROHIBITED\n";
print $outFH "007B..007E; ; PROHIBITED\n";
print $outFH "3002; ; PROHIBITED\n";
print $outFH "\n# Total code points 30\n";
close($outFH);
}
#-----------------------------------------------------------------------
sub usage {
print << "END";
Usage:
filterRFC3454.pl
Options:
--sourcedir=<directory>
--destdir=<directory>
--src-filename=<name of RFC file>
--dest-filename=<name of destination file>
--A1 Generate data for table A.1
--B1 Generate data for table B.1
--B2 Generate data for table B.2
--B3 Generate data for table B.3
--C11 Generate data for table C.1.1
--C12 Generate data for table C.1.2
--C21 Generate data for table C.2.1
--C22 Generate data for table C.2.2
--C3 Generate data for table C.3
--C4 Generate data for table C.4
--C5 Generate data for table C.5
--C6 Generate data for table C.6
--C7 Generate data for table C.7
--C8 Generate data for table C.8
--C9 Generate data for table C.9
--iscsi Generate data for extra prohibited iSCSI chars
Note, --B2 and --B3 are mutually exclusive.
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
filterRFC3454.pl filters the RFC file and creates String prep table files.
The RFC text can be downloaded from ftp://ftp.rfc-editor.org/in-notes/rfc3454.txt
END
exit(0);
}