#!/usr/bin/perl

# $Id: register_parsers 1641 2008-01-25 10:54:06Z icabrera $

use strict;
use AppConfig qw/:argcount :expand/;

my $info;;

my $config = AppConfig->new(
			    "add|a=s" => {DEFAULT => ''},
                           );
$config->args();

$info = $config->add unless (!$config->add);

my $conf = shift || '/etc/parserd.conf';

my %parsers = ();

die "Nothing to register (with -a)" unless $info;

open(INFO,"<$info") || die "Can't open $info";

my $parser=0;

my @parsers=();

while(<INFO>) {
  if (/^\s*\[\s*(.*?)\s*\]/){
    $parser=$1;
    $parsers{$parser} = $_;
    push(@parsers,$parser);
    next;
  }
  s/^\s*//;
  $parsers{$parser} .= $_, next if ($parser);
}

close(INFO);

my $pat =join('|',@parsers);
$pat = qr/($pat)/;

my $delete = 0;

unless (-e "$conf"){
  open(CONF,">$conf") || die "cant create conf file $conf";
  while (<DATA> !~ /^__CONF__/){};
  print CONF <DATA>;
  close(CONF);
  close(DATA);
}

my $backup = "$conf.bak";

rename($conf,$backup) || die "can't rename conf file $conf";

open(CONF,"<$backup") || die "Can't open $backup";
open(OUT,">$conf") || die "Can't open $conf";

my $found = 0;
while(<CONF>){
  chomp;
  $delete = ($1 =~ $pat) if (/^\s*\[\s*(.*?)\s*\]/);
  if (/^\s*parsers\s*=/) {
    foreach $parser (@parsers) {
      $_ .= " $parser" unless /\b$parser\b/;
    }
    $found = 1;
  }
  s/^\s*//o;
  print OUT "$_\n" unless $delete;
}
unless ($found) {
  print OUT "\n";
  print OUT "parsers = " . join(" " , @parsers) . "\n";
}

foreach $parser (@parsers) {
  print OUT "\n";
  print OUT $parsers{$parser};
}

close(OUT);
close(CONF);


__END__

=head1 NAME

register_parsers - A simple perl script to register parsers in parserd configuration file

=head1 SYNOPSIS

register_parsers -a <partial_conf_file> <parserd.conf>

=head1 DESCRIPTION

register_parsers adds information about servers defined in
B<partial_conf_file> to parserd configuration file <parserd.conf>.
Existing previous configurations for these parsers are overwritten.

=head1 COPYRIGHT AND LICENSE

Copyright (C) 2003-2008, INRIA.

This program is free software; you can redistribute it and/or modify it under
the same terms as Perl itself.

=head1 AUTHOR

Eric de la Clergerie, Eric.De_La_Clergerie@inria.fr

=head1 SEE ALSO

perl (1)
parserd (1)
parser_client (1)
parser.pl

DyALog <http://alpage.inria.fr/dyalog.en.html>
parserd <http://alpage.inria.fr/catalogue.en.html#parserd>

=cut

__CONF__
# parserd.conf configuration file for parserd

# Verbose [default = 0]
# verbose off

# Should we daemonize the server [default = 1 ]
# setsid = 1

# Port of the server [default = 8999]
# port = 8999

# To set \$PATH env var [ default = /usr/ucb /bin ]
# path = /usr/ucb
# path = /bin

# Name of log file [default = /tmp/parserd.log]
# log_file = /tmp/parserd.log

# Max number of clients [default = 2]
# maxclients = 2

# Parser list
parsers = 

# Definition of each parser

