#include <windows.h>
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#include "conio.h"

#include "CRB_Main.h"
//#include "CRB_Log.h"
#define __CRB_Includes_SNA__
#include "sna/snammg.h"
#undef __CRB_Includes_SNA__

tdstBloc	*g_p_stMemory0[C_CRB_NBMAXBLOC];
tdstBloc	*g_p_stMemory1[C_CRB_NBMAXBLOC];
tdstBloc	*g_p_stPtrMemory0[C_CRB_NBMAXBLOC];
tdstBloc	*g_p_stPtrMemory1[C_CRB_NBMAXBLOC];

unsigned long g_ulNbBloc;

unsigned long g_ulBlocPtrTable[1000000];
unsigned char g_ucBlocPtrDestTable[1000000];

unsigned long g_ulNbPtr,g_ulNbBadPtr;

unsigned char g_ucAvoidAllEntries;

// For debug purpose
long g_ulBadBlocDiff[100];
unsigned long g_ulBadBlocDiffOccur[100];
unsigned long g_ulNbBadBlocDiff;
// End for debug purpose

char g_bGlideMode;

void CRB_InitArray()
{
}

char SNA_fn_bSaveThisModuleBlocInFix( tdstBloc *_p_stBlock )
{
	return(_p_stBlock->ucLocation == SNA_C_ucBlockOfFix);
}

char SNA_fn_bSaveThisModuleBlocInLevel( tdstBloc *_p_stBlock )
{
	return(_p_stBlock->ucLocation == SNA_C_ucBlockOfLevel);
}

unsigned long CRB_fn_ulNbOfFixBlockIn( tdstBloc **_p_a_stBlocks, unsigned long _ulArraySize )
{
	unsigned long i, ulNb = 0;
	for( i=0; i<_ulArraySize; i++ )
	{
		if( SNA_fn_bSaveThisModuleBlocInFix( *_p_a_stBlocks ) )
			ulNb++;
		_p_a_stBlocks++;
	}
	return ulNb;
}

unsigned long CRB_fn_ulNbOfLevelBlockIn( tdstBloc **_p_a_stBlocks, unsigned long _ulArraySize )
{
	unsigned long i, ulNb = 0;
	for( i=0; i<_ulArraySize; i++ )
	{
		if( SNA_fn_bSaveThisModuleBlocInLevel( *_p_a_stBlocks ) )
			ulNb++;
		_p_a_stBlocks++;
	}
	return ulNb;
}

unsigned char CRB_fn_bDestinationBloc( unsigned long _ulPtrValue )
{
	unsigned char i;
	
	for(i=0;i<g_ulNbBloc;i++)
	{
		if( (_ulPtrValue>=g_p_stMemory0[i]->ulBeginBloc) && (_ulPtrValue<g_p_stMemory0[i]->ulEndBloc) )
		{
			return i;
		}
	}
	return -1;
}





// Add a bad bloc displacement to the array of bad bloc disp.
void CRB_fn_bAddBadBlocDiff(long ucI)
{
	unsigned char i;
	
	for(i=0;i<g_ulNbBadBlocDiff;i++)
	{
		if(ucI==g_ulBadBlocDiff[i])
		{
			g_ulBadBlocDiffOccur[i]++;
			return;
		}
	}
	g_ulBadBlocDiff[g_ulNbBadBlocDiff]=ucI;
	g_ulNbBadBlocDiff++;
	return;
}

// Open file for writing PtrTable.
HANDLE CRB_fn_vOpenPtrTable(char *szFilename,unsigned long ulNbBloc)
{
	HANDLE hFile;
	unsigned char ucNb;
	DWORD dwWrite;

	ucNb=(unsigned char)ulNbBloc;
	hFile = CreateFile (szFilename , GENERIC_WRITE, 0 , NULL , CREATE_ALWAYS , FILE_ATTRIBUTE_NORMAL , NULL);
	WriteFile (hFile , &ucNb , 1 , &dwWrite , NULL);

	return(hFile);
}

// Close file for PtrTable.
void CRB_fn_vClosePtrTable(HANDLE hFile)
{
	CloseHandle (hFile);
}



