// gbagraphics_compiler.cpp : Defines the entry point for the application.
//

#include <windows.h>
#include <stdio.h>
#include "resource.h"

LRESULT CALLBACK DialogProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam);

void Debug(const char *format, ...)		{
	char      vbuf[1024];
	va_list   arg_ptr;
	va_start(arg_ptr, format);
	_vsnprintf(vbuf, sizeof(vbuf), format, arg_ptr);
	MessageBox(NULL,vbuf,"Débogage",0);
}

char (*listeNoms)[65];
const int nbEleMaxListe=1000;
int nbEleListe;
char test10[10]=		{
	10
};

void AjNomUtilise(char *nom)		{
	if (strlen(nom)>64)		{
		MessageBox(NULL,"Le nom de symbole est trop long!\nCette erreur ne devrait pas arriver...","Erreur!!!",MB_ICONERROR);
		return;
	}
	if (nbEleListe+1>=nbEleMaxListe)		{
		MessageBox(NULL,"Trop de symboles!\nCeci ne devrait pas arriver...","Erreur!!!",MB_ICONERROR);
		return;
	}
	strcpy(listeNoms[nbEleListe],nom);
	nbEleListe++;
}

BOOL VerifNomUtilise(char *nom)		{
	int i;
	for (i=0;i<nbEleListe;i++)
		if (!strcmp(nom,listeNoms[i]))
			return TRUE;
	return FALSE;
}

//Fichier Lecture,Ecriture
void EcritEntete(char *fichier, FILE *f, FILE *w)			{
	char str[1000], nomtemp[1000], strcopie[1000];
	char *ptr, *ptrsav;
	int premFois=1;
	int nbImbrications=0;

	while(!feof(f))		{
		fgets(str,1000,f);
		str[strlen(str)-1]=0;
		strcpy(strcopie,str);
		ptr=str;
		//Pas un commentaire
		if (nbImbrications==0 && ((*ptr>='a' && *ptr<='z') || (*ptr>='A' && *ptr<='Z') || *ptr=='_'))			{
			ptr=str;
			while(*ptr!='(' && *ptr!=';' && *ptr!='[' && *ptr!=0 && *ptr!='{' && *ptr!='=')
				ptr++;
			if (*ptr==0 || *ptr=='{')
				goto pasbon;
			if (*ptr=='=' || *ptr==';')
				*ptr=0;
			ptrsav=ptr;
			//Trouver le nom derrière la (, [ ou autre
			ptr--;
			while(*ptr==' ' || *ptr=='	')
				ptr--;
			while((*ptr>='a' && *ptr<='z') || (*ptr>='A' && *ptr<='Z') || (*ptr>='0' && *ptr<='9') || *ptr=='_')
				ptr--;
			ptr++;
			strncpy(nomtemp,ptr,ptrsav-ptr);
			nomtemp[ptrsav-ptr]=0;
			if (VerifNomUtilise(nomtemp))		{
				goto pasbon;
			}
			AjNomUtilise(nomtemp);
			if (*ptrsav=='[')		{
				while(*ptrsav!=';' && *ptrsav!='=' && *ptrsav)
					ptrsav++;
				*ptrsav=0;
			}
			if (*ptrsav=='(')		{
				int imbric;
				imbric=0;
				ptrsav++;
				//PRENDRE EN COMPTE LES ) et ( DANS LES DEFINITION DE FONCTION
				while(*ptrsav)			{
					if (*ptrsav=='(')
						imbric++;
					else if (*ptrsav==')')
						imbric--;
					if (imbric<0)
						break;
					ptrsav++;
				}
				if (*ptrsav==')')
					*(ptrsav+1)=0;
			}
			if (premFois)
				fprintf(w,"//%s\n",fichier);
			premFois=0;
			fputs("extern ",w);
//			fputs(ptr,w);
			fputs(str,w);
			fputs(";\n",w);
		}
pasbon:
		ptr=strcopie;
		while(1)		{
			if (*ptr==0)
				break;
			else if (*ptr=='\"')		{
				ptr++;
				while(*ptr!='\"')		{
					if (*ptr=='\\')
						ptr++;
					ptr++;
				}
			}
			else if (*ptr=='\'')		{
				ptr++;
				while(*ptr!='\'')		{
					if (*ptr=='\\')
						ptr++;
					ptr++;
				}
			}
			else if (*ptr=='{')
				nbImbrications++;
			else if (*ptr=='}')
				nbImbrications--;
			ptr++;
		}
/*		if (!strncmp(str,"const ",6))			{
			char *ptr=str;
			while(*ptr!='=' && *ptr)
				ptr++;
			*ptr++=';';
			*ptr++='\n';
			*ptr++=0;
			if (VerifNomUtilise(str))
				goto pasbon;
			AjNomUtilise(str);
			if (premFois)
				fprintf(w,"//%s\n",fichier);
			premFois=0;
			fputs("extern ",w);
			fputs(str,w);
pasbon:
			;
		}*/
	}
}

