#!/usr/bin/perl -w # # Make a dictd database index from a database file. # Entries must be of one of these two forms: # # word - definition follows a hypen surrounded by spaces # and is permitted to span lines. # # alternate # form where the word appears on a line by itself # but the definition may still span lines. # # Any line beginning with non-whitespace starts a new entry. # # # By Seth Golub # http://www.aigeek.com/ # 8 Mar 2000 use strict; my $alphabet = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'; my $byte_offset = 0; my $bytes_current_entry = 0; my $key; my %table = (); my $sort = 1; if ( (@ARGV > 0) && ($ARGV[0] =~ /^-/) ) { require Getopt::Std; my %opts = (); Getopt::Std::getopts( "Sh", \%opts ); usage() if defined( $opts{'h'} ); $sort = 0 if defined( $opts{'S'} ); } my $line; while ( $line = <> ) { if ( $line =~ /^\S/ ) { if ( defined( $key ) ) { index_entry( $key, $byte_offset, $bytes_current_entry ); } $byte_offset += $bytes_current_entry; $bytes_current_entry = 0; ( $key ) = $line =~ /^(.+?)( +-.*)?$/; warn "Failed to find key: $line" if !defined( $key ); } $bytes_current_entry += length( $line ); } index_entry( $key, $byte_offset, $bytes_current_entry ) if defined( $key ); if ( $sort ) { foreach my $key ( sort { lc($a) cmp lc($b) } keys %table ) { print $table{$key}; } } exit; sub encode_base64 { my ( $num ) = @_; return "A" if ($num == 0); my $str = ""; while ( $num > 0 ) { $str = substr( $alphabet, $num % 64, 1 ) . $str; $num >>= 6; # same as /= 64, but probably faster } return $str; } sub index_entry { my ( $key, $byte_offset, $byte_length ) = @_; my $entry = sprintf( "%s\t%s\t%s\n", $key, encode_base64( $byte_offset ), encode_base64( $byte_length ) ); if ( $sort ) { $table{$key} = $entry; } else { print $entry; } } sub usage { die " Usage: $0 [-h][-S] [file] [file] .. -h Print this help message -S Do not sort entries \n"; } __END__