From 64346ddb1dc9e2eb58e83d424d3a43ba48d7fe5c Mon Sep 17 00:00:00 2001 From: Toni Wilen Date: Mon, 9 Mar 2009 18:59:04 +0200 Subject: [PATCH] imported winuaesrc1600b16.zip --- cfgfile.c | 2 +- cia.c | 9 ++--- debug.c | 2 +- expansion.c | 4 +-- filesys.c | 27 +++++++------- gayle.c | 2 +- include/fsdb.h | 1 + include/zarchive.h | 1 + memory.c | 68 +++++++++++++++++++++++------------- newcpu.c | 4 +-- od-win32/clipboard_win32.c | 30 ++++++++-------- od-win32/fsdb_win32.c | 20 +++++++++-- od-win32/win32.h | 4 +-- od-win32/win32gui.c | 14 ++++---- od-win32/winuaechangelog.txt | 13 +++++++ savestate.c | 13 ++++--- zfile.c | 7 +++- zfile_archive.c | 35 +++++++++---------- 18 files changed, 156 insertions(+), 100 deletions(-) diff --git a/cfgfile.c b/cfgfile.c index 93817df5..17db9b78 100644 --- a/cfgfile.c +++ b/cfgfile.c @@ -2799,7 +2799,7 @@ uae_u32 cfgfile_uaelib (int mode, uae_u32 name, uae_u32 dst, uae_u32 maxlen) uae_u8 *restore_configuration (uae_u8 *src) { TCHAR *s = au (src); - write_log (s); + //write_log (s); xfree (s); src += strlen (src) + 1; return src; diff --git a/cia.c b/cia.c index 1e529556..206f5a76 100644 --- a/cia.c +++ b/cia.c @@ -590,10 +590,12 @@ static void bfe001_change (void) } if (currprefs.cs_ciaoverlay && (v & 1) != oldovl) { oldovl = v & 1; - if (!oldovl || ersatzkickfile) + if (!oldovl || ersatzkickfile) { map_overlay (1); - else + } else { + //activate_debugger (); map_overlay (0); + } } } @@ -610,7 +612,7 @@ static uae_u8 ReadCIAA (unsigned int addr) switch (addr & 0xf) { case 0: #ifdef ACTION_REPLAY - action_replay_ciaread(); + action_replay_ciaread (); #endif tmp = DISK_status() & 0x3c; tmp |= handle_joystick_buttons (ciaadra); @@ -1151,7 +1153,6 @@ void CIA_reset (void) ersatz_chipcopy (); else map_overlay (0); - oldovl = 1; #ifdef SERIAL_PORT if (currprefs.use_serial && !savestate_state) serial_dtr_off (); /* Drop DTR at reset */ diff --git a/debug.c b/debug.c index a0bfde5e..e4491caf 100644 --- a/debug.c +++ b/debug.c @@ -746,7 +746,7 @@ static void decode_copper_insn (FILE* file, unsigned long insn, unsigned long ad uae_u32 insn_type = insn & 0x00010001; int hpos, vpos; TCHAR here = ' '; - TCHAR record[] = L" L"; + TCHAR record[] = L" "; if (find_copper_record (addr, &hpos, &vpos)) { _stprintf (record, L" [%03x %03x]", vpos, hpos); } diff --git a/expansion.c b/expansion.c index 6d321775..255f2e02 100644 --- a/expansion.c +++ b/expansion.c @@ -329,7 +329,7 @@ static void REGPARAM2 expamem_bput (uaecptr addr, uae_u32 value) if (expamem_type () == zorroII) { expamem_hi = value; (*card_map[ecard]) (); - write_log (L" Card %d (Zorro%s) done.\n", ecard + 1, expamem_type () == 0xc0 ? "II" : "III"); + write_log (L" Card %d (Zorro%s) done.\n", ecard + 1, expamem_type () == 0xc0 ? L"II" : L"III"); ++ecard; if (ecard < cardno) (*card_init[ecard]) (); @@ -345,7 +345,7 @@ static void REGPARAM2 expamem_bput (uaecptr addr, uae_u32 value) break; case 0x4c: - write_log (L" Card %d (Zorro%s) had no success.\n", ecard + 1, expamem_type () == 0xc0 ? "II" : "III"); + write_log (L" Card %d (Zorro%s) had no success.\n", ecard + 1, expamem_type () == 0xc0 ? L"II" : L"III"); ++ecard; if (ecard < cardno) (*card_init[ecard]) (); diff --git a/filesys.c b/filesys.c index 32e759d3..fa053075 100644 --- a/filesys.c +++ b/filesys.c @@ -844,7 +844,7 @@ typedef uae_u8 *dpacket; #define GET_PCK_ARG5(p) ((uae_s32)(do_get_mem_long ((uae_u32 *)((p) + dp_Arg5)))) #define PUT_PCK64_RES0(p,v) do { do_put_mem_long ((uae_u32 *)((p) + dp64_Res0), (v)); } while (0) -#define PUT_PCK64_RES1(p,v) do { do_put_mem_long ((uae_u32 *)((p) + dp64_Res1), ((v) >> 32)); do_put_mem_long ((uae_u32 *)((p) + dp64_Res1 + 4), ((uae_u32)v)); } while (0) +#define PUT_PCK64_RES1(p,v) do { do_put_mem_long ((uae_u32 *)((p) + dp64_Res1), (((uae_u64)v) >> 32)); do_put_mem_long ((uae_u32 *)((p) + dp64_Res1 + 4), ((uae_u32)v)); } while (0) #define PUT_PCK64_RES2(p,v) do { do_put_mem_long ((uae_u32 *)((p) + dp64_Res2), (v)); } while (0) #define GET_PCK64_TYPE(p) ((uae_s32)(do_get_mem_long ((uae_u32 *)((p) + dp64_Type)))) @@ -2754,7 +2754,7 @@ get_fileinfo (Unit *unit, dpacket packet, uaecptr info, a_inode *aino) #ifdef HAVE_ST_BLOCKS put_long (info + 128, statbuf.st_blocks); #else - put_long (info + 128, (statbuf.st_size > MAXFILESIZE32 ? MAXFILESIZE32 : statbuf.st_size) / 512 + 1); + put_long (info + 128, (statbuf.st_size + 511) / 512); #endif get_time (statbuf.st_mtime, &days, &mins, &ticks); put_long (info + 132, days); @@ -3735,7 +3735,7 @@ action_seek (Unit *unit, dpacket packet) } res = fs_lseek (unit, k->fd, pos, whence); - if (-1 == res) { + if (-1 == res || res > MAXFILESIZE32) { PUT_PCK_RES1 (packet, res); PUT_PCK_RES2 (packet, ERROR_SEEK_ERROR); } else @@ -4479,7 +4479,7 @@ static void action_change_file_position64 (Unit *unit, dpacket packet) PUT_PCK64_RES2 (packet, ERROR_SEEK_ERROR); } else { PUT_PCK64_RES1 (packet, TRUE); - PUT_PCK64_RES2 (packet, DOS_TRUE); + PUT_PCK64_RES2 (packet, 0); } k->file_pos = res; @@ -4498,7 +4498,7 @@ static void action_get_file_position64 (Unit *unit, dpacket packet) } TRACE((L"ACTION_GET_FILE_POSITION64(%s)\n", k->aino->nname)); PUT_PCK64_RES1 (packet, k->file_pos); - PUT_PCK64_RES2 (packet, DOS_TRUE); + PUT_PCK64_RES2 (packet, 0); } static void action_change_file_size64 (Unit *unit, dpacket packet) @@ -4549,7 +4549,7 @@ static void action_change_file_size64 (Unit *unit, dpacket packet) } PUT_PCK64_RES1 (packet, DOS_TRUE); - PUT_PCK64_RES2 (packet, TRUE); + PUT_PCK64_RES2 (packet, 0); } @@ -4572,7 +4572,7 @@ static void action_get_file_size64 (Unit *unit, dpacket packet) if (filesize >= 0) { fs_lseek64 (unit, k->fd, old, SEEK_SET); PUT_PCK64_RES1 (packet, filesize); - PUT_PCK64_RES2 (packet, DOS_TRUE); + PUT_PCK64_RES2 (packet, 0); return; } } @@ -5313,7 +5313,7 @@ static int rdb_mount (UnitInfo *uip, int unit_no, int partnum, uaecptr parmpacke bufrdb[0xdd] = 0; bufrdb[0xde] = 0; bufrdb[0xdf] = 0; - if (rdb_checksum (L"RDSK", bufrdb, rdblock)) { + if (rdb_checksum ("RDSK", bufrdb, rdblock)) { write_log (L"Windows 95/98/ME trashed RDB detected, fixing..\n"); hdf_write (hfd, bufrdb, rdblock * hfd->blocksize, hfd->blocksize); break; @@ -5507,13 +5507,14 @@ static void addfakefilesys (uaecptr parmpacket, uae_u32 dostype) static int dofakefilesys (UnitInfo *uip, uaecptr parmpacket) { int i, size; - TCHAR tmp[1024]; + TCHAR tmp[MAX_DPATH]; + uae_u8 buf[512]; struct zfile *zf; uae_u32 dostype, fsres, fsnode; - memset (tmp, 0, 4); - hdf_read (&uip->hf, tmp, 0, 512); - dostype = (tmp[0] << 24) | (tmp[1] << 16) |(tmp[2] << 8) | tmp[3]; + memset (buf, 0, 4); + hdf_read (&uip->hf, buf, 0, 512); + dostype = (buf[0] << 24) | (buf[1] << 16) |(buf[2] << 8) | buf[3]; if (dostype == 0) return FILESYS_HARDFILE; fsres = get_long (parmpacket + PP_FSRES); @@ -5531,7 +5532,7 @@ static int dofakefilesys (UnitInfo *uip, uaecptr parmpacket) } tmp[0] = 0; - if (uip->filesysdir && _tcslen(uip->filesysdir) > 0) { + if (uip->filesysdir && _tcslen (uip->filesysdir) > 0) { _tcscpy (tmp, uip->filesysdir); } else if ((dostype & 0xffffff00) == 0x444f5300) { _tcscpy (tmp, currprefs.romfile); diff --git a/gayle.c b/gayle.c index bc51f11e..56184ceb 100644 --- a/gayle.c +++ b/gayle.c @@ -340,7 +340,7 @@ static void write_gayle_cs (uae_u8 val) /* PCMCIA disable -> enable */ card_trigger (!(gayle_cs & GAYLE_CS_DIS) ? 1 : 0); if (PCMCIA_LOG) - write_log (L"PCMCIA slot: %s PC=%08X\n", !(gayle_cs & 1) ? "enabled" : "disabled", M68K_GETPC); + write_log (L"PCMCIA slot: %s PC=%08X\n", !(gayle_cs & 1) ? L"enabled" : L"disabled", M68K_GETPC); } } static uae_u8 read_gayle_cs (void) diff --git a/include/fsdb.h b/include/fsdb.h index 766ad23c..2182e3e5 100644 --- a/include/fsdb.h +++ b/include/fsdb.h @@ -140,6 +140,7 @@ extern int my_truncate (const TCHAR *name, uae_u64 len); extern int dos_errno (void); extern int my_existsfile (const TCHAR *name); extern int my_existsdir (const TCHAR *name); +extern FILE *my_opentext (const TCHAR*); extern char *custom_fsdb_search_dir (const char *dirname, TCHAR *rel); extern a_inode *custom_fsdb_lookup_aino_aname (a_inode *base, const TCHAR *aname); diff --git a/include/zarchive.h b/include/zarchive.h index 240c1cba..25c8a143 100644 --- a/include/zarchive.h +++ b/include/zarchive.h @@ -7,6 +7,7 @@ struct zfile { uae_u64 size; uae_u64 seek; int deleteafterclose; + int textmode; struct zfile *next; }; diff --git a/memory.c b/memory.c index f24f5e81..630ae8dd 100644 --- a/memory.c +++ b/memory.c @@ -2632,6 +2632,30 @@ struct zfile *read_rom_name (const TCHAR *filename) return f; } + +static void kickstart_fix_checksum (uae_u8 *mem, int size) +{ + uae_u32 cksum = 0, prevck = 0; + int i, ch = size == 524288 ? 0x7ffe8 : 0x3e; + + mem[ch] = 0; + mem[ch + 1] = 0; + mem[ch + 2] = 0; + mem[ch + 3] = 0; + for (i = 0; i < size; i+=4) { + uae_u32 data = (mem[i] << 24) | (mem[i + 1] << 16) | (mem[i + 2] << 8) | mem[i + 3]; + cksum += data; + if (cksum < prevck) + cksum++; + prevck = cksum; + } + cksum ^= 0xffffffff; + mem[ch++] = cksum >> 24; + mem[ch++] = cksum >> 16; + mem[ch++] = cksum >> 8; + mem[ch++] = cksum >> 0; +} + static uae_char *kickstring = "exec.library"; static int read_kickstart (struct zfile *f, uae_u8 *mem, int size, int dochecksum, int noalias) { @@ -2663,14 +2687,31 @@ static int read_kickstart (struct zfile *f, uae_u8 *mem, int size, int dochecksu } memset (mem, 0, size); + for (i = 0; i < 8; i++) + mem[size - 16 + i * 2 + 1] = 0x18 + i; + mem[size - 20] = size >> 24; + mem[size - 19] = size >> 16; + mem[size - 18] = size >> 8; + mem[size - 17] = size >> 0; + i = zfile_fread (mem, 1, size, f); + if (kickdisk && i > 262144) i = 262144; - +#if 0 if (i >= 262144 && (i != 262144 && i != 524288 && i != 524288 * 2 && i != 524288 * 4)) { notify_user (NUMSG_KSROMREADERROR); return 0; } +#endif + if (i < size - 20) + kickstart_fix_checksum (mem, size); + + j = 1; + while (j < i) + j <<= 1; + i = j; + if (!noalias && i == size / 2) memcpy (mem + size / 2, mem, size / 2); @@ -2750,29 +2791,6 @@ static int load_extendedkickstart (void) return 1; } -static void kickstart_fix_checksum (uae_u8 *mem, int size) -{ - uae_u32 cksum = 0, prevck = 0; - int i, ch = size == 524288 ? 0x7ffe8 : 0x3e; - - mem[ch] = 0; - mem[ch + 1] = 0; - mem[ch + 2] = 0; - mem[ch + 3] = 0; - for (i = 0; i < size; i+=4) { - uae_u32 data = (mem[i] << 24) | (mem[i + 1] << 16) | (mem[i + 2] << 8) | mem[i + 3]; - cksum += data; - if (cksum < prevck) - cksum++; - prevck = cksum; - } - cksum ^= 0xffffffff; - mem[ch++] = cksum >> 24; - mem[ch++] = cksum >> 16; - mem[ch++] = cksum >> 8; - mem[ch++] = cksum >> 0; -} - static int patch_shapeshifter (uae_u8 *kickmemory) { /* Patch Kickstart ROM for ShapeShifter - from Christian Bauer. @@ -3575,7 +3593,7 @@ void memory_reset (void) map_banks (&rtarea_bank, rtarea_base >> 16, 1, 0); #endif - if ((cloanto_rom || currprefs.cs_ksmirror_e0) && !currprefs.maprom && !extendedkickmem_type) + if ((cloanto_rom || currprefs.cs_ksmirror_e0) && (currprefs.maprom != 0xe00000) && !extendedkickmem_type) map_banks (&kickmem_bank, 0xE0, 8, 0); if (currprefs.cs_ksmirror_a8) { if (extendedkickmem2_size) { diff --git a/newcpu.c b/newcpu.c index 0e44ac64..ed7d40de 100644 --- a/newcpu.c +++ b/newcpu.c @@ -2925,11 +2925,11 @@ void m68k_dumpstate (void *f, uaecptr *nextpc) int i, j; for (i = 0; i < 8; i++){ - f_out (f, L" LD%d %08lX ", i, m68k_dreg (®s, i)); + f_out (f, L" D%d %08lX ", i, m68k_dreg (®s, i)); if ((i & 3) == 3) f_out (f, L"\n"); } for (i = 0; i < 8; i++){ - f_out (f, L" LA%d %08lX ", i, m68k_areg (®s, i)); + f_out (f, L" A%d %08lX ", i, m68k_areg (®s, i)); if ((i & 3) == 3) f_out (f, L"\n"); } if (regs.s == 0) regs.usp = m68k_areg (®s, 7); diff --git a/od-win32/clipboard_win32.c b/od-win32/clipboard_win32.c index 7af7f98d..f22c1970 100644 --- a/od-win32/clipboard_win32.c +++ b/od-win32/clipboard_win32.c @@ -65,17 +65,17 @@ static void to_amiga_start (void) uae_Signal (get_long (clipboard_data + 8), 1 << 13); } -static TCHAR *pctoamiga (const TCHAR *txt) +static uae_char *pctoamiga (const uae_char *txt) { int len; - TCHAR *txt2; + uae_char *txt2; int i, j; - len = _tcslen (txt) + 1; - txt2 = xmalloc (len * sizeof (TCHAR)); + len = strlen (txt) + 1; + txt2 = xmalloc (len); j = 0; for (i = 0; i < len; i++) { - TCHAR c = txt[i]; + uae_char c = txt[i]; if (c == 13) continue; txt2[j++] = c; @@ -83,7 +83,7 @@ static TCHAR *pctoamiga (const TCHAR *txt) return txt2; } -static int parsecsi (const uae_u8 *txt, int off, int len) +static int parsecsi (const uae_char *txt, int off, int len) { while (off < len) { if (txt[off] >= 0x40) @@ -104,7 +104,7 @@ static TCHAR *amigatopc (const uae_u8 *txt) cnt = 0; len = strlen (txt) + 1; for (i = 0; i < len; i++) { - TCHAR c = txt[i]; + uae_char c = txt[i]; if (c == 13) pc = 1; if (c == 10) @@ -115,7 +115,7 @@ static TCHAR *amigatopc (const uae_u8 *txt) txt2 = xcalloc (len + cnt, 1); j = 0; for (i = 0; i < len; i++) { - uae_u8 c = txt[i]; + uae_char c = txt[i]; if (c == 0 && i + 1 < len) continue; if (c == 10) @@ -140,11 +140,11 @@ static void to_iff_text (TCHAR *pctxt) uae_u8 b[] = { 'F','O','R','M',0,0,0,0,'F','T','X','T','C','H','R','S',0,0,0,0 }; uae_u32 size; int txtlen; - TCHAR *txt; + uae_char *txt; char *s; - txt = pctoamiga (pctxt); - s = ua (txt); + s = ua (pctxt); + txt = pctoamiga (s); txtlen = strlen (s); xfree (to_amiga); size = txtlen + sizeof b + (txtlen & 1) - 8; @@ -160,7 +160,7 @@ static void to_iff_text (TCHAR *pctxt) to_amiga_size = sizeof b + txtlen + (txtlen & 1); to_amiga = xcalloc (to_amiga_size, 1); memcpy (to_amiga, b, sizeof b); - memcpy (to_amiga + sizeof b, s, txtlen); + memcpy (to_amiga + sizeof b, txt, txtlen); to_amiga_start (); xfree (txt); xfree (s); @@ -676,14 +676,14 @@ static void clipboard_read (HWND hwnd) write_log (L"clipboard: windows clipboard: "); while (f = EnumClipboardFormats (f)) { write_log (L"%d ", f); - if (f == CF_TEXT) + if (f == CF_UNICODETEXT) text = TRUE; if (f == CF_BITMAP) bmp = TRUE; } write_log (L"\n"); if (text) { - hglb = GetClipboardData (CF_TEXT); + hglb = GetClipboardData (CF_UNICODETEXT); if (hglb != NULL) { TCHAR *lptstr = GlobalLock (hglb); if (lptstr != NULL) { @@ -755,7 +755,7 @@ static int clipboard_put_text_real (const TCHAR *txt) TCHAR *lptstr = GlobalLock (hglb); _tcscpy (lptstr, txt); GlobalUnlock (hglb); - SetClipboardData (CF_TEXT, hglb); + SetClipboardData (CF_UNICODETEXT, hglb); ret = TRUE; } CloseClipboard (); diff --git a/od-win32/fsdb_win32.c b/od-win32/fsdb_win32.c index debde65c..47383e9e 100644 --- a/od-win32/fsdb_win32.c +++ b/od-win32/fsdb_win32.c @@ -925,8 +925,24 @@ int my_getvolumeinfo (const TCHAR *root) return ret; } +FILE *my_opentext (const TCHAR *name) +{ + FILE *f; + uae_u8 tmp[4]; + int v; - - + f = _tfopen (name, L"rb"); + if (!f) + return NULL; + v = fread (tmp, 1, 4, f); + fclose (f); + if (v == 4) { + if (tmp[0] == 0xef && tmp[1] == 0xbb && tmp[2] == 0xbf) + return _tfopen (name, L"r, ccs=UTF-8"); + if (tmp[0] == 0xff && tmp[1] == 0xfe) + return _tfopen (name, L"r, ccs=UTF-16LE"); + } + return _tfopen (name, L"r"); +} diff --git a/od-win32/win32.h b/od-win32/win32.h index 909c5547..7abf82a7 100644 --- a/od-win32/win32.h +++ b/od-win32/win32.h @@ -17,8 +17,8 @@ #define WINUAEPUBLICBETA 1 -#define WINUAEBETA L"15" -#define WINUAEDATE MAKEBD(2009, 3, 7) +#define WINUAEBETA L"16" +#define WINUAEDATE MAKEBD(2009, 3, 9) #define WINUAEEXTRA L"" #define WINUAEREV L"" diff --git a/od-win32/win32gui.c b/od-win32/win32gui.c index d48ddbec..1fecef03 100644 --- a/od-win32/win32gui.c +++ b/od-win32/win32gui.c @@ -882,11 +882,11 @@ static struct romdata *scan_single_rom_2 (struct zfile *f) return 0; } zfile_fread (buffer, 1, 11, f); - if (!memcmp (buffer, L"KICK", 4)) { + if (!memcmp (buffer, "KICK", 4)) { zfile_fseek (f, 512, SEEK_SET); if (size > 262144) size = 262144; - } else if (!memcmp (buffer, L"AMIROMTYPE1", 11)) { + } else if (!memcmp (buffer, "AMIROMTYPE1", 11)) { cl = 1; size -= 11; } else { @@ -1299,7 +1299,7 @@ int target_cfgfile_load (struct uae_prefs *p, TCHAR *filename, int type, int isd _tcscpy (fname, filename); if (!zfile_exists (fname)) { fetch_configurationpath (fname, sizeof (fname) / sizeof (TCHAR)); - if (memcmp(fname, filename, _tcslen (fname))) + if (_tcsncmp (fname, filename, _tcslen (fname))) _tcscat (fname, filename); else _tcscpy (fname, filename); @@ -2181,7 +2181,7 @@ static struct ConfigStruct *readconfigcache (const TCHAR *path) err = 0; first = NULL; getconfigcache (cachepath, path); - zcache = _tfopen (cachepath, L"r"); + zcache = my_opentext (cachepath); if (!zcache) return NULL; if (!configurationcache) { @@ -2967,7 +2967,7 @@ void InitializeListView (HWND hDlg) _tcscpy (devname_str, L"n/a"); _tcscpy (volname_str, L"n/a"); _tcscpy (bootpri_str, L"n/a"); - if (!memcmp (rootdir, L"HD_", 3)) + if (!_tcsncmp (rootdir, L"HD_", 3)) rootdir += 3; } else { _tcscpy (blocksize_str, L"n/a"); @@ -7493,9 +7493,9 @@ static void hardfile_testrdb (HWND hDlg, struct hfdlg_vals *hdf) return; zfile_fread (tmp, 1, sizeof (tmp), f); zfile_fclose (f); - if (!memcmp (tmp + 2, L"CIS", 3)) + if (!memcmp (tmp + 2, "CIS", 3)) hdf->controller = HD_CONTROLLER_PCMCIA_SRAM; - if (!memcmp (tmp, L"RDSK\0\0\0", 7)) { + if (!memcmp (tmp, "RDSK\0\0\0", 7)) { hdf->sectors = 0; hdf->surfaces = 0; hdf->reserved = 0; diff --git a/od-win32/winuaechangelog.txt b/od-win32/winuaechangelog.txt index 54f6d6c0..9f5b3bc4 100644 --- a/od-win32/winuaechangelog.txt +++ b/od-win32/winuaechangelog.txt @@ -1,4 +1,17 @@ +Beta 16: + +- multiple unicode conversion issues fixed, hardfile/drive issues, + clipboard text conversion, statefiles etc.. +- automatically add KS rom "footer" if rom is too short (for my own + rom project, more information later...) +- unrar.dll support fixed and uses now unicode functions +- all text file reading routines now automatically support UTF-8 and + UTF-16LE formats if BOM is included (plain files only, not inside + archives yet) +- directory filesystem seek 2G test added, 64-bit seek function return + code fix + Beta 15: - WinUAE is now native unicode application (internally all strings are diff --git a/savestate.c b/savestate.c index bf0c0f49..6409be5d 100644 --- a/savestate.c +++ b/savestate.c @@ -150,13 +150,13 @@ void save_u8_func (uae_u8 **dstp, uae_u8 v) void save_string_func (uae_u8 **dstp, const TCHAR *from) { uae_u8 *dst = *dstp; - char *s; - s = ua (from); + char *s, *s2; + s2 = s = ua (from); while (s && *s) *dst++ = *s++; *dst++ = 0; *dstp = dst; - xfree (s); + xfree (s2); } uae_u32 restore_u32_func (uae_u8 **dstp) @@ -221,6 +221,7 @@ static void save_chunk (struct zfile *f, uae_u8 *chunk, size_t len, TCHAR *name, uae_u32 flags; size_t pos; size_t chunklen, len2; + char *s; if (!chunk) return; @@ -231,7 +232,9 @@ static void save_chunk (struct zfile *f, uae_u8 *chunk, size_t len, TCHAR *name, } /* chunk name */ - zfile_fwrite (name, 1, 4, f); + s = ua (name); + zfile_fwrite (s, 1, 4, f); + xfree (s); pos = zfile_ftell (f); /* chunk size */ dst = &tmp[0]; @@ -384,7 +387,7 @@ static void restore_header (uae_u8 *src) emuversion = restore_string (); description = restore_string (); write_log (L"Saved with: '%s %s', description: '%s'\n", - emuname,emuversion,description); + emuname, emuversion, description); xfree (description); xfree (emuversion); xfree (emuname); diff --git a/zfile.c b/zfile.c index 246612ab..5ef4581b 100644 --- a/zfile.c +++ b/zfile.c @@ -519,7 +519,12 @@ static struct zfile *zfile_fopen_2 (const TCHAR *name, const TCHAR *mode) } else { l = zfile_create (); l->name = my_strdup (name); - f = _tfopen (l->name, mode); + if (!_tcsicmp (mode, L"r")) { + f = my_opentext (l->name); + l->textmode = 1; + } else { + f = _tfopen (l->name, mode); + } if (!f) { zfile_fclose (l); return 0; diff --git a/zfile_archive.c b/zfile_archive.c index b7c918ba..2db23540 100644 --- a/zfile_archive.c +++ b/zfile_archive.c @@ -438,8 +438,8 @@ struct zfile *archive_access_7z (struct znode *zn) /* copy and paste job? you are only imagining it! */ static struct zfile *rarunpackzf; /* stupid unrar.dll */ #include -typedef HANDLE (_stdcall* RAROPENARCHIVE)(struct RAROpenArchiveData*); -static RAROPENARCHIVE pRAROpenArchive; +typedef HANDLE (_stdcall* RAROPENARCHIVEEX)(struct RAROpenArchiveDataEx*); +static RAROPENARCHIVEEX pRAROpenArchiveEx; typedef int (_stdcall* RARREADHEADEREX)(HANDLE,struct RARHeaderDataEx*); static RARREADHEADEREX pRARReadHeaderEx; typedef int (_stdcall* RARPROCESSFILE)(HANDLE,int,char*,char*); @@ -473,13 +473,13 @@ static int canrar(void) rarlib = WIN32_LoadLibrary (L"unrar.dll"); if (rarlib) { - pRAROpenArchive = (RAROPENARCHIVE)GetProcAddress (rarlib, "RAROpenArchive"); + pRAROpenArchiveEx = (RAROPENARCHIVEEX)GetProcAddress (rarlib, "RAROpenArchiveEx"); pRARReadHeaderEx = (RARREADHEADEREX)GetProcAddress (rarlib, "RARReadHeaderEx"); pRARProcessFile = (RARPROCESSFILE)GetProcAddress (rarlib, "RARProcessFile"); pRARCloseArchive = (RARCLOSEARCHIVE)GetProcAddress (rarlib, "RARCloseArchive"); pRARSetCallback = (RARSETCALLBACK)GetProcAddress (rarlib, "RARSetCallback"); pRARGetDllVersion = (RARGETDLLVERSION)GetProcAddress (rarlib, "RARGetDllVersion"); - if (pRAROpenArchive && pRARReadHeaderEx && pRARProcessFile && pRARCloseArchive && pRARSetCallback) { + if (pRAROpenArchiveEx && pRARReadHeaderEx && pRARProcessFile && pRARCloseArchive && pRARSetCallback) { israr = 1; write_log (L"unrar.dll version %08X detected and used\n", pRARGetDllVersion ? pRARGetDllVersion() : -1); @@ -502,7 +502,7 @@ static int CALLBACK RARCallbackProc (UINT msg,LONG UserData,LONG P1,LONG P2) struct RARContext { - struct RAROpenArchiveData OpenArchiveData; + struct RAROpenArchiveDataEx OpenArchiveData; struct RARHeaderDataEx HeaderData; HANDLE hArcData; }; @@ -520,7 +520,7 @@ struct zvolume *archive_directory_rar (struct zfile *z) struct zfile *zftmp; int cnt; - if (!canrar()) + if (!canrar ()) return archive_directory_arcacc (z, ArchiveFormatRAR); if (z->data) /* wtf? stupid unrar.dll only accept filename as an input.. */ @@ -529,12 +529,11 @@ struct zvolume *archive_directory_rar (struct zfile *z) zv = zvolume_alloc (z, ArchiveFormatRAR, rc); fclose (z->f); /* bleh, unrar.dll fails to open the archive if it is already open.. */ z->f = NULL; - rc->OpenArchiveData.ArcName = ua (z->name); + rc->OpenArchiveData.ArcNameW = z->name; rc->OpenArchiveData.OpenMode = RAR_OM_LIST; - rc->hArcData = pRAROpenArchive (&rc->OpenArchiveData); - xfree (rc->OpenArchiveData.ArcName); + rc->hArcData = pRAROpenArchiveEx (&rc->OpenArchiveData); if (rc->OpenArchiveData.OpenResult != 0) { - xfree(rc); + xfree (rc); if (!rar_resetf (z)) { zfile_fclose_archive (zv); return NULL; @@ -545,17 +544,15 @@ struct zvolume *archive_directory_rar (struct zfile *z) pRARSetCallback (rc->hArcData, RARCallbackProc, 0); cnt = 0; while (pRARReadHeaderEx (rc->hArcData, &rc->HeaderData) == 0) { - TCHAR *name = au (rc->HeaderData.FileName); struct zarchive_info zai; struct znode *zn; memset(&zai, 0, sizeof zai); - zai.name = name; + zai.name = rc->HeaderData.FileNameW; zai.size = rc->HeaderData.UnpSize; zai.t = fromdostime (rc->HeaderData.FileTime); zn = zvolume_addfile_abs (zv, &zai); zn->offset = cnt++; pRARProcessFile (rc->hArcData, RAR_SKIP, NULL, NULL); - xfree (name); } pRARCloseArchive (rc->hArcData); zftmp = zfile_fopen_empty (z->name, 0); @@ -573,22 +570,22 @@ struct zfile *archive_access_rar (struct znode *zn) if (zn->volume->method != ArchiveFormatRAR) return archive_access_arcacc (zn); rc->OpenArchiveData.OpenMode = RAR_OM_EXTRACT; - rc->hArcData = pRAROpenArchive(&rc->OpenArchiveData); + rc->hArcData = pRAROpenArchiveEx (&rc->OpenArchiveData); if (rc->OpenArchiveData.OpenResult != 0) return NULL; - pRARSetCallback(rc->hArcData, RARCallbackProc, 0); + pRARSetCallback (rc->hArcData, RARCallbackProc, 0); for (i = 0; i <= zn->offset; i++) { - if (pRARReadHeaderEx(rc->hArcData, &rc->HeaderData)) + if (pRARReadHeaderEx (rc->hArcData, &rc->HeaderData)) return NULL; if (i < zn->offset) { - if (pRARProcessFile(rc->hArcData, RAR_SKIP, NULL, NULL)) + if (pRARProcessFile (rc->hArcData, RAR_SKIP, NULL, NULL)) goto end; } } zf = zfile_fopen_empty (zn->fullname, zn->size); rarunpackzf = zf; - if (pRARProcessFile(rc->hArcData, RAR_TEST, NULL, NULL)) { - zfile_fclose(zf); + if (pRARProcessFile (rc->hArcData, RAR_TEST, NULL, NULL)) { + zfile_fclose (zf); zf = NULL; } end: -- 2.47.3