summaryrefslogtreecommitdiff
path: root/app/bin/fileio.c
diff options
context:
space:
mode:
Diffstat (limited to 'app/bin/fileio.c')
-rw-r--r--app/bin/fileio.c966
1 files changed, 551 insertions, 415 deletions
diff --git a/app/bin/fileio.c b/app/bin/fileio.c
index cb0c8de..4741c05 100644
--- a/app/bin/fileio.c
+++ b/app/bin/fileio.c
@@ -17,35 +17,9 @@
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
-#include <stdlib.h>
-#include <stdio.h>
-#ifndef WINDOWS
-#include <unistd.h>
-#include <dirent.h>
-#include <errno.h>
-#endif
-#include <math.h>
-#include <ctype.h>
-#include <string.h>
-#include <time.h>
-#include <ctype.h>
-#ifdef WINDOWS
- #include <io.h>
- #define W_OK (2)
- #define access _access
- #include <windows.h>
-#endif
-#include <sys/stat.h>
-#include <stdarg.h>
-#include <locale.h>
-
-#include <stdint.h>
-
-#include <assert.h>
-
#include <cJSON.h>
#include "archive.h"
@@ -58,101 +32,106 @@
#include "draw.h"
#include "fileio.h"
#include "fcntl.h"
-#include "i18n.h"
#include "layout.h"
#include "manifest.h"
-#include "messages.h"
#include "misc.h"
#include "param.h"
#include "include/paramfile.h"
+#include "include/paramfilelist.h"
#include "paths.h"
#include "track.h"
-#include "utility.h"
#include "version.h"
#include "dynstring.h"
+#include "common-ui.h"
+#include "ctrain.h"
-#ifdef WINDOWS
+#ifdef UTFCONVERT
#include "include/utf8convert.h"
-#endif // WINDOWS
+#endif // UTFCONVERT
-
-/*#define TIME_READTRACKFILE*/
+EXPORT dynArr_t paramProc_da;
#define COPYBLOCKSIZE 1024
EXPORT const char * workingDir;
EXPORT const char * libDir;
-EXPORT wMenuList_p fileList_ml;
-
EXPORT char * clipBoardN;
static coOrd paste_offset, cursor_offset;
EXPORT wBool_t bExample = FALSE;
EXPORT wBool_t bReadOnly = FALSE;
-
+EXPORT wBool_t bInReadTracks = FALSE;
#ifdef WINDOWS
#define rename( F1, F2 ) Copyfile( F1, F2 )
+#endif
-static int Copyfile( char * fn1, char * fn2 )
+EXPORT int Copyfile( const char * fn1, const char * fn2 )
{
FILE *f1, *f2;
size_t size;
f1 = fopen( fn1, "r" );
- if ( f1 == NULL )
+ if ( f1 == NULL ) {
return 0;
+ }
f2 = fopen( fn2, "w" );
if ( f2 == NULL ) {
fclose( f1 );
return -1;
}
- while ( (size=fread( message, 1, sizeof message, f1 )) > 0 )
+ while ( (size=fread( message, 1, sizeof message, f1 )) > 0 ) {
fwrite( message, size, 1, f2 );
+ }
fclose( f1 );
fclose( f2 );
return 0;
}
-#endif
-/**
- * Save the old locale and set to new.
- *
- * \param newlocale IN the new locale to set
- * \return pointer to the old locale
- */
-
-char *
-SaveLocale( char *newLocale )
+//
+// Locale handling
+// SetCLocale is called before reading/writing any data files (.xtc, .xti, .xtq, .cus...)
+// SetUserLocale is called after
+// Calls can be nested: C, C, User, User
+//
+static char * sUserLocale = NULL; // current user locale
+static long lCLocale = 0; // locale state: > 0 C locale, <= 0 user locale
+static long nCLocale = 0; // total # of setlocals calls
+static int log_locale = 0; // logging
+static int log_timereadfile = 0;
+
+EXPORT void SetCLocale()
{
- char *oldLocale;
- char *saveLocale = NULL;
-
- /* get old locale setting */
- oldLocale = setlocale(LC_ALL, NULL);
-
- /* allocate memory to save */
- if (oldLocale)
- saveLocale = strdup( oldLocale );
-
- setlocale(LC_ALL, newLocale );
-
- return( saveLocale );
+ if ( sUserLocale == NULL ) {
+ sUserLocale = MyStrdup( setlocale( LC_ALL, NULL ) );
+ }
+ if ( lCLocale == 0 ) {
+ LOG( log_locale, 1, ( "Set C Locale: %ld\n", ++nCLocale ) );
+ setlocale( LC_ALL, "C" );
+#ifdef LC_MESSAGES
+ setlocale( LC_MESSAGES, "");
+#endif
+ }
+ lCLocale++;
+ if ( lCLocale > 1 ) {
+ LOG( log_locale, 3, ( "SetClocale - C! %ld\n", nCLocale) );
+ } else if ( lCLocale < 1 ) {
+ LOG( log_locale, 2, ( "SetClocale - User! %ld\n", nCLocale) );
+ }
}
-/**
- * Restore a previously saved locale.
- *
- * \param locale IN return value from earlier call to SaveLocale
- */
-
-void
-RestoreLocale( char * locale )
+EXPORT void SetUserLocale()
{
- if( locale ) {
- setlocale( LC_ALL, locale );
- free( locale );
+ if ( lCLocale == 1 ) {
+ LOG( log_locale, 1, ( "Set %s Locale: %ld\n", sUserLocale, ++nCLocale ) );
+ setlocale( LC_ALL, sUserLocale );
+ }
+ lCLocale--;
+ if ( lCLocale < 0 ) {
+ LOG( log_locale, 2, ("SetUserLocale - User! %ld\n", nCLocale) );
+ } else if ( lCLocale > 0 ) {
+ LOG( log_locale, 3, ("SetUserLocale - C! %ld\n", nCLocale) );
}
}
@@ -178,13 +157,16 @@ EXPORT void Stripcr( char * line )
{
char * cp;
cp = line + strlen(line);
- if (cp == line)
+ if (cp == line) {
return;
+ }
cp--;
- if (*cp == '\n')
+ if (*cp == '\n') {
*cp-- = '\0';
- if (cp >= line && *cp == '\r')
+ }
+ if (cp >= line && *cp == '\r') {
*cp = '\0';
+ }
}
EXPORT char * GetNextLine( void )
@@ -221,16 +203,16 @@ EXPORT char * GetNextLine( void )
*/
EXPORT int InputError(
- char * msg,
- BOOL_T showLine,
- ... )
+ char * msg,
+ BOOL_T showLine,
+ ... )
{
va_list ap;
char * mp = message;
int ret;
mp += sprintf( message, "INPUT ERROR: %s:%d\n",
- paramFileName, paramLineNum );
+ paramFileName, paramLineNum );
va_start( ap, showLine );
mp += vsprintf( mp, msg, ap );
va_end( ap );
@@ -254,12 +236,12 @@ EXPORT int InputError(
EXPORT void SyntaxError(
- char * event,
- wIndex_t actual,
- wIndex_t expected )
+ char * event,
+ wIndex_t actual,
+ wIndex_t expected )
{
InputError( "%s scan returned %d (expected %d)",
- TRUE, event, actual, expected );
+ TRUE, event, actual, expected );
}
@@ -291,9 +273,9 @@ EXPORT void SyntaxError(
*/
EXPORT BOOL_T GetArgs(
- char * line,
- char * format,
- ... )
+ char * line,
+ char * format,
+ ... )
{
char * cp, * cq;
long * pl;
@@ -304,15 +286,16 @@ EXPORT BOOL_T GetArgs(
char * ps;
char ** qp;
va_list ap;
- char *oldLocale = NULL;
char * sError = NULL;
- oldLocale = SaveLocale("C");
+ if ( lCLocale < 1 ) {
+ LOG( log_locale, 1, ( "GetArgs: not in C locale\n" ) );
+ }
cp = line;
va_start( ap, format );
for ( ; sError==NULL && *format; format++ ) {
- while (isspace((unsigned char)*cp)) cp++;
+ while (isspace((unsigned char)*cp)) { cp++; }
if (!*cp && strchr( "XZYzc", *format ) == NULL ) {
sError = "EOL unexpected";
break;
@@ -363,10 +346,11 @@ EXPORT BOOL_T GetArgs(
sError = "%s: expected integer";
break;
}
- if (*cq == '.')
+ if (*cq == '.') {
*pf = strtod( cp, &cq );
- else
+ } else {
*pf /= mainD.dpi;
+ }
cp = cq;
break;
case 'u':
@@ -418,24 +402,25 @@ EXPORT BOOL_T GetArgs(
break;
case 's':
ps = va_arg( ap, char * );
- while (isspace((unsigned char)*cp)) cp++;
- while (*cp && !isspace((unsigned char)*cp)) *ps++ = *cp++;
+ while (isspace((unsigned char)*cp)) { cp++; }
+ while (*cp && !isspace((unsigned char)*cp)) { *ps++ = *cp++; }
*ps++ = '\0';
break;
case 'q':
qp = va_arg( ap, char * * );
if (*cp != '\"')
/* Stupid windows */
+ {
cq = strchr( cp, '\"' );
- else
+ } else {
cq = cp;
+ }
if (cq!=NULL) {
cp = cq;
ps = &message[0];
cp++;
while (*cp) {
- if ( (ps-message)>=sizeof message)
- AbortProg( "Quoted title argument too long" );
+ CHECK( (ps-message)<sizeof message );
if (*cp == '\"') {
if (*++cp == '\"') {
*ps++ = '\"';
@@ -453,25 +438,25 @@ EXPORT BOOL_T GetArgs(
} else {
message[0] = '\0';
}
-#ifdef WINDOWS
+#ifdef UTFCONVERT
ConvertUTF8ToSystem(message);
#endif
*qp = (char*)ConvertFromEscapedText(message);
break;
case 'c':
qp = va_arg( ap, char * * );
- while (isspace((unsigned char)*cp)) cp++;
- if (*cp)
+ while (isspace((unsigned char)*cp)) { cp++; }
+ if (*cp) {
*qp = cp;
- else
+ } else {
*qp = NULL;
+ }
break;
default:
- AbortProg( "getArgs: bad format char: %c", *format );
+ CHECKMSG( FALSE, ( "getArgs: bad format char: %c", *format ) );
}
}
va_end( ap );
- RestoreLocale(oldLocale);
if ( sError ) {
InputError( sError, TRUE, cp );
return FALSE;
@@ -484,17 +469,19 @@ EXPORT BOOL_T GetArgs(
wBool_t IsEND( char * sEnd )
{
char * cp;
- wBool_t bAllowNakedENDs = paramVersion < 12;
+ wBool_t bAllowNakedENDs = paramVersion < VERSION_NONAKEDENDS;
for( cp = paramLine; *cp && (isspace( *cp ) || *cp == '\t'); cp++ );
- if ( strncmp( cp, sEnd, strlen(sEnd) ) == 0 )
+ if ( strncmp( cp, sEnd, strlen(sEnd) ) == 0 ) {
cp += strlen( sEnd );
- else if ( bAllowNakedENDs && strncmp( cp, "END", 3 ) == 0 )
+ } else if ( bAllowNakedENDs && strncmp( cp, "END", 3 ) == 0 ) {
cp += 3;
- else
+ } else {
return FALSE;
+ }
for ( ; *cp && isspace( *cp ); cp++ );
- if ( *cp != '\0' )
+ if ( *cp != '\0' ) {
return FALSE;
+ }
return TRUE;
}
@@ -526,11 +513,11 @@ ReadMultilineText()
string = MyStrdup(DynStringToCStr(&noteText));
string[strlen(string) - 1] = '\0';
-#ifdef WINDOWS
+#ifdef UTFCONVERT
if (wIsUTF8(string)) {
ConvertUTF8ToSystem(string);
}
-#endif // WINDOWS
+#endif // UTFCONVERT
DynStringFree(&noteText);
return(string);
@@ -538,8 +525,8 @@ ReadMultilineText()
EXPORT wBool_t ParseRoomSize(
- char * s,
- coOrd * roomSizeRet )
+ char * s,
+ coOrd * roomSizeRet )
{
coOrd size;
char *cp;
@@ -547,7 +534,7 @@ EXPORT wBool_t ParseRoomSize(
size.x = strtod( s, &cp );
if (cp != s) {
s = cp;
- while (isspace((unsigned char)*s)) s++;
+ while (isspace((unsigned char)*s)) { s++; }
if (*s == 'x' || *s == 'X') {
size.y = strtod( ++s, &cp );
if (cp != s) {
@@ -573,8 +560,8 @@ EXPORT wBool_t ParseRoomSize(
* \param [IN] delete if not NULL function for freeing the definition
*/
EXPORT void AddParam(
- char * name,
- readParam_t proc)
+ char * name,
+ readParam_t proc)
{
DYNARR_APPEND( paramProc_t, paramProc_da, 10 );
paramProc(paramProc_da.cnt-1).name = name;
@@ -585,7 +572,7 @@ EXPORT char * PutTitle( char * cp )
{
static char *title;
char * tp;
- unsigned cnt = strlen(cp) * 2 + 3; // add 3 for quotes and terminating \0
+ size_t cnt = strlen(cp) * 2 + 3; // add 3 for quotes and terminating \0
if (!title) {
title = MyMalloc(cnt);
@@ -604,18 +591,19 @@ EXPORT char * PutTitle( char * cp )
}
cp++;
}
- if ( *cp )
+ if ( *cp ) {
NoticeMessage( _("putTitle: title too long: %s"), _("Ok"), NULL, title );
+ }
*tp = '\0';
-#ifdef WINDOWS
+#ifdef UTFCONVERT
if(RequiresConvToUTF8(title)) {
char *out = MyMalloc(cnt);
- wSystemToUTF8(title, out, cnt);
+ wSystemToUTF8(title, out, (unsigned int)cnt);
strcpy(title, out);
MyFree(out);
}
-#endif // WINDOWS
+#endif // UTFCONVERT
return title;
}
@@ -630,15 +618,16 @@ void SetWindowTitle( void )
{
char *filename;
- if ( changed > 2 || inPlayback )
+ if ( changed > 2 || inPlayback ) {
return;
+ }
filename = GetLayoutFilename();
sprintf( message, "%s%s%s - %s(%s)",
- (filename && filename[0])?filename: _("Unnamed Trackplan"),
- bReadOnly?_(" (R/O)"):"",
- changed>0?"*":"",
- sProdName, sVersion );
+ (filename && filename[0])?filename: _("Unnamed Trackplan"),
+ bReadOnly?_(" (R/O)"):"",
+ changed>0?"*":"",
+ sProdName, sVersion );
wWinSetTitle( mainW, message );
}
@@ -654,11 +643,6 @@ static struct wFilSel_t * loadFile_fs = NULL;
static struct wFilSel_t * saveFile_fs = NULL;
static struct wFilSel_t * examplesFile_fs = NULL;
-static wWin_p checkPointingW;
-static paramData_t checkPointingPLs[] = {
- { PD_MESSAGE, N_("Check Pointing") } };
-static paramGroup_t checkPointingPG = { "checkpoint", 0, checkPointingPLs, sizeof checkPointingPLs/sizeof checkPointingPLs[0] };
-
static char * checkPtFileName1;
static char * checkPtFileName2;
static char * checkPtFileNameBackup;
@@ -668,39 +652,37 @@ static char * checkPtFileNameBackup;
* \param IN pathName filename including directory
* \param IN fileName pointer to filename part in pathName
* \param IN full
- * \param IN noSetCurDir if FALSE current diurectory is changed to file location
+ * \param IN noSetCurDir if FALSE current directory is changed to file location
* \param IN complain if FALSE error messages are supressed
*
* \return FALSE in case of load error
*/
static BOOL_T ReadTrackFile(
- const char * pathName,
- const char * fileName,
- BOOL_T full,
- BOOL_T noSetCurDir,
- BOOL_T complain )
+ const char * pathName,
+ const char * fileName,
+ BOOL_T full,
+ BOOL_T noSetCurDir,
+ BOOL_T complain )
{
int count;
coOrd roomSize;
long scale;
char * cp;
- char *oldLocale = NULL;
int ret = TRUE;
- oldLocale = SaveLocale( "C" );
-
paramFile = fopen( pathName, "r" );
if (paramFile == NULL) {
- /* Reset the locale settings */
- RestoreLocale( oldLocale );
-
- if ( complain )
- NoticeMessage( MSG_OPEN_FAIL, _("Continue"), NULL, sProdName, pathName, strerror(errno) );
-
+ if ( complain ) {
+ NoticeMessage( MSG_OPEN_FAIL, _("Continue"), NULL, sProdName, pathName,
+ strerror(errno) );
+ }
return FALSE;
}
+ bInReadTracks = TRUE;
+ SetCLocale();
+ checkPtFileNameBackup = NULL;
paramLineNum = 0;
paramFileName = strdup( fileName );
@@ -708,7 +690,8 @@ static BOOL_T ReadTrackFile(
count = 0;
int skipLines = 0;
BOOL_T skip = FALSE;
- while ( paramFile && ( fgets(paramLine, sizeof paramLine, paramFile) ) != NULL ) {
+ while ( paramFile
+ && ( fgets(paramLine, sizeof paramLine, paramFile) ) != NULL ) {
count++;
BOOL_T old_skip = skip;
skip = FALSE;
@@ -718,14 +701,15 @@ static BOOL_T ReadTrackFile(
}
paramLineNum++;
if (strlen(paramLine) == (sizeof paramLine) -1 &&
- paramLine[(sizeof paramLine)-1] != '\n') {
- if( !(ret = InputError( "Line too long", TRUE )))
+ paramLine[(sizeof paramLine)-1] != '\n') {
+ if( !(ret = InputError( "Line too long", TRUE ))) {
break;
+ }
}
Stripcr( paramLine );
if (paramLine[0] == '#' ||
- paramLine[0] == '\n' ||
- paramLine[0] == '\0' ) {
+ paramLine[0] == '\n' ||
+ paramLine[0] == '\0' ) {
/* comment */
continue;
}
@@ -737,31 +721,35 @@ static BOOL_T ReadTrackFile(
} else if (strncmp( paramLine, "VERSION ", 8 ) == 0) {
paramVersion = strtol( paramLine+8, &cp, 10 );
if (cp)
- while (*cp && isspace((unsigned char)*cp)) cp++;
+ while (*cp && isspace((unsigned char)*cp)) { cp++; }
if ( paramVersion > iParamVersion ) {
if (cp && *cp) {
- NoticeMessage( MSG_UPGRADE_VERSION1, _("Ok"), NULL, paramVersion, iParamVersion, sProdName, cp );
+ NoticeMessage( MSG_UPGRADE_VERSION1, _("Ok"), NULL, paramVersion, iParamVersion,
+ sProdName, cp );
} else {
- NoticeMessage( MSG_UPGRADE_VERSION2, _("Ok"), NULL, paramVersion, iParamVersion, sProdName );
+ NoticeMessage( MSG_UPGRADE_VERSION2, _("Ok"), NULL, paramVersion, iParamVersion,
+ sProdName );
}
break;
}
if ( paramVersion < iMinParamVersion ) {
- NoticeMessage( MSG_BAD_FILE_VERSION, _("Ok"), NULL, paramVersion, iMinParamVersion, sProdName );
+ NoticeMessage( MSG_BAD_FILE_VERSION, _("Ok"), NULL, paramVersion,
+ iMinParamVersion, sProdName );
break;
}
} else if (!full) {
- if( !(ret = InputError( "unknown command", TRUE )))
+ if( !(ret = InputError( "unknown command", TRUE ))) {
break;
+ }
} else if (strncmp( paramLine, "TITLE1 ", 7 ) == 0) {
-#ifdef WINDOWS
+#ifdef UTFCONVERT
ConvertUTF8ToSystem(paramLine + 7);
-#endif // WINDOWS
+#endif // UTFCONVERT
SetLayoutTitle(paramLine + 7);
} else if (strncmp( paramLine, "TITLE2 ", 7 ) == 0) {
-#ifdef WINDOWS
+#ifdef UTFCONVERT
ConvertUTF8ToSystem(paramLine + 7);
-#endif // WINDOWS
+#endif // UTFCONVERT
SetLayoutSubtitle(paramLine + 7);
} else if (strncmp( paramLine, "ROOMSIZE", 8 ) == 0) {
if ( ParseRoomSize( paramLine+8, &roomSize ) ) {
@@ -769,24 +757,27 @@ static BOOL_T ReadTrackFile(
/*wFloatSetValue( roomSizeXPD.control, PutDim(roomSize.x) );*/
/*wFloatSetValue( roomSizeYPD.control, PutDim(roomSize.y) );*/
} else {
- if( !(ret = InputError( "ROOMSIZE: bad value", TRUE )))
+ if( !(ret = InputError( "ROOMSIZE: bad value", TRUE ))) {
break;
+ }
}
} else if (strncmp( paramLine, "SCALE ", 6 ) == 0) {
- if ( !DoSetScale( paramLine+5 ) ) {
- if( !(ret = InputError( "SCALE: bad value", TRUE )))
+ if ( !DoSetScale( paramLine+6 ) ) {
+ if( !(ret = InputError( "SCALE: bad value", TRUE ))) {
break;
+ }
}
} else if (strncmp( paramLine, "MAPSCALE ", 9 ) == 0) {
scale = atol( paramLine+9 );
if (scale > 1) {
- mapD.scale = mapScale = scale;
+ mapD.scale = scale;
}
} else if (strncmp( paramLine, "LAYERS ", 7 ) == 0) {
ReadLayers( paramLine+7 );
} else {
if (!old_skip) {
- if (InputError(_("Unknown layout file object - skip until next good object?"), TRUE)) { //OK to carry on
+ if (InputError(_("Unknown layout file object - skip until next good object?"),
+ TRUE)) { //OK to carry on
/* SKIP until next main line we recognize */
skip = TRUE;
skipLines++;
@@ -794,51 +785,61 @@ static BOOL_T ReadTrackFile(
} else {
break; //Close File
}
- } else skip = TRUE;
+ } else { skip = TRUE; }
skipLines++;
}
}
+ bInReadTracks = FALSE;
if (paramFile) {
fclose(paramFile);
paramFile = NULL;
}
if( ret ) {
- if (!noSetCurDir)
+ if (!noSetCurDir) {
SetCurrentPath( LAYOUTPATHKEY, fileName );
+ }
}
- if (skipLines>0)
- NoticeMessage( MSG_LAYOUT_LINES_SKIPPED, _("Ok"), NULL, paramFileName, skipLines);
-
- RestoreLocale( oldLocale );
+ if (skipLines>0) {
+ NoticeMessage( MSG_LAYOUT_LINES_SKIPPED, _("Ok"), NULL, paramFileName,
+ skipLines);
+ }
paramFile = NULL;
+ SetUserLocale();
free(paramFileName);
- paramFileName = NULL;
+ paramFileName = NULL;
InfoMessage( "%d", count );
return ret;
}
int LoadTracks(
- int cnt,
- char **fileName,
- void * data)
+ int cnt,
+ char **fileName,
+ void * data)
{
-#ifdef TIME_READTRACKFILE
- long time0, time1;
-#endif
char *nameOfFile = NULL;
char *extOfFile;
- assert( fileName != NULL );
- assert( cnt == 1 );
+ CHECK( fileName != NULL );
+ CHECK( cnt == 1 );
+
+ nameOfFile = FindFilename(fileName[0]);
+
+ // Make sure it exists and it is readable
+ if (access(fileName[0], R_OK) != 0) {
+ NoticeMessage(MSG_OPEN_FAIL, _("Continue"), NULL, _("Track"), nameOfFile,
+ _("Not Found"));
+ return FALSE;
+ }
- if ( ! bExample )
+ if ( ! bExample ) {
SetCurrentPath(LAYOUTPATHKEY, fileName[0]);
+ }
bReadOnly = bExample;
paramVersion = -1;
wSetCursor( mainD.d, wCursorWait );
@@ -846,20 +847,19 @@ int LoadTracks(
ClearTracks();
ResetLayers();
checkPtMark = changed = 0;
- LayoutBackGroundInit(TRUE); //Keep values of background -> will be overriden my archive
+ if (!data) {
+ LayoutBackGroundInit(
+ TRUE); //Keep values of background -> will be overriden by archive
+ }
UndoSuspend();
useCurrentLayer = FALSE;
-#ifdef TIME_READTRACKFILE
- time0 = wGetTimer();
-#endif
- nameOfFile = FindFilename( fileName[ 0 ] );
- /*
- * Support zipped filetype
- */
+ /*
+ * Support zipped filetype
+ */
extOfFile = FindFileExtension( nameOfFile);
- BOOL_T zipped = FALSE;
+// BOOL_T zipped = FALSE;
BOOL_T loadXTC = TRUE;
char * full_path = strdup(fileName[0]);
@@ -883,20 +883,18 @@ int LoadTracks(
FILE * f = fopen (manifest_file, "rb");
- if (f)
- {
- fseek(f, 0, SEEK_END);
- length = ftell(f);
- fseek(f, 0, SEEK_SET);
- manifest = malloc(length + 1);
- if (manifest) {
- size_t siz = fread(manifest, 1, length, f);
- manifest[length] = '\0';
- }
- fclose(f);
- } else
- {
- NoticeMessage(MSG_MANIFEST_OPEN_FAIL, _("Continue"), NULL, manifest_file);
+ if (f) {
+ fseek(f, 0, SEEK_END);
+ length = ftell(f);
+ fseek(f, 0, SEEK_SET);
+ manifest = malloc(length + 1);
+ if (manifest) {
+ fread(manifest, 1, length, f);
+ manifest[length] = '\0';
+ }
+ fclose(f);
+ } else {
+ NoticeMessage(MSG_MANIFEST_OPEN_FAIL, _("Continue"), NULL, manifest_file);
}
free(manifest_file);
@@ -904,55 +902,54 @@ int LoadTracks(
//Set filename to point to included .xtc file
//Use the name inside manifest (this helps if a user renames the zip)
- if (manifest)
- {
- arch_file = ParseManifest(manifest, zip_input);
+ if (manifest) {
+ arch_file = ParseManifest(manifest, zip_input);
free(manifest);
}
free(full_path);
full_path = NULL;
// If no manifest value use same name as the archive
- if (arch_file && arch_file[0])
- {
- MakeFullpath(&full_path, zip_input, arch_file, NULL);
- } else
- {
- MakeFullpath(&full_path, zip_input, nameOfFile, NULL);
+ if (arch_file && arch_file[0]) {
+ MakeFullpath(&full_path, zip_input, arch_file, NULL);
+ } else {
+ MakeFullpath(&full_path, zip_input, nameOfFile, NULL);
}
nameOfFile = FindFilename(full_path);
extOfFile = FindFileExtension(full_path);
- if (strcmp(extOfFile, ZIPFILETYPEEXTENSION )==0)
- {
- for (int i=0; i<4; i++) {
- extOfFile[i] = extOfFile[i+1];
- }
+ if (strcmp(extOfFile, ZIPFILETYPEEXTENSION )==0) {
+ for (int i=0; i<4; i++) {
+ extOfFile[i] = extOfFile[i+1];
+ }
}
LOG(log_zip, 1, ("Zip-File %s \n", full_path))
- #if DEBUG
- printf("File Path: %s \n", full_path);
- #endif
+#if DEBUG
+ printf("File Path: %s \n", full_path);
+#endif
} else {
loadXTC = FALSE; // when unzipping fails, don't attempt loading the trackplan
}
- zipped = TRUE;
+// zipped = TRUE;
free(zip_input);
}
- if ( bExample )
+ if ( bExample ) {
bReadOnly = TRUE;
- else if ( access( fileName[0], W_OK ) == -1 )
+ } else if ( access( fileName[0], W_OK ) == -1 ) {
bReadOnly = TRUE;
- else
+ } else {
bReadOnly = FALSE;
+ }
char *copyOfFileName = MyStrdup(fileName[0]);
- if (loadXTC && ReadTrackFile( full_path, FindFilename( fileName[0]), TRUE, TRUE, TRUE )) {
+ unsigned long time0 = wGetTimer();
+ if (loadXTC
+ && ReadTrackFile( full_path, FindFilename( fileName[0]), TRUE, TRUE, TRUE )) {
nameOfFile = NULL;
extOfFile = NULL;
@@ -962,21 +959,19 @@ int LoadTracks(
if ( ! bExample && (nameOfFile != NULL) ) {
char * copyFile = strdup(fileName[0]);
- char * listName = FindFilename(strdup(fileName[0])); //Make sure the list name is new
+ char * listName = FindFilename(strdup(
+ fileName[0])); //Make sure the list name is new
wMenuListAdd( fileList_ml, 0, listName, copyFile );
}
ResolveIndex();
-#ifdef TIME_READTRACKFILE
- time1 = wGetTimer();
- printf( "time= %ld ms \n", time1-time0 );
-#endif
- RecomputeElevations();
+ LOG( log_timereadfile, 1, ( "Read time (%s) = %lu mS \n", fileName[0],
+ wGetTimer()-time0 ) );
+ RecomputeElevations(NULL);
AttachTrains();
DoChangeNotification( CHANGE_ALL );
DoUpdateTitles();
- LoadLayerLists();
LayerSetCounts();
}
@@ -984,6 +979,8 @@ int LoadTracks(
free(full_path);
full_path = NULL;
+ UpdateLayerDlg(curLayer);
+
UndoResume();
Reset();
wSetCursor( mainD.d, defaultCursor );
@@ -994,42 +991,43 @@ int LoadTracks(
* Load the layout specified by data. Filename may contain a full
* path.
* \param index IN ignored
- * \param label IN ignored
+ * \param label IN if not NULL - during startup - set flag to not load background
* \param data IN path and filename
*/
EXPORT void DoFileList(
- int index,
- char * label,
- void * data )
+ int index,
+ char * label,
+ void * data )
{
char *pathName = (char*)data;
bExample = FALSE;
- LoadTracks( 1, &pathName, NULL );
+ if (label) {
+ LoadTracks( 1, &pathName, I2VP(1));
+ } else {
+ LoadTracks( 1, &pathName, NULL );
+ }
}
-
static BOOL_T DoSaveTracks(
- const char * fileName )
+ const char * fileName )
{
FILE * f;
time_t clock;
BOOL_T rc = TRUE;
- char *oldLocale = NULL;
- oldLocale = SaveLocale( "C" );
f = fopen( fileName, "w" );
if (f==NULL) {
- RestoreLocale( oldLocale );
-
- NoticeMessage( MSG_OPEN_FAIL, _("Continue"), NULL, _("Track"), fileName, strerror(errno) );
-
+ NoticeMessage( MSG_OPEN_FAIL, _("Continue"), NULL, _("Track"), fileName,
+ strerror(errno) );
return FALSE;
}
+ SetCLocale();
wSetCursor( mainD.d, wCursorWait );
time(&clock);
- rc &= fprintf(f,"#%s Version: %s, Date: %s\n", sProdName, sVersion, ctime(&clock) )>0;
+ rc &= fprintf(f,"#%s Version: %s, Date: %s\n", sProdName, sVersion,
+ ctime(&clock) )>0;
rc &= fprintf(f, "VERSION %d %s\n", iParamVersion, PARAMVERSIONVERSION )>0;
Stripcr( GetLayoutTitle() );
Stripcr( GetLayoutSubtitle() );
@@ -1042,15 +1040,15 @@ static BOOL_T DoSaveTracks(
rc &= WriteMainNote( f );
rc &= WriteTracks( f, TRUE );
rc &= fprintf(f, "%s\n", END_TRK_FILE)>0;
- if ( !rc )
+ if ( !rc ) {
NoticeMessage( MSG_WRITE_FAILURE, _("Ok"), NULL, strerror(errno), fileName );
+ }
fclose(f);
bReadOnly = FALSE;
- RestoreLocale( oldLocale );
-
checkPtMark = changed;
wSetCursor( mainD.d, defaultCursor );
+ SetUserLocale();
return rc;
}
@@ -1065,74 +1063,83 @@ static BOOL_T DoSaveTracks(
*/
static BOOL_T CopyDependency(char * name, char * target_dir)
{
- char * backname = FindFilename(name);
+ char * backname = FindFilename(name);
BOOL_T copied = TRUE;
FILE * source = fopen(name, "rb");
- if (source != NULL) {
- char * target_file;
- MakeFullpath(&target_file, target_dir, backname, NULL);
- FILE * target = fopen(target_file, "wb");
-
- if (target != NULL) {
- char *buffer = MyMalloc(COPYBLOCKSIZE);
- while (!feof(source)) {
- size_t bytes = fread(buffer, 1, sizeof(buffer), source);
- if (bytes) {
- fwrite(buffer, 1, bytes, target);
- }
- }
+ if (source != NULL) {
+ char * target_file;
+ MakeFullpath(&target_file, target_dir, backname, NULL);
+ FILE * target = fopen(target_file, "wb");
+
+ if (target != NULL) {
+ char *buffer = MyMalloc(COPYBLOCKSIZE);
+ while (!feof(source)) {
+ size_t bytes = fread(buffer, 1, sizeof(buffer), source);
+ if (bytes) {
+ fwrite(buffer, 1, bytes, target);
+ }
+ }
MyFree(buffer);
- LOG(log_zip, 1, ("Zip-Include %s into %s \n", name, target_file))
+ LOG(log_zip, 1, ("Zip-Include %s into %s \n", name, target_file))
#if DEBUG
- printf("xtrkcad: Included file %s into %s \n",
- name, target_file);
+ printf("xtrkcad: Included file %s into %s \n",
+ name, target_file);
#endif
- fclose(target);
- } else {
- NoticeMessage(MSG_COPY_FAIL, _("Continue"), NULL, name, target_file);
- copied = FALSE;
- }
- free(target_file);
- fclose(source);
- } else {
- NoticeMessage(MSG_COPY_OPEN_FAIL, _("Continue"), NULL, name);
- copied = FALSE;
- }
- return copied;
+ fclose(target);
+ } else {
+ NoticeMessage(MSG_COPY_FAIL, _("Continue"), NULL, name, target_file);
+ copied = FALSE;
+ }
+ free(target_file);
+ fclose(source);
+ } else {
+ NoticeMessage(MSG_COPY_OPEN_FAIL, _("Continue"), NULL, name);
+ copied = FALSE;
+ }
+ return copied;
}
static doSaveCallBack_p doAfterSave;
-
+/**
+ * Save the layout to file. This function handles either cases, classic xtc
+ * files as well as xtce zip archives.
+ *
+ * \param cnt Number of files, must be 1
+ * \param fileName name of destination file including extension (xtc or xtce)
+ * \param data unused
+ *
+ * \returns TRUE for success
+ */
static int SaveTracks(
- int cnt,
- char **fileName,
- void * data )
+ int cnt,
+ char** fileName,
+ void* data)
{
+ BOOL_T success = FALSE;
- assert( fileName != NULL );
- assert( cnt == 1 );
+ CHECK(fileName != NULL);
+ CHECK(cnt == 1);
- char *nameOfFile = FindFilename(fileName[0]);
+ char* nameOfFile = FindFilename(fileName[0]);
SetCurrentPath(LAYOUTPATHKEY, fileName[0]);
//Support Archive zipped files
- char * extOfFile = FindFileExtension( fileName[0]);
+ char* extOfFile = FindFileExtension(fileName[0]);
+ if (extOfFile && (strcmp(extOfFile, ZIPFILETYPEEXTENSION) == 0)) {
- if (extOfFile && (strcmp(extOfFile,ZIPFILETYPEEXTENSION)==0)) {
-
- char * ArchiveName;
+ char* ArchiveName;
//Set filename to point to be the same as the included .xtc file.
//This is also in the manifest - in case a user renames the archive file.
- char * zip_output = GetZipDirectoryName(ARCHIVE_WRITE);
+ char* zip_output = GetZipDirectoryName(ARCHIVE_WRITE);
DeleteDirectory(zip_output);
SafeCreateDir(zip_output);
@@ -1142,94 +1149,157 @@ static int SaveTracks(
nameOfFile = FindFilename(ArchiveName);
extOfFile = FindFileExtension(ArchiveName);
- if (extOfFile && strcmp(extOfFile, ZIPFILETYPEEXTENSION)==0) {
+ if (extOfFile && strcmp(extOfFile, ZIPFILETYPEEXTENSION) == 0) {
// Get rid of the 'e'
extOfFile[3] = '\0';
}
- char * DependencyDir;
+ char* DependencyDir;
- //The included files are placed (for now) into an includes directory - TODO an array of includes with directories by type
+ // The included files are placed (for now) into an includes directory -
+ // TODO an array of includes with directories by type
MakeFullpath(&DependencyDir, zip_output, "includes", NULL);
SafeCreateDir(DependencyDir);
- char * background = GetLayoutBackGroundFullPath();
+ char* background = GetLayoutBackGroundFullPath();
- if (background && background[0])
- CopyDependency(background,DependencyDir);
+ // if used, get the background file
+ // else ignore this step
+ if (background && background[0]) {
+ success = CopyDependency(background, DependencyDir);
+ } else {
+ background = NULL;
+ success = TRUE;
+ }
- //The details are stored into the manifest - TODO use arrays for files, locations
- char *oldLocale = SaveLocale("C");
- char* json_Manifest = CreateManifest(nameOfFile, background, "includes");
- char * manifest_file;
+ if (success) {
+ //The details are stored into the manifest - TODO use arrays for files, locations
+ SetCLocale();
+ char* json_Manifest = CreateManifest(nameOfFile, background, "includes");
+ char* manifest_file;
- MakeFullpath(&manifest_file, zip_output, "manifest.json", NULL);
+ MakeFullpath(&manifest_file, zip_output, "manifest.json", NULL);
- FILE *fp = fopen(manifest_file, "wb");
- if (fp != NULL)
- {
- fputs(json_Manifest, fp);
- fclose(fp);
- } else {
- NoticeMessage( MSG_MANIFEST_FAIL, _("Continue"), NULL, manifest_file );
- }
- RestoreLocale(oldLocale);
+ FILE* fp = fopen(manifest_file, "wb");
+ if (fp != NULL) {
+ fputs(json_Manifest, fp);
+ fclose(fp);
+ } else {
+ NoticeMessage(MSG_MANIFEST_FAIL, _("Continue"), NULL, manifest_file);
+ success = FALSE;
+ }
+ SetUserLocale();
- free(manifest_file);
- free(json_Manifest);
+ free(manifest_file);
+ free(json_Manifest);
+ }
- DoSaveTracks( ArchiveName );
+ success &= DoSaveTracks(ArchiveName);
- if (CreateArchive( zip_output, fileName[0]) != TRUE) {
- NoticeMessage( MSG_ARCHIVE_FAIL, _("Continue"), NULL, fileName[0], zip_output );
+ if (success) {
+ if (CreateArchive(zip_output, fileName[0]) != TRUE) {
+ NoticeMessage(MSG_ARCHIVE_FAIL, _("Continue"), NULL, fileName[0], zip_output);
+ }
}
+
free(zip_output);
free(ArchiveName);
- } else
-
- DoSaveTracks( fileName[ 0 ] );
+ } else {
+ success = DoSaveTracks(fileName[0]);
+ }
- nameOfFile = FindFilename( fileName[ 0 ] );
- wMenuListAdd( fileList_ml, 0, nameOfFile, MyStrdup(fileName[ 0 ]) );
- checkPtMark = changed = 0;
+ if (success) {
+ nameOfFile = FindFilename(fileName[0]);
+ wMenuListAdd(fileList_ml, 0, nameOfFile, MyStrdup(fileName[0]));
+ checkPtMark = changed = 0;
- SetLayoutFullPath(fileName[0]);
+ SetLayoutFullPath(fileName[0]);
+ }
- if (doAfterSave)
+ if (doAfterSave) {
doAfterSave();
- doAfterSave = NULL;
- return TRUE;
+ }
+ return success;
}
+/**
+ * Save information about current files and some settings to preferences file.
+ */
-EXPORT void DoSave( doSaveCallBack_p after )
+EXPORT void SaveState(void)
{
- doAfterSave = after;
+ wWinPix_t width, height;
+ const char * fileName;
+ void * pathName;
+ char file[6];
+ int inx;
+
+ wWinGetSize(mainW, &width, &height);
+ wPrefSetInteger("draw", "mainwidth", (int)width);
+ wPrefSetInteger("draw", "mainheight", (int)height);
+ SaveParamFileList();
+ ParamUpdatePrefs();
+
+ wPrefSetString( "misc", "lastlayout", GetLayoutFullPath());
+ wPrefSetInteger( "misc", "lastlayoutexample", bExample );
+
+ if (fileList_ml) {
+ strcpy(file, "file");
+ file[5] = 0;
+ for (inx = 0; inx < NUM_FILELIST; inx++) {
+ fileName = wMenuListGet(fileList_ml, inx, &pathName);
+ if (fileName) {
+ file[4] = '0' + inx;
+ sprintf(message, "%s", (char* )pathName);
+ wPrefSetString("filelist", file, message);
+ }
+ }
+ }
+ wPrefFlush("");
+}
+static void SetAutoSave()
+{
+ if (saveFile_fs == NULL)
+ saveFile_fs = wFilSelCreate( mainW, FS_SAVE, 0, _("AutoSave Tracks As"),
+ sSourceFilePattern, SaveTracks, NULL );
+ wFilSelect( saveFile_fs, GetCurrentPath(LAYOUTPATHKEY));
+ checkPtMark = 1;
+ SetWindowTitle();
+ CleanupCheckpointFiles(); //Remove old checkpoint
+ SaveState();
+
+}
+
+EXPORT void DoSave( void * doAfterSaveVP )
+{
+ doAfterSave = doAfterSaveVP;
if ( bReadOnly || *(GetLayoutFilename()) == '\0') {
if (saveFile_fs == NULL)
saveFile_fs = wFilSelCreate( mainW, FS_SAVE, 0, _("Save Tracks"),
- sSourceFilePattern, SaveTracks, NULL );
+ sSourceFilePattern, SaveTracks, NULL );
wFilSelect( saveFile_fs, GetCurrentPath(LAYOUTPATHKEY));
- changed = checkPtMark = 1;
+ checkPtMark = 1;
} else {
char *temp = GetLayoutFullPath();
SaveTracks( 1, &temp, NULL );
}
SetWindowTitle();
+ CleanupCheckpointFiles(); //Remove old checkpoint
SaveState();
}
-EXPORT void DoSaveAs( doSaveCallBack_p after )
+EXPORT void DoSaveAs( void * doAfterSaveVP )
{
- doAfterSave = after;
+ doAfterSave = doAfterSaveVP;
if (saveFile_fs == NULL)
saveFile_fs = wFilSelCreate( mainW, FS_SAVE, 0, _("Save Tracks As"),
- sSaveFilePattern, SaveTracks, NULL );
+ sSaveFilePattern, SaveTracks, NULL );
wFilSelect( saveFile_fs, GetCurrentPath(LAYOUTPATHKEY));
- changed = checkPtMark = 1;
+ checkPtMark = 1;
SetWindowTitle();
+ CleanupCheckpointFiles(); //Remove old checkpoint
SaveState();
}
@@ -1237,11 +1307,12 @@ EXPORT void DoLoad( void )
{
if (loadFile_fs == NULL)
loadFile_fs = wFilSelCreate( mainW, FS_LOAD, 0, _("Open Tracks"),
- sSourceFilePattern, LoadTracks, NULL );
+ sSourceFilePattern, LoadTracks, NULL );
bExample = FALSE;
wFilSelect( loadFile_fs, GetCurrentPath(LAYOUTPATHKEY));
paste_offset = zero;
cursor_offset = zero;
+ CleanupCheckpointFiles(); //Remove old checkpoint
SaveState();
}
@@ -1249,13 +1320,13 @@ EXPORT void DoLoad( void )
EXPORT void DoExamples( void )
{
if (examplesFile_fs == NULL) {
- static wBool_t bExample = TRUE;
examplesFile_fs = wFilSelCreate( mainW, FS_LOAD, 0, _("Example Tracks"),
- sSourceFilePattern, LoadTracks, &bExample );
+ sSourceFilePattern, LoadTracks, NULL );
}
bExample = TRUE;
sprintf( message, "%s" FILE_SEP_CHAR "examples" FILE_SEP_CHAR, libDir );
wFilSelect( examplesFile_fs, message );
+ CleanupCheckpointFiles(); //Remove old checkpoint
SaveState();
}
@@ -1264,7 +1335,7 @@ wIndex_t max_generations_count = 10;
static char sCheckPointBF[STR_LONG_SIZE];
-EXPORT void DoCheckPoint( void )
+static void DoCheckPoint( void )
{
int rc;
@@ -1273,12 +1344,8 @@ EXPORT void DoCheckPoint( void )
MakeFullpath(&checkPtFileNameBackup, workingDir, sCheckPointBF, NULL);
}
- if (checkPointingW == NULL) {
- ParamRegister( &checkPointingPG );
- checkPointingW = ParamCreateDialog( &checkPointingPG, MakeWindowTitle(_("Check Pointing")), NULL, NULL, NULL, FALSE, NULL, F_TOP|F_CENTER, NULL );
- }
rename( checkPtFileName1, checkPtFileName2 );
- //wShow( checkPointingW );
+
rc = DoSaveTracks( checkPtFileName1 );
/* could the check point file be written ok? */
@@ -1305,10 +1372,38 @@ EXPORT void DoCheckPoint( void )
rename( checkPtFileName2, checkPtFileName1 );
}
- //wHide( checkPointingW );
wShow( mainW );
}
+
+static wIndex_t autosave_count = 0;
+EXPORT wIndex_t checkPtMark = 0;
+EXPORT long checkPtInterval = 10;
+EXPORT long autosaveChkPoints = 0;
+
+EXPORT void TryCheckPoint()
+{
+ if (checkPtInterval > 0
+ && changed >= checkPtMark + (wIndex_t) checkPtInterval
+ && !inPlayback) {
+ DoCheckPoint();
+ checkPtMark = changed;
+
+ autosave_count++;
+
+ if ((autosaveChkPoints>0) && (autosave_count>=autosaveChkPoints)) {
+ if ( bReadOnly || *(GetLayoutFilename()) == '\0') {
+ SetAutoSave();
+ } else {
+ DoSave(NULL);
+ }
+ InfoMessage(_("File AutoSaved"));
+ autosave_count = 0;
+ }
+ }
+}
+
+
/**
* Remove all temporary files before exiting. When the program terminates
* normally through the exit choice, files and directories that were created
@@ -1319,10 +1414,8 @@ EXPORT void DoCheckPoint( void )
*
*/
-EXPORT void CleanupFiles( void )
+EXPORT void CleanupCheckpointFiles( void )
{
- char *tempDir;
-
if( checkPtFileName1 ) {
if (checkPtFileNameBackup) {
remove( checkPtFileNameBackup );
@@ -1331,6 +1424,22 @@ EXPORT void CleanupFiles( void )
remove( checkPtFileName1 );
}
+}
+
+/**
+ * Remove all temporary files used for archive handling. When the program terminates
+ * normally through the exit choice, files and directories that were created
+ * temporarily are removed: zip_in.<pid> and zip_out.<pid>
+ *
+ * \param none
+ * \return none
+ *
+ */
+
+EXPORT void CleanupTempArchive(void)
+{
+ char* tempDir;
+
for (int i = ARCHIVE_READ; i <= ARCHIVE_WRITE; ++i) {
tempDir = GetZipDirectoryName(i);
if (tempDir) {
@@ -1382,7 +1491,8 @@ EXPORT int LoadCheckpoint( BOOL_T sameName )
MakeFullpath(&search, workingDir, sCheckPointF, NULL);
UndoSuspend();
- if (ReadTrackFile( search, search + strlen(search) - strlen( sCheckPointF ), TRUE, TRUE, TRUE )) {
+ if (ReadTrackFile( search, search + strlen(search) - strlen( sCheckPointF ),
+ TRUE, TRUE, TRUE )) {
ResolveIndex();
LayoutBackGroundInit(FALSE); //Get Prior BackGround
LayoutBackGroundSave(); //Save Background Values
@@ -1396,13 +1506,17 @@ EXPORT int LoadCheckpoint( BOOL_T sameName )
SetCurrentPath( LAYOUTPATHKEY, initialFile );
SetLayoutFullPath(initialFile);
}
- } else SetLayoutFullPath("");
+ } else { SetLayoutFullPath(""); }
- RecomputeElevations();
+ RecomputeElevations(NULL);
AttachTrains();
DoChangeNotification( CHANGE_ALL );
DoUpdateTitles();
- } else SetLayoutFullPath("");
+
+ } else { SetLayoutFullPath(""); }
+
+ LayerSetCounts();
+ UpdateLayerDlg(curLayer);
Reset();
UndoResume();
@@ -1436,15 +1550,15 @@ static int importAsModule;
*/
static int ImportTracks(
- int cnt,
- char **fileName,
- void * data )
+ int cnt,
+ char **fileName,
+ void * data )
{
char *nameOfFile;
long paramVersionOld = paramVersion;
- assert( fileName != NULL );
- assert( cnt == 1 );
+ CHECK( fileName != NULL );
+ CHECK( cnt == 1 );
nameOfFile = FindFilename(fileName[ 0 ]);
paramVersion = -1;
@@ -1452,14 +1566,14 @@ static int ImportTracks(
Reset();
SetAllTrackSelect( FALSE );
int saveLayer = curLayer;
- int layer;
+ int layer = 0;
if (importAsModule) {
layer = FindUnusedLayer(0);
- if (layer==-1) return FALSE;
+ if (layer==-1) { return FALSE; }
char LayerName[80];
LayerName[0] = '\0';
sprintf(LayerName,_("Module - %s"),nameOfFile);
- if (layer>=0) SetCurrLayer(layer, NULL, 0, NULL, NULL);
+ if (layer>=0) { SetCurrLayer(layer, NULL, 0, NULL, NULL); }
SetLayerName(layer,LayerName);
}
ImportStart();
@@ -1467,24 +1581,25 @@ static int ImportTracks(
useCurrentLayer = TRUE;
ReadTrackFile( fileName[ 0 ], nameOfFile, FALSE, FALSE, TRUE );
ImportEnd(zero, TRUE, FALSE);
- if (importAsModule) SetLayerModule(layer,TRUE);
+ if (importAsModule) { SetLayerModule(layer,TRUE); }
useCurrentLayer = FALSE;
SetCurrLayer(saveLayer, NULL, 0, NULL, NULL);
/*DoRedraw();*/
EnableCommands();
wSetCursor( mainD.d, defaultCursor );
paramVersion = paramVersionOld;
- DoCommandB( (void*)(intptr_t)selectCmdInx );
+ DoCommandB( I2VP(selectCmdInx) );
SelectRecount();
return TRUE;
}
EXPORT void DoImport( void * type )
{
- importAsModule = (int)(long)type;
+ importAsModule = (int)VP2L(type);
if (importFile_fs == NULL)
- importFile_fs = wFilSelCreate( mainW, FS_LOAD, 0, _("Import Tracks"),
- sImportFilePattern, ImportTracks, NULL );
+ importFile_fs = wFilSelCreate( mainW, FS_LOAD, 0,
+ type == 0 ? _("Import Tracks") : _("Import Module"),
+ sImportFilePattern, ImportTracks, NULL );
wFilSelect( importFile_fs, GetCurrentPath(LAYOUTPATHKEY));
}
@@ -1500,36 +1615,36 @@ EXPORT void DoImport( void * type )
*/
static int DoExportTracks(
- int cnt,
- char **fileName,
- void * data )
+ int cnt,
+ char **fileName,
+ void * data )
{
FILE * f;
time_t clock;
- char *oldLocale = NULL;
- assert( fileName != NULL );
- assert( cnt == 1 );
+ CHECK( fileName != NULL );
+ CHECK( cnt == 1 );
SetCurrentPath( IMPORTPATHKEY, fileName[ 0 ] );
f = fopen( fileName[ 0 ], "w" );
if (f==NULL) {
- NoticeMessage( MSG_OPEN_FAIL, _("Continue"), NULL, _("Export"), fileName[0], strerror(errno) );
+ NoticeMessage( MSG_OPEN_FAIL, _("Continue"), NULL, _("Export"), fileName[0],
+ strerror(errno) );
return FALSE;
}
- oldLocale = SaveLocale("C");
+ SetCLocale();
wSetCursor( mainD.d, wCursorWait );
time(&clock);
fprintf(f,"#%s Version: %s, Date: %s\n", sProdName, sVersion, ctime(&clock) );
fprintf(f, "VERSION %d %s\n", iParamVersion, PARAMVERSIONVERSION );
coOrd offset;
- ExportTracks( f , &offset);
+ ExportTracks( f, &offset );
fprintf(f, "%s\n", END_TRK_FILE);
fclose(f);
- RestoreLocale( oldLocale );
+ SetUserLocale();
Reset();
wSetCursor( mainD.d, defaultCursor );
@@ -1538,56 +1653,54 @@ static int DoExportTracks(
}
-EXPORT void DoExport( void )
+EXPORT void DoExport( void * unused )
{
- if (selectedTrackCount <= 0) {
- ErrorMessage( MSG_NO_SELECTED_TRK );
- return;
- }
if (exportFile_fs == NULL)
exportFile_fs = wFilSelCreate( mainW, FS_SAVE, 0, _("Export Tracks"),
- sImportFilePattern, DoExportTracks, NULL );
+ sImportFilePattern, DoExportTracks, NULL );
wFilSelect( exportFile_fs, GetCurrentPath(LAYOUTPATHKEY));
}
-EXPORT BOOL_T EditCopy( void )
+EXPORT wBool_t editStatus = TRUE;
+
+EXPORT void EditCopy( void * unused )
{
+ editStatus = FALSE;
FILE * f;
time_t clock;
- char *oldLocale = NULL;
if (selectedTrackCount <= 0) {
ErrorMessage( MSG_NO_SELECTED_TRK );
- return FALSE;
+ return;
}
f = fopen( clipBoardN, "w" );
if (f == NULL) {
- NoticeMessage( MSG_OPEN_FAIL, _("Continue"), NULL, _("Clipboard"), clipBoardN, strerror(errno) );
- return FALSE;
+ NoticeMessage( MSG_OPEN_FAIL, _("Continue"), NULL, _("Clipboard"), clipBoardN,
+ strerror(errno) );
+ return;
}
- oldLocale = SaveLocale("C");
+ SetCLocale();
time(&clock);
fprintf(f,"#%s Version: %s, Date: %s\n", sProdName, sVersion, ctime(&clock) );
fprintf(f, "VERSION %d %s\n", iParamVersion, PARAMVERSIONVERSION );
- ExportTracks(f, &paste_offset);
+ ExportTracks(f, &paste_offset );
fprintf(f, "%s\n", END_TRK_FILE );
- RestoreLocale(oldLocale);
+ SetUserLocale();
fclose(f);
- return TRUE;
+ editStatus = TRUE;
}
-EXPORT BOOL_T EditCut( void )
+EXPORT void EditCut( void * unused )
{
- if (!EditCopy())
- return FALSE;
+ EditCopy(NULL);
+ if ( !editStatus ) { return; }
SelectDelete();
- return TRUE;
}
@@ -1598,13 +1711,10 @@ EXPORT BOOL_T EditCut( void )
* \return TRUE if success, FALSE on error (file not found)
*/
-BOOL_T EditPastePlace( wBool_t inPlace )
+static BOOL_T EditPastePlace( wBool_t inPlace )
{
BOOL_T rc = TRUE;
- char *oldLocale = NULL;
-
- oldLocale = SaveLocale("C");
wSetCursor( mainD.d, wCursorWait );
Reset();
@@ -1623,31 +1733,32 @@ BOOL_T EditPastePlace( wBool_t inPlace )
NoticeMessage( MSG_CANT_PASTE, _("Continue"), NULL );
rc = FALSE;
}
- if (inPlace)
+ if (inPlace) {
ImportEnd(paste_offset, FALSE, TRUE);
- else
+ } else {
ImportEnd(zero, FALSE, FALSE);
+ }
useCurrentLayer = FALSE;
/*DoRedraw();*/
EnableCommands();
wSetCursor( mainD.d, defaultCursor );
- DoCommandB( (void*)(intptr_t)selectCmdInx );
+ DoCommandB( I2VP(selectCmdInx) );
SelectRecount();
UpdateAllElevations();
- RestoreLocale(oldLocale);
return rc;
}
-EXPORT BOOL_T EditPaste( void) {
- return EditPastePlace(FALSE);
+EXPORT void EditPaste( void * unused )
+{
+ editStatus = EditPastePlace(FALSE);
}
-
-EXPORT BOOL_T EditClone( void ) {
- BOOL_T rc = TRUE;
- if (!EditCopy()) return FALSE;
- if (!EditPastePlace(TRUE)) return FALSE;
- return rc;
+
+EXPORT void EditClone( void * unused )
+{
+ EditCopy( NULL );
+ if ( !editStatus ) { return; }
+ editStatus = EditPastePlace(TRUE);
}
/*****************************************************************************
@@ -1656,15 +1767,40 @@ EXPORT BOOL_T EditClone( void ) {
*
*/
-EXPORT void FileInit( void )
+
+EXPORT void LoadFileList(void)
{
- if ( (libDir = wGetAppLibDir()) == NULL ) {
- abort();
+ char file[6];
+ int inx;
+ const char * cp;
+ const char *fileName, *pathName;
+ strcpy(file, "fileX");
+ for (inx = NUM_FILELIST - 1; inx >= 0; inx--) {
+ file[4] = '0' + inx;
+ cp = wPrefGetString("filelist", file);
+ if (!cp) {
+ continue;
+ }
+ pathName = MyStrdup(cp);
+ fileName = FindFilename((char *) pathName);
+ if (fileName) {
+ wMenuListAdd(fileList_ml, 0, fileName, pathName);
+ }
}
- if ( (workingDir = wGetAppWorkDir()) == NULL )
- AbortProg( "wGetAppWorkDir()" );
+}
+
+
+
+EXPORT void FileInit( void )
+{
+ libDir = wGetAppLibDir();
+ CHECK( libDir );
+ workingDir = wGetAppWorkDir();
+ CHECK( workingDir );
SetLayoutFullPath("");
- MakeFullpath(&clipBoardN, workingDir, sClipboardF, NULL);
+ MakeFullpath(&clipBoardN, workingDir, sClipboardF, NULL);
+ log_locale = LogFindIndex( "locale" );
+ log_timereadfile = LogFindIndex( "timereadfile" );
}