#include <locale.h>
#include <libintl.h>
#define _(x) gettext(x)
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <dirent.h>
#include <errno.h>
#if !defined(__WIN32__)
#include <sys/stat.h>
#include <sys/types.h>
#endif
#include "classicladder.h"
#include "global.h"
#include "edit.h"
#include "calc.h"
#include "calc_sequential.h"
#include "files.h"
#include "files_sequential.h"
#include "files_project.h"
#ifdef __WIN32__
#define CAR_SEP '\\'
#else
#define CAR_SEP '/'
#endif
void VerifyDirectorySelected( char * NewDir )
{
strcpy( InfosGene->CurrentProjectFileName, NewDir );
if (strlen(InfosGene->CurrentProjectFileName)>1)
{
if ( strcmp( &NewDir[ strlen( NewDir ) -4 ], ".clp" )!=0 )
{
DIR *pDir;
pDir = opendir(InfosGene->CurrentProjectFileName);
if (pDir==NULL && errno==ENOTDIR)
{
int Lgt = strlen(InfosGene->CurrentProjectFileName);
char * End = &InfosGene->CurrentProjectFileName[Lgt-1];
do
{
End--;
}
while(*End!=CAR_SEP && --Lgt>0);
End++;
if ( Lgt>0 )
{
*End = '\0';
}
else
{
printf(_("ERROR with path directory given for project !!!\n"));
InfosGene->CurrentProjectFileName[ 0 ] = '\0';
}
}
else
{
if (pDir != NULL)
{
closedir(pDir);
}
if (InfosGene->CurrentProjectFileName[strlen(InfosGene->CurrentProjectFileName)-1]!=CAR_SEP)
strcat( InfosGene->CurrentProjectFileName, "/" );
}
}
}
}
void InitTempDir( void )
{
char * TmpEnv = getenv("TMP");
if ( TmpEnv==NULL )
TmpEnv = "/tmp";
sprintf( TmpDirectory, "%s/classicladder_tmp_XXXXXX", TmpEnv );
#ifndef __WIN32__
if ( mkdtemp( TmpDirectory )==NULL )
#else
if ( mktemp( TmpDirectory )==NULL )
#endif
{
sprintf( TmpDirectory, "%s/classicladder_tmp", TmpEnv );
#ifndef __WIN32__
mkdir( TmpDirectory, S_IRWXU );
#else
mkdir( TmpDirectory );
#endif
}
#ifdef __WIN32__
else
{
mkdir( TmpDirectory );
}
#endif
}
char LoadProjectFiles( char * FileProject )
{
char Result = FALSE;
char OldProjectFound = TRUE;
if ( TmpDirectory[ 0 ]=='\0' )
InitTempDir( );
CleanTmpLadderDirectory( FALSE );
if ( strcmp( &FileProject[ strlen( FileProject ) -4 ], ".clp" )==0 )
OldProjectFound = FALSE;
if ( OldProjectFound )
{
LoadAllLadderDatas( FileProject );
}
else
{
Result = SplitFiles( FileProject, TmpDirectory );
LoadAllLadderDatas( TmpDirectory );
}
return Result;
}
char FileName[500];
char LoadGeneralParamsOnlyFromProject( char * FileProject )
{
char Result = FALSE;
if ( TmpDirectory[ 0 ]=='\0' )
InitTempDir( );
CleanTmpLadderDirectory( FALSE );
if ( strcmp( &FileProject[ strlen( FileProject ) -4 ], ".clp" )==0 )
{
Result = SplitFiles( FileProject, TmpDirectory );
sprintf(FileName,"%s/general.txt",TmpDirectory);
LoadGeneralParameters( FileName );
}
return Result;
}
char SaveProjectFiles( char * FileProject )
{
if ( TmpDirectory[ 0 ]=='\0' )
InitTempDir( );
printf(_("Save project '%s' from tmp dir=%s\n"), FileProject, TmpDirectory);
SaveAllLadderDatas( TmpDirectory );
if ( strcmp( &FileProject[ strlen( FileProject ) -4 ], ".clp" )!=0 )
strcat( FileProject, ".clp" );
return JoinFiles( FileProject, TmpDirectory );
}
#define FILE_HEAD "_FILE-"
#define STR_LEN_FILE_HEAD strlen(FILE_HEAD)
char JoinFiles( char * DirAndNameOfProject, char * TmpDirectoryFiles )
{
char ProjectFileOk = FALSE;
FILE * pProjectFile;
char Buff[300];
char BuffTemp[300];
DIR *pDir;
struct dirent *pEnt;
pProjectFile = fopen( DirAndNameOfProject, "wt" );
if ( pProjectFile )
{
fputs( "_FILES_CLASSICLADDER\n", pProjectFile );
pDir = opendir( TmpDirectoryFiles );
if (pDir)
{
while ((pEnt = readdir(pDir)) != NULL)
{
if ( strcmp(pEnt->d_name,".") && strcmp(pEnt->d_name,"..") )
{
FILE * pParametersFile;
sprintf(Buff, "%s/%s", TmpDirectoryFiles,pEnt->d_name);
pParametersFile = fopen( Buff, "rt" );
if (pParametersFile)
{
sprintf( BuffTemp, FILE_HEAD "%s\n", pEnt->d_name );
fputs( BuffTemp, pProjectFile );
while( !feof( pParametersFile ) )
{
char Buff[ 300 ];
if (fgets( Buff, 300, pParametersFile ) && !feof(pParametersFile))
{
fputs( Buff, pProjectFile );
}
}
fclose( pParametersFile );
sprintf( BuffTemp, "_/FILE-%s\n", pEnt->d_name );
fputs( BuffTemp, pProjectFile );
}
}
}
closedir(pDir);
}
fputs( "_/FILES_CLASSICLADDER\n", pProjectFile );
fclose(pProjectFile);
ProjectFileOk = TRUE;
}
return ProjectFileOk;
}
char SplitFiles( char * DirAndNameOfProject, char * TmpDirectoryFiles )
{
char ProjectFileOk = TRUE;
char Buff[ 300 ];
FILE * pProjectFile;
FILE * pParametersFile;
char ParametersFile[300];
strcpy(ParametersFile,"");
pProjectFile = fopen( DirAndNameOfProject, "rb" );
if ( pProjectFile )
{
if ( fgets( Buff, 300, pProjectFile ) && strncmp( Buff, "_FILES_CLASSICLADDER", strlen( "_FILES_CLASSICLADDER" ) )==0 )
{
while( !feof( pProjectFile ) )
{
if ( fgets( Buff, 300, pProjectFile ) && !feof( pProjectFile ) )
{
if (strncmp(Buff,FILE_HEAD,STR_LEN_FILE_HEAD) ==0)
{
sprintf(ParametersFile, "%s/%s", TmpDirectoryFiles, &Buff[STR_LEN_FILE_HEAD]);
ParametersFile[ strlen( ParametersFile )-1 ] = '\0';
if ( ParametersFile[ strlen(ParametersFile)-1 ]=='\r' )
ParametersFile[ strlen(ParametersFile)-1 ] = '\0';
}
else
{
if ( ( strncmp( Buff, "_/FILES_CLASSICLADDER", strlen("_/FILES_CLASSICLADDER") )!=0 )
&& Buff[ 0 ]!='\n' )
{
char cEndOfFile = FALSE;
pParametersFile = fopen( ParametersFile, "wt" );
if (pParametersFile)
{
fputs( Buff, pParametersFile );
while( !feof( pProjectFile ) && !cEndOfFile )
{
if (fgets( Buff, 300, pProjectFile ) && strncmp(Buff,"_/FILE-",strlen("_/FILE-")) !=0)
{
if (!feof(pProjectFile))
fputs( Buff, pParametersFile );
}
else
{
cEndOfFile = TRUE;
}
}
fclose(pParametersFile);
}
}
}
}
}
}
else
{
ProjectFileOk = FALSE;
}
fclose(pProjectFile);
}
else
{
ProjectFileOk = FALSE;
}
return ProjectFileOk;
}