// Save PtrTable for a bloc to disc.
//void CRB_fn_vSavePtrTable(unsigned long ulBlocNb,FILE *fFile)
void CRB_fn_vSavePtrTable(unsigned long ulBlocNb,HANDLE hFile)
{
	unsigned long i;
	unsigned char ucNb;
	DWORD dwWrite;
	tdstPtr *p_stPtr;
	tdstPtr *p_stPointer;

	// N° Module
	ucNb=(unsigned char)g_p_stMemory0[ulBlocNb]->ulModuleNumber;
	WriteFile (hFile , &ucNb , 1 , &dwWrite , NULL);

	// N° Bloc
	ucNb=(unsigned char)g_p_stMemory0[ulBlocNb]->ulBlocNumber;
	WriteFile (hFile , &ucNb , 1 , &dwWrite , NULL);

	// Nb of Ptr
	WriteFile (hFile , &(g_ulNbPtr) , 4 , &dwWrite , NULL);
	/*
	for(i=0;i<g_ulNbPtr;i++)
	{
		WriteFile (hFile , &(g_ulBlocPtrTable[i]) , 4 , &dwWrite , NULL);				

		if(g_ucBlocPtrDestTable[i]<0xf0)
		{
			ucNb=(unsigned char)g_p_stMemory0[g_ucBlocPtrDestTable[i]]->ulModuleNumber;
		}
		else
		{
			ucNb=g_ucBlocPtrDestTable[i];
		}
		WriteFile (hFile , &ucNb , 1 , &dwWrite , NULL);

		if(g_ucBlocPtrDestTable[i]<0xf0)
		{
			ucNb=(unsigned char)g_p_stMemory0[g_ucBlocPtrDestTable[i]]->ulBlocNumber;
		}
		else
		{
			ucNb=g_ucBlocPtrDestTable[i];
		}
		WriteFile (hFile , &ucNb , 1 , &dwWrite , NULL);
	}
	*/

	p_stPointer = (tdstPtr*) malloc (sizeof(tdstPtr) * g_ulNbPtr);
	p_stPtr = p_stPointer;
	for(i=0;i<g_ulNbPtr;i++,p_stPtr++)
	{
		//
		p_stPtr -> p_vPtr = g_ulBlocPtrTable[i];
		//
		if(g_ucBlocPtrDestTable[i]<0xf0)
		{
			p_stPtr -> ucTargetModule = (unsigned char)g_p_stMemory0[g_ucBlocPtrDestTable[i]]->ulModuleNumber;
		}
		else
		{
			p_stPtr -> ucTargetModule = g_ucBlocPtrDestTable[i];
		}
		//
		if(g_ucBlocPtrDestTable[i]<0xf0)
		{
			p_stPtr -> ucTargetBlock = (unsigned char)g_p_stMemory0[g_ucBlocPtrDestTable[i]]->ulBlocNumber;
		}
		else
		{
			p_stPtr -> ucTargetBlock = g_ucBlocPtrDestTable[i];
		}
	}
	WriteFile (hFile , p_stPointer , sizeof(tdstPtr) * g_ulNbPtr , &dwWrite , NULL);
	free (p_stPointer);
}


void CRB_fn_vBuildPointerTableForFix(unsigned long ulNbBloc,char *szFilename)
{
	unsigned long i,j;
	unsigned long *p_b0,*p_b1,ulLastBadPtr;
	unsigned char ucDestBloc;
	//FILE *fFile;
	HANDLE hFile;

	hFile = CRB_fn_vOpenPtrTable (szFilename , CRB_fn_ulNbOfFixBlockIn (g_p_stMemory0 , ulNbBloc));

	// For stats
//	fn_vBeginLogPointersInfos( "Fix" );

	g_ulNbBadPtr=0;
	ulLastBadPtr=0;
	for(i=0;i<ulNbBloc;i++)
	{
		g_ulNbPtr=0;

		// GuS: Don't compute relocation for empty blocs.
		if( g_p_stMemory0[i]->ulSize == 0 ) continue;

		p_b0=(unsigned long *)g_p_stMemory0[i]->cMemory;
		p_b1=(unsigned long *)g_p_stMemory1[i]->cMemory;


		for(j=0;j<((g_p_stMemory0[i]->ulSize)>>2);j++)
		{

			if(p_b0[j]!=p_b1[j])
			{
				ucDestBloc=CRB_fn_bDestinationBloc(p_b0[j]);
//			fn_vLogAddPointer( i, ucDestBloc );

				if(ucDestBloc!=(unsigned char)-1)
				{
					// Add store of the address of this ptr and the aim bloc.
					g_ulBlocPtrTable[g_ulNbPtr]=g_p_stMemory0[i]->ulBeginBloc+(j<<2);
					g_ucBlocPtrDestTable[g_ulNbPtr]=ucDestBloc;
					g_ulNbPtr++;
/*
					if( g_p_stMemory0[ucDestBloc]->ulModuleNumber == C_ucIdOfModuleTmp ) 
					{
						// Pointers to block TMP will be set to NULL.
						g_ucBlocPtrDestTable[g_ulNbPtr-1]=0xfe;
					}
*/
				}
				else
				{
/* Gus: Uncomment this to take care of pointers to unknown blocs.
					if(ulLastBadPtr==(j+1))
					{
						printf("\nptr Possible");
					}
					// for debug only
					// Pointers to unknow blocks will remain unchanged.
					g_ulBlocPtrTable[g_ulNbPtr]=g_p_stMemory0[i]->ulBeginBloc+(j<<2);
					g_ucBlocPtrDestTable[g_ulNbPtr]=0xff;
					g_ulNbPtr++;
					// end debug
					g_ulNbBadPtr++;
					ulLastBadPtr=j;
					// printf("\nWarning - A Pointer (Offset=%lx) in Module %ld Bloc %ld point out of Blocs !",j,g_p_stMemory0[i]->ulModuleNumber,g_p_stMemory0[i]->ulBlocNumber);
*/
				}
			}
		}

//		fn_vLogPointersInfosForOneBlock( i );
		CRB_fn_vSavePtrTable (i , hFile);
	
	}
//	fn_vEndLogPointersInfos();
	CRB_fn_vClosePtrTable (hFile);

}

