aboutsummaryrefslogtreecommitdiff
path: root/jindroush/acvt/acvt.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'jindroush/acvt/acvt.cpp')
-rw-r--r--jindroush/acvt/acvt.cpp216
1 files changed, 216 insertions, 0 deletions
diff --git a/jindroush/acvt/acvt.cpp b/jindroush/acvt/acvt.cpp
new file mode 100644
index 0000000..857da5b
--- /dev/null
+++ b/jindroush/acvt/acvt.cpp
@@ -0,0 +1,216 @@
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation; either version 2 of the License, or
+// any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// 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., 675 Mass Ave, Cambridge, MA 02139, USA.
+//
+
+#include "pub.def"
+#include "jintypes.h"
+#include "autil.h"
+#include "adsk.h"
+
+BOOL Convert( char* szInFile, char* szOutFile );
+
+DISK_TYPE g_dtypeIn = DISK_AUTO;
+DISK_TYPE g_dtypeOut = DISK_ATR;
+
+BOOL g_bVerbose = FALSE;
+BOOL g_bBatchMode = FALSE;
+BOOL g_bRepairAuto = FALSE;
+BOOL g_bRepair = TRUE;
+BOOL g_bFirstErrStop = FALSE;
+BOOL g_bOverWrite = FALSE;
+BOOL g_bTestOnly = FALSE;
+BOOL g_bForceClassic = FALSE;
+
+#define SHEADER PRG_NAME " v" PRG_VERSION " (c) " PRG_COPYRIGHT " " PRG_AUTHOR "\n"
+
+#define HEADER SHEADER \
+ PRG_DESC "\n" \
+ " Latest version can be found at " PRG_URL "\n" \
+ " Published under GPL. See GPL.TXT.\n\n"
+
+#define USAGE HEADER "Usage: " PRG_NAME " " PRG_USAGE
+
+#include "switches.cpp"
+
+int main(int argc,char *argv[])
+{
+ setbuf( stdout, NULL );
+ setbuf( stderr, NULL );
+
+ if ( !SWITCHES_Init( &argc, argv ) )
+ return 1;
+
+ if ( argc < 2 )
+ {
+ SWFN_HELP( USAGE );
+ return 1;
+ }
+
+ fprintf( stderr, SHEADER );
+
+ BOOL bRet = FALSE;
+
+ char szOutFile[ 255 ];
+
+ if ( g_bBatchMode )
+ {
+ argc--;
+ argv++;
+
+ while( argc-- )
+ {
+ char* szInFile = *(argv++);
+ GuessBestFnameFromPC( szOutFile, szInFile, GetDiskTypeExt( g_dtypeOut ) );
+ bRet = Convert( szInFile, szOutFile );
+ printf( "\n" );
+
+ if ( !bRet && g_bFirstErrStop )
+ break;
+ }
+
+ }
+ else
+ {
+ char* szInFile = argv[ 1 ];
+
+ if ( argc >= 3 )
+ {
+ strcpy( szOutFile, argv[ 2 ] );
+ }
+ else
+ {
+ GuessBestFnameFromPC( szOutFile, szInFile, GetDiskTypeExt( g_dtypeOut ) );
+ }
+
+ bRet = Convert( szInFile, szOutFile );
+ }
+
+ if ( bRet && !g_bTestOnly )
+ printf ( "Done.\n" );
+
+ return bRet ? 0 : 1;
+}
+
+BOOL Convert( char* szInFile, char* szOutFile )
+{
+ ADisk* pDiskIn = NULL;
+ ADisk* pDiskOut = NULL;
+
+ DISKINIT_RETCODE ret;
+
+ g_dtypeIn = DISK_ATR;
+ if ( DI_RET_CONTINUE == ( ret = InitializeDisk( &pDiskIn, DISK_ATR, szInFile, FALSE, g_bRepair, g_bRepairAuto ) ) )
+ {
+ g_dtypeIn = DISK_DI;
+ if ( DI_RET_CONTINUE == ( ret = InitializeDisk( &pDiskIn, DISK_DI, szInFile, FALSE, g_bRepair, g_bRepairAuto ) ) )
+ {
+ g_dtypeIn = DISK_DCM;
+ if ( DI_RET_CONTINUE == ( ret = InitializeDisk( &pDiskIn, DISK_DCM, szInFile, FALSE, g_bRepair, g_bRepairAuto ) ) )
+ {
+ g_dtypeIn = DISK_SCP;
+ if ( DI_RET_CONTINUE == ( ret = InitializeDisk( &pDiskIn, DISK_SCP, szInFile, FALSE, g_bRepair, g_bRepairAuto ) ) )
+ {
+ g_dtypeIn = DISK_XFD;
+ if ( DI_RET_CONTINUE == ( ret = InitializeDisk( &pDiskIn, DISK_XFD, szInFile, FALSE, g_bRepair, g_bRepairAuto ) ) )
+ {
+ printf( "Unable to determine format of disk image '%s'!\n", szInFile );
+ return FALSE;
+ }
+ }
+ }
+ }
+ }
+
+ if ( ret == DI_RET_CANT_CONTINUE )
+ return FALSE;
+
+ printf( "Input file '%s' (%s)\n", szInFile, GetDiskTypeName( g_dtypeIn ) );
+
+ if ( g_bVerbose )
+ {
+ DISK_GEOMETRY* pgeo = pDiskIn->GetGeometry();
+ printf( "Sides: %d\n", pgeo->iSides );
+ printf( "Tracks: %d\n", pgeo->iTracks );
+ printf( "SecPerTrack: %d\n", pgeo->iSectorsPerTrack );
+ printf( "BytesPerSec: %d\n", pgeo->iBytesPerSector );
+ printf( "Sectors: %d\n", pgeo->iSectors );
+ }
+
+ if ( g_bTestOnly )
+ {
+ printf( "File loaded OK.\n" );
+ delete pDiskIn;
+ return TRUE;
+ }
+
+ switch( g_dtypeOut )
+ {
+ case DISK_ATR:
+ pDiskOut = new CAtr();
+ break;
+
+ case DISK_XFD:
+ pDiskOut = new CXfd();
+ break;
+
+ case DISK_DI:
+ pDiskOut = new CDi();
+ break;
+
+ case DISK_SCP:
+ pDiskOut = new CScp();
+ break;
+
+ case DISK_DCM:
+ pDiskOut = new CDcm();
+ break;
+
+ default:
+ break;
+ }
+
+ if ( !pDiskOut )
+ {
+ fprintf( stderr, "Can't create such image!\n" );
+ return FALSE;
+ }
+
+ DISK_GEOMETRY* pgeo = pDiskIn->GetGeometry();
+ DISK_GEOMETRY forced;
+
+ memcpy( &forced, pgeo, sizeof( DISK_GEOMETRY ) );
+
+ if ( g_bForceClassic )
+ ForceClassicSize( &forced );
+
+ //duplicating the image
+ pDiskOut->Duplicate( pDiskIn, &forced );
+
+ printf( "Output file '%s' (%s)\n", szOutFile, GetDiskTypeName( g_dtypeOut ) );
+
+ //and save it in new format
+ if ( !pDiskOut->Save( szOutFile, g_bOverWrite ) )
+ {
+ printf( "Error! %s\n", pDiskOut->GetLastError() );
+ delete pDiskIn;
+ delete pDiskOut;
+ return FALSE;
+ }
+
+ delete pDiskIn;
+ delete pDiskOut;
+
+ return TRUE;
+}
+