#!/usr/bin/perl

###########################################################################
#
# Script Perl permettant de definir un formulaire et des routines associees
# pour permettre aux etudiants de trouver des references dans la bibliographie
# sur les methodes formelles.
#
# Auteur: Guy Tremblay
# Creation: Printemps 1998
# Revision: Hiver 1997
#
###########################################################################


#----------------------------------------------------------------------

if ($ENV{"SCRIPT_FILENAME"}) {
    @tmp1 = split( "/", $ENV{"SCRIPT_FILENAME"} );
} else {
    @tmp1 = split( "/", $ENV{"HOME"} );
}
$home = $tmp1[1];


# Variable globale a utiliser comme prefixe pour acceder a ma bibliographie

$prefixeBib = "/$home/tremblay_gu/biblio/";

#----------------------------------------------------------------------


require "/$home/tremblay_gu/public_html/cgi-bin/cgi-lib.pl";
$ancienneLigne = "";
$finRencontree = 0;


MAIN:
{

    if (&ReadParse(*input))
    {
	&ProcessForm;
    }
    else
    {
	&ShowForm;
    }
}

###############################################
#Sous-routine qui affiche le formulaire
###############################################
sub ShowForm
{
	print &PrintHeader;
	print &HtmlTop("Recherche d'un article dans la bibliographie sur les m&eacute;thodes formelles.");
	print <<EOTA;
&Agrave; chaque r&eacute;f&eacute;rence (ou presque) 
de cette bibliographie est 
associ&eacute;e un r&eacute;sum&eacute; d&eacute;crivant bri&egrave;vement
    le contenu de la r&eacute;f&eacute;rence.
<P>

Le mot-cl&eacute; (le cl&eacute; de recherche) indiqu&eacute; plus bas va
trouver les r&eacute;f&eacute;rences annot&eacute;es avec
``<TT>\\\\Application</TT>'', indiquant des articles o&ugrave;
l'accent est mis principalement sur la description d'une application
industrielle des m&eacute;thodes formelles. Toutefois, d'autres
articles sans cette annotation pr&eacute;sentent de telles
applications (par ex., des
articles inclus dans divers recueils d'articles.)

<P>
<HR>
<P>

Le mot-cl&eacute; 
indiqu&eacute; pour la recherche peut &ecirc;tre un
nom d'auteur, un mot d'un titre ou un mot-cl&eacute; d&eacute;crivant
le contenu de l'article ou livre. En fait, de fa&ccedil;on plus
g&eacute;n&eacute;rale, cette cl&eacute; de recherche peut &ecirc;tre
une expression r&eacute;guli&egrave;re <i>perl</i>.

	<FORM METHOD=POST>
	<P>
<PRE>Entrez un mot-cl&eacute;:       <INPUT TYPE="TEXT" NAME="motcle" SIZE=20 VALUE="\\\\Application">
</PRE>

<P>
<P>

<SELECT NAME="biblio">
<OPTION VALUE="mf" SELECTED> M&eacute;thodes formelles
<OPTION VALUE="fp">Programmation fonctionnelle 
<OPTION VALUE="arch+pp">Architecture et programmation parall&egrave;le
<OPTION VALUE="comp">Compilation
</SELECT>



<INPUT TYPE="SUBMIT" VALUE="Effectuer recherche">
<INPUT TYPE="RESET" VALUE="Effacer">
</FORM>

<P>

Lorsque vous aurez trouv&eacute; un article qui vous int&eacute;resse,
prenez note de la cl&eacute; bibliographique (sur la 
ligne contenant ``\@'': la cl&eacute; est l'identificateur
entre les caract&egrave;res ``{'' et ``,'') ainsi que du titre de
l'article et <A HREF="./choisir.cgi">aller remplir le formulaire
appropri&eacute;</A>.

<P>

Note: Vous pouvez &eacute;videmment choisir un article qui n'est pas dans cette
bibliographie. Dans ce cas, faites-moi toutefois parvenir la
r&eacute;f&eacute;rence exacte et je l'ajouterai dans la bibliographie.

<P>

<P><HR><P><P><P>
    <B> R&eacute;alisation</B>: Ce script a &eacute;t&eacute; d&eacute;velopp&eacute; par <A HREF="http://www.labunix.uqam.ca/~tremblay"> Guy Tremblay</A>, professeur au d&eacute;partement d'informatique de l'UQAM.
EOTA
    
    print "<P><P>";
	
	print &HtmlBot;
}


sub ProcessForm
{
    local($motCle);

    $motCle = $input{'motcle'};
    $laBib = $input{'biblio'};
    if (!$laBib) {
	$laBib = "mf";
    }
    $bib = $prefixeBib . $laBib . ".bib";

    print &PrintHeader;
    print &HtmlTop("R&eacute;f&eacute;rences trouv&eacute;es pour \"$motCle\" (dans $laBib.bib)");
    
    &ObtenirReferences($motCle);

    print "<P><P>";
    print &HtmlBot;
}


# -------------------------------------------------

sub ObtenirReferences
{
    local($motCle) = @_;
    local($numRef) = 0;

    $motCle =~ y/a-z/A-Z/;


    if (!open(BIB, "< $bib")) {
        print "$bib\n";
	print "*** Erreur: Fichier bibliographie pas trouvee\n";
	return;
    }

    $refs = "";

    print "<A NAME=\"Ref-0\"></A>\n<UL>\n";
    while($ref = &obtenirReference) {
	$laRef = $ref;
	$ref =~ y/a-z/A-Z/;
	if ($ref =~ /$motCle/) {
	    $titre = &trouverTitre($laRef);
	    $laRef =~ s/!!/\n/g;
	    $numRef = $numRef + 1;
	    print "<LI><A HREF=\"\#Ref-$numRef\"> \# $numRef: </A>$titre\n";
	    $refs = 
		$refs . 
                "<B><A NAME=\"Ref-$numRef\">" . 
		"R&eacute;f&eacute;rence \#$numRef: " . 
		"</A></B>\n<PRE>\n$laRef</PRE>\n<P><EM>Pour revenir &agrave;
l'index, <A HREF=\"#index\">cliquez-ici.</A></EM><P>Pour remplir le
formulaire de choix, <A HREF=\"./choisir.cgi\">cliquez-ici</A><P><HR><P>\n\n";
	}
    }
    close(BIB);
    if ($numRef == 0) {
	print "<LI> Aucune r&eacute;f&eacute;rence trouv&eacute;e\n";
    }
    print "</UL>\n";
    print "<P> <HR><P>\n";
    print $refs;
}

sub trouverTitre
{
    local($uneRef) = @_;
    $titreTrouve = 0;

    @words = split(/!!/, $uneRef);
    for( $i = 0; ($i < $#words) && (! $titreTrouve); $i++ ) {
	if ( $words[$i] =~ /[ \t]title/ ) {
	    $words[$i] =~ s/[ \t]*title[ \t]*=[ \t]*//;
	    $titreTrouve = $words[$i];
	}
    }
    if (! $titreTrouve) {
	return "Titre inconnu";
    }

    for ( ; $i < $#words; $i++ ) {
	if ( $words[$i] =~ /=/ ) {
	    chop $titreTrouve;
	    return $titreTrouve;
	}
	$words[$i] =~ s/^[ \t]*//;
	$titreTrouve .= " " . $words[$i];
    }
}

sub obtenirReference
{
    $ref = "";
    $trouve = 0;
    $fin = 0;
    
    if ($finRencontree) {
	return( 0 );
    }

    if ($ancienneLigne && ($ancienneLigne ne "")) {
	$ligne = $ancienneLigne;
    } else {
	$ancienneLigne = $ligne;
	$ligne = <BIB>;
	$finRencontree = (! $ligne);
    }
    
    
    while ( $ligne && (! $fin) ) {
	if (substr($ligne,0,1) eq "@") {
	    if ($trouve) {
		$fin = 1;
	    } else {
		$trouve = 1;
		chop $ligne;
		$ref = $ligne . "!!";
	    }
	} else {
	    chop $ligne;
	    $ref = $ref . $ligne . "!!";
	}
	$ancienneLigne = $ligne;
	if (! $fin) {
	    $ligne = <BIB>;
	    if (! $ligne) {
		$finRencontree = 1;
		$ancienneLigne = $ligne;
	    }
	}
    }
    
    return $ref;
}