#define MAX_PROFONDEUR 32


int APIENTRY WinTest(char (*test2)[10], int test);

int APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR     lpCmdLine,
                     int       nCmdShow)
{
	FILE *f, *w;
	HANDLE hFile, arborescence_hfile[MAX_PROFONDEUR];
	WIN32_FIND_DATA wfd, arborescence_wfd[MAX_PROFONDEUR];
	HWND hWnd;
	int continuer=1, niveau=0;

	hWnd=CreateDialog(hInstance,(LPCTSTR)IDD_DIALOG1,NULL,(DLGPROC)DialogProc);

	w=fopen("all.h","w");

	if (!w)			{
		MessageBox(NULL,"Impossible d'écrire all.h!","Erreur",MB_ICONERROR);
		return 1;
	}

	nbEleListe=0;
	listeNoms=malloc(sizeof(*listeNoms)*nbEleMaxListe);

redo:
	hFile=FindFirstFile("*.*",&wfd);
	continuer = FindNextFile(hFile,&wfd);
	continuer = FindNextFile(hFile,&wfd);

//	if (hFile==INVALID_HANDLE_VALUE)		{
	if (!continuer)			{
//		MessageBox(NULL,"Aucun fichier .c trouvé!","Erreur",MB_ICONERROR);
		goto aucun_fichier;
//		return 1;
	}

//	fputs("#ifndef ALL_H\n#define ALL_H\n",w);
	do		{
		SetDlgItemText(hWnd,IDC_NOM,wfd.cFileName);
		if (GetFileAttributes(wfd.cFileName)&FILE_ATTRIBUTE_DIRECTORY)			{
			if (wfd.cFileName[0]!='$')			{
				SetCurrentDirectory(wfd.cFileName);
				arborescence_wfd[niveau]=wfd;
				arborescence_hfile[niveau]=hFile;
				niveau++;
				goto redo;
			}
		}

		if (!strcmp(wfd.cFileName+strlen(wfd.cFileName)-2,".c"))			{
//		Sleep(500);
			//Fichier courant
			f=fopen(wfd.cFileName,"r");
			SetDlgItemText(hWnd,IDC_NOM,wfd.cFileName);
//			Sleep(1000);

			if (f)		{
				EcritEntete(wfd.cFileName,f,w);
				fclose(f);
			}
		}

boucle:
		continuer = FindNextFile(hFile,&wfd);
	} while (continuer);

aucun_fichier:
	if (niveau>0)			{
		niveau--;
		wfd=arborescence_wfd[niveau];
		hFile=arborescence_hfile[niveau];
		SetCurrentDirectory("..");
		goto boucle;
	}

//	fputs("#endif\n\n",w);
	fputs("\n\n",w);
	fclose(w);

	return 0;
}


LRESULT CALLBACK DialogProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)		{

	switch (message)
	{
		case WM_INITDIALOG:
			return TRUE;

		case WM_COMMAND:
			//Bouton annuler
			if (LOWORD(wParam) == IDCANCEL)
			{
				DestroyWindow(hDlg);
				return TRUE;
			}

			break;
	}

    return FALSE;
}




