// English (Neutral) resources\r
\r
#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)\r
+#ifdef _WIN32\r
LANGUAGE LANG_ENGLISH, SUBLANG_NEUTRAL\r
#pragma code_page(1252)\r
+#endif //_WIN32\r
\r
/////////////////////////////////////////////////////////////////////////////\r
//\r
IDI_PORTS ICON "port.ico"\r
IDI_CONFIGFILE ICON "configfile.ico"\r
IDI_FILE ICON "file.ico"\r
+IDI_EXPANSION ICON "expansion.ico"\r
\r
/////////////////////////////////////////////////////////////////////////////\r
//\r
// Accelerator\r
//\r
\r
-IDR_DBGACCEL ACCELERATORS\r
+IDR_DBGACCEL ACCELERATORS \r
BEGIN\r
VK_F1, ID_DBG_PAGE1, VIRTKEY, NOINVERT\r
VK_F2, ID_DBG_PAGE2, VIRTKEY, NOINVERT\r
RTEXT "Aspect ratio:",IDC_STATIC,153,102,52,10,SS_CENTERIMAGE\r
RTEXT "Refresh rate:",IDC_STATIC,22,103,51,10,SS_CENTERIMAGE\r
COMBOBOX IDC_RTG_VBLANKRATE,77,101,68,150,CBS_DROPDOWN | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP\r
- CONTROL "bsdsocket.library",IDC_SOCKETS,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,142,148,120,10\r
- CONTROL "uaenet.device",IDC_SANA2,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,142,160,77,10\r
- CONTROL "A2065 Z2",IDC_A2065,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,233,160,57,10\r
+ CONTROL "bsdsocket.library [] bsdsocket network library emulation.",IDC_SOCKETS,\r
+ "Button",BS_AUTOCHECKBOX | WS_TABSTOP,142,148,120,10\r
+ CONTROL "uaenet.device [] Sana 2 compatible network device emulation. WinPcap required.",IDC_SANA2,\r
+ "Button",BS_AUTOCHECKBOX | WS_TABSTOP,142,160,77,10\r
+ CONTROL "A2065 Z2 [] A2065 Ethernet Zorro II card emulation. WinPcap required.",IDC_A2065,\r
+ "Button",BS_AUTOCHECKBOX | WS_TABSTOP,233,160,57,10\r
GROUPBOX "Network",IDC_STATIC,126,130,169,66\r
COMBOBOX IDC_NETDEVICE,132,176,156,65,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP\r
CONTROL "uaescsi.device",IDC_SCSIDEVICE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,13,160,102,10\r
- CONTROL "Catweasel Z2 emulation",IDC_CATWEASEL,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,13,148,101,10\r
+ CONTROL "Catweasel Z2 emulation [] Catweasel MK2 Zorro II card emulation. Physical Windows compatible Catweasel card and drivers required.",IDC_CATWEASEL,\r
+ "Button",BS_AUTOCHECKBOX | WS_TABSTOP,13,148,101,10\r
GROUPBOX "Miscellaneous Expansions",IDC_STATIC,5,130,117,66\r
END\r
\r
// Menu\r
//\r
\r
-IDM_SYSTRAY MENU\r
+IDM_SYSTRAY MENU \r
BEGIN\r
POPUP "Menu"\r
BEGIN\r
END\r
END\r
\r
-IDM_DBGCONTEXTMENU MENU\r
+IDM_DBGCONTEXTMENU MENU \r
BEGIN\r
POPUP "Inactive"\r
BEGIN\r
//\r
\r
#ifdef APSTUDIO_INVOKED\r
-GUIDELINES DESIGNINFO\r
+GUIDELINES DESIGNINFO \r
BEGIN\r
- IDD_CPU, DIALOG\r
- BEGIN\r
- END\r
-\r
IDD_FILTER, DIALOG\r
BEGIN\r
BOTTOMMARGIN, 237\r
// String Table\r
//\r
\r
-STRINGTABLE\r
+STRINGTABLE \r
BEGIN\r
IDS_KICKSTART "ROM"\r
IDS_DISK "Disk swapper"\r
IDS_FILTER "Filter"\r
END\r
\r
-STRINGTABLE\r
+STRINGTABLE \r
BEGIN\r
IDS_MISC2 "Pri. & Extensions"\r
IDS_PATHS "Paths"\r
IDS_EXPANSION "Expansions"\r
END\r
\r
-STRINGTABLE\r
+STRINGTABLE \r
BEGIN\r
IDS_EXTTEXT "Floppy disk image files"\r
IDS_EXTACTUAL "ADF"\r
IDS_EIGHTH "eighth "\r
END\r
\r
-STRINGTABLE\r
+STRINGTABLE \r
BEGIN\r
IDS_NINTH "ninth "\r
IDS_TENTH "tenth "\r
IDS_VOLUME "Volume"\r
END\r
\r
-STRINGTABLE\r
+STRINGTABLE \r
BEGIN\r
IDS_SELECTFILESYSROOT "Please select the root directory of the file system..."\r
IDS_DEFAULTMIDIOUT "Default MIDI-Out Device"\r
IDS_MIDIOVERFLOW "Sysexbuffer overflow. Should not happen. Please report this to\nberndroesch1@compuserve.de"\r
END\r
\r
-STRINGTABLE\r
+STRINGTABLE \r
BEGIN\r
IDS_PATH "Path"\r
IDS_RW "R/W"\r
IDS_INVALIDCOMPORT "The serial port you have in this configuration is not valid on this machine.\n"\r
END\r
\r
-STRINGTABLE\r
+STRINGTABLE \r
BEGIN\r
IDS_HFDSIZE "Size"\r
IDS_DEVICE "Device"\r
IDS_DEFAULT_WINUAE "WinUAE default (old)"\r
END\r
\r
-STRINGTABLE\r
+STRINGTABLE \r
BEGIN\r
IDS_SOUND_STEREO2 "Cloned Stereo (4 Channels)"\r
IDS_INPUT_CUSTOMEVENT "<Custom event>"\r
IDS_NETDISCONNECTED "Cable disconnected"\r
END\r
\r
-STRINGTABLE\r
+STRINGTABLE \r
BEGIN\r
IDS_UNSUPPORTEDPIXELFORMAT \r
"Error: unsupported pixel format. Please use a different screen mode.\n"\r
IDS_ERRORTITLE "WinUAE message"\r
END\r
\r
-STRINGTABLE\r
+STRINGTABLE \r
BEGIN\r
IDS_INP "WinUAE Input Recording"\r
IDS_RESTOREINP "Playback a WinUAE input recording"\r
IDS_SOUND_FILTER_EMULATED "Emulated (A500)"\r
END\r
\r
-STRINGTABLE\r
+STRINGTABLE \r
BEGIN\r
IDS_SOUND_FILTER_EMULATED_E "Emulated (A1200)"\r
IDS_INPUT_COMPATIBILITY "Compatibility mode"\r
"the desktop is running in an unknown color mode."\r
END\r
\r
-STRINGTABLE\r
+STRINGTABLE \r
BEGIN\r
IDS_UNSUPPORTEDSCREENMODE_2 \r
"the desktop is running in 8-bit color depth, which WinUAE can't use in windowed mode."\r
IDS_TREEVIEW_ABOUT "About"\r
END\r
\r
-STRINGTABLE\r
+STRINGTABLE \r
BEGIN\r
IDS_NOHARDDRIVES "No hard disks detected that were either empty or RDB-partitioned."\r
IDS_DEFAULT_HOST "Default Configuration"\r
IDS_FLOPPYTYPE35DDESCOM "3.5"" ESCOM"\r
END\r
\r
-STRINGTABLE\r
+STRINGTABLE \r
BEGIN\r
IDS_NUMSG_NEEDEXT2 "The software uses a non-standard floppy disk format. You may need to use a custom floppy disk image file instead of a standard one. This message will not appear again."\r
IDS_NUMSG_NOROMKEY "Could not find system ROM key file."\r
IDS_NUMSG_KSROMREADERROR "Error while reading system ROM."\r
END\r
\r
-STRINGTABLE\r
+STRINGTABLE \r
BEGIN\r
IDS_NUMSG_NOEXTROM "No extended ROM found."\r
IDS_NUMSG_MODRIP_NOTFOUND "No music modules or packed data found."\r
IDS_ROMSCANEND "Scan of ROMs finished"\r
END\r
\r
-STRINGTABLE\r
+STRINGTABLE \r
BEGIN\r
IDS_ROM_AVAILABLE "available"\r
IDS_ROM_UNAVAILABLE "unavailable"\r
IDS_SB_CUSTOMEVENT "Enter custom event string.."\r
END\r
\r
-STRINGTABLE\r
+STRINGTABLE \r
BEGIN\r
IDS_QS_MODELS "A500\nA500+\nA600\nA1000\nA1200\nA3000\nA4000\nCD32\nCDTV\nArcadia Multi Select system\nExpanded WinUAE example configuration"\r
IDS_QS_MODEL_A500 "1.3 ROM, OCS, 512 KB Chip + 512 KB Slow RAM (most common)\nThis configuration is capable of running most games and demos produced for first-generation hardware. Only few exceptions need a different configuration (e.g. the oldest games tend to be incompatible with this configuration).\n1.3 ROM, ECS Agnus, 512 KB Chip RAM + 512 KB Slow RAM\nLater hardware revision of the A500. Nearly 100% compatible with the previous configuration.\n1.3 ROM, ECS Agnus, 1 MB Chip RAM\nFew newer games and demos require this configuration.\n1.3 ROM, OCS Agnus, 512 KB Chip RAM\nVery old (e.g. pre-1988) games and demos may require this configuration.\n1.2 ROM, OCS Agnus, 512 KB Chip RAM\nAs available for the A1000, and installed on the first A500 and A2000 series. Some very old programs only work correctly with this configuration. Note: This system ROM version can only boot from floppy disk (no hard disk boot support).\n1.2 ROM, OCS Agnus, 512 KB Chip RAM + 512 KB Slow RAM\nThis configuration adds expansion memory to the first A500 produced. Try this if your game does not work with newer configurations, but works with the previous one. It could add some features to the game, including faster loading times. Note: This system ROM version can only boot from floppy disk (no hard disk boot support)."\r
IDS_QS_MODEL_CDTV "CDTV\nThe CDTV was the first model with a built-in CD-ROM drive. Looking like a black CD player, it featured a configuration equivalent to that of an A500 with 1 MB RAM and an ECS chipset.\nFloppy drive and 64KB SRAM card expanded CDTV\n"\r
END\r
\r
-STRINGTABLE\r
+STRINGTABLE \r
BEGIN\r
IDS_QS_MODEL_UAE "High-end expanded configuration"\r
IDS_QS_MODEL_ARCADIA "Arcadia\nArcadia Multi Select system is arcade platform developed by Arcadia and Mastertronic. It is based on an A500 mainboard with ROM cage attached to expansion port. Arcadia ROM files go to ""Cartridge ROM File"" in ROM-panel."\r
IDS_QS_MODEL_A4000T "A4000T (test)\nA4000T"\r
END\r
\r
-STRINGTABLE\r
+STRINGTABLE \r
BEGIN\r
IDS_FLOPPYTYPE35DDPC "3.5"" DD (PC)"\r
IDS_FLOPPYTYPE35HDPC "3.5"" HD (PC)"\r
IDS_PRINTER_ASCII "ASCII-Only"\r
END\r
\r
-STRINGTABLE\r
+STRINGTABLE \r
BEGIN\r
IDS_PRINTER_EPSON9 "Epson Matrix Printer Emulation, 9pin"\r
IDS_PRINTER_POSTSCRIPT_DETECTION "PostScript (Passthrough)"\r
// Finnish resources\r
\r
#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_FIN)\r
+#ifdef _WIN32\r
LANGUAGE LANG_FINNISH, SUBLANG_DEFAULT\r
#pragma code_page(1252)\r
+#endif //_WIN32\r
\r
#ifdef APSTUDIO_INVOKED\r
/////////////////////////////////////////////////////////////////////////////\r
#define WRITE_LOG_BUF_SIZE 4096
void write_log (const TCHAR *format, ...)
{
- int count;
- TCHAR buffer[WRITE_LOG_BUF_SIZE];
- va_list parms;
- va_start (parms, format);
- if (debug) {
- count = _vsntprintf (buffer, WRITE_LOG_BUF_SIZE - 1, format, parms);
- _tprintf (buffer);
- }
- va_end (parms);
+ int count;
+ TCHAR buffer[WRITE_LOG_BUF_SIZE];
+ va_list parms;
+ va_start (parms, format);
+ if (debug) {
+ count = _vsntprintf (buffer, WRITE_LOG_BUF_SIZE - 1, format, parms);
+ _tprintf (buffer);
+ }
+ va_end (parms);
}
void gui_message (const TCHAR *format, ...)
int uaerand (void)
{
- return rand ();
+ return rand ();
}
static int pattern_match (const TCHAR *str, const TCHAR *pattern)
{
- enum State {
- Exact, // exact match
- Any, // ?
- AnyRepeat // *
- };
-
- const TCHAR *s = str;
- const TCHAR *p = pattern;
- const TCHAR *q = 0;
- int state = 0;
-
- int match = TRUE;
- while (match && *p) {
- if (*p == '*') {
- state = AnyRepeat;
- q = p+1;
- } else if (*p == '?') state = Any;
- else state = Exact;
-
- if (*s == 0) break;
-
- switch (state) {
- case Exact:
- match = *s == *p;
- s++;
- p++;
- break;
-
- case Any:
- match = TRUE;
- s++;
- p++;
- break;
-
- case AnyRepeat:
- match = TRUE;
- s++;
-
- if (*s == *q){
- // make a recursive call so we don't match on just a single character
- if (pattern_match(s,q) == TRUE) {
+ enum State {
+ Exact, // exact match
+ Any, // ?
+ AnyRepeat // *
+ };
+
+ const TCHAR *s = str;
+ const TCHAR *p = pattern;
+ const TCHAR *q = 0;
+ int state = 0;
+
+ int match = TRUE;
+ while (match && *p) {
+ if (*p == '*') {
+ state = AnyRepeat;
+ q = p+1;
+ } else if (*p == '?') state = Any;
+ else state = Exact;
+
+ if (*s == 0) break;
+
+ switch (state) {
+ case Exact:
+ match = *s == *p;
+ s++;
+ p++;
+ break;
+
+ case Any:
+ match = TRUE;
+ s++;
p++;
- }
+ break;
+
+ case AnyRepeat:
+ match = TRUE;
+ s++;
+
+ if (*s == *q){
+ // make a recursive call so we don't match on just a single character
+ if (pattern_match(s,q) == TRUE) {
+ p++;
+ }
+ }
+ break;
}
- break;
- }
- }
+ }
- if (state == AnyRepeat) return (*s == *q);
- else if (state == Any) return (*s == *p);
- else return match && (*s == *p);
+ if (state == AnyRepeat) return (*s == *q);
+ else if (state == Any) return (*s == *p);
+ else return match && (*s == *p);
}
static void geterror (void)
{
- TCHAR *err = zfile_geterror();
- if (!err)
- return;
- _tprintf (L"%s\n", err);
+ TCHAR *err = zfile_geterror ();
+ if (!err)
+ return;
+ _tprintf (L"%s\n", err);
}
static const TCHAR *prots = L"HSPARWED";
struct arcdir {
- TCHAR *name;
- int isdir;
- uae_u32 flags;
- uae_u64 size;
- TCHAR *comment;
- uae_u32 crc32;
- int iscrc;
- __time64_t dt;
- int parent, nextlevel;
+ TCHAR *name;
+ int isdir;
+ uae_u32 flags;
+ uae_u64 size;
+ TCHAR *comment;
+ uae_u32 crc32;
+ int iscrc;
+ __time64_t dt;
+ int parent, nextlevel;
};
static struct arcdir **filelist;
static void dolist (struct arcdir **filelist, struct arcdir *adp, int entries, int parent, int level)
{
- int ii, i;
-
- for (ii = 0; ii < 2; ii++) {
- for (i = 0; i < entries; i++) {
- struct arcdir *ad = filelist[i];
- int j;
- TCHAR protflags[9];
- TCHAR dates[32];
- TCHAR crcs[16];
- int flags;
- struct tm *dt;
-
- if (ad->parent != parent)
- continue;
-
- if ((ii == 0 && ad->isdir) || (ii == 1 && !ad->isdir)) {
-
- flags = ad->flags;
-
- if (flags >= 0) {
- for (j = 0; j < 8; j++) {
- protflags[j] = '-';
- if (flags & (1 << (7 - j)))
- protflags[j] = prots[j];
- }
- protflags[j] = 0;
- } else {
- _tcscpy (protflags, L"--------");
- }
-
- if (ad->dt > 0) {
- dt = _gmtime64 (&ad->dt);
- _tcsftime (dates, sizeof (dates) / sizeof (TCHAR), L"%Y/%m/%d %H:%M:%S", dt);
- } else {
- _tcscpy (dates, L"-------------------");
- }
+ int ii, i;
+
+ for (ii = 0; ii < 2; ii++) {
+ for (i = 0; i < entries; i++) {
+ struct arcdir *ad = filelist[i];
+ int j;
+ TCHAR protflags[9];
+ TCHAR dates[32];
+ TCHAR crcs[16];
+ int flags;
+ struct tm *dt;
+
+ if (ad->parent != parent)
+ continue;
+
+ if ((ii == 0 && ad->isdir) || (ii == 1 && !ad->isdir)) {
+
+ flags = ad->flags;
+
+ if (flags >= 0) {
+ for (j = 0; j < 8; j++) {
+ protflags[j] = '-';
+ if (flags & (1 << (7 - j)))
+ protflags[j] = prots[j];
+ }
+ protflags[j] = 0;
+ } else {
+ _tcscpy (protflags, L"--------");
+ }
+
+ if (ad->dt > 0) {
+ dt = _gmtime64 (&ad->dt);
+ _tcsftime (dates, sizeof (dates) / sizeof (TCHAR), L"%Y/%m/%d %H:%M:%S", dt);
+ } else {
+ _tcscpy (dates, L"-------------------");
+ }
+
+ for (j = 0; j < level; j++)
+ _tprintf (L" ");
+ if (ad->iscrc)
+ _stprintf (crcs, L"%08X", ad->crc32);
+ else
+ _tcscpy (crcs, L"--------");
+ if (ad->isdir > 0)
+ _tprintf (L" [DIR] %s %s %s\n", protflags, dates, ad->name);
+ else if (ad->isdir < 0)
+ _tprintf (L" [VDIR] %s %s %s\n", protflags, dates, ad->name);
+ else
+ _tprintf (L"%10I64d %s %s %s %s\n", ad->size, protflags, dates, crcs, ad->name);
+ if (ad->comment)
+ _tprintf (L" \"%s\"\n", ad->comment);
+ if (ad->nextlevel >= 0) {
+ level++;
+ dolist (filelist, adp, entries, ad - adp, level);
+ level--;
+ }
- for (j = 0; j < level; j++)
- _tprintf (L" ");
- if (ad->iscrc)
- _stprintf (crcs, L"%08X", ad->crc32);
- else
- _tcscpy (crcs, L"--------");
- if (ad->isdir > 0)
- _tprintf (L" [DIR] %s %s %s\n", protflags, dates, ad->name);
- else if (ad->isdir < 0)
- _tprintf (L" [VDIR] %s %s %s\n", protflags, dates, ad->name);
- else
- _tprintf (L"%10I64d %s %s %s %s\n", ad->size, protflags, dates, crcs, ad->name);
- if (ad->comment)
- _tprintf (L" \"%s\"\n", ad->comment);
- if (ad->nextlevel >= 0) {
- level++;
- dolist (filelist, adp, entries, ad - adp, level);
- level--;
+ }
}
-
- }
}
- }
}
static int parentid = -1, subdirid;
static void resetlist (void)
{
- parentid = -1;
- subdirid = 0;
- maxentries = 10000;
- entries = 0;
+ parentid = -1;
+ subdirid = 0;
+ maxentries = 10000;
+ entries = 0;
}
static int unlist2 (struct arcdir *adp, const TCHAR *src, int all)
{
- struct zvolume *zv;
- void *h;
- int i;
- TCHAR p[MAX_DPATH];
- TCHAR fn[MAX_DPATH];
- struct arcdir *ad;
-
- zv = zfile_fopen_archive_root (src);
- if (zv == NULL) {
- geterror();
- _tprintf (L"Couldn't open archive '%s'\n", src);
- return 0;
- }
- h = zfile_opendir_archive (src);
- if (!h) {
- _tcscpy (p, src);
- _tcscat (p, L".DIR");
+ struct zvolume *zv;
+ void *h;
+ int i;
+ TCHAR p[MAX_DPATH];
+ TCHAR fn[MAX_DPATH];
+ struct arcdir *ad;
+
+ zv = zfile_fopen_archive_root (src);
+ if (zv == NULL) {
+ geterror();
+ _tprintf (L"Couldn't open archive '%s'\n", src);
+ return 0;
+ }
h = zfile_opendir_archive (src);
if (!h) {
- geterror();
- _tprintf (L"Couldn't open directory '%s'\n", src);
- return 0;
+ _tcscpy (p, src);
+ _tcscat (p, L".DIR");
+ h = zfile_opendir_archive (src);
+ if (!h) {
+ geterror();
+ _tprintf (L"Couldn't open directory '%s'\n", src);
+ return 0;
+ }
}
- }
- while (zfile_readdir_archive (h, fn)) {
- struct _stat64 st;
- int isdir;
- uae_u32 flags;
- TCHAR *comment;
- struct zfile *zf;
- uae_u32 crc32 = 0;
- int iscrc = 0;
- int nextdir = -1;
-
- _tcscpy (p, src);
- _tcscat (p, sep);
- _tcscat (p, fn);
- if (!zfile_stat_archive (p, &st)) {
- st.st_size = -1;
- st.st_mtime = 0;
- }
- isdir = 0;
- flags = 0;
- comment = 0;
- zfile_fill_file_attrs_archive (p, &isdir, &flags, &comment);
- flags ^= 15;
- if (!isdir && st.st_size < 1024 * 1024 * 2 && st.st_size > 0) {
- zf = zfile_open_archive (p, 0);
- if (zf) {
- crc32 = zfile_crc32 (zf);
- iscrc = 1;
- }
- }
+ while (zfile_readdir_archive (h, fn)) {
+ struct _stat64 st;
+ int isdir;
+ uae_u32 flags;
+ TCHAR *comment;
+ struct zfile *zf;
+ uae_u32 crc32 = 0;
+ int iscrc = 0;
+ int nextdir = -1;
+
+ _tcscpy (p, src);
+ _tcscat (p, sep);
+ _tcscat (p, fn);
+ if (!zfile_stat_archive (p, &st)) {
+ st.st_size = -1;
+ st.st_mtime = 0;
+ }
+ isdir = 0;
+ flags = 0;
+ comment = 0;
+ zfile_fill_file_attrs_archive (p, &isdir, &flags, &comment);
+ flags ^= 15;
+ if (!isdir && st.st_size < 1024 * 1024 * 2 && st.st_size > 0) {
+ zf = zfile_open_archive (p, 0);
+ if (zf) {
+ crc32 = zfile_crc32 (zf);
+ iscrc = 1;
+ }
+ }
- ad = &adp[entries++];
- ad->isdir = isdir;
- ad->comment = comment;
- ad->flags = flags;
- ad->name = my_strdup (fn);
- ad->size = st.st_size;
- ad->dt = st.st_mtime;
- ad->parent = parentid;
- ad->crc32 = crc32;
- ad->iscrc = iscrc;
-
- if (isdir && all) {
- int oldparent = parentid;
- parentid = ad - adp;
- nextdir = parentid + 1;
- unlist2 (adp, p, all);
- parentid = oldparent;
- }
+ ad = &adp[entries++];
+ ad->isdir = isdir;
+ ad->comment = comment;
+ ad->flags = flags;
+ ad->name = my_strdup (fn);
+ ad->size = st.st_size;
+ ad->dt = st.st_mtime;
+ ad->parent = parentid;
+ ad->crc32 = crc32;
+ ad->iscrc = iscrc;
+
+ if (isdir && all) {
+ int oldparent = parentid;
+ parentid = ad - adp;
+ nextdir = parentid + 1;
+ unlist2 (adp, p, all);
+ parentid = oldparent;
+ }
- ad->nextlevel = nextdir;
+ ad->nextlevel = nextdir;
- if (entries >= maxentries)
- break;
- }
- if (parentid >= 0)
- return 1;
+ if (entries >= maxentries)
+ break;
+ }
+ if (parentid >= 0)
+ return 1;
+
+ filelist = xmalloc (entries * sizeof (struct arcdir*));
+ for (i = 0; i < entries; i++) {
+ filelist[i] = &adp[i];
+ }
- filelist = xmalloc (entries * sizeof (struct arcdir*));
- for (i = 0; i < entries; i++) {
- filelist[i] = &adp[i];
- }
-
- // bubblesort is the winner!
- for (i = 0; i < entries; i++) {
- int j;
- for (j = i + 1; j < entries; j++) {
- int diff = _tcsicmp (filelist[i]->name, filelist[j]->name);
- if (diff > 0) {
- struct arcdir *tmp;
- tmp = filelist[i];
- filelist[i] = filelist[j];
- filelist[j] = tmp;
- }
+ // bubblesort is the winner!
+ for (i = 0; i < entries; i++) {
+ int j;
+ for (j = i + 1; j < entries; j++) {
+ int diff = _tcsicmp (filelist[i]->name, filelist[j]->name);
+ if (diff > 0) {
+ struct arcdir *tmp;
+ tmp = filelist[i];
+ filelist[i] = filelist[j];
+ filelist[j] = tmp;
+ }
+ }
}
- }
- dolist (filelist, adp, entries, -1, 0);
- zfile_closedir_archive (h);
- zfile_fclose_archive (zv);
- return 1;
+ dolist (filelist, adp, entries, -1, 0);
+ zfile_closedir_archive (h);
+ zfile_fclose_archive (zv);
+ return 1;
}
static int unlist (const TCHAR *src, int all)
{
- struct arcdir *adp;
- adp = xcalloc (sizeof (struct arcdir), maxentries);
- unlist2 (adp, src, all);
- return 1;
+ struct arcdir *adp;
+ adp = xcalloc (sizeof (struct arcdir), maxentries);
+ unlist2 (adp, src, all);
+ return 1;
}
static int docrclist (const TCHAR *src)
{
- WIN32_FIND_DATA ffd;
- HANDLE h;
- TCHAR path[MAX_DPATH];
-
- _tcscpy (path, src);
- _tcscat (path, L"\\*.*");
- h = FindFirstFile (path, &ffd);
- while (h) {
- if (ffd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) {
- if (!_tcscmp (ffd.cFileName, L".") || !_tcscmp (ffd.cFileName, L".."))
- goto next;
- _tcscpy (path, src);
- _tcscat (path, L"\\");
- _tcscat (path, ffd.cFileName);
- docrclist (path);
- } else {
- TCHAR path2[MAX_DPATH];
- _tcscpy (path, src);
- _tcscat (path, L"\\");
- _tcscat (path, ffd.cFileName);
- GetFullPathName (path, MAX_DPATH, path2, NULL);
- resetlist ();
- unlist (path2, 1);
- }
+ WIN32_FIND_DATA ffd;
+ HANDLE h;
+ TCHAR path[MAX_DPATH];
+
+ _tcscpy (path, src);
+ _tcscat (path, L"\\*.*");
+ h = FindFirstFile (path, &ffd);
+ while (h) {
+ if (ffd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) {
+ if (!_tcscmp (ffd.cFileName, L".") || !_tcscmp (ffd.cFileName, L".."))
+ goto next;
+ _tcscpy (path, src);
+ _tcscat (path, L"\\");
+ _tcscat (path, ffd.cFileName);
+ docrclist (path);
+ } else {
+ TCHAR path2[MAX_DPATH];
+ _tcscpy (path, src);
+ _tcscat (path, L"\\");
+ _tcscat (path, ffd.cFileName);
+ GetFullPathName (path, MAX_DPATH, path2, NULL);
+ resetlist ();
+ unlist (path2, 1);
+ }
next:
- if (!FindNextFile (h, &ffd)) {
- FindClose (h);
- break;
+ if (!FindNextFile (h, &ffd)) {
+ FindClose (h);
+ break;
+ }
}
- }
- return 1;
+ return 1;
}
static void setdate (const TCHAR *src, __time64_t tm)
{
- struct utimbuf ut;
- if (tm) {
- ut.actime = ut.modtime = tm;
- utime (src, &ut);
- }
+ struct utimbuf ut;
+ if (tm) {
+ ut.actime = ut.modtime = tm;
+ utime (src, &ut);
+ }
}
static int found;
static int unpack (const TCHAR *src, const TCHAR *filename, const TCHAR *dst, int out, int all, int level)
{
- void *h;
- struct zvolume *zv;
- int ret;
- uae_u8 *b;
- int size;
- TCHAR fn[MAX_DPATH];
-
- ret = 0;
- zv = zfile_fopen_archive_root (src);
- if (zv == NULL) {
- geterror();
- _tprintf (L"Couldn't open archive '%s'\n", src);
- return 0;
- }
- h = zfile_opendir_archive (src);
- if (!h) {
- geterror();
- _tprintf (L"Couldn't open directory '%s'\n", src);
- return 0;
- }
- while (zfile_readdir_archive (h, fn)) {
- if (all || !_tcsicmp (filename, fn)) {
- TCHAR tmp[MAX_DPATH];
- struct zfile *s, *d;
- struct _stat64 st;
-
- found = 1;
- _tcscpy (tmp, src);
- _tcscat (tmp, sep);
- _tcscat (tmp, fn);
- if (!zfile_stat_archive (tmp, &st)) {
- _tprintf (L"Couldn't stat '%s'\n", tmp);
- continue;
- }
- if (dst == NULL || all)
- dst = fn;
- if (st.st_mode) {
- if (all > 0)
- continue;
- if (all < 0) {
- TCHAR oldcur[MAX_DPATH];
- my_mkdir (fn);
- my_setcurrentdir (fn, oldcur);
- unpack (tmp, fn, dst, out, all, 1);
- my_setcurrentdir (oldcur, NULL);
- setdate (dst, st.st_mtime);
- continue;
- }
- _tprintf (L"Directory extraction not yet supported\n");
+ void *h;
+ struct zvolume *zv;
+ int ret;
+ uae_u8 *b;
+ int size;
+ TCHAR fn[MAX_DPATH];
+
+ ret = 0;
+ zv = zfile_fopen_archive_root (src);
+ if (zv == NULL) {
+ geterror();
+ _tprintf (L"Couldn't open archive '%s'\n", src);
return 0;
- }
-
- s = zfile_open_archive (tmp, 0);
- if (!s) {
+ }
+ h = zfile_opendir_archive (src);
+ if (!h) {
geterror();
- _tprintf (L"Couldn't open '%s' for reading\n", src);
- continue;
- }
- zfile_fseek (s, 0, SEEK_END);
- size = zfile_ftell (s);
- zfile_fseek (s, 0, SEEK_SET);
- b = xcalloc (size, 1);
- if (b) {
- if (zfile_fread (b, size, 1, s) == 1) {
- if (out) {
- _tprintf (L"\n");
- fwrite (b, size, 1, stdout);
- } else {
- d = zfile_fopen (dst, L"wb", 0);
- if (d) {
- if (zfile_fwrite (b, size, 1, d) == 1) {
- ret = 1;
- _tprintf (L"%s extracted, %d bytes\n", dst, size);
- }
- zfile_fclose (d);
- setdate (dst, st.st_mtime);
+ _tprintf (L"Couldn't open directory '%s'\n", src);
+ return 0;
+ }
+ while (zfile_readdir_archive (h, fn)) {
+ if (all || !_tcsicmp (filename, fn)) {
+ TCHAR tmp[MAX_DPATH];
+ struct zfile *s, *d;
+ struct _stat64 st;
+
+ found = 1;
+ _tcscpy (tmp, src);
+ _tcscat (tmp, sep);
+ _tcscat (tmp, fn);
+ if (!zfile_stat_archive (tmp, &st)) {
+ _tprintf (L"Couldn't stat '%s'\n", tmp);
+ continue;
+ }
+ if (dst == NULL || all)
+ dst = fn;
+ if (st.st_mode) {
+ if (all > 0)
+ continue;
+ if (all < 0) {
+ TCHAR oldcur[MAX_DPATH];
+ my_mkdir (fn);
+ my_setcurrentdir (fn, oldcur);
+ unpack (tmp, fn, dst, out, all, 1);
+ my_setcurrentdir (oldcur, NULL);
+ setdate (dst, st.st_mtime);
+ continue;
+ }
+ _tprintf (L"Directory extraction not yet supported\n");
+ return 0;
+ }
+
+ s = zfile_open_archive (tmp, 0);
+ if (!s) {
+ geterror();
+ _tprintf (L"Couldn't open '%s' for reading\n", src);
+ continue;
+ }
+ zfile_fseek (s, 0, SEEK_END);
+ size = zfile_ftell (s);
+ zfile_fseek (s, 0, SEEK_SET);
+ b = xcalloc (size, 1);
+ if (b) {
+ if (zfile_fread (b, size, 1, s) == 1) {
+ if (out) {
+ _tprintf (L"\n");
+ fwrite (b, size, 1, stdout);
+ } else {
+ d = zfile_fopen (dst, L"wb", 0);
+ if (d) {
+ if (zfile_fwrite (b, size, 1, d) == 1) {
+ ret = 1;
+ _tprintf (L"%s extracted, %d bytes\n", dst, size);
+ }
+ zfile_fclose (d);
+ setdate (dst, st.st_mtime);
+ }
+ }
+ }
+ xfree (b);
}
- }
+ zfile_fclose (s);
+ if (!all)
+ break;
}
- xfree (b);
- }
- zfile_fclose (s);
- if (!all)
- break;
}
- }
- geterror ();
- if (!found && !level) {
- _tprintf (L"'%s' not found\n", fn);
- }
- return ret;
+ geterror ();
+ if (!found && !level) {
+ _tprintf (L"'%s' not found\n", fn);
+ }
+ return ret;
}
static int unpack2 (const TCHAR *src, const TCHAR *match, int level)
{
- void *h;
- struct zvolume *zv;
- int ret;
- uae_u8 *b;
- int size;
- TCHAR fn[MAX_DPATH];
-
- ret = 0;
- zv = zfile_fopen_archive_root (src);
- if (zv == NULL) {
- geterror();
- _tprintf (L"Couldn't open archive '%s'\n", src);
- return 0;
- }
- h = zfile_opendir_archive (src);
- if (!h) {
- geterror();
- _tprintf (L"Couldn't open directory '%s'\n", src);
- return 0;
- }
- while (zfile_readdir_archive (h, fn)) {
- TCHAR tmp[MAX_DPATH];
- TCHAR *dst;
- struct zfile *s, *d;
- int isdir, flags;
-
- _tcscpy (tmp, src);
- _tcscat (tmp, sep);
- _tcscat (tmp, fn);
- zfile_fill_file_attrs_archive (tmp, &isdir, &flags, NULL);
- if (isdir) {
- TCHAR *p = _tcsstr (fn, L".DIR");
- if (isdir == ZNODE_VDIR && p && _tcslen (p) == 4) {
- p[0] = 0;
- if (pattern_match (fn, match))
- continue;
- p[0] = '.';
- }
- unpack2 (tmp, match, 1);
- continue;
+ void *h;
+ struct zvolume *zv;
+ int ret;
+ uae_u8 *b;
+ int size;
+ TCHAR fn[MAX_DPATH];
+
+ ret = 0;
+ zv = zfile_fopen_archive_root (src);
+ if (zv == NULL) {
+ geterror();
+ _tprintf (L"Couldn't open archive '%s'\n", src);
+ return 0;
}
-
- if (pattern_match (fn, match)) {
- struct _stat64 st;
-
- if (!zfile_stat_archive (tmp, &st)) {
- st.st_mtime = -1;
- }
- found = 1;
- dst = fn;
- s = zfile_open_archive (tmp, 0);
- if (!s) {
+ h = zfile_opendir_archive (src);
+ if (!h) {
geterror();
- _tprintf (L"Couldn't open '%s' for reading\n", tmp);
- continue;
- }
- zfile_fseek (s, 0, SEEK_END);
- size = zfile_ftell (s);
- zfile_fseek (s, 0, SEEK_SET);
- b = xcalloc (size, 1);
- if (b) {
- if (zfile_fread (b, size, 1, s) == 1) {
- d = zfile_fopen (dst, L"wb", 0);
- if (d) {
- if (zfile_fwrite (b, size, 1, d) == 1) {
- ret = 1;
- _tprintf (L"%s extracted, %d bytes\n", dst, size);
+ _tprintf (L"Couldn't open directory '%s'\n", src);
+ return 0;
+ }
+ while (zfile_readdir_archive (h, fn)) {
+ TCHAR tmp[MAX_DPATH];
+ TCHAR *dst;
+ struct zfile *s, *d;
+ int isdir, flags;
+
+ _tcscpy (tmp, src);
+ _tcscat (tmp, sep);
+ _tcscat (tmp, fn);
+ zfile_fill_file_attrs_archive (tmp, &isdir, &flags, NULL);
+ if (isdir) {
+ TCHAR *p = _tcsstr (fn, L".DIR");
+ if (isdir == ZNODE_VDIR && p && _tcslen (p) == 4) {
+ p[0] = 0;
+ if (pattern_match (fn, match))
+ continue;
+ p[0] = '.';
+ }
+ unpack2 (tmp, match, 1);
+ continue;
+ }
+
+ if (pattern_match (fn, match)) {
+ struct _stat64 st;
+
+ if (!zfile_stat_archive (tmp, &st)) {
+ st.st_mtime = -1;
+ }
+ found = 1;
+ dst = fn;
+ s = zfile_open_archive (tmp, 0);
+ if (!s) {
+ geterror();
+ _tprintf (L"Couldn't open '%s' for reading\n", tmp);
+ continue;
+ }
+ zfile_fseek (s, 0, SEEK_END);
+ size = zfile_ftell (s);
+ zfile_fseek (s, 0, SEEK_SET);
+ b = xcalloc (size, 1);
+ if (b) {
+ if (zfile_fread (b, size, 1, s) == 1) {
+ d = zfile_fopen (dst, L"wb", 0);
+ if (d) {
+ if (zfile_fwrite (b, size, 1, d) == 1) {
+ ret = 1;
+ _tprintf (L"%s extracted, %d bytes\n", dst, size);
+ }
+ zfile_fclose (d);
+ setdate (dst, st.st_mtime);
+ }
+ }
+ xfree (b);
}
- zfile_fclose (d);
- setdate (dst, st.st_mtime);
- }
+ zfile_fclose (s);
}
- xfree (b);
- }
- zfile_fclose (s);
}
- }
- geterror ();
- if (!found && !level) {
- _tprintf (L"'%s' not matched\n", match);
- }
- return ret;
+ geterror ();
+ if (!found && !level) {
+ _tprintf (L"'%s' not matched\n", match);
+ }
+ return ret;
}
static int scanpath (TCHAR *src, TCHAR *outpath)
{
- struct zvolume *zv;
- void *h;
- TCHAR fn[MAX_DPATH];
-
- zv = zfile_fopen_archive_root (src);
- if (zv == NULL) {
- geterror();
- _tprintf (L"Couldn't open archive '%s'\n", src);
- return 0;
- }
- h = zfile_opendir_archive (src);
- if (!h) {
- geterror();
- _tprintf (L"Couldn't open directory '%s'\n", src);
- return 0;
- }
- while (zfile_readdir_archive (h, fn)) {
- TCHAR tmp[MAX_DPATH];
- int isdir, flags;
- _tcscpy (tmp, src);
- _tcscat (tmp, sep);
- _tcscat (tmp, fn);
- zfile_fill_file_attrs_archive (tmp, &isdir, &flags, NULL);
- if (isdir == ZNODE_VDIR) {
- _tcscpy (outpath, tmp);
- scanpath (tmp, outpath);
- break;
+ struct zvolume *zv;
+ void *h;
+ TCHAR fn[MAX_DPATH];
+
+ zv = zfile_fopen_archive_root (src);
+ if (zv == NULL) {
+ geterror();
+ _tprintf (L"Couldn't open archive '%s'\n", src);
+ return 0;
}
- }
- return 1;
+ h = zfile_opendir_archive (src);
+ if (!h) {
+ geterror();
+ _tprintf (L"Couldn't open directory '%s'\n", src);
+ return 0;
+ }
+ while (zfile_readdir_archive (h, fn)) {
+ TCHAR tmp[MAX_DPATH];
+ int isdir, flags;
+ _tcscpy (tmp, src);
+ _tcscat (tmp, sep);
+ _tcscat (tmp, fn);
+ zfile_fill_file_attrs_archive (tmp, &isdir, &flags, NULL);
+ if (isdir == ZNODE_VDIR) {
+ _tcscpy (outpath, tmp);
+ scanpath (tmp, outpath);
+ break;
+ }
+ }
+ return 1;
}
int wmain (int argc, wchar_t *argv[], wchar_t *envp[])
{
- int ok = 0, i;
- int list = 0, xtract = 0, extract = 0;
- int out = 0, all = 0, crclist = 0;
- TCHAR path[MAX_DPATH] = { 0 }, pathx[MAX_DPATH] = { 0 };
+ int ok = 0, i;
+ int list = 0, xtract = 0, extract = 0;
+ int out = 0, all = 0, crclist = 0;
+ TCHAR path[MAX_DPATH] = { 0 }, pathx[MAX_DPATH] = { 0 };
#if 0
- TCHAR tmppath[MAX_DPATH];
+ TCHAR tmppath[MAX_DPATH];
#endif
- int used[32] = { 0 };
- TCHAR *parm2 = NULL;
- TCHAR *parm3 = NULL;
- TCHAR *match = NULL;
-
- resetlist ();
-
- for (i = 0; i < argc && i < 32; i++) {
- if (!_tcsicmp (argv[i], L"-crclist")) {
- crclist = 1;
- used[i] = 1;
- }
- if (!_tcsicmp (argv[i], L"o")) {
- out = 1;
- used[i] = 1;
- }
- if (!_tcsicmp (argv[i], L"-o")) {
- out = 1;
- used[i] = 1;
- }
- if (!_tcsicmp (argv[i], L"l")) {
- list = 1;
- used[i] = 1;
- }
- if (!_tcsicmp (argv[i], L"-l")) {
- list = 1;
- used[i] = 1;
- }
- if (!_tcsicmp (argv[i], L"x")) {
- xtract = 1;
- used[i] = 1;
- }
- if (!_tcsicmp (argv[i], L"-x")) {
- xtract = 1;
- used[i] = 1;
- }
- if (!_tcsicmp (argv[i], L"e")) {
- extract = 1;
- used[i] = 1;
- }
- if (!_tcsicmp (argv[i], L"-e")) {
- extract = 1;
- used[i] = 1;
- }
- if (!_tcsicmp (argv[i], L"*")) {
- all = 1;
- used[i] = 1;
+ int used[32] = { 0 };
+ TCHAR *parm2 = NULL;
+ TCHAR *parm3 = NULL;
+ TCHAR *match = NULL;
+
+ resetlist ();
+
+ for (i = 0; i < argc && i < 32; i++) {
+ if (!_tcsicmp (argv[i], L"-crclist")) {
+ crclist = 1;
+ used[i] = 1;
+ }
+ if (!_tcsicmp (argv[i], L"o")) {
+ out = 1;
+ used[i] = 1;
+ }
+ if (!_tcsicmp (argv[i], L"-o")) {
+ out = 1;
+ used[i] = 1;
+ }
+ if (!_tcsicmp (argv[i], L"l")) {
+ list = 1;
+ used[i] = 1;
+ }
+ if (!_tcsicmp (argv[i], L"-l")) {
+ list = 1;
+ used[i] = 1;
+ }
+ if (!_tcsicmp (argv[i], L"x")) {
+ xtract = 1;
+ used[i] = 1;
+ }
+ if (!_tcsicmp (argv[i], L"-x")) {
+ xtract = 1;
+ used[i] = 1;
+ }
+ if (!_tcsicmp (argv[i], L"e")) {
+ extract = 1;
+ used[i] = 1;
+ }
+ if (!_tcsicmp (argv[i], L"-e")) {
+ extract = 1;
+ used[i] = 1;
+ }
+ if (!_tcsicmp (argv[i], L"*")) {
+ all = 1;
+ used[i] = 1;
+ }
+ if (!_tcsicmp (argv[i], L"**")) {
+ all = -1;
+ used[i] = 1;
+ }
+ if (!used[i] && (_tcschr (argv[i], '*') || _tcschr (argv[i], '?'))) {
+ extract = 1;
+ match = argv[i];
+ used[i] = 1;
+ }
}
- if (!_tcsicmp (argv[i], L"**")) {
- all = -1;
- used[i] = 1;
+ for (i = 1; i < argc && i < 32; i++) {
+ if (!used[i]) {
+ _tcscpy (pathx, argv[i]);
+ GetFullPathName (argv[i], MAX_DPATH, path, NULL);
+ used[i] = 1;
+ break;
+ }
}
- if (!used[i] && (_tcschr (argv[i], '*') || _tcschr (argv[i], '?'))) {
- extract = 1;
- match = argv[i];
- used[i] = 1;
+ for (i = 1; i < argc && i < 32; i++) {
+ if (!used[i]) {
+ parm2 = argv[i];
+ used[i] = 1;
+ break;
+ }
}
- }
- for (i = 1; i < argc && i < 32; i++) {
- if (!used[i]) {
- _tcscpy (pathx, argv[i]);
- GetFullPathName (argv[i], MAX_DPATH, path, NULL);
- used[i] = 1;
- break;
+ for (i = 1; i < argc && i < 32; i++) {
+ if (!used[i]) {
+ parm3 = argv[i];
+ used[i] = 1;
+ break;
+ }
}
- }
- for (i = 1; i < argc && i < 32; i++) {
- if (!used[i]) {
- parm2 = argv[i];
- used[i] = 1;
- break;
+
+ // _tcscpy (tmppath, path);
+ // scanpath (tmppath, path);
+
+ if (crclist) {
+ docrclist (L".");
+ ok = 1;
+ } else if (!list && match) {
+ unpack2 (path, match, 0);
+ ok = 1;
+ } else if (!list && !parm2 && all > 0) {
+ unpack2 (path, L"*", 0);
+ ok = 1;
+ } else if (!list && extract && parm2) {
+ unpack2 (path, parm2, 0);
+ ok = 1;
+ } else if (argc == 2 || (argc > 2 && list)) {
+ unlist (path, all);
+ ok = 1;
+ } else if (((xtract && parm2) || all || (argc >= 3 && parm2)) && !out) {
+ unpack (path, parm2, parm3, 0, all, 0);
+ ok = 1;
+ } else if (parm2 && (argc >= 4 && out)) {
+ unpack (path, parm2, parm3, 1, all, 0);
+ ok = 1;
}
- }
- for (i = 1; i < argc && i < 32; i++) {
- if (!used[i]) {
- parm3 = argv[i];
- used[i] = 1;
- break;
+ if (!ok) {
+ _tprintf (L"UAE unpacker uaeunp 0.7 by Toni Wilen (c)2009\n");
+ _tprintf (L"\n");
+ _tprintf (L"List: \"uaeunp (-l) <path>\"\n");
+ _tprintf (L"List all recursively: \"uaeunp -l <path> **\"\n");
+ _tprintf (L"Extract to file: \"uaeunp (-x) <path> <filename> [<dst name>]\"\n");
+ _tprintf (L"Extract all (single directory): \"uaeunp (-x) <path> *\"\n");
+ _tprintf (L"Extract all (recursively): \"uaeunp (-x) <path> **\"\n");
+ _tprintf (L"Extract all (recursively, current dir): \"uaeunp -e <path> <match string>\"\n");
+ _tprintf (L"Output to console: \"uaeunp (-x) -o <path> <filename>\"\n");
+ _tprintf (L"\n");
+ _tprintf (L"Supported disk image formats:\n");
+ _tprintf (L" ADF, HDF (VHD), DMS, encrypted DMS, IPF, FDI, DSQ, WRP\n");
+ _tprintf (L"Supported filesystems:\n");
+ _tprintf (L" OFS, FFS, SFS, SFS2 and FAT12\n");
+ _tprintf (L"Supported archive formats:\n");
+ _tprintf (L" 7ZIP, LHA, LZX, RAR (unrar.dll), ZIP, ArchiveAccess.DLL\n");
+ _tprintf (L"Miscellaneous formats:\n");
+ _tprintf (L" RDB partition table, GZIP\n");
+
+
}
- }
-
-// _tcscpy (tmppath, path);
-// scanpath (tmppath, path);
-
- if (crclist) {
- docrclist (L".");
- ok = 1;
- } else if (!list && match) {
- unpack2 (path, match, 0);
- ok = 1;
- } else if (!list && !parm2 && all > 0) {
- unpack2 (path, L"*", 0);
- ok = 1;
- } else if (!list && extract && parm2) {
- unpack2 (path, parm2, 0);
- ok = 1;
- } else if (argc == 2 || (argc > 2 && list)) {
- unlist (path, all);
- ok = 1;
- } else if (((xtract && parm2) || all || (argc >= 3 && parm2)) && !out) {
- unpack (path, parm2, parm3, 0, all, 0);
- ok = 1;
- } else if (parm2 && (argc >= 4 && out)) {
- unpack (path, parm2, parm3, 1, all, 0);
- ok = 1;
- }
- if (!ok) {
- _tprintf (L"UAE unpacker uaeunp 0.7 by Toni Wilen (c)2009\n");
- _tprintf (L"\n");
- _tprintf (L"List: \"uaeunp (-l) <path>\"\n");
- _tprintf (L"List all recursively: \"uaeunp -l <path> **\"\n");
- _tprintf (L"Extract to file: \"uaeunp (-x) <path> <filename> [<dst name>]\"\n");
- _tprintf (L"Extract all (single directory): \"uaeunp (-x) <path> *\"\n");
- _tprintf (L"Extract all (recursively): \"uaeunp (-x) <path> **\"\n");
- _tprintf (L"Extract all (recursively, current dir): \"uaeunp -e <path> <match string>\"\n");
- _tprintf (L"Output to console: \"uaeunp (-x) -o <path> <filename>\"\n");
- _tprintf (L"\n");
- _tprintf (L"Supported disk image formats:\n");
- _tprintf (L" ADF, HDF (VHD), DMS, encrypted DMS, IPF, FDI, DSQ, WRP\n");
- _tprintf (L"Supported filesystems:\n");
- _tprintf (L" OFS, FFS, SFS, SFS2 and FAT12\n");
- _tprintf (L"Supported archive formats:\n");
- _tprintf (L" 7ZIP, LHA, LZX, RAR (unrar.dll), ZIP, ArchiveAccess.DLL\n");
- _tprintf (L"Miscellaneous formats:\n");
- _tprintf (L" RDB partition table, GZIP\n");
-
-
- }
- return 0;
+ return 0;
}
/*
- 0.7:
+0.7:
- - vhd read support
+- vhd read support
+- dms, ipf (and possible other) disk image formats didn't unpack inside archives
- 0.6:
+0.6:
- - rdb handling optimization (no more huge memory usage)
- - fat12 supported
+- rdb handling optimization (no more huge memory usage)
+- fat12 supported
- 0.5:
+0.5:
- - adf protection flags fixed
- - sfs support added
- - >512 block sizes supported (rdb hardfiles only)
+- adf protection flags fixed
+- sfs support added
+- >512 block sizes supported (rdb hardfiles only)
- 0.5b:
+0.5b:
- - SFS file extraction fixed
- - SFS2 supported
- - block size autodetection implemented (if non-rdb hardfile)
+- SFS file extraction fixed
+- SFS2 supported
+- block size autodetection implemented (if non-rdb hardfile)
- 0.5c:
+0.5c:
- - rdb_dump.dat added to rdb hardfiles, can be used to dump/backup rdb blocks
+- rdb_dump.dat added to rdb hardfiles, can be used to dump/backup rdb blocks
*/
\ No newline at end of file
struct zfile *l = zlist;
struct zfile *nxt;
+ //write_log (L"%p\n", f);
if (!f)
return;
if (f->opencnt < 0) {
return z2;
}
+static void truncate880k (struct zfile *z)
+{
+ int i;
+ uae_u8 *b;
+
+ if (z == NULL || z->data == NULL)
+ return;
+ if (z->size < 880 * 512 * 2) {
+ int size = 880 * 512 * 2 - z->size;
+ b = xcalloc (size, 1);
+ zfile_fwrite (b, size, 1, z);
+ xfree (b);
+ return;
+ }
+ for (i = 880 * 512 * 2; i < z->size; i++) {
+ if (z->data[i])
+ return;
+ }
+ z->size = 880 * 512 * 2;
+}
+
static struct zfile *extadf (struct zfile *z, int pctype)
{
int i, r;
zfile_fclose (z);
xfree (mfm);
xfree (amigamfmbuffer);
+ truncate880k (zo);
return zo;
end:
zfile_fclose (zo);
xfree (mfm);
xfree (amigamfmbuffer);
xfree (outbuf);
+ truncate880k (zo);
return zo;
end:
if (zo)
xfree (mfm);
xfree (amigamfmbuffer);
xfree (outbuf);
+ truncate880k (zo);
return zo;
end:
if (zo)
}
+static const TCHAR *archive_extensions[] = {
+ L"7z", L"rar", L"zip", L"lha", L"lzh", L"lzx",
+ L"adf", L"adz", L"dsq", L"dms", L"ipf", L"fdi", L"wrp",
+ L"hdf",
+ NULL
+};
static const TCHAR *plugins_7z[] = { L"7z", L"rar", L"zip", L"lha", L"lzh", L"lzx", L"adf", L"dsq", L"hdf", NULL };
static const uae_char *plugins_7z_x[] = { "7z", "Rar!", "MK", NULL, NULL, NULL, NULL, NULL, NULL, NULL };
static const int plugins_7z_t[] = {
}
return l;
}
+
+#ifdef _WIN32
+static int isinternetfile (const TCHAR *name)
+{
+ if (!_tcsnicmp (name, L"http://", 7) || !_tcsnicmp (name, L"https://", 8))
+ return 1;
+ if (!_tcsnicmp (name, L"ftp://", 6))
+ return -1;
+ return 0;
+}
+#include <wininet.h>
+#define INETBUFFERLEN 1000000
+static struct zfile *zfile_fopen_internet (const TCHAR *name, const TCHAR *mode, int mask)
+{
+ static HINTERNET hi;
+ HINTERNET i = NULL;
+ TCHAR tmp[MAX_DPATH];
+ DWORD ierr = 0;
+ DWORD outbuf = sizeof tmp / sizeof (TCHAR);
+ uae_u8 *data = 0;
+ int bufferlen = INETBUFFERLEN;
+ int datalen;
+ DWORD didread;
+ struct zfile *zf = NULL;
+
+ if (_tcschr (mode, 'w') || _tcschr (mode, 'a'))
+ return NULL;
+ tmp[0] = 0;
+ if (!hi) {
+ hi = InternetOpen (WINUAEAPPNAME, INTERNET_OPEN_TYPE_PRECONFIG_WITH_NO_AUTOPROXY, NULL, NULL, 0);
+ if (hi == NULL) {
+ write_log (L"InternetOpen() failed, %d\n", GetLastError ());
+ return NULL;
+ }
+ }
+ i = InternetOpenUrl (hi, name, NULL, 0, INTERNET_FLAG_NO_COOKIES, 0);
+ if (i == NULL) {
+ DWORD err = GetLastError ();
+ if (err == ERROR_INTERNET_EXTENDED_ERROR)
+ InternetGetLastResponseInfo (&ierr, tmp, &outbuf);
+ write_log (L"InternetOpenUrl(%s) failed %d (%d,%s)\n", name, err, ierr, tmp);
+ goto end;
+ }
+
+ if (isinternetfile (name) > 0) {
+ DWORD statuscode;
+ DWORD hindex = 0;
+ DWORD size = sizeof statuscode;
+ if (!HttpQueryInfo (i, HTTP_QUERY_STATUS_CODE | HTTP_QUERY_FLAG_NUMBER, &statuscode, &size, &hindex)) {
+ DWORD err = GetLastError ();
+ write_log (L"HttpQueryInfo(%s) failed %d\n", name, err);
+ goto end;
+ }
+ if (statuscode != 200) {
+ write_log (L"HttpQueryInfo(%s)=%d\n", name, statuscode);
+ goto end;
+ }
+ }
+
+ if (mask & ZFD_CHECKONLY) {
+ zf = zfile_create (NULL);
+ goto end;
+ }
+
+ datalen = 0;
+ data = malloc (bufferlen);
+ for (;;) {
+ if (!InternetReadFile (i, data + datalen, INETBUFFERLEN, &didread)) {
+ DWORD err = GetLastError ();
+ if (err == ERROR_INTERNET_EXTENDED_ERROR)
+ InternetGetLastResponseInfo (&ierr, tmp, &outbuf);
+ write_log (L"InternetReadFile(%s) failed %d (%d,%s)\n", name, err, ierr, tmp);
+ break;
+ }
+ if (didread == 0)
+ break;
+ datalen += didread;
+ if (datalen > bufferlen - INETBUFFERLEN) {
+ bufferlen += INETBUFFERLEN;
+ data = realloc (data, bufferlen);
+ if (!data) {
+ datalen = 0;
+ break;
+ }
+ }
+ }
+ if (datalen > 0) {
+ zf = zfile_create (NULL);
+ if (zf) {
+ zf->size = datalen;
+ zf->data = data;
+ data = NULL;
+ }
+ }
+end:
+ if (i)
+ InternetCloseHandle (i);
+ free (data);
+ return zf;
+}
+#endif
+
struct zfile *zfile_fopen (const TCHAR *name, const TCHAR *mode, int mask)
{
struct zfile *f;
TCHAR tmp[MAX_DPATH];
TCHAR dirsep[2] = { FSDB_DIR_SEPARATOR, '\0' };
+#ifdef _WIN32
+ if (isinternetfile (name))
+ return zfile_fopen_internet (name, mode, mask);
+#endif
f = zfile_fopen_x (name, mode, mask);
if (f)
return f;
added = 0;
zn = zv->root.child;
while (zn) {
+ int done = 0;
struct zfile *z;
TCHAR *ext = _tcsrchr (zn->name, '.');
if (ext && !zn->vchild && zn->type == ZNODE_FILE) {
- for (i = 0; plugins_7z[i]; i++) {
- if (!strcasecmp (ext + 1, plugins_7z[i])) {
+ for (i = 0; !done && archive_extensions[i]; i++) {
+ if (!strcasecmp (ext + 1, archive_extensions[i])) {
zfile_fopen_archive_recurse2 (zv, zn);
+ done = 1;
}
}
}
- z = archive_getzfile (zn, zv->method);
- if (z && iszip (z))
- zfile_fopen_archive_recurse2 (zv, zn);
+ if (!done) {
+ z = archive_getzfile (zn, zv->method);
+ if (z && iszip (z))
+ zfile_fopen_archive_recurse2 (zv, zn);
+ }
zn = zn->next;
}
return 0;
{
struct zfile *zf = NULL;
struct zvolume *zvnew = NULL;
+ int i;
#ifdef ZFILE_DEBUG
write_log (L"unpacking '%s'\n", path);
goto end;
zvnew = zfile_fopen_archive_ext (zv->parentz, zf);
if (!zvnew) {
- struct zfile *zf2 = zuncompress (&zv->root, zf, 0, ZFD_ALL, NULL);
- if (zf2) {
- zf = zf2;
- zvnew = archive_directory_plain (zf);
+ struct zfile *zf2, *zf3;
+ TCHAR oldname[MAX_DPATH];
+ _tcscpy (oldname, zf->name);
+ zf3 = zfile_dup (zf);
+ if (zf3) {
+ zf2 = zuncompress (&zv->root, zf3, 0, ZFD_ALL, NULL);
+ if (zf2) {
+ TCHAR newname[MAX_DPATH];
+ _tcscpy (newname, zf2->name);
+ for (i = _tcslen (newname) - 1; i > 0; i--) {
+ if (newname[i] == '\\' || newname[i] == '/')
+ break;
+ }
+ //_tcscat (oldname, newname + i);
+ //xfree (zf2->name);
+ //zf2->name = my_strdup (oldname);
+ zf = zf2;
+ zvnew = archive_directory_plain (zf);
+ } else {
+ zfile_fclose (zf3);
+ }
}
}
if (!zvnew)