void CRB_fn_vBuildPointerTableForLevel(unsigned long ulNbBloc,char *szFilename)
{
	unsigned long i,j;
	unsigned long *p_b0,*p_b1,ulLastBadPtr;
	unsigned char ucDestBloc;
	HANDLE hFile;

	hFile = CRB_fn_vOpenPtrTable (szFilename , CRB_fn_ulNbOfLevelBlockIn (g_p_stMemory0 , ulNbBloc));

	// For stats
//	fn_vBeginLogPointersInfos( "Level" );

	g_ulNbBadPtr=0;
	ulLastBadPtr=0;
	for(i=0;i<ulNbBloc;i++)
	{
		g_ulNbPtr=0;
//		g_ulNbPtrFix=0;

		// GuS: Don't compute relocation for empty blocs.
		if( g_p_stMemory0[i]->ulSize == 0 ) continue;

		p_b0=(unsigned long *)g_p_stMemory0[i]->cMemory;
		p_b1=(unsigned long *)g_p_stMemory1[i]->cMemory;


		for(j=0;j<((g_p_stMemory0[i]->ulSize)>>2);j++)
		{

			if(p_b0[j]!=p_b1[j])
			{
				ucDestBloc=CRB_fn_bDestinationBloc(p_b0[j]);
//				fn_vLogAddPointer( i, ucDestBloc );
				if(ucDestBloc==(unsigned char)-1)
				{
/* Gus: Uncomment this to take care of pointers to unknown blocs.
					if(ulLastBadPtr==(j+1))
					{
						printf("\nptr Possible");
					}
					// for debug only
					g_ulBlocPtrTable[g_ulNbPtr]=g_p_stMemory0[i]->ulBeginBloc+(j<<2);
					g_ucBlocPtrDestTable[g_ulNbPtr]=0xff;
					g_ulNbPtr++;
					// end debug
					g_ulNbBadPtr++;
					ulLastBadPtr=j;
					// printf("\nWarning - A Pointer (Offset=%lx) in Module %ld Bloc %ld point out of Blocs !",j,g_p_stMemory0[i]->ulModuleNumber,g_p_stMemory0[i]->ulBlocNumber);
*/
				}
				else
				{
					if( SNA_fn_bSaveThisModuleBlocInFix( g_p_stMemory0[i] ) )
					{
						if( SNA_fn_bSaveThisModuleBlocInFix( g_p_stMemory0[ucDestBloc] ) )
						{
							// Pointer from fix to fix: case is already handled by CRB_fn_vBuildPointerTableForFix
								j=j;
						}
						else if( SNA_fn_bSaveThisModuleBlocInLevel( g_p_stMemory0[ucDestBloc] ) )
						{
							// Pointeur from fix to level
							g_ulBlocPtrTable[g_ulNbPtr]=g_p_stMemory0[i]->ulBeginBloc+(j<<2);
							g_ucBlocPtrDestTable[g_ulNbPtr]=ucDestBloc;
							g_ulNbPtr++;
						}
					}
					else // Pointeur from level to anywhere
					{
						 // Add store of the address of this ptr and the aim bloc.
						g_ulBlocPtrTable[g_ulNbPtr]=g_p_stMemory0[i]->ulBeginBloc+(j<<2);
						g_ucBlocPtrDestTable[g_ulNbPtr]=ucDestBloc;
						g_ulNbPtr++;

/*
						if( g_p_stMemory0[ucDestBloc]->ulModuleNumber == C_ucIdOfModuleTmp ) 
						{
							// Pointers to block TMP will be set to NULL.
							g_ucBlocPtrDestTable[g_ulNbPtr-1]=0xfe;
						}
*/
					}
				}
			}
		}
		if( SNA_fn_bSaveThisModuleBlocInFix( g_p_stMemory0[i] ) )
		{
		}
		else
		{
//			fn_vLogPointersInfosForOneBlock( i );
			CRB_fn_vSavePtrTable (i , hFile);
		}
		
	}
//	fn_vEndLogPointersInfos();
	CRB_fn_vClosePtrTable (hFile);
}

