#include <stdio.h>
#include <fcntl.h>
#include <errno.h>
#include <string.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>

#include "commun.h"
#include "section.h"

#define false 0
#define true  1

char* cBufferParam = 0;
char* cBufferTrt = 0;

int iTaille;

/*-------------------------------------------------------------------------*/
// Ouverture et chargement en mémoire du contenu du fichier paramètre
//
// Test ok le 14/03/06
//
//
/*-------------------------------------------------------------------------*/
int OpenFileParam(char* szFile)
{
	int hSrcFile;
	char szErreur[300];
    
	hSrcFile = open (szFile, O_RDONLY, S_IRUSR);
	
	if (hSrcFile == -1)
	{
		sprintf (szErreur, "Erreur durant l'ouverture du fichier paramètre %s:%d", szFile, errno);
		GenereErreur (szErreur);
		return false;
	}

	iTaille = lseek (hSrcFile, 0, SEEK_END);

	cBufferParam = (char *) malloc (iTaille+1);

    memset (cBufferParam, 0, iTaille+1);
    lseek (hSrcFile, 0, SEEK_SET);
	if (read (hSrcFile, cBufferParam, iTaille) == -1)
	{
		sprintf (szErreur, "Erreur durant la lecture du fichier paramètre %s:%d", szFile,errno);
		GenereErreur (szErreur);
		close (hSrcFile);
		return false;
	}

	close (hSrcFile);
	return true;
}

/*-------------------------------------------------------------------------*/
// Libération de la mémoire allouée pour le fichier paramètre
//
// Test ok le 14/03/06
//
//
/*-------------------------------------------------------------------------*/

void CloseFileParam ()
{
#ifndef WINTST
	free (cBufferParam);
#endif
	cBufferParam = 0;
}

/*-------------------------------------------------------------------------*/
// Cherche la première section à partir de la position courante (szBufferSection)
// en mémoire et retourne le numéro de section ainsi que sa taille
// 
// Code testé et ok le 03/03/06
//
/*-------------------------------------------------------------------------*/
int FindFirstNextSection(char** szBufferSection, int* iTailleSection)
{
	int iNumSection;
	int iCpt;
	char szSection[20];
	char szErreur[200];

	iNumSection = 0;
	
	if (cBufferParam != 0)
	{
		memset (szSection, 0, sizeof (szSection));

		if (*szBufferSection == 0)
			cBufferTrt = cBufferParam;
		else
			cBufferTrt = *szBufferSection;

		if (*cBufferTrt != '[')
		{
			do
			{
				cBufferTrt+=1;
			}while (cBufferTrt <= cBufferParam + iTaille && *cBufferTrt != '[');
		}

		if (cBufferTrt + 1 >= cBufferParam + iTaille)
		{
/*			strcpy (szErreur, "Erreur: Aucune section trouvée.");
			GenereErreur (szErreur);*/
		}
		else
		{
			// On est sur le crochet, on passe donc au caratère suivant
			cBufferTrt+=1;
			if (*cBufferTrt == ']')
			{
				strcpy (szErreur, "Erreur: une section sans nom trouvée.");
				GenereErreur (szErreur);
			}
			else
			{
				iCpt = 0;
				do
				{
					if (*cBufferTrt != ' ' && *cBufferTrt != 13 && *cBufferTrt != 10 && *cBufferTrt != ']')
						szSection [iCpt++] = *cBufferTrt;
					cBufferTrt+=1;
				}while (cBufferTrt <= cBufferParam + iTaille && *cBufferTrt != ']');

				if (iCpt == 0)
				{
					strcpy (szErreur, "Erreur: une section sans nom trouvée.");
					GenereErreur (szErreur);
				}
				else
				{
					if (*cBufferTrt != ']' && cBufferTrt >= cBufferParam + iTaille)
					{
						strcpy (szErreur, "Erreur: Fin de fichier trouvé sur un début de section.");
						GenereErreur (szErreur);
					}
					else
					{
						// Determiner la section
						Majuscule (szSection);
						iNumSection = DeterminerSection(szSection);
						if (iNumSection != 0)
						{
							// On calcul la taille de la section
							cBufferTrt+=1;
							do
							{
								cBufferTrt+=1;
							}while (cBufferTrt <= cBufferParam + iTaille && (*cBufferTrt == 13 || *cBufferTrt == 10 || *cBufferTrt == 32));

							if (cBufferTrt <= cBufferParam + iTaille)
							{
								*szBufferSection = cBufferTrt;

								if (*cBufferTrt != '[')
								{
									*iTailleSection = 0;
									do
									{
										cBufferTrt+=1;
										*(iTailleSection)+=1;
									}while (cBufferTrt <= cBufferParam + iTaille && *cBufferTrt != '[');
								}
							}
							// Sinon, la section est vide et il n'y a plus rien dans le fichier, on stop !
						}
					}
				}
			}
		}
	}

	return iNumSection;
}
