#!/usr/bin/perl -lw

use utf8;
use strict;
use warnings;

BEGIN {
    unshift @INC, ( $ENV{'POPHOME'} || '@POPHOME@' ) . '/lib'
      unless $ENV{'KUNDE_NO_PERLPATH'};
}

use Dbase::Getopt;
use Dbase::Globals qw(bignum find_descr get_bitmap get_gruppen);

my ( $AsBitmap, @Gruppen );
my @Args = GetOptions(
    'as-bitmap'       => \$AsBitmap,
    'bitmap4gruppe=s' => sub { push @Gruppen, $_[1]; $AsBitmap = 1 }
    ,    # für Abwärtskompatibilität
    'descr=s'  => \my $Descr,
    'gruppe=s' => \@Gruppen,
);

die "--descr muss angegeben werden!\n" unless defined $Descr;

my $bitmap = bignum(0);
$bitmap |= get_bitmap( $Descr => $_, 1 ) for @Gruppen;

for (@Args) {
    my ( $grs, $grc ) = get_gruppen( $Descr, $_, 1 );
    $bitmap |= $grs;
    $bitmap ^= ( $bitmap & $grc );
}

if ($AsBitmap) { print $bitmap }
else {
    my @bits;
    my $bit = 0;
    while ($bitmap) {
        push @bits, $bit if $bitmap & 1;
        $bitmap >>= 1;
        ++$bit;
    }
    print join ',', @bits;
}

__END__

=head1 NAME

find_descr - Deskriptorenwerte ermitteln

=head1 SYNOPSE

Gib die Nummern der Personen-Flags C<pwdomain> und <mail> aus:

    find_descr -descr pwdomain mail

Gib eine Bitmaske für alle Personen-Flags der Gruppe C<hide> außer C<service>
aus:

    find_descr -descr pwdomain -gruppe hide '!service' -as-bitmap

Gib eine komma-getrennte Liste aller zur Gruppe C<registriert> gehörenden
Domainstatus aus:

    find_descr -descr domainstatus -gruppe registriert

=head1 BESCHREIBUNG

Dieses Tool ist dazu gedacht, etwa innerhalb von Shell-Scripts Deskriptorenwerte
zu ermitteln.
Es können mehrere Deskriptorennamen angegeben werden; die zugehörigen
Zahlenwerte werden zeilenweise ausgegeben.

=head1 NOTWENDIGE ARGUMENTE

=over 4

=item -descr TABELLENNAME

Name der Deskriptorentabelle, um die es geht

=back

=head1 OPTIONEN

=over 4

=item -as-bitmap

Deskriptorenliste als Bitmaske ausgeben.

=item -gruppe Deskriptorengruppe

Alle Deskriptoren der angegebenen Gruppe auswählen.
Diese Option kann mehrfach verwendet werden, um Deskriptoren
mehrerer Gruppen auszuwählen (ODER-Verknüpfung).

=item -help

=item -?

um (nur) diese Dokumentation anzeigen zu lassen

=back

