#!/usr/bin/perl

# Copyright (C) 2003, 2004 by INRIA

# $Id: register_parsers,v 1.3 2004/12/02 17:47:45 rousse Exp $

use strict;
use Getopt::Mixed "nextOption";

my $info;;

Getopt::Mixed::init( "a=s add>a" );

while (my ($option,$value) = nextOption()) {
  $info =$value, next if ($option eq 'a');
}

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 parsed 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 AUTHOR

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

=head1 SEE ALSO

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

DyALog <http://atoll.inria.fr/~clerger>

=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

