blob: 63dc396ac54084571523b490364ed81ae4bd7b95 [file] [log] [blame]
:
eval 'exec perl -S $0 ${1+"$@"}'
if 0;
#**************************************************************
#
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.
#
#**************************************************************
#
# add keyids to sdf file
#
use Compress::Zlib();
print "\nkeyidGen version 1.0 \n\n";
my ( $infile,$outfile,$dbimport );
get_options();
print_help() if ( !defined $infile || $help );
exit 1 if ( !defined $infile );
if ( ! defined $outfile )
{
$outfile = $infile;
$outfile =~ s/\.sdf$//i;
$outfile .= "_KeyID.sdf";
}
$collisions = 0;
%hashcodes = ();
$count = 0;
print "writing to $outfile\n";
open INFILE,"<$infile" || die "could not open $infile $! $^E\n";
open OUTFILE,">$outfile" || die "could not open $outfile $! $^E\n";
while ( <INFILE> )
{
$line = $_;
chomp $line;
$hash = 0;
if ( $line =~ /^([^\t]*)\t([^\t]*)\t([^\t]*)\t([^\t]*)\t([^\t]*)\t([^\t]*)\t([^\t]*)\t([^\t]*)\t([^\t]*)\t([^\t]*)\t([^\t]*)\t([^\t]*)\t([^\t]*)\t([^\t]*)\t([^\t]*)$/ )
{
$string="$1 $2 $4 $5 $6 $7 $8";
$hashp = makeID( $string );
if ( defined ($hashcodes{ $hashp } ) )
{
$collisions ++ unless $hashcodes{ $hashp } eq $string;
}
$hashcodes{ $hashp } = $string;
$count++;
if ( $dbimport )
{
my ( $pre, $post, $old );
$pre = "$1\t$2\t";
$post = "\t$4\t$5\t$6\t$7\t$8\t$9\t$10\t$11\t$12\t$13\t$14\t$15\n";
$old = $3;
$old =~ s/;{0,1}keyid:......;{0,1}//;
$old =~ s/^0$//;
if ( $old ne "" ) { $old .= ";"; }
print OUTFILE "$pre${old}keyid:$hashp$post";
}
else
{
print OUTFILE "$1\t$2\t$3\t$4\t$5\t$6\t$7\t$8\t$9\t$10\t".makekidstr($hashp,$11)."\t".makekidstr($hashp,$12)."\t$13\t".makekidstr($hashp,$14)."\t$15\n";
}
}
}
print "$count entries\n";
print "$collisions collisions\n";
close INFILE;
close OUTFILE;
sub makeID
{
my ( $String ) = shift;
my ( $hash );
# hardcoded to prevent windows installer to choke on bad directoryname :-((
if ( $String eq "scp2 source\\ooo\\directory_ooo.ulf LngText STR_DIR_KAPITEL " )
{
return "keyid1";
}
$hash = Compress::Zlib::crc32( $String, undef );
return makenumber( $hash );
}
sub makenumber
{
$h = shift;
# 1 2 3 4
# 1234567890123456789012345678901234567890
$symbols="0123456789abcdefghijklmnopqrstuvwxyz+-[=]";
$order = length($symbols);
$result = "";
while ( length( $result ) < 6 )
{
$result .= substr( $symbols, ($h % $order), 1 );
$h = int( $h / $order );
}
die "makenumber failed because number is too big (this cannot be so this is a strange error)" if $h > 0;
return reverse $result;
}
sub makekidstr
{
$kid = shift;
$str = shift;
if ( $str ne "" )
{
# special handling for strings starting with font descriptions like {&Tahoma8} (win system integration)
if ( $str =~ s/^(\{\&[^\}]+\})// )
{
return "$1$kid‖$str";
}
else
{
return "$kid‖$str";
}
}
else
{
return "";
}
# return "default";
}
sub print_help
{
print "\n\n";
print "keyidGen 0.5 for sdf files\n";
print "--------------------------\n";
print "Usage:\n";
print "keyidGen <infile> [<outfile>] [-dbimport]\n";
print " add keyids to the entries and write them to a file with\n";
print " _KeyID added to the name\n";
print " -dbimport Add KeyID to a new column instead of to the strings.\n";
print " This is needed to import the IDs into tha database.\n";
print "\n\n";
}
sub get_options {
my ($arg,$has_infile);
while ($arg = shift @ARGV) {
$arg =~ /^-dbimport$/ and $dbimport = 1 and next;
$arg =~ /^-help$/ and $help = 1 and next; #show help
if ( !$has_infile )
{
$infile = $arg;
$has_infile = 1;
}
else
{
$outfile = $arg;
}
}
}