void CRB_fn_vBuildPointerTableForPtr(unsigned long ulNbBloc,char *szFilename, char *szType )
{
	unsigned long i,j;
	unsigned long *p_b0,*p_b1;
	unsigned char ucDestBloc,br=0;
	HANDLE hFile;

	hFile = CRB_fn_vOpenPtrTable (szFilename , ulNbBloc);

	// For stats
//	fn_vBeginLogPointersInfosForGlobalPointers( szType );

	g_ulNbBadPtr=0;
	for(i=0;i<ulNbBloc;i++)
	{
		g_ulNbPtr=0;

		// GuS: Don't compute relocation for empty blocs.
		if( g_p_stPtrMemory0[i]->ulSize == 0 ) continue;

		p_b0=(unsigned long *)g_p_stPtrMemory0[i]->cMemory;
		p_b1=(unsigned long *)g_p_stPtrMemory1[i]->cMemory;


		for(j=0;j<((g_p_stPtrMemory0[i]->ulSize)>>2);j++)
		{
			if(p_b0[j]!=p_b1[j])
			{

				ucDestBloc=CRB_fn_bDestinationBloc(p_b0[j]);
//				fn_vLogAddPointer( i, ucDestBloc );
				if(ucDestBloc!=(unsigned char)-1)
				{
					// Add store of the address of this ptr and the aim bloc.
					g_ulBlocPtrTable[g_ulNbPtr]=p_b0[j];
					g_ucBlocPtrDestTable[g_ulNbPtr]=ucDestBloc;
					g_ulNbPtr++;
					
				}
				else
				{
					// for debug only
//					g_ulBlocPtrTable[g_ulNbPtr]=g_p_stMemory0[i]->ulBeginBloc+(j<<2);
//					g_ucBlocPtrDestTable[g_ulNbPtr]=0;
//					g_ulNbPtr++;
					// end debug
					g_ulNbBadPtr++;
					if(g_ucAvoidAllEntries==0)
					{
						if(br!=2)
							printf("\nWarning - A GlobalPointer (%8ld:%8lx/%8lx) point out of Blocs !",j,p_b0[j],p_b1[j]);
						if((j%24==0)&&(br==0))
						{
							char c;
							printf("\nStop On Next Bad Pointer (Y/N/Skip all) :");
							c=getch();
							c=toupper(c);
							if(c=='N')
								br=1;
							if(c=='S')
								br=2;
							
						}
					}
				}
			}
		}

//		fn_vLogPointersInfosForOneBlock( i );
		CRB_fn_vSavePtrTable (i , hFile);
	
	}
//	fn_vEndLogPointersInfos();
	CRB_fn_vClosePtrTable (hFile);

}




