/******************************************
*
* Cedric Pradalier 2001
* mail : http://cedric.pradalier.free.fr/mail.html
*
*****************************************/
#include "arrets.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "corresp.h"
#include "bdlignes.h"
#include "lignes.h"
#include "output.h"
/*************************************************
Fichier de representation des arrets
**************************************************/
CArrets::CArrets()
{
mNom=NULL;
mId=0;
mNbLignesPresentes=0;
tLignesPresentes=NULL;
}
CArrets::~CArrets()
{
// sprintf(outbuf,"deleting arrets %s\n",mNom);FlushBuffer();
free(mNom);
delete [] tLignesPresentes;
}
void strtrim(char * s)
{
int i;
i=0;
while (s[i] != 0) i++;
i -= 1;
while ((s[i] == ' ') || (s[i] == '\t')) i--;
s[i+1] = 0;
}
/* Lecture d'un fichier : fp doit etre deja ouvert
Le fichier doit suivre les spec definies dans Regles
Et Le prochain champ doit effectivement etre la definition
d'un arret.
Sinon, le fscanf ne marche pas.
On lit ensuite toutes les lignes presentes a cet arret */
int CArrets::Read(FILE * fp)
{
char tnom[80];
int i=0;
fscanf(fp,"%d %[^:\t] : %d",&mId,tnom,&mNbLignesPresentes);
strtrim(tnom);
tLignesPresentes=new int[mNbLignesPresentes];
for (i=0;i<mNbLignesPresentes;i++)
fscanf(fp,"%d",&(tLignesPresentes[i]));
mNom = (char *) malloc((strlen(tnom)+1) * sizeof(char));
strcpy(mNom,tnom);
return 0;
}
/* Si on a juste besoin de lire l'Id de l'arret,
La Base de donnee est deja formee */
int CArrets::ReadId(FILE * fp)
{
char ligne[80];
int i;
fgets(ligne,80,fp);
sscanf(ligne,"%d",&i);
return i;
}
/* Affichage */
void CArrets::Print()
{
sprintf(outbuf,"%i : %s -> ",mId,mNom);FlushBuffer();
for(int i=0;i<mNbLignesPresentes;i++)
sprintf(outbuf,"%i ",tLignesPresentes[i]);FlushBuffer();
sprintf(outbuf,"\n");FlushBuffer();
}
void CArrets::PrintMin()
{
sprintf(outbuf,"%03i = %s\n",mId,mNom);FlushBuffer();
}
/* Extraction des lignes presente a un arret
Simple ajout des elem du tableau dans l'ensemble E
pour pouvoir supprimer les doublons */
void CArrets::ExtraitPresentes(CEnsemble * E,void * pBDL)
{
CBDLignes * pBD = (CBDLignes *) pBDL;
CLignes * ind;
for (int i=0;i<mNbLignesPresentes;i++)
if ((ind = pBD->Find(tLignesPresentes[i])) != NULL)
{
CCorresp * nouveau = new CCorresp(this,ind,s_aller);
// nouveau->AddInterdit(mId);
E->add((CObjet *) nouveau);
}
}