reman3/Rayman_X/cpa/Appli/Max23Dos/src/main.c

1204 lines
34 KiB
C

/*=========================================================================
*
* Main.c - global functions
*
* Version 1.0
* Revision date
*
*=======================================================================*/
#include <windows.h>
#include <stdio.h>
#include <conio.h>
#define __DeclareGlobalVariableErrMlt_h__
#include "ErrMlt.h"
#undef __DeclareGlobalVariableErrMlt_h__
#define __DeclareGlobalVariableMemMlt_h__
#include "MemMlt.h"
#undef __DeclareGlobalVariableMemMlt_h__
#include "Main.h"
#include "conventi.h"
#include "print.h"
#include "system.h"
#include "Actors.h"
#include "Anims.h"
#include "Banks.h"
#include "Classes.h"
#include "Families.h"
#include "Levels.h"
#include "Textures.h"
#include "ModLib.h"
#include "ModLoad.h"
#include "ObjLoad.h"
#include "LgtLoad.h"
#include "PlgLoad.h"
#include "SctLoad.h"
#include "SpoLoad.h"
#include "VseLoad.h"
#include "ZooLoad.h"
#include "SaveModifLst.h"
//--- Global defines (main.h) --------------------------------------------------------
// current version
char g_fVersion[9] = "7.0.0";
BOOL g_bVersionN64;
// modes
BOOL g_bOneAnimMode, g_bAnimMode;
BOOL g_bOneBankMode, g_bBankMode;
BOOL g_bOneClassMode, g_bClassMode;
BOOL g_bOneLevelMode, g_bLevelMode;
BOOL g_bOneFamilyMode, g_bFamilyMode;
BOOL g_bOneTextureMode, g_bTextureMode;
// data
MLT_tdeCategory g_cCategoryType;
xString g_sAnim[100];
xString g_sBank[100];
xString g_sClass[100];
xString g_sLevel[100];
xString g_sFamily[100];
xString g_sTexture[100];
long g_lAnimNum;
long g_lBankNum;
long g_lClassNum;
long g_lLevelNum;
long g_lFamilyNum;
long g_lTextureNum;
// directories
xString g_sInitialDir;
xString g_sRawData;
xString g_sGameData;
xString g_sFileIn, g_sDirectorySave, g_sFileMaterial;
//--- Global defines (system.h) --------------------------------------------------------
// index of chosen directories
int g_iData = 0;
int g_iRaw = 0;
// paths for directories
xString g_sGameCommon;
xString g_sRawCommon;
xString g_sGameSpecific1;
xString g_sRawSpecific1;
xString g_sGameSpecific2;
xString g_sRawSpecific2;
xString g_sGameTextureDirectory;
//--- Global defines (print.h) --------------------------------------------------------
// main options
BOOL g_bRaymanII = FALSE;
BOOL g_bModifLst = FALSE;
BOOL g_bEraseMdf = TRUE;
// ignore options
BOOL g_bIgnoreZoo = FALSE;
BOOL g_bIgnoreSct = TRUE;
BOOL g_bIgnoreSpo = TRUE;
BOOL g_bIgnoreGmt = TRUE;
BOOL g_bIgnoreTex = TRUE;
// conversion options
BOOL g_bCopyAnims = FALSE;
BOOL g_bCopyTextures = FALSE;
BOOL g_bGenerateRLI;
BOOL g_bUpdateGameDSC;
// erase options
BOOL g_bEraseDuplicated;
BOOL g_bEraseUnused;
// family options
BOOL g_bCommonFamily = FALSE;
BOOL g_bSpecificFamily = FALSE;
BOOL g_bAskFamily = TRUE;
BOOL g_bApplyAll = FALSE;
// bank options
BOOL g_bCreateBasicFamily = FALSE;
// existence of files
BOOL g_bCreatedSpo;
BOOL g_bCreatedGmt;
BOOL g_bExistSpo = TRUE;
BOOL g_bExistMdf = FALSE;
BOOL g_bExistMdt = FALSE;
BOOL g_bExistSpoBank;
//--- Global statics --------------------------------------------------------
// names
xString gs_szNewName;
//--------------------------------------------------------------------
/****************************************************************************
* Description: Main function (DOS)
*
* Parameters:
*---------------------------------------------------------------------------
* Revision date: Author:
*****************************************************************************/
#ifndef _WINDOWS
void main (int argc, char **argv)
{
MLT_fn_vMainConvert( argc, argv );
}
#endif
/****************************************************************************
* Description: Main function
*
* Parameters:
*---------------------------------------------------------------------------
* Revision date: Author:
*****************************************************************************/
void MLT_fn_vMainConvert (int argc, char **argv)
{
long i;
// save initial directory
GetCurrentDirectory(256, g_sInitialDir);
// init system parameters
MLT_vInitSystem();
// init main variables
MLT_vInitVariables();
// set default directory
sprintf(g_sRawData, "%s\\RawData", g_sInitialDir);
sprintf(g_sGameData, "%s\\GameData", g_sInitialDir);
// analyse parameters
for(i=1; i<argc; i++)
{
if( argv[i][0] != '-')
{
fprintf(stderr, "\nError : Invalid param : %s\n", argv[i]);
MLT_vExitSystem();
}
switch(toupper(argv[i][1]))
{
case 'A' :
// one animation mode
if(g_bOneAnimMode)
g_bOneAnimMode = (argv[i][2] != '+');
// animation mode
g_bAnimMode = TRUE;
// add animation to convert
sprintf(g_sAnim[g_lAnimNum], "%s", argv[i]+2);
g_lAnimNum++;
break;
case 'B' :
// one bank mode
if(g_bOneBankMode)
g_bOneBankMode = (argv[i][2] != '+');
// bank mode
g_bBankMode = TRUE;
// add bank to convert
sprintf(g_sBank[g_lBankNum], "%s", argv[i]+2);
g_lBankNum++;
break;
case 'C' :
// one class mode
if(g_bOneClassMode)
g_bOneClassMode = (argv[i][2] != '+');
// class mode
g_bClassMode = TRUE;
// add class to convert
sprintf(g_sClass[g_lClassNum], "%s", argv[i]+2);
g_lClassNum++;
break;
case 'F' :
// one family mode
if(g_bOneFamilyMode)
g_bOneFamilyMode = (argv[i][2] != '+');
// family mode
g_bFamilyMode = TRUE;
// add family to convert
sprintf(g_sFamily[g_lFamilyNum], "%s", argv[i]+2);
g_lFamilyNum++;
break;
case 'L' :
// one level mode
if(g_bOneLevelMode)
g_bOneLevelMode = (argv[i][2] != '+');
// level mode
g_bLevelMode = TRUE;
// add level to convert
sprintf(g_sLevel[g_lLevelNum], "%s", argv[i]+2);
g_lLevelNum++;
break;
case 'R' :
// get RawData directory
if( ((argv[i]+2)[0] == '\\')
|| ((argv[i]+2)[0] == '/')
|| ((argv[i]+2)[1] == ':') )
sprintf(g_sRawData, "%s", argv[i]+2);
else
sprintf(g_sRawData, "%s\\%s", g_sInitialDir, argv[i]+2);
break;
case 'G' :
// get GameData directory
if( ((argv[i]+2)[0] == '\\')
|| ((argv[i]+2)[0] == '/')
|| ((argv[i]+2)[1] == ':') )
sprintf(g_sGameData, "%s", argv[i]+2);
else
sprintf(g_sGameData, "%s\\%s", g_sInitialDir, argv[i]+2);
break;
case 'S' :
// texture option
if( (toupper((argv[i]+2)[0]) == 'T')
&& (toupper((argv[i]+2)[1]) == 'G')
&& (toupper((argv[i]+2)[2]) == 'A') )
g_bCopyTextures=TRUE;
// super-object option
if( (toupper((argv[i]+2)[0]) == 'P')
&& (toupper((argv[i]+2)[1]) == 'O'))
g_bIgnoreSpo = FALSE;
// sectors option
if( (toupper((argv[i]+2)[0]) == 'C')
&& (toupper((argv[i]+2)[1]) == 'T'))
g_bIgnoreSct = FALSE;
break;
case 'M' :
// zones option
if( (toupper((argv[i]+2)[0]) == 'Z')
&& (toupper((argv[i]+2)[1]) == 'O')
&& (toupper((argv[i]+2)[2]) == 'O') )
g_bIgnoreZoo = TRUE;
break;
case 'V' :
// N64 option
if( (toupper((argv[i]+2)[0]) == 'N')
&& (toupper((argv[i]+2)[1]) == '6')
&& (toupper((argv[i]+2)[2]) == '4') )
g_bVersionN64 = TRUE;
// material option
if( (toupper((argv[i]+2)[0]) == 'G')
&& (toupper((argv[i]+2)[1]) == 'M')
&& (toupper((argv[i]+2)[2]) == 'T') )
g_bIgnoreGmt = FALSE;
// version option
if( (toupper((argv[i]+2)[0]) == 'R')
&& (toupper((argv[i]+2)[1]) == 'I')
&& (toupper((argv[i]+2)[2]) == 'I'))
g_bRaymanII = TRUE;
break;
case 'H' :
// help
printf("Syntax : %s [-Mzoo] [-aAnim] [-lLevel] [-bBank] [-cClasse] [-fFamily] [-rRawData] [-gGameData]\n",argv[0]);
printf(" -aAnim : Copy to GameData all the files in this anim only or all the anims if +\n");
printf(" -lLevel : Compute this level only or all if +\n");
printf(" -bBank : Compute this bank only or all if +\n");
printf(" -cClasse : Compute this classe only or all if +\n");
printf(" -fFamily : Compute this family only or all if +\n");
printf(" -rRawData : Graphics's directory (default is \"RawData\")\n");
printf(" -gGameData : 3Dos's directory (default is \"GameData\")\n");
printf(" -mZoo : Rebuild the .Zoo file for the family\n");
printf(" -tTexture : Specify the textures directory in Rawdata\n");
printf(" -vN64 : Exclusif for Nintendo 64\n");
printf("\n");
printf("Exemple : Max23Dos -l+ -bNavet\n");
printf(" This command compute all the levels and the Navet bank\n");
printf(" from the directory \"RawData\" to the directory \"GameData\"\n");
MLT_vExitSystem();
break;
}
}
printf("\n");
// verify the GameData
if( !SetCurrentDirectory(g_sGameData) )
{
fprintf(stderr, "\nError : the directory %s does not exist\n", g_sGameData);
MLT_vExitSystem();
}
SetCurrentDirectory(g_sInitialDir);
// verify the RawData
if( !SetCurrentDirectory(g_sRawData) )
{
fprintf(stderr, "\nError : the directory %s does not exist\n", g_sRawData);
MLT_vExitSystem();
}
MLT_vSetData();
// compute the anim if there is one
g_cCategoryType = C_Anim;
if(g_bAnimMode)
{
if(g_bOneAnimMode)
for(i=0; i<g_lAnimNum; i++)
MLT_vComputeOneAnim(g_sAnim[i], g_sRawData, g_sGameData);
else
MLT_vComputeAllAnims(g_sRawData, g_sGameData);
printf("\n");
}
// compute the bank if there is one
g_cCategoryType = C_Bank;
if(g_bBankMode)
{
if(g_bOneBankMode)
for(i=0; i<g_lBankNum; i++)
MLT_vComputeOneBank(g_sBank[i], g_sRawData, g_sGameData);
else
MLT_vComputeAllBanks(g_sRawData, g_sGameData);
printf("\n");
}
// compute the class if there is
g_cCategoryType = C_Classe;
if(g_bClassMode)
{
if(g_bOneClassMode)
for(i=0; i<g_lClassNum; i++)
MLT_vComputeOneClass(MLT_p_cGetFileNameWithoutExt(g_sClass[i]), g_sRawData, g_sGameData);
else
MLT_vComputeAllClasses(g_sRawData, g_sGameData);
printf("\n");
}
SetCurrentDirectory(g_sInitialDir);
// compute the family if there is one
g_cCategoryType = C_Family;
if(g_bFamilyMode)
{
if(g_bOneFamilyMode)
for(i=0; i<g_lFamilyNum; i++)
MLT_vComputeOneFamily(g_sFamily[i], g_sRawData, g_sGameData);
else
MLT_vComputeAllFamilies(g_sRawData, g_sGameData);
printf("\n");
}
// compute the level if there is one
g_cCategoryType = C_Level;
if(g_bLevelMode)
{
MLT_vReadSPOFlagsFile(g_sRawData);
if(g_bOneLevelMode)
for(i=0; i<g_lLevelNum; i++)
MLT_vComputeOneLevel(g_sLevel[i], g_sRawData, g_sGameData);
else
MLT_vComputeAllLevels(g_sRawData, g_sGameData);
printf("\n");
}
// desinit system
MLT_vExitSystem();
}
/****************************************************************************
* Description: global initialisations
*
* Parameters:
*---------------------------------------------------------------------------
* Revision date: Author:
*****************************************************************************/
void MLT_vInitSystem()
{
// memory
Mmg_fn_vFirstInitMmgModule(1);
// scripts
SCR_fn_v_RdL0_Init();
// register loading functions
MLT_vInitMODLoad();
MLT_vInitPLGLoad();
MLT_vInitALWLoad();
MLT_vInitSPOLoad();
MLT_vInitOBJLoad();
MLT_vInitSCTLoad();
MLT_vInitZOOLoad();
MLT_vInitVSELoad();
MLT_vInitLVLLoad();
// init modes
g_bOneAnimMode = TRUE;
g_bOneBankMode = TRUE;
g_bOneClassMode = TRUE;
g_bOneLevelMode = TRUE;
g_bOneFamilyMode = TRUE;
// display version number
printf("Convertion utility 3DSMAX to 3DOS v%s.\n",g_fVersion);
}
/****************************************************************************
* Description: global desinitialisations
*
* Parameters:
*---------------------------------------------------------------------------
* Revision date: Author:
*****************************************************************************/
void MLT_vExitSystem()
{
// scripts
SCR_fn_v_RdL0_Close();
// erase libraries
MLT_vEraseLib();
MLT_vErasePLGLib();
MLT_vEraseALWLib();
MLT_vEraseLGTLib();
// delete hierarchy
MLT_vDeleteHierarchy(g_hRoot);
// display end message
printf("\nPress a key\n");
while(!getch());
exit(0);
}
/****************************************************************************
* Description: create and register all game directories
*
* Parameters:
*---------------------------------------------------------------------------
* Revision date: Author:
*****************************************************************************/
void MLT_vSetData ()
{
xString sComment;
// init ModifLst file
sprintf(sComment, "%s\\%s", g_sGameData, M_TempSCR_Modif);
SCR_fn_v_SvL1_SetModificationFileName(sComment);
// register rawdata directory
sprintf(g_sRawData, "%s", g_sRawData);
// change directory
SetCurrentDirectory(g_sGameData);
// create sub directories of GameData
CreateDirectory("World", NULL);
CreateDirectory("World\\Graphics", NULL);
CreateDirectory("World\\Graphics\\Anims", NULL);
CreateDirectory("World\\Graphics\\Textures", NULL);
CreateDirectory("World\\Graphics\\Objects", NULL);
CreateDirectory("World\\Graphics\\Objects\\Classes", NULL);
CreateDirectory("World\\Graphics\\Objects\\Banks", NULL);
CreateDirectory("World\\Graphics\\Visuals", NULL);
CreateDirectory("World\\Libraries", NULL);
CreateDirectory("World\\Libraries\\Materials", NULL);
CreateDirectory("World\\Levels", NULL);
CreateDirectory("World\\Levels\\_Common", NULL);
CreateDirectory("World\\Levels\\_Common\\Families", NULL);
// set the materials and textures directories
sprintf(g_sGameTextureDirectory, "%s\\World\\Graphics\\Textures", g_sGameData);
// register current position in modiflst
MLT_vSavePosInModifFile();
}
/****************************************************************************
* Description: init main variables before conversion
*
* Parameters:
*---------------------------------------------------------------------------
* Revision date: Author:
*****************************************************************************/
void MLT_vInitVariables ()
{
// no action by default
g_bAnimMode = FALSE;
g_bBankMode = FALSE;
g_bClassMode = FALSE;
g_bLevelMode = FALSE;
g_bFamilyMode = FALSE;
g_bVersionN64 = FALSE;
// no conversion by default
g_lLevelNum = 0;
g_lBankNum = 0;
g_lAnimNum = 0;
g_lClassNum = 0;
g_lFamilyNum = 0;
g_lTextureNum = 0;
}
/****************************************************************************
* Description: test the existence of the specified file
*
* Parameters: sDir : directory name
* sFile : file name
*---------------------------------------------------------------------------
* Revision date: Author:
*****************************************************************************/
long MLT_bFindFile (char *sDir, char *sFile)
{
char *p_cName;
BOOL bRet;
xString sDirectory, sTemp;
HANDLE hHandle;
WIN32_FIND_DATA stFindFileData;
// search file in the given directory
if (SearchPath(sDir, sFile, NULL, 256, sTemp, &p_cName))
{
return TRUE;
}
// change directory
GetCurrentDirectory(256, sDirectory);
if (SetCurrentDirectory(sDir) == 0)
return FALSE;
// search for the subdirectories
memset(&stFindFileData,0,sizeof(stFindFileData));
hHandle = FindFirstFile("*.*", &stFindFileData);
if( hHandle == INVALID_HANDLE_VALUE)
{
SetCurrentDirectory(sDirectory);
MLT_vOutput( C_ComRes_cErrorLine, "\nError : Can't find %s", sDir);
return FALSE;
}
do if(stFindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
{
if(strlen(stFindFileData.cFileName) == 0) break;
if(strcmp(stFindFileData.cFileName, ".") == 0) continue;
if(strcmp(stFindFileData.cFileName, "..") == 0) continue;
// search in subdirectory
sprintf(sTemp, "%s\\%s", sDir, stFindFileData.cFileName);
bRet = MLT_bFindFile(sTemp, sFile);
SetCurrentDirectory(sDir);
// if file was found, stop here
if(bRet)
{
SetCurrentDirectory(sDirectory);
sprintf(sDir, "%s", sTemp);
FindClose(hHandle);
return TRUE;
}
}
while(FindNextFile(hHandle, &stFindFileData));
FindClose(hHandle);
// restore directory
SetCurrentDirectory(sDirectory);
// file was not found
return FALSE;
}
/****************************************************************************
* Description: copy file from sSrc to sDst directory
*
* Parameters: sFile : file name
* sSrc : source directory
* sDst : destination directory
*---------------------------------------------------------------------------
* Revision date: Author:
*****************************************************************************/
void MLT_vCopyFiles (char *sFile, char *sSrc, char *sDst)
{
xString sDirectory, sName;
HANDLE hHandle;
WIN32_FIND_DATA stFindFileData;
// change directory
GetCurrentDirectory(256, sDirectory);
CreateDirectory(sDst, NULL);
SetCurrentDirectory(sSrc);
// search for source file
memset(&stFindFileData,0,sizeof(stFindFileData));
hHandle = FindFirstFile(sFile, &stFindFileData);
if( hHandle == INVALID_HANDLE_VALUE)
{
SetCurrentDirectory(sDirectory);
MLT_vOutput( C_ComRes_cErrorLine, "\nError : Can't find %s\\%s", sSrc, sFile);
return;
}
do
{
xString sFileDst;
if (strlen(stFindFileData.cFileName) == 0)
break;
// get complete file name for destination
sprintf(sFileDst, "%s\\%s", sDst, stFindFileData.cFileName);
// copy file
SetCurrentDirectory(sSrc);
CopyFile(stFindFileData.cFileName, sFileDst, FALSE);
// update ModifLst.txt file
strcpy(sName, "AAA\\");
strcat(sName, stFindFileData.cFileName);
if (!strstr(sFileDst, "Families"))
{
MLT_vAddEntryToModifFile(sName);
MLT_vAddEntryToModifFile("\n");
}
}
while(FindNextFile(hHandle, &stFindFileData));
FindClose(hHandle);
// restore directory
SetCurrentDirectory(sDirectory);
}
/****************************************************************************
* Description: copy and rename file
*
* Parameters: _sFileSrc : source file
* _sDirSrc : source directory
* _sFileDst : destination file
* _sDirDst : destination directory
* bErase : flag : erase or preserve existing file
*---------------------------------------------------------------------------
* Revision date: Author:
*****************************************************************************/
void MLT_vCopyAndRenameFile (char *_sFileSrc, char *_sDirSrc, char *_sFileDst, char *_sDirDst, BOOL bErase)
{
xString sDirectory, sFileSrc, sFileDst, sTemp;
char *p_cName;
// save directory
GetCurrentDirectory(256, sDirectory);
// search destination file
CreateDirectory(_sDirDst, NULL);
sprintf(sFileDst, "%s\\%s", _sDirDst, _sFileDst);
// check that the target file does not exist or must be erased
if (!bErase && (SearchPath( NULL,sFileDst,NULL,256,sTemp,&p_cName) != 0))
return;
// search source file
CreateDirectory(_sDirSrc, NULL);
sprintf(sFileSrc, "%s\\%s", _sDirSrc, _sFileSrc);
// check that the source file existd
if (SearchPath( NULL,sFileSrc,NULL,256,sTemp,&p_cName) == 0)
return;
// copy file
CopyFile(sFileSrc, sFileDst, FALSE);
// restore directory
SetCurrentDirectory(sDirectory);
}
/****************************************************************************
* Description: copy file and replace source reference with new one
*
* Parameters: _sFileSrc : source file
* _sDirSrc : source directory
* _sFileDst : destination file
* _sDirDst : destination directory
* _SrcRef : source reference
* _DstRef : destination reference
* bErase : flag : erase or preserve existing file
*---------------------------------------------------------------------------
* Revision date: Author:
*****************************************************************************/
void MLT_vCopyAndUpdateFile(char *_sFileSrc, char *_sDirSrc, char *_sFileDst, char *_sDirDst, char *_SrcRef, char *_DstRef, BOOL bErase)
{
xString sDirectory, sFileDst, sFileSrc;
xString sRead, sWrite, sEnd, sTemp;
FILE *fileR, *fileW;
char *p_cName, *p_cChar;
// save directory
GetCurrentDirectory(256, sDirectory);
// search destination file
CreateDirectory(_sDirDst, NULL);
sprintf(sFileDst, "%s\\%s", _sDirDst, _sFileDst);
// check that the target file does not exist or must be erased
if (!bErase && (SearchPath( NULL,sFileDst,NULL,256,sTemp,&p_cName) != 0))
return;
// search source file
CreateDirectory(_sDirSrc, NULL);
sprintf(sFileSrc, "%s\\%s", _sDirSrc, _sFileSrc);
// open files
fileR = fopen(sFileSrc, "rt");
fileW = fopen(sFileDst, "wt");
if ((fileR==NULL) || (fileW==NULL))
return;
// copy with updated reference
while (fgets(sRead, 256, fileR) != NULL)
{
strcpy(sWrite, "");
strcpy(sEnd, sRead);
// seach for reference
while ((p_cChar = strstr(sEnd, _SrcRef)) != NULL)
{
// replace it with new one
strcpy(sTemp, p_cChar + strlen(_SrcRef));
p_cChar[0] = '\0';
strcat(sWrite, sEnd);
strcat(sWrite, _DstRef);
strcpy(sEnd, sTemp);
}
strcat(sWrite, sEnd);
fputs(sWrite, fileW);
}
// close files
fclose(fileR);
fclose(fileW);
}
/****************************************************************************
* Description: copy one texture file from source to destination directory
*
* Parameters: sTextureName: name of texture file
* sRawData : source directory
* sGameData : destination directory
*---------------------------------------------------------------------------
* Revision date: Author:
*****************************************************************************/
void MLT_vCopyOneTexture(char *sTextureName, char *sRawData, char * sGameData)
{
xString sDirectory, sGameTexturesLevel, sTypeName;
// change directory
GetCurrentDirectory(256, sDirectory);
SetCurrentDirectory(sRawData);
// create destination texture subdirectory
strcpy(sTypeName, strstr(sRawData, "\\Textures")+9);
sprintf(sGameTexturesLevel, "%s\\World\\Graphics\\Textures%s", sGameData, sTypeName);
CreateDirectory(sGameTexturesLevel, NULL);
// get complete texture name
strcat(sGameTexturesLevel, "\\");
strcat(sGameTexturesLevel, sTextureName);
// copy texture file
CopyFile(sTextureName, sGameTexturesLevel, FALSE);
// restore directory
SetCurrentDirectory(sDirectory);
}
/****************************************************************************
* Description: remove collision flags from the name
*
* Parameters: szName : name to update
*---------------------------------------------------------------------------
* Revision date: Author:
*****************************************************************************/
char* MLT_vRemoveFromName (char *szName)
{
char *p_Char;
// find lowercase flag
if (strstr(szName, "!nocol"))
p_Char=strstr(szName, "!nocol");
// find uppercase flag
if (strstr(szName, "!NOCOL"))
p_Char=strstr(szName, "!NOCOL");
// remove flag
strcpy(gs_szNewName, szName);
gs_szNewName[strlen(szName) - strlen(p_Char)]='\0';
p_Char+=6;
strcat(gs_szNewName, p_Char);
return gs_szNewName;
}
/****************************************************************************
* Description: return the file name whitout extension
*
* Parameters: _sFileName : name to update
*---------------------------------------------------------------------------
* Revision date: Author:
*****************************************************************************/
char *MLT_p_cGetFileNameWithoutExt(char *_sFileName)
{
char *p_char;
static xString sFileName;
sprintf(sFileName, "%s", _sFileName);
p_char = sFileName;
if ((p_char=strstr(sFileName, "."))!=NULL)
*p_char = 0;
return sFileName;
}
/****************************************************************************
* Description: return the file name whitout path
*
* Parameters: sFileName : name to update
*---------------------------------------------------------------------------
* Revision date: Author:
*****************************************************************************/
char *MLT_p_cGetFileNameWithoutPath (char *sFileName)
{
char *p_char;
if (((p_char = strrchr( sFileName, '/')) != NULL) || ((p_char = strrchr( sFileName, '\\')) != NULL))
p_char++;
else
p_char = sFileName;
return p_char;
}
/****************************************************************************
* Description: replace all spaces with '_' character
*
* Parameters: sFileName : name to update
*---------------------------------------------------------------------------
* Revision date: Author:
*****************************************************************************/
char *MLT_p_cEraseSpace (char *sFileName)
{
char *p_char;
p_char = sFileName;
while ((p_char =strstr(sFileName, " "))!=NULL)
{
if (*p_char == ' ')
*p_char = '_';
}
return sFileName;
}
/****************************************************************************
* Description: return section name without the file. (file^section:name)
*
* Parameters: sFileName : name to update
*---------------------------------------------------------------------------
* Revision date: Author:
*****************************************************************************/
char *MLT_p_cGetSectionName(char *sSection)
{
return (strchr( sSection, '^') + 1);
}
/****************************************************************************
* Description: delete the spo flags from the name
* (the spo flags are identified by the $ symbol)
*
* Parameters: sIdent : pointer on the name to update
*---------------------------------------------------------------------------
* Revision date: Author:
*****************************************************************************/
void MLT_vRemoveFlags (char **sIdent )
{
char *p_Char1, *p_Char2;
char szName[50];
if ((p_Char1=strstr(*sIdent, "$"))!=NULL)
{
p_Char2=p_Char1;
p_Char1++;
while( (*p_Char1 != 0) && (*p_Char1 != '|')
&& (*p_Char1 != '#') && (*p_Char1 != '&')
&& (*p_Char1 != '=') && (*p_Char1 != '_') )
p_Char1++;
(*sIdent)[strlen(*sIdent)-strlen(p_Char2)]='\0';
strcpy(szName, *sIdent);
if (*p_Char1 != 0)
strcat(szName, p_Char1);
strcpy(*sIdent, szName);
}
}
/****************************************************************************
* Description: delete the geometric properties from the name
* (the geometric properties are identified by the # symbol)
*
* Parameters: sIdent : pointer on the name to update
*---------------------------------------------------------------------------
* Revision date: Author:
*****************************************************************************/
void MLT_vRemoveGeomProp (char **sIdent )
{
char *p_Char1, *p_Char2;
char szName[50];
if ((p_Char1=strstr(*sIdent, "#"))!=NULL)
{
p_Char2=p_Char1;
p_Char1++;
while( (*p_Char1 != 0) && (*p_Char1 != '|')
&& (*p_Char1 != '$') && (*p_Char1 != '&')
&& (*p_Char1 != '=') && (*p_Char1 != '_')
&& (*p_Char1 != '!'))
p_Char1++;
(*sIdent)[strlen(*sIdent)-strlen(p_Char2)]='\0';
strcpy(szName, *sIdent);
if (*p_Char1 != 0)
strcat(szName, p_Char1);
strcpy(*sIdent, szName);
}
}
/****************************************************************************
* Description: extract the szExtract part from the name
*
* Parameters: sIdent : pointer on the name to update
* sIdent : string to return
*---------------------------------------------------------------------------
* Revision date: Author:
*****************************************************************************/
void MLT_vExtractPropFromName(char **sIdent, char *szExtract )
{
char *p_Char1, *p_Char2;
char szName[100];
if ((p_Char1=strstr(*sIdent, szExtract))!=NULL)
{
p_Char2=p_Char1+strlen(szExtract);
(*sIdent)[strlen(*sIdent)-strlen(p_Char1)]='\0';
strcpy(szName, *sIdent);
if (*p_Char2 != 0)
strcat(szName, p_Char2);
strcpy(*sIdent, szName);
}
}
/****************************************************************************
* Description: split a module section name into : forme|habillage!NoPhy<NoLod=Name
*
* Parameters: _sIdent : name to split
* sForme : returns the form part
* sHabillage : returns the mapping part
* p_lNoPhy : returns the physical index
* p_lNoLod : returns the level of detail
* sName : returns the instance name
*---------------------------------------------------------------------------
* Revision date: Author:
*****************************************************************************/
void MLT_vSplitModuleSectionName (char *_sIdent, char *sForme, char *sHabillage, long *p_lNoPhy, long *p_lNoLod, char *sName)
{
xString sIdent;
char *p_cForme, *p_cHabillage, *p_cName, *p_char, *p_tmp;
// save complete name
sprintf(sIdent, "%s", _sIdent);
// init all parameters
p_char = sIdent;
p_cForme = sIdent;
p_cHabillage = p_cName = NULL;
*p_lNoPhy = 0;
*p_lNoLod = 0;
while (*p_char != 0)
{
// look for the separator symbols
while( (*p_char != 0)
&& (*p_char != '|')
&& (*p_char != '!')
&& (*p_char != '=')
&& (*p_char != '<') ) p_char++;
switch(*p_char)
{
case '|' :
// identify mapping
p_cHabillage = p_char+1;
break;
case '!' :
// identify index
*p_lNoPhy = strtol(p_char+1, &p_tmp, 10);
break;
case '<' :
// identify level of detail
*p_lNoLod = strtol(p_char+1, &p_tmp, 10);
break;
case '=' :
// identify instance name
p_cName = p_char+1;
break;
}
if (*p_char == 0)
break;
*p_char = 0;
// next character
p_char++;
}
// update parameters
sprintf(sForme, "%s", p_cForme);
if(p_cHabillage != NULL)
sprintf(sHabillage, "%s", p_cHabillage);
else
sprintf(sHabillage, "");
if(p_cName != NULL)
sprintf(sName, "%s", p_cName);
else
sprintf(sName, "");
}
/****************************************************************************
* Description: compute a physical section name into : forme|habillage!NoPhy=Name
*
* Parameters: sSection : name to compute
* sForme : form part
* sHabillage : mapping part
* p_lNoPhy : physical index
* sName : instance name
*---------------------------------------------------------------------------
* Revision date: Author:
*****************************************************************************/
void MLT_vComputePhysicalSectionName (char *sSection, char *sForme, char *sHabillage, long lNoPhy, char *sName)
{
xString sTmp;
// init name with form
sprintf(sSection, "%s", sForme);
// if necessary, add collide info
if (!strcmp(sHabillage, M_Collide))
{
strcat(sSection, "!");
}
// if necessary, add mapping
else if(strlen(sHabillage) != 0)
{
sprintf(sTmp, "%s|%s", sSection, sHabillage);
sprintf(sSection, "%s", sTmp);
}
// if necessary, add physical index
if(lNoPhy>1)
{
sprintf(sTmp, "%s!%d", sSection, lNoPhy);
sprintf(sSection, "%s", sTmp);
}
// if necessary, add instance name
if(strlen(sName) != 0)
{
sprintf(sTmp, "%s=%s", sSection, sName);
sprintf(sSection, "%s", sTmp);
}
}
/****************************************************************************
* Description: compute a visualset section name into : forme|habillage=Name
*
* Parameters: sSection : name to compute
* sForme : form part
* sHabillage : mapping part
* sName : instance name
*---------------------------------------------------------------------------
* Revision date: Author:
*****************************************************************************/
void MLT_vComputeVisualSetSectionName (char *sSection, char *sForme, char *sHabillage, char *sName)
{
xString sTmp;
// init name with form
sprintf(sSection, "%s", sForme);
// if necessary, add mapping
if(strlen(sHabillage) != 0)
{
sprintf(sTmp, "%s|%s", sSection, sHabillage);
sprintf(sSection, "%s", sTmp);
}
// if necessary, add instance name
if(strlen(sName) != 0)
{
sprintf(sTmp, "%s=%s", sSection, sName);
sprintf(sSection, "%s", sTmp);
}
}
/****************************************************************************
* Description: display a line in the result window
*
* Parameters: cLineType : type of the line (normal, warning, error)
* szFormat : line to display
*---------------------------------------------------------------------------
* Revision date: Author:
*****************************************************************************/
void MLT_vOutput (char cLineType, char *szFormat, ... )
{
va_list argptr;
char szLine[256];
va_start( argptr, szFormat );
vsprintf( szLine, szFormat, argptr );
va_end( argptr );
#ifndef _WINDOWS
cLineType = cLineType;
fprintf( stderr, szLine );
#else
fn_vAfxOutputStringRes( szLine, cLineType);
#endif
}