// Build and save relocation table for sound pointers.
// Sound datas require a special function because they contain
// some data that are not pointers but change at each load.
void CRB_fn_vBuildPointerTableForSndPtr(unsigned long ulNbBloc,char *szFilename, char *szType)
{
	unsigned long i,j;
	char *p_b0,*p_b1;
	unsigned char ucDestBloc,ucNotPossible;
	HANDLE hFile;
	
	hFile = CRB_fn_vOpenPtrTable (szFilename , ulNbBloc);

	// For stats
//	fn_vBeginLogPointersInfosForGlobalPointers( szType );
	
	ucNotPossible=1;
	g_ulNbBadPtr=0;
	for(i=0;i<ulNbBloc;i++)
	{
		// GuS: Don't compute relocation for empty blocs.
		if( g_p_stPtrMemory0[i]->ulSize == 0 ) continue;

		g_ulNbPtr=0;
		p_b0=(unsigned char *)g_p_stPtrMemory0[i]->cMemory;
		p_b1=(unsigned char *)g_p_stPtrMemory1[i]->cMemory;
		
		for(j=4;j<g_p_stPtrMemory0[i]->ulSize;j=j+8)
		{
			//lDiff=(*(unsigned long *)(p_b1+j))-(*(unsigned long*)(p_b0+j));
			ucDestBloc=CRB_fn_bDestinationBloc(*((unsigned long *)(p_b0+j)));
//			fn_vLogAddPointer( i, ucDestBloc );
			if(ucDestBloc!=(unsigned char)-1)
			{
				// Add store of the address of this ptr and the aim bloc.
				g_ulBlocPtrTable[g_ulNbPtr]=*(unsigned long *)(p_b0+j);
				g_ucBlocPtrDestTable[g_ulNbPtr]=ucDestBloc;
				g_ulNbPtr++;
			}
			else
			{
				g_ulNbBadPtr++;
				printf("\nWarning - A SoundPointer (%ld) point out of Blocs !",(j-4)>>3);
			}
			
		}
//		fn_vLogPointersInfosForOneBlock( i );
		CRB_fn_vSavePtrTable (i , hFile);
	}
	
///	fn_vEndLogPointersInfos();
	CRB_fn_vClosePtrTable (hFile);

}

// Build correspondance table for bloc number in the 2 SNA files.
void CRB_fn_vTestBlocTable(unsigned long ulNbBloc)
{
	unsigned long i,OK;

	OK=1;
	for(i=0;i<ulNbBloc;i++)
	{
		if( (g_p_stMemory1[i]->ulBeginBloc - g_p_stMemory0[i]->ulBeginBloc) == 0 )
		{
			printf("\nFATAL ERROR - Module %d Bloc %d has not moved ! \n Relocation files may be incorrect",g_p_stMemory0[i]->ulModuleNumber,g_p_stMemory0[i]->ulBlocNumber);
			OK=0;
		}
	}
	if(OK==0)
	{
		getchar();
		exit(3);
	}

}



