#/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= --destdir= --src-filename= --dest-filename= --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); }