#!/usr/bin/perl
my
$unlink
;
END {
defined
$unlink
and -f
$unlink
and
unlink
(
$unlink
);
}
sub
usage {
(
my
$prog
= $0 ) =~ s/^.*//;
print
STDERR
<<"EOT";
Usage: $prog --help
$prog --create GDBM-FILE [INPUT-FILE ...]
$prog --dump GDBM-FILE
EOT
exit
shift
;
}
sub
cmd_create {
my
$dbmfile
=
shift
;
my
$newfile
=
$dbmfile
.
'.NEW'
;
my
$fh
= IO::File->new(
$newfile
, O_CREAT | O_EXCL )
or
die
"Error opening $newfile: $!\n"
;
$unlink
=
$newfile
;
$fh
->
close
();
my
%h
;
tie
(
%h
,
'GDBM_File'
,
$newfile
, GDBM_NEWDB, 0644 )
or
die
"Error opening $newfile: $!\n"
;
while
(<>) {
next
if
/^
chomp
;
my
(
$k
,
$v
) =
split
( /:/,
$_
, 2 ) or
next
;
$v
= 1
unless
defined
$v
;
die
"Already seen $k\n"
if
$h
{
$k
};
$h
{
$k
} =
$v
;
}
untie
(
%h
) or
die
"Error untying $newfile: $!"
;
rename
(
$newfile
,
$dbmfile
)
or
die
"Error renaming $newfile to $dbmfile"
;
}
sub
cmd_dump {
my
$dbmfile
=
shift
;
my
%h
;
tie
(
%h
,
'GDBM_File'
,
$dbmfile
, GDBM_READER, 0 )
or
die
"Error opening $dbmfile: $!\n"
;
print
map
(
"$_:$h{$_}\n"
,
keys
%h
);
}
my
(
$help
,
$create
,
$dump
);
GetOptions(
'help'
=> \
$help
,
'create=s'
=> \
$create
,
'dump=s'
=> \
$dump
) or usage(1);
if
(
$help
) {
usage(0);
}
elsif
(
$create
and not
$dump
) {
cmd_create(
$create
);
}
elsif
(
$dump
and not
$create
) {
cmd_dump(
$dump
);
}
elsif
(
$dump
and
$create
) {
die
"Only one of --dump or --create may be specified\n"
;
}
else
{
die
"One of --dump or --create must be specified\n"
;
}