int main(int argc, char *argv[])
{
	char szFilename0[255],szFilename1[255];
	char *p_cl;  
	unsigned char ucFix;
	unsigned long ulNbBloc;

//	getch();

	g_ucAvoidAllEntries=0;
	g_bGlideMode=1;

	if(argv[2])
	{
		strcpy(szFilename0,argv[2]);
		p_cl=strstr(szFilename0,"-");
		
		if( toupper(*(p_cl+1))=='S' )
			g_ucAvoidAllEntries=1;
		if (toupper(*(p_cl+1))=='D' )
			g_bGlideMode=0;
	}

	if(argv[3])
	{
		strcpy(szFilename0,argv[3]);
		p_cl=strstr(szFilename0,"-");
		
		if( toupper(*(p_cl+1))=='S' )
			g_ucAvoidAllEntries=1;
		if (toupper(*(p_cl+1))=='D' )
			g_bGlideMode=0;
	}

	CRB_InitArray();

	if( strcmp(_strupr(argv[1]),"FIX") == 0 )
	{
		// Read blocks from the fix
		ulNbBloc=CRB_fn_bReadAllMemoryBlocks( "Fix0.sna", g_p_stMemory0, C_CRB_NEW );
		g_ulNbBloc=CRB_fn_bReadAllMemoryBlocks( "Fix1.sna", g_p_stMemory1, C_CRB_NEW );
		ucFix = 1;
	}
	else
	{
		// Read blocs of the level if we compute relocation for level.
		// Those block also contains reloc infos about blocks in the fix.
		strcpy(szFilename0,argv[1]);
		strcat(szFilename0,"0.sna");
		ulNbBloc=CRB_fn_bReadAllMemoryBlocks(szFilename0,g_p_stMemory0,C_CRB_ADD);
		strcpy(szFilename1,argv[1]);
		strcat(szFilename1,"1.sna");
		g_ulNbBloc=CRB_fn_bReadAllMemoryBlocks(szFilename1,g_p_stMemory1,C_CRB_ADD);
		ucFix = 0;
	}

	if(g_ulNbBloc!=ulNbBloc)
	{
		printf("\nERROR - Incompatible SNA Files, Number of Bloc is Different !");
		getchar();
		exit(4);
	}

	// Build correspondance table and write pointer table to disc.
	CRB_fn_vTestBlocTable(ulNbBloc);
	strcpy(szFilename0,argv[1]);
	strcat(szFilename0,".rtb");
	if(ucFix==1)
		CRB_fn_vBuildPointerTableForFix(ulNbBloc,szFilename0);
	else
		CRB_fn_vBuildPointerTableForLevel(ulNbBloc,szFilename0);


	// Relocation table for global pointers
	strcpy(szFilename0,argv[1]);
	strcat(szFilename0,"0.gpt");
	ulNbBloc=CRB_fn_bReadPtrBlocks(szFilename0,g_p_stPtrMemory0, "Global");

	strcpy(szFilename1,argv[1]);
	strcat(szFilename1,"1.gpt");
	ulNbBloc=CRB_fn_bReadPtrBlocks(szFilename1,g_p_stPtrMemory1, "Global");

	strcpy(szFilename0,argv[1]);
	strcat(szFilename0,".rtp");
	CRB_fn_vBuildPointerTableForPtr(ulNbBloc,szFilename0, "Global");


	// Relocation table for Texture pointers
	strcpy(szFilename0,argv[1]);
	strcat(szFilename0,"0.ptx");
	ulNbBloc=CRB_fn_bReadPtrBlocks(szFilename0 ,g_p_stPtrMemory0, "Texture");

	strcpy(szFilename0,argv[1]);
	strcat(szFilename0,"1.ptx");
	ulNbBloc=CRB_fn_bReadPtrBlocks(szFilename0 ,g_p_stPtrMemory1, "Texture");

	strcpy(szFilename0,argv[1]);
	strcat(szFilename0,".rtt");
	CRB_fn_vBuildPointerTableForPtr(ulNbBloc,szFilename0, "Texture");


	
	// Relocation table for sound pointers
	strcpy(szFilename0,argv[1]);
	strcat(szFilename0,"0.snd");
	ulNbBloc=CRB_fn_bReadPtrBlocks(szFilename0,g_p_stPtrMemory0, "Sound" );

	strcpy(szFilename1,argv[1]);
	strcat(szFilename1,"1.snd");
	ulNbBloc=CRB_fn_bReadPtrBlocks(szFilename1,g_p_stPtrMemory1, "Sound" );

	strcpy(szFilename0,argv[1]);
	strcat(szFilename0,".rts");
	CRB_fn_vBuildPointerTableForSndPtr(ulNbBloc,szFilename0, "Sound" );

	// Relocation table for vignette pointers
	if( ucFix==0 )
	{
		strcpy(szFilename0,argv[1]);
		strcat(szFilename0,"0.vgm");
		ulNbBloc=CRB_fn_bReadPtrBlocks(szFilename0,g_p_stPtrMemory0, "Vignette" );

		strcpy(szFilename1,argv[1]);
		strcat(szFilename1,"1.vgm");
		ulNbBloc=CRB_fn_bReadPtrBlocks(szFilename1,g_p_stPtrMemory1, "Vignette" );

		if( ulNbBloc > 0 )
		{
			strcpy(szFilename0,argv[1]);
			strcat(szFilename0,".rtv");
			CRB_fn_vBuildPointerTableForPtr(ulNbBloc,szFilename0, "Vignette" );
		}
	}

	// MR0912
	if(ucFix!=0)
	{
		strcpy(szFilename0,argv[1]);
		strcat(szFilename0,"0.lsy");
		ulNbBloc=CRB_fn_bReadPtrBlocks(szFilename0,g_p_stPtrMemory0, "LipsSync" );

		strcpy(szFilename1,argv[1]);
		strcat(szFilename1,"1.lsy");
		ulNbBloc=CRB_fn_bReadPtrBlocks(szFilename1,g_p_stPtrMemory1, "LipsSync" );

		if( ulNbBloc > 0 )
		{
			strcpy(szFilename0,argv[1]);
			strcat(szFilename0,".rtl");
			CRB_fn_vBuildPointerTableForPtr(ulNbBloc,szFilename0, "LipsSync" );
		}
	}

	
	printf("\n\nConversion Completed OK !!! \n");
//	getch();
	/*
	if(g_ucAvoidAllEntries==0)
		getch();
	*/

	return 0;
} 

