/******************************************
*
* Cedric Pradalier 2001
* mail : http://cedric.pradalier.free.fr/mail.html
*
*****************************************/
#include "recherche.h"
#include "lignes.h"
#include "lignes_gen.h"
#include "arrets.h"
#include "bdlignes.h"
#include "bdarrets.h"
#include "horaire.h"
#include "vector.h"
#include "ensemble.h"
#include "corresp.h"
#include "date.h"
#include "treillis.h"
#include "output.h"
#include <string.h>
void PrintItineraires(CommunicationStruct * S)
{
int i;
// Enfin on affiche
if (S->ArretDepSensUnique)
{
sprintf(outbuf,"ATTENTION : L'arret %s est desservi en sens unique \n",
S->ADep->mNom);
FlushBuffer();
}
sprintf(outbuf,"Recherche itineraires effectuee.\n"); FlushBuffer();
sprintf(outbuf,"--> %i itineraires trouves\n",S->NbItinTrouves); FlushBuffer();
sprintf(outbuf,"Mise a jour des horaires de correspondance.\n"); FlushBuffer();
sprintf(outbuf,"--> Nombre d'itinéraires impossibles : %i\n",S->NbItinRejetes); FlushBuffer();
sprintf(outbuf,"\n Depart : %s",S->ADep->mNom); FlushBuffer();
sprintf(outbuf,"\n Arrivee : %s",S->AArr->mNom); FlushBuffer();
sprintf(outbuf,"\n Date : %s ",GetDayString(S->Date.GetDayinWeek()));FlushBuffer();
S->Date.Print();
sprintf(outbuf,"\n Arrivee -- heure limite : "); FlushBuffer();
S->Limite.Print();
sprintf(outbuf,"\n Temps minimal de correspondance : "); FlushBuffer();
S->TpsCorresp.Print();
sprintf(outbuf,"\n"); FlushBuffer();
S->Itineraires.Sort();
for (i=0;i<S->Itineraires.GetNbElem();i++)
{
CTreillis * iti = (CTreillis *) S->Itineraires.ElemAt(i);
sprintf(outbuf,"--------------------------------------------------\n");
FlushBuffer();
iti->Print();
}
if (S->Itineraires.GetNbElem() == 0)
{
sprintf(outbuf,"--------------------------------------------------\n");
FlushBuffer();
sprintf(outbuf,"Aucun itineraire possible\n");
FlushBuffer();
}
sprintf(outbuf,"--------------------------------------------------\n");
FlushBuffer();
}
int main(int argc,char *argv[])
{
/************************************************
Appel :
itinR [<repertoire de travail>] [<fichier requete>]
Le principe du main est de lire les fichiers
de definition des BD d'arrets et de lignes.
Puis de lire les arguments de la requetes
Enfin, on appelle la fonction de recherche
avec les bons arguments
**************************************************/
FILE * fp;
CDate Date;
char temp[80] = "";
char dir[80] = ".";
if (argc > 1)
{
strcpy(dir,argv[1]);
}
if (argc > 2)
{
if ((fp = fopen(argv[2],"r")) == NULL)
{
sprintf(outbuf,"Impossible de trouver le fichier ""query""\n");
FlushBuffer();
exit(1);
}
}
else
{
/* Ajout du repertoire */
strcpy(temp,dir);
strcat(temp,"/query");
if ((fp = fopen(temp,"r")) == NULL)
{
sprintf(outbuf,"Impossible de trouver le fichier ""query""\n");
FlushBuffer();
exit(1);
}
}
int IndDep,IndArr,HCode,TCode,MaxCorresp;
CommunicationStruct S;
fscanf(fp,"Depart = %d \n",&IndDep);
fscanf(fp,"Arrivee = %d \n",&IndArr);
fscanf(fp,"Limite = %d \n",&HCode);
fscanf(fp,"Nb Max de correspondances = %d \n",&MaxCorresp);
fscanf(fp,"Tps Corresp = %d \n",&TCode);
fscanf(fp,"Date = ");
if (Date.Read(fp))
{
fscanf(fp," \n");
fclose(fp);
}
else
{
fclose(fp);
sprintf(outbuf,"Date illisible dans la requete.\n");
FlushBuffer();
exit(1);
}
sprintf(outbuf," \n Itineraires grenoblois : version 0.4\n");
FlushBuffer();
sprintf(outbuf,"Chargement...\n");
FlushBuffer();
strcpy(temp,dir);
strcat(temp,"/horaires/TAG.arrets");
CBDArrets * pBDA = new CBDArrets(temp);
strcpy(temp,dir);
strcat(temp,"/horaires/TAG.lignes");
CBDLignes * pBDL = new CBDLignes(temp,pBDA);
// CLignes * ligne;
pBDL->LoadHoraires(Date,pBDA);
sprintf(outbuf,"Chargement effectue.\n");
FlushBuffer();
sprintf(outbuf,"Debut de la recherche...\n");
FlushBuffer();
S.TpsCorresp = CHoraire(TCode);
S.Limite = CHoraire(HCode);
S.Date = Date;
S.ADep = pBDA->Find(IndDep);
S.AArr = pBDA->Find(IndArr);
S.MaxNbCorresp = MaxCorresp;
Recherche(pBDA, pBDL, &S);
// Affichage
PrintItineraires(&S);
delete pBDA;
delete pBDL;
}