diff -Naur advancemame-0.84.0/advance/advance.mak advancemame-0.84.0-patched/advance/advance.mak
--- advancemame-0.84.0/advance/advance.mak	Sun Jul 25 13:57:03 2004
+++ advancemame-0.84.0-patched/advance/advance.mak	Mon Jul 26 20:34:23 2004
@@ -286,22 +286,22 @@
 pkgdocdir = $(docdir)/advance
 
 installdirs:
-	-$(INSTALL_DATA_DIR) $(pkgdir)
-	-$(INSTALL_DATA_DIR) $(pkgdocdir)
-	-$(INSTALL_MAN_DIR) $(mandir)/man1
+	-$(INSTALL_DATA_DIR) $(DESTDIR)$(pkgdir)
+	-$(INSTALL_DATA_DIR) $(DESTDIR)$(pkgdocdir)
+	-$(INSTALL_MAN_DIR) $(DESTDIR)$(mandir)/man1
 ifneq ($(wildcard $(EMUSRC)),)
-	-$(INSTALL_DATA_DIR) $(pkgdir)/rom
-	-$(INSTALL_DATA_DIR) $(pkgdir)/sample
-	-$(INSTALL_DATA_DIR) $(pkgdir)/artwork
-	-$(INSTALL_DATA_DIR) $(pkgdir)/image
-	-$(INSTALL_DATA_DIR) $(pkgdir)/crc
+	-$(INSTALL_DATA_DIR) $(DESTDIR)$(pkgdir)/rom
+	-$(INSTALL_DATA_DIR) $(DESTDIR)$(pkgdir)/sample
+	-$(INSTALL_DATA_DIR) $(DESTDIR)$(pkgdir)/artwork
+	-$(INSTALL_DATA_DIR) $(DESTDIR)$(pkgdir)/image
+	-$(INSTALL_DATA_DIR) $(DESTDIR)$(pkgdir)/crc
 endif
 
 install-data: $(INSTALL_DATAFILES)
 ifdef INSTALL_DATAFILES
 	@for i in $(INSTALL_DATAFILES); do \
-		echo "$(INSTALL_DATA) $$i $(pkgdir)"; \
-		$(INSTALL_DATA) $$i $(pkgdir); \
+		echo "$(INSTALL_DATA) $$i $(DESTDIR)$(pkgdir)"; \
+		$(INSTALL_DATA) $$i $(DESTDIR)$(pkgdir); \
 	done
 endif
 
@@ -314,8 +314,8 @@
 
 install-bin: $(INSTALL_BINFILES)
 	@for i in $(INSTALL_BINFILES); do \
-		echo "$(INSTALL_PROGRAM) $$i $(bindir)"; \
-		$(INSTALL_PROGRAM) $$i $(bindir); \
+		echo "$(INSTALL_PROGRAM) $$i $(DESTDIR)$(bindir)"; \
+		$(INSTALL_PROGRAM) $$i $(DESTDIR)$(bindir); \
 	done
 
 uninstall-bin:
@@ -326,8 +326,8 @@
 install-doc: $(DOCOBJ) $(INSTALL_DOCFILES)
 ifdef INSTALL_DOCFILES
 	@for i in $(INSTALL_DOCFILES); do \
-		echo "$(INSTALL_DATA) $$i $(pkgdocdir)"; \
-		$(INSTALL_DATA) $$i $(pkgdocdir); \
+		echo "$(INSTALL_DATA) $$i $(DESTDIR)$(pkgdocdir)"; \
+		$(INSTALL_DATA) $$i $(DESTDIR)$(pkgdocdir); \
 	done
 endif
 
@@ -341,8 +341,8 @@
 install-man: $(DOCOBJ) $(INSTALL_MANFILES)
 ifdef INSTALL_MANFILES
 	@for i in $(INSTALL_MANFILES); do \
-		echo "$(INSTALL_DATA) $$i $(mandir)/man1"; \
-		$(INSTALL_DATA) $$i $(mandir)/man1; \
+		echo "$(INSTALL_DATA) $$i $(DESTDIR)$(mandir)/man1"; \
+		$(INSTALL_DATA) $$i $(DESTDIR)$(mandir)/man1; \
 	done
 endif
 
diff -Naur advancemame-0.84.0/advance/advance.mak.orig advancemame-0.84.0-patched/advance/advance.mak.orig
--- advancemame-0.84.0/advance/advance.mak.orig	Wed Dec 31 19:00:00 1969
+++ advancemame-0.84.0-patched/advance/advance.mak.orig	Sun Jul 25 13:57:03 2004
@@ -0,0 +1,461 @@
+############################################################################
+# Common dir
+
+OBJ = obj/$(CONF_EMU)/$(BINARYDIR)
+MENUOBJ = obj/menu/$(BINARYDIR)
+MOBJ = obj/m/$(BINARYDIR)
+JOBJ = obj/j/$(BINARYDIR)
+KOBJ = obj/k/$(BINARYDIR)
+IOBJ = obj/i/$(BINARYDIR)
+VOBJ = obj/v/$(BINARYDIR)
+SOBJ = obj/s/$(BINARYDIR)
+CFGOBJ = obj/cfg/$(BINARYDIR)
+LINEOBJ = obj/line/$(BINARYBUILDDIR)
+D2OBJ = obj/d2/$(BINARYBUILDDIR)
+DOCOBJ = obj/doc
+
+############################################################################
+# Common targets
+
+ifdef ADVANCE_ALL
+all_override: $(ADVANCE_ALL)
+endif
+
+ifneq ($(wildcard $(EMUSRC)),)
+INSTALL_DIRS += $(OBJ)
+INSTALL_BINFILES += $(OBJ)/$(EMUNAME)$(EXE)
+INSTALL_DIRS += $(DOCOBJ)
+INSTALL_MANFILES += $(DOCOBJ)/advmame.1
+INSTALL_MANFILES += $(DOCOBJ)/advdev.1
+ifeq ($(CONF_EMU),mame)
+INSTALL_DATAFILES += $(srcdir)/support/event.dat
+INSTALL_DATAFILES += $(srcdir)/support/history.dat
+INSTALL_BINFILES += $(OBJ)/chdman$(EXE)
+endif
+ifeq ($(CONF_EMU),mess)
+INSTALL_DATAFILES += $(srcdir)/support/sysinfo.dat
+INSTALL_MANFILES += $(srcdir)/support/advmess.1
+endif
+endif
+ifneq ($(wildcard $(srcdir)/advance/menu.mak),)
+INSTALL_DIRS += $(MENUOBJ) $(DOCOBJ)
+INSTALL_BINFILES += $(MENUOBJ)/advmenu$(EXE)
+INSTALL_MANFILES += $(DOCOBJ)/advmenu.1
+endif
+ifneq ($(wildcard $(srcdir)/advance/cfg.mak),)
+INSTALL_DIRS += $(CFGOBJ) $(DOCOBJ)
+INSTALL_BINFILES += $(CFGOBJ)/advcfg$(EXE)
+INSTALL_MANFILES += $(DOCOBJ)/advcfg.1
+endif
+ifneq ($(wildcard $(srcdir)/advance/v.mak),)
+INSTALL_DIRS += $(VOBJ) $(DOCOBJ)
+INSTALL_BINFILES += $(VOBJ)/advv$(EXE)
+INSTALL_MANFILES += $(DOCOBJ)/advv.1
+endif
+ifneq ($(CONF_SYSTEM),windows)
+ifneq ($(wildcard $(srcdir)/advance/s.mak),)
+INSTALL_DIRS += $(SOBJ) $(DOCOBJ)
+INSTALL_BINFILES += $(SOBJ)/advs$(EXE)
+INSTALL_MANFILES += $(DOCOBJ)/advs.1
+endif
+ifneq ($(wildcard $(srcdir)/advance/k.mak),)
+INSTALL_DIRS += $(KOBJ) $(DOCOBJ)
+INSTALL_BINFILES += $(KOBJ)/advk$(EXE)
+INSTALL_MANFILES += $(DOCOBJ)/advk.1
+endif
+ifneq ($(wildcard $(srcdir)/advance/j.mak),)
+INSTALL_DIRS += $(JOBJ) $(DOCOBJ)
+INSTALL_BINFILES += $(JOBJ)/advj$(EXE)
+INSTALL_MANFILES += $(DOCOBJ)/advj.1
+endif
+ifneq ($(wildcard $(srcdir)/advance/m.mak),)
+INSTALL_DIRS += $(MOBJ) $(DOCOBJ)
+INSTALL_BINFILES += $(MOBJ)/advm$(EXE)
+INSTALL_MANFILES += $(DOCOBJ)/advm.1
+endif
+endif
+
+INSTALL_DOCFILES += $(subst $(srcdir)/doc/,$(DOCOBJ)/,$(subst .d,.txt,$(wildcard $(srcdir)/doc/*.d)))
+INSTALL_DOCFILES += $(subst $(srcdir)/doc/,$(DOCOBJ)/,$(subst .d,.html,$(wildcard $(srcdir)/doc/*.d)))
+WEB_DOCFILES += $(subst $(srcdir)/doc/,$(DOCOBJ)/,$(subst .d,.hh,$(wildcard $(srcdir)/doc/*.d)))
+
+all: $(INSTALL_DIRS) $(INSTALL_BINFILES) $(INSTALL_DOCFILES) $(INSTALL_MANFILES) $(INSTALL_DATAFILES)
+emu: $(OBJ) $(OBJ)/$(EMUNAME)$(EXE)
+menu: $(MENUOBJ) $(MENUOBJ)/advmenu$(EXE)
+cfg: $(CFGOBJ) $(CFGOBJ)/advcfg$(EXE)
+v: $(VOBJ) $(VOBJ)/advv$(EXE)
+s: $(SOBJ) $(SOBJ)/advs$(EXE)
+k: $(KOBJ) $(KOBJ)/advk$(EXE)
+i: $(IOBJ) $(IOBJ)/advi$(EXE)
+j: $(JOBJ) $(JOBJ)/advj$(EXE)
+m: $(MOBJ) $(MOBJ)/advm$(EXE)
+line: $(LINEOBJ) $(LINEOBJ)/advline$(EXE_BUILD)
+d2: $(D2OBJ) $(D2OBJ)/advd2$(EXE_BUILD)
+web: $(DOCOBJ) $(WEB_DOCFILES)
+
+# Ensure that the doc target is always created also if a doc directory exists
+.PHONY: doc
+
+doc: $(DOCOBJ) $(INSTALL_DOCFILES)
+
+############################################################################
+# Common SRC
+
+RCSRC = $(srcdir)/support/pcvga.rc \
+	$(srcdir)/support/pcsvga60.rc \
+	$(srcdir)/support/standard.rc \
+	$(srcdir)/support/medium.rc \
+	$(srcdir)/support/extended.rc \
+	$(srcdir)/support/pal.rc \
+	$(srcdir)/support/ntsc.rc
+
+MPGLIB_SRC = \
+	$(wildcard $(srcdir)/advance/mpglib/*.c) \
+	$(wildcard $(srcdir)/advance/mpglib/*.h) \
+	$(wildcard $(srcdir)/advance/mpglib/*.txt)
+
+EXPAT_SRC = \
+	$(wildcard $(srcdir)/advance/expat/*.c) \
+	$(wildcard $(srcdir)/advance/expat/*.h) \
+	$(wildcard $(srcdir)/advance/expat/COPYING) \
+	$(wildcard $(srcdir)/advance/expat/README) \
+	$(wildcard $(srcdir)/advance/expat/*.diff)
+
+LIB_SRC = \
+	$(wildcard $(srcdir)/advance/lib/*.c) \
+	$(wildcard $(srcdir)/advance/lib/*.h) \
+	$(wildcard $(srcdir)/advance/lib/*.hin) \
+	$(wildcard $(srcdir)/advance/lib/*.ico) \
+	$(wildcard $(srcdir)/advance/lib/*.rc) \
+	$(wildcard $(srcdir)/advance/lib/*.dat) \
+	$(wildcard $(srcdir)/advance/lib/*.cfg) \
+	$(wildcard $(srcdir)/advance/lib/*.html)
+
+BLIT_SRC = \
+	$(wildcard $(srcdir)/advance/blit/*.c) \
+	$(wildcard $(srcdir)/advance/blit/*.h) \
+	$(wildcard $(srcdir)/advance/blit/*.dat)
+
+CARD_SRC = \
+	$(wildcard $(srcdir)/advance/card/*.c) \
+	$(wildcard $(srcdir)/advance/card/*.h)
+	
+SVGALIB_SRC = \
+	$(wildcard $(srcdir)/advance/svgalib/*.c) \
+	$(wildcard $(srcdir)/advance/svgalib/*.h) \
+	$(wildcard $(srcdir)/advance/svgalib/*.dif) \
+	$(wildcard $(srcdir)/advance/svgalib/*.txt) \
+	$(wildcard $(srcdir)/advance/svgalib/*.bat) \
+	$(wildcard $(srcdir)/advance/svgalib/*.sh) \
+	$(wildcard $(srcdir)/advance/svgalib/*.cfg) \
+	$(wildcard $(srcdir)/advance/svgalib/*.html)
+
+SVGALIBDRIVERS_SRC = \
+	$(wildcard $(srcdir)/advance/svgalib/drivers/*.c) \
+        $(wildcard $(srcdir)/advance/svgalib/drivers/*.h)
+
+SVGALIBCLOCKCHI_SRC = \
+	$(wildcard $(srcdir)/advance/svgalib/clockchi/*.c) \
+        $(wildcard $(srcdir)/advance/svgalib/clockchi/*.h)
+
+SVGALIBRAMDAC_SRC = \
+	$(wildcard $(srcdir)/advance/svgalib/ramdac/*.c) \
+	$(wildcard $(srcdir)/advance/svgalib/ramdac/*.h)
+
+SVGALIBSVGADOS_SRC = \
+	$(wildcard $(srcdir)/advance/svgalib/svgados/*.c)
+
+SVGALIBSVGAWIN_SRC = \
+	$(wildcard $(srcdir)/advance/svgalib/svgawin/*.c) \
+	$(wildcard $(srcdir)/advance/svgalib/svgawin/*.h)
+
+SVGALIBSVGAWINSYS_SRC = \
+	$(wildcard $(srcdir)/advance/svgalib/svgawin/sys/*.h)
+
+SVGALIBSVGAWININSTALL_SRC = \
+	$(wildcard $(srcdir)/advance/svgalib/svgawin/install/makefile) \
+	$(wildcard $(srcdir)/advance/svgalib/svgawin/install/*.c) \
+	$(wildcard $(srcdir)/advance/svgalib/svgawin/install/*.h)
+
+SVGALIBSVGAWINDRIVER_SRC = \
+	$(wildcard $(srcdir)/advance/svgalib/svgawin/driver/makefile) \
+	$(wildcard $(srcdir)/advance/svgalib/svgawin/driver/sources) \
+	$(wildcard $(srcdir)/advance/svgalib/svgawin/driver/*.rc) \
+	$(wildcard $(srcdir)/advance/svgalib/svgawin/driver/*.c) \
+	$(wildcard $(srcdir)/advance/svgalib/svgawin/driver/*.h)
+
+SVGALIBSVGAVDD_SRC = \
+	$(wildcard $(srcdir)/advance/svgalib/svgavdd/*.c)
+
+SVGALIBSVGAVDDVDD_SRC = \
+	$(wildcard $(srcdir)/advance/svgalib/svgavdd/vdd/makefile) \
+	$(wildcard $(srcdir)/advance/svgalib/svgavdd/vdd/sources) \
+	$(wildcard $(srcdir)/advance/svgalib/svgavdd/vdd/*.rc) \
+	$(wildcard $(srcdir)/advance/svgalib/svgavdd/vdd/*.def) \
+	$(wildcard $(srcdir)/advance/svgalib/svgavdd/vdd/*.c) \
+	$(wildcard $(srcdir)/advance/svgalib/svgavdd/vdd/*.h)
+
+V_SRC = \
+	$(wildcard $(srcdir)/advance/v/*.c) \
+	$(wildcard $(srcdir)/advance/v/*.h)
+
+S_SRC = \
+	$(wildcard $(srcdir)/advance/s/*.c) \
+	$(wildcard $(srcdir)/advance/s/*.h)
+
+I_SRC = \
+	$(wildcard $(srcdir)/advance/i/*.c) \
+	$(wildcard $(srcdir)/advance/i/*.h)
+
+K_SRC = \
+	$(wildcard $(srcdir)/advance/k/*.c) \
+	$(wildcard $(srcdir)/advance/k/*.h)
+
+J_SRC = \
+	$(wildcard $(srcdir)/advance/j/*.c) \
+	$(wildcard $(srcdir)/advance/j/*.h)
+
+M_SRC = \
+	$(wildcard $(srcdir)/advance/m/*.c) \
+	$(wildcard $(srcdir)/advance/m/*.h)
+
+CFG_SRC = \
+	$(wildcard $(srcdir)/advance/cfg/*.c)
+
+LINE_SRC = \
+	$(wildcard $(srcdir)/advance/line/*.cc)
+
+SRCOSD = \
+	$(wildcard $(srcdir)/advance/osd/*.c) \
+	$(wildcard $(srcdir)/advance/osd/*.h) \
+	$(wildcard $(srcdir)/advance/osd/*.y) \
+	$(wildcard $(srcdir)/advance/osd/*.l) \
+	$(wildcard $(srcdir)/advance/osd/*.dat)
+
+LINUX_SRC = \
+	$(wildcard $(srcdir)/advance/linux/*.c) \
+	$(wildcard $(srcdir)/advance/linux/*.h)
+
+DOS_SRC = \
+	$(wildcard $(srcdir)/advance/dos/*.c) \
+	$(wildcard $(srcdir)/advance/dos/*.h) \
+	$(wildcard $(srcdir)/advance/dos/*.dat)
+
+WINDOWS_SRC = \
+	$(wildcard $(srcdir)/advance/windows/*.c) \
+	$(wildcard $(srcdir)/advance/windows/*.h)
+
+SDL_SRC = \
+	$(wildcard $(srcdir)/advance/sdl/*.c) \
+	$(wildcard $(srcdir)/advance/sdl/*.h) \
+	$(wildcard $(srcdir)/advance/sdl/*.dat)
+
+D2_SRC = \
+	$(wildcard $(srcdir)/advance/d2/*.cc)
+
+CONF_SRC = \
+	$(srcdir)/Makefile.in \
+	$(srcdir)/Makefile.usr \
+	$(srcdir)/root.mak \
+	$(srcdir)/configure.ac \
+	$(srcdir)/configure \
+	$(srcdir)/configure.dos \
+	$(srcdir)/configure.windows \
+	$(srcdir)/configure.darwin \
+	$(srcdir)/aclocal.m4 \
+	$(srcdir)/config.guess \
+	$(srcdir)/config.sub \
+	$(srcdir)/install-sh \
+	$(srcdir)/missing
+
+CONF_BIN = \
+	$(srcdir)/support/confbin/INSTALL \
+	$(srcdir)/support/confbin/Makefile.am \
+	$(srcdir)/support/confbin/Makefile.in \
+	$(srcdir)/support/confbin/configure.ac \
+	$(srcdir)/support/confbin/autogen.sh \
+	$(srcdir)/support/confbin/configure \
+	$(srcdir)/support/confbin/aclocal.m4 \
+	$(srcdir)/support/confbin/install-sh \
+	$(srcdir)/support/confbin/missing
+
+############################################################################
+# Common install
+
+pkgdir = $(datadir)/advance
+pkgdocdir = $(docdir)/advance
+
+installdirs:
+	-$(INSTALL_DATA_DIR) $(pkgdir)
+	-$(INSTALL_DATA_DIR) $(pkgdocdir)
+	-$(INSTALL_MAN_DIR) $(mandir)/man1
+ifneq ($(wildcard $(EMUSRC)),)
+	-$(INSTALL_DATA_DIR) $(pkgdir)/rom
+	-$(INSTALL_DATA_DIR) $(pkgdir)/sample
+	-$(INSTALL_DATA_DIR) $(pkgdir)/artwork
+	-$(INSTALL_DATA_DIR) $(pkgdir)/image
+	-$(INSTALL_DATA_DIR) $(pkgdir)/crc
+endif
+
+install-data: $(INSTALL_DATAFILES)
+ifdef INSTALL_DATAFILES
+	@for i in $(INSTALL_DATAFILES); do \
+		echo "$(INSTALL_DATA) $$i $(pkgdir)"; \
+		$(INSTALL_DATA) $$i $(pkgdir); \
+	done
+endif
+
+uninstall-data:
+ifdef INSTALL_DATAFILES
+	@for i in $(INSTALL_DATAFILES); do \
+		rm -f $(pkgdir)/$$i; \
+	done
+endif
+
+install-bin: $(INSTALL_BINFILES)
+	@for i in $(INSTALL_BINFILES); do \
+		echo "$(INSTALL_PROGRAM) $$i $(bindir)"; \
+		$(INSTALL_PROGRAM) $$i $(bindir); \
+	done
+
+uninstall-bin:
+	@for i in $(INSTALL_BINFILES); do \
+		rm -f $(bindir)/$$i; \
+	done
+
+install-doc: $(DOCOBJ) $(INSTALL_DOCFILES)
+ifdef INSTALL_DOCFILES
+	@for i in $(INSTALL_DOCFILES); do \
+		echo "$(INSTALL_DATA) $$i $(pkgdocdir)"; \
+		$(INSTALL_DATA) $$i $(pkgdocdir); \
+	done
+endif
+
+uninstall-doc:
+ifdef INSTALL_DOCFILES
+	@for i in $(INSTALL_DOCFILES); do \
+		rm -f $(pkgdocdir)/$$i; \
+	done
+endif
+
+install-man: $(DOCOBJ) $(INSTALL_MANFILES)
+ifdef INSTALL_MANFILES
+	@for i in $(INSTALL_MANFILES); do \
+		echo "$(INSTALL_DATA) $$i $(mandir)/man1"; \
+		$(INSTALL_DATA) $$i $(mandir)/man1; \
+	done
+endif
+
+uninstall-man:
+ifdef INSTALL_MANFILES
+	@for i in $(INSTALL_MANFILES); do \
+		rm -f $(mandir)/man1/$$i; \
+	done
+endif
+
+install: installdirs install-bin install-data install-doc install-man
+
+uninstall: uninstall-bin uninstall-data uninstall-doc uninstall-man
+
+############################################################################
+# Common build
+
+# Resource include dir
+RCFLAGS += --include-dir advance/lib
+
+############################################################################
+# Whole targets
+
+# Debug
+#WHOLE_CFLAGS_OPT = -O2 -Wall -Wno-sign-compare -Wno-unused
+#WHOLE_CFLAGS_EMU = -fomit-frame-pointer
+#WHOLE_LDFLAGS = -rdynamic
+DEFS_LINUX =-DSTDC_HEADERS=1 -DHAVE_SYS_WAIT_H=1 -DHAVE_DIRENT_H=1 -DTIME_WITH_SYS_TIME=1 -DGWINSZ_IN_SYS_IOCTL=1 -DHAVE_SYS_TYPES_H=1 -DHAVE_SYS_STAT_H=1 -DHAVE_STDLIB_H=1 -DHAVE_STRING_H=1 -DHAVE_MEMORY_H=1 -DHAVE_STRINGS_H=1 -DHAVE_INTTYPES_H=1 -DHAVE_STDINT_H=1 -DHAVE_UNISTD_H=1 -DHAVE_UNISTD_H=1 -DHAVE_SCHED_H=1 -DHAVE_NETDB_H=1 -DHAVE_TERMIOS_H=1 -DHAVE_EXECINFO_H=1 -DHAVE_SYS_UTSNAME_H=1 -DHAVE_SYS_TYPES_H=1 -DHAVE_SYS_STAT_H=1 -DHAVE_SYS_SOCKET_H=1 -DHAVE_SYS_SELECT_H=1 -DHAVE_SYS_IOCTL_H=1 -DHAVE_SYS_TIME_H=1 -DHAVE_SYS_MMAN_H=1 -DHAVE_SYS_IO_H=1 -DHAVE_SYS_KD_H=1 -DHAVE_SYS_VT_H=1 -DHAVE_NETINET_IN_H=1 -Drestrict=__restrict -DHAVE_ALLOCA_H=1 -DHAVE_ALLOCA=1 -DHAVE_UNISTD_H=1 -DHAVE_FORK=1 -DHAVE_VFORK=1 -DHAVE_WORKING_VFORK=1 -DHAVE_WORKING_FORK=1 -DHAVE_STDLIB_H=1 -DHAVE_MALLOC=1 -DHAVE_STDLIB_H=1 -DHAVE_UNISTD_H=1 -DHAVE_GETPAGESIZE=1 -DHAVE_MMAP=1 -DHAVE_SYS_SELECT_H=1 -DHAVE_SYS_SOCKET_H=1 -DSELECT_TYPE_ARG1=int -DSELECT_TYPE_ARG234=\(fd_set\ \*\) -DSELECT_TYPE_ARG5=\(struct\ timeval\ \*\) -DHAVE_VPRINTF=1 -DHAVE_STRCASECMP=1 -DHAVE_STRERROR=1 -DHAVE_UNAME=1 -DHAVE_SYSCONF=1 -DHAVE_BACKTRACE=1 -DHAVE_BACKTRACE_SYMBOLS=1 -DHAVE_IOPL=1 -DHAVE_INOUT=1 -DHAVE_LIBZ=1 -DHAVE_SLANG_SLANG_H=1
+
+# Optimized
+WHOLE_CFLAGS_OPT = -fomit-frame-pointer -O2 -Wall -Wno-sign-compare -Wno-unused
+WHOLE_CFLAGS_EMU =
+WHOLE_LDFLAGS = -s
+
+ARCH_I386 = CONF_MAP=yes CONF_ARCH=i386 CONF_CFLAGS_OPT="-march=i386 $(WHOLE_CFLAGS_OPT)" CONF_CFLAGS_EMU="$(WHOLE_CFLAGS_EMU)" CONF_LDFLAGS="$(WHOLE_LDFLAGS)"
+ARCH_PENTIUM = CONF_MAP=yes CONF_ARCH=pentium CONF_CFLAGS_OPT="-march=pentium $(WHOLE_CFLAGS_OPT)" CONF_CFLAGS_EMU="$(WHOLE_CFLAGS_EMU)" CONF_LDFLAGS="$(WHOLE_LDFLAGS)"
+ARCH_PENTIUM_BLEND = CONF_MAP=yes CONF_ARCH=pentium CONF_CFLAGS_OPT="-march=pentium -mcpu=pentium2 $(WHOLE_CFLAGS_OPT) -fno-merge-constants" CONF_CFLAGS_EMU="$(WHOLE_CFLAGS_EMU)" CONF_LDFLAGS="$(WHOLE_LDFLAGS)"
+ARCH_PENTIUM_BLEND_GCCOLD = CONF_MAP=yes CONF_ARCH=pentium CONF_CFLAGS_OPT="-march=i586 -mcpu=i686 $(WHOLE_CFLAGS_OPT)" CONF_CFLAGS_EMU="$(WHOLE_CFLAGS_EMU)" CONF_LDFLAGS="$(WHOLE_LDFLAGS)"
+
+MANUAL=-f Makefile.usr
+
+WHOLECD_FLAGS = \
+	DATADIR="/root" SYSCONFDIR="/etc" \
+	CONF_ARCH=cd CONF_CFLAGS_OPT="-march=pentium -mcpu=pentium2 $(WHOLE_CFLAGS_OPT) -fno-merge-constants" CONF_CFLAGS_EMU="$(WHOLE_CFLAGS_EMU)" CONF_LDFLAGS="$(WHOLE_LDFLAGS)" \
+	CONF_DEFS="$(DEFS_LINUX)" \
+	CONF_HOST=linux \
+	CONF_LIB_KEVENT=yes CONF_LIB_JEVENT=yes CONF_LIB_MEVENT=yes \
+	CONF_LIB_KRAW=yes CONF_LIB_MRAW=yes \
+	CONF_LIB_SVGALIB=no CONF_LIB_ALSA=yes CONF_LIB_FB=yes \
+	CONF_LIB_OSS=no CONF_LIB_PTHREAD=no CONF_LIB_SDL=no
+
+wholemame: mamedif
+	$(MAKE) $(MANUAL) dist
+	$(MAKE) $(MANUAL) CONF_DIFFSRC=yes dist
+	$(MAKE) $(MANUAL) $(ARCH_PENTIUM_BLEND_GCCOLD) CONF_HOST=windows distbin
+	$(MAKE) $(MANUAL) $(ARCH_PENTIUM_BLEND) CONF_HOST=linux CONF_DEFS="$(DEFS_LINUX)" distbin
+	$(MAKE) $(MANUAL) $(ARCH_PENTIUM_BLEND_GCCOLD) CONF_HOST=dos distbin
+
+wholecd:
+	$(MAKE) $(MANUAL) $(WHOLECD_FLAGS) distbin
+	$(MAKE) $(MANUAL) $(WHOLECD_FLAGS) distmenubin
+	$(MAKE) $(MANUAL) $(WHOLECD_FLAGS) CONF_EMU=mess distbin
+
+wholemess: messdif
+	$(MAKE) $(MANUAL) CONF_EMU=mess dist
+	$(MAKE) $(MANUAL) CONF_EMU=mess CONF_DIFFSRC=yes dist
+	$(MAKE) $(MANUAL) $(ARCH_PENTIUM_BLEND) CONF_HOST=linux CONF_EMU=mess CONF_DEFS="$(DEFS_LINUX)" distbin
+	$(MAKE) $(MANUAL) $(ARCH_PENTIUM_BLEND_GCCOLD) CONF_HOST=windows CONF_EMU=mess distbin
+	$(MAKE) $(MANUAL) $(ARCH_PENTIUM_BLEND_GCCOLD) CONF_HOST=dos CONF_EMU=mess distbin
+
+wholemenu:
+	$(MAKE) $(MANUAL) distmenu
+	$(MAKE) $(MANUAL) $(ARCH_PENTIUM_BLEND) CONF_HOST=linux CONF_DEFS="$(DEFS_LINUX)" distmenubin
+	$(MAKE) $(MANUAL) $(ARCH_PENTIUM_BLEND_GCCOLD) CONF_HOST=windows distmenubin
+	$(MAKE) $(MANUAL) $(ARCH_PENTIUM_BLEND_GCCOLD) CONF_HOST=dos distmenubin
+
+wholecab:
+	$(MAKE) $(MANUAL) distcab
+	$(MAKE) $(MANUAL) $(ARCH_I386) CONF_HOST=dos distcabbin
+	$(MAKE) $(MANUAL) $(ARCH_I386) CONF_HOST=windows distcabbin
+
+#############################################################################
+# Development targets
+
+devflags: obj
+	$(ECHO) CC=$(CC)
+	$(ECHO) CFLAGS=$(CFLAGS)
+	$(ECHO) CXX=$(CXX)
+	$(ECHO) CXXFLAGS=$(CXXFLAGS)
+	$(ECHO) LD=$(LD)
+	$(ECHO) LDFLAGS=$(LDFLAGS)
+	$(ECHO) CC_BUILD=$(CC_BUILD)
+	$(ECHO) CFLAGS_BUILD=$(CFLAGS_BUILD)
+	$(ECHO) LD_BUILD=$(LD_BUILD)
+	$(ECHO) SDLCFLAGS=$(SDLCFLAGS)
+	$(ECHO) SDLLIBS=$(SDLLIBS)
+	$(ECHO) FREETYPECFLAGS=$(FREETYPECFLAGS)
+	$(ECHO) FREETYPELIBS=$(FREETYPELIBS)
+	$(ECHO) EMUCFLAGS=$(EMUCFLAGS)
+	$(ECHO) EMULDFLAGS=$(EMULDFLAGS)
+	$(ECHO) ADVANCECFLAGS=$(ADVANCECFLAGS)
+	$(ECHO) ADVANCELDFLAGS=$(ADVANCELDFLAGS)
+	$(ECHO) ADVANCELIBS=$(ADVANCELIBS)
+	$(ECHO) "int test(void) { return 0; }" > obj/flags.c
+	$(CC) $(CFLAGS) obj/flags.c -S -fverbose-asm -o obj/flags.S
+
+devosdep:
+	rgrep -r MSDOS $(srcdir)/advance
+	rgrep -r WIN32 $(srcdir)/advance
+
+devdef:
+	rgrep -r "^#if" $(srcdir)/advance | grep -v -E "_H$$|USE|__cplusplus|expat|svgalib|windows|NDEBUG|MESS|linux/.*event|advmame.dif|advmess.dif|/y_tab|/lexyy|/tsr|/card|/dos"
+
+devtags:
+	cd advance && ctags -R
+
diff -Naur advancemame-0.84.0/advance/lib/fz.c.orig advancemame-0.84.0-patched/advance/lib/fz.c.orig
--- advancemame-0.84.0/advance/lib/fz.c.orig	Wed Dec 31 19:00:00 1969
+++ advancemame-0.84.0-patched/advance/lib/fz.c.orig	Sun Jul 25 13:57:04 2004
@@ -0,0 +1,726 @@
+/*
+ * This file is part of the Advance project.
+ *
+ * Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004 Andrea Mazzoleni
+ *
+ * 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
+ * (at your option) 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.
+ *
+ * In addition, as a special exception, Andrea Mazzoleni
+ * gives permission to link the code of this program with
+ * the MAME library (or with modified versions of MAME that use the
+ * same license as MAME), and distribute linked combinations including
+ * the two.  You must obey the GNU General Public License in all
+ * respects for all of the code used other than MAME.  If you modify
+ * this file, you may extend this exception to your version of the
+ * file, but you are not obligated to do so.  If you do not wish to
+ * do so, delete this exception statement from your version.
+ */
+
+#include "portable.h"
+
+#include "fz.h"
+#include "endianrw.h"
+
+/* Zip format */
+#define ZIP_LO_filename_length 0x1A
+#define ZIP_LO_extra_field_length 0x1C
+#define ZIP_LO_FIXED 0x1E /* size of fixed data structure */
+
+/**************************************************************************/
+/* unlocked interface for streams (faster than locked) */
+
+static FILE* fopen_lock(const char* name, const char* mode)
+{
+	FILE* f;
+
+	f = fopen(name, mode);
+
+#if HAVE_FLOCKFILE
+	if (f)
+		flockfile(f);
+#endif
+
+	return f;
+}
+
+static int fclose_lock(FILE *f)
+{
+#if HAVE_FUNLOCKFILE
+	funlockfile(f);
+#endif
+
+	return fclose(f);
+}
+
+static size_t fread_lock(void* data, size_t size, size_t count, FILE* f)
+{
+#if HAVE_FREAD_UNLOCKED
+	return fread_unlocked(data, size, count, f);
+#else
+	return fread(data, size, count, f);
+#endif
+}
+
+static size_t fwrite_lock(const void* data, size_t size, size_t count, FILE* f)
+{
+#if HAVE_FWRITE_UNLOCKED
+	return fwrite_unlocked(data, size, count, f);
+#else
+	return fwrite(data, size, count, f);
+#endif
+}
+
+static int feof_lock(FILE* f)
+{
+#if HAVE_FEOF_UNLOCKED
+	return feof_unlocked(f);
+#else
+	return feof(f);
+#endif
+}
+
+static int fgetc_lock(FILE* f)
+{
+#if HAVE_FGETC_UNLOCKED
+	return fgetc_unlocked(f);
+#else
+	return fgetc(f);
+#endif
+}
+
+/**************************************************************************/
+/* fz interface */
+
+#define INFLATE_INPUT_BUFFER_MAX 4096
+
+adv_error fzgrow(adv_fz* f, unsigned size)
+{
+	if (f->type == fz_memory_write) {
+		if (f->virtual_size < size) {
+			unsigned char* data = realloc(f->data_write, size);
+			if (!data)
+				return -1;
+			f->data_write = data;
+			f->virtual_size = size;
+		}
+		return 0;
+	} else {
+			return -1;
+	}
+}
+
+/**
+ * Read from a file.
+ * The semantic is like the C fread() function.
+ */
+unsigned fzread(void *buffer, unsigned size, unsigned number, adv_fz* f)
+{
+	if (f->type == fz_file) {
+		return fread_lock(buffer, size, number, f->f);
+	} else {
+		unsigned total_size;
+
+		/* adjust the number of record to read */
+		total_size = size * number;
+		if (f->virtual_pos + total_size >= f->virtual_size) {
+			number = (f->virtual_size - f->virtual_pos) / size;
+			if (!number)
+				return 0;
+			total_size = size * number;
+		}
+
+		if (f->type == fz_memory_read) {
+			memcpy(buffer, f->data_read + f->virtual_pos, total_size);
+			f->virtual_pos += total_size;
+			return number;
+		} else if (f->type == fz_memory_write) {
+			memcpy(buffer, f->data_write + f->virtual_pos, total_size);
+			f->virtual_pos += total_size;
+			return number;
+		} else if (f->type == fz_file_compressed) {
+			int err = Z_STREAM_END;
+			f->z.next_out = buffer;
+			f->z.avail_out = total_size;
+
+			while (f->z.avail_out) {
+				if (!f->z.avail_in) {
+					unsigned run = INFLATE_INPUT_BUFFER_MAX;
+					if (run > f->remaining)
+						run = f->remaining;
+					f->z.next_in = f->zbuffer;
+					run = fread_lock(f->zbuffer, 1, run, f->f);
+					f->remaining -= run;
+					/* add an extra byte at the end, required by the zlib library */
+					if (run && !f->remaining)
+						++run;
+					f->z.avail_in = run;
+				}
+				if (!f->z.avail_in)
+					break;
+				err = inflate(&f->z, Z_NO_FLUSH);
+				if (err != Z_OK)
+					break;
+			}
+
+			total_size -= f->z.avail_out;
+			f->virtual_pos += total_size;
+
+			return total_size / size;
+		}
+	}
+
+	return 0;
+}
+
+/**
+ * Write to a file.
+ * This function works only for files opened with fzopen().
+ * The semantic is like the C fwrite() function.
+ */
+unsigned fzwrite(const void *buffer, unsigned size, unsigned number, adv_fz* f)
+{
+	if (f->type == fz_file) {
+		return fwrite_lock(buffer, size, number, f->f);
+	} else if (f->type == fz_memory_write) {
+		unsigned total_size;
+
+		/* adjust the number of record to write */
+		total_size = size * number;
+
+		if (fzgrow(f, f->virtual_pos + total_size) != 0)
+			return -1;
+
+		memcpy(f->data_write + f->virtual_pos, buffer, total_size);
+		f->virtual_pos += total_size;
+		return number;
+	} else {
+		return -1;
+	}
+}
+
+static adv_fz* fzalloc(void)
+{
+	adv_fz* f;
+
+	f = malloc(sizeof(adv_fz));
+	if (!f)
+		return 0;
+
+	f->type = fz_invalid;
+	f->virtual_pos = 0;
+	f->virtual_size = 0;
+	f->real_offset = 0;
+	f->real_size = 0;
+	f->data_read = 0;
+	f->data_write = 0;
+	f->f = 0;
+
+	return f;
+}
+
+/**
+ * Open a normal file.
+ * The semantic is like the C fopen() function.
+ */
+adv_fz* fzopen(const char* file, const char* mode)
+{
+	adv_fz* f = fzalloc();
+	if (!f)
+		return 0;
+
+	f->type = fz_file;
+	f->f = fopen_lock(file, mode);
+	if (!f->f) {
+		free(f);
+		return 0;
+	}
+
+	return f;
+}
+
+/**
+ * Open a normal file doing all the write access in memory.
+ * The semantic is like the C fopen() function.
+ */
+adv_fz* fzopennullwrite(const char* file, const char* mode)
+{
+	adv_fz* f = fzalloc();
+	if (!f)
+		goto err;
+
+	f->type = fz_memory_write;
+	f->virtual_pos = 0;
+	f->f = fopen_lock(file, "rb");
+	if (f->f) {
+		struct stat st;
+
+		if (fstat(fileno(f->f), &st) != 0) {
+			goto err_close;
+		}
+
+		f->data_write = malloc(st.st_size);
+		if (!f->data_write) {
+			goto err_close;
+		}
+
+		f->virtual_size = st.st_size;
+
+		if (fread_lock(f->data_write, st.st_size, 1, f->f) != 1) {
+			goto err_data;
+		}
+
+		fclose_lock(f->f);
+		f->f = 0;
+	} else {
+		if (strchr(mode, 'w')!=0 || strchr(mode, 'a')!=0) {
+			/* creation allowed */
+			f->data_write = 0;
+			f->virtual_size = 0;
+		} else {
+			/* creation not possible */
+			goto err_free;
+		}
+	}
+
+	return f;
+
+err_data:
+	free(f->data_write);
+err_close:
+	fclose_lock(f->f);
+err_free:
+	free(f);
+err:
+	return 0;
+}
+
+/**
+ * Open an uncompressed file part of a ZIP archive.
+ * \param file ZIP archive.
+ * \param offset Offset in the archive.
+ * \param size Size of the data.
+ */
+adv_fz* fzopenzipuncompressed(const char* file, unsigned offset, unsigned size)
+{
+	unsigned char buf[ZIP_LO_FIXED];
+	unsigned filename_length;
+	unsigned extra_field_length;
+
+	adv_fz* f = fzalloc();
+	if (!f)
+		return 0;
+
+	f->type = fz_file;
+	f->virtual_pos = 0;
+	f->virtual_size = size;
+	f->f = fopen_lock(file, "rb");
+	if (!f->f) {
+		free(f);
+		return 0;
+	}
+
+	if (fseek(f->f, offset, SEEK_SET) != 0) {
+		fclose_lock(f->f);
+		free(f);
+		return 0;
+	}
+	if (fread_lock(buf, ZIP_LO_FIXED, 1, f->f)!=1) {
+		fclose_lock(f->f);
+		free(f);
+		return 0;
+	}
+	filename_length = le_uint16_read(buf+ZIP_LO_filename_length);
+	extra_field_length = le_uint16_read(buf+ZIP_LO_extra_field_length);
+
+	/* calculate offset to data and seek there */
+	offset += ZIP_LO_FIXED + filename_length + extra_field_length;
+
+	f->real_offset = offset;
+	f->real_size = size;
+
+	if (fseek(f->f, f->real_offset, SEEK_SET) != 0) {
+		fclose_lock(f->f);
+		free(f);
+		return 0;
+	}
+
+	return f;
+}
+
+static void compressed_init(adv_fz* f)
+{
+	int err;
+
+	memset(&f->z, 0, sizeof(f->z));
+	f->z.zalloc = 0;
+	f->z.zfree = 0;
+	f->z.opaque = 0;
+	f->z.next_in  = 0;
+	f->z.avail_in = 0;
+	f->z.next_out = 0;
+	f->z.avail_out = 0;
+
+	f->zbuffer = (unsigned char*)malloc(INFLATE_INPUT_BUFFER_MAX+1); /* +1 for the extra byte at the end */
+	f->remaining = f->real_size;
+
+	/*
+	 * windowBits is passed < 0 to tell that there is no zlib header.
+	 * Note that in this case inflate *requires* an extra "dummy" byte
+	 * after the compressed stream in order to complete decompression and
+	 * return Z_STREAM_END.
+	 */
+	err = inflateInit2(&f->z, -MAX_WBITS);
+
+	assert(err == Z_OK);
+}
+
+static void compressed_done(adv_fz* f)
+{
+	inflateEnd(&f->z);
+	free(f->zbuffer);
+}
+
+/**
+ * Open an compressed file part of a ZIP archive.
+ * \param file ZIP archive.
+ * \param offset Offset in the archive.
+ * \param size_compressed Size of the compressed data.
+ * \param size_uncompressed Size of the uncompressed data.
+ */
+adv_fz* fzopenzipcompressed(const char* file, unsigned offset, unsigned size_compressed, unsigned size_uncompressed)
+{
+	unsigned char buf[ZIP_LO_FIXED];
+	unsigned filename_length;
+	unsigned extra_field_length;
+
+	adv_fz* f = fzalloc();
+	if (!f)
+		return 0;
+
+	f->type = fz_file_compressed;
+	f->virtual_pos = 0;
+	f->virtual_size = size_uncompressed;
+	f->f = fopen_lock(file, "rb");
+	if (!f->f) {
+		free(f);
+		return 0;
+	}
+
+	if (fseek(f->f, offset, SEEK_SET) != 0) {
+		fclose_lock(f->f);
+		free(f);
+		return 0;
+	}
+	if (fread_lock(buf, ZIP_LO_FIXED, 1, f->f)!=1) {
+		fclose_lock(f->f);
+		free(f);
+		return 0;
+	}
+	filename_length = le_uint16_read(buf+ZIP_LO_filename_length);
+	extra_field_length = le_uint16_read(buf+ZIP_LO_extra_field_length);
+
+	/* calculate offset to data and seek there */
+	offset += ZIP_LO_FIXED + filename_length + extra_field_length;
+
+	f->real_offset = offset;
+	f->real_size = size_compressed;
+
+	if (fseek(f->f, f->real_offset, SEEK_SET) != 0) {
+		fclose_lock(f->f);
+		free(f);
+		return 0;
+	}
+
+	compressed_init(f);
+
+	return f;
+}
+
+/**
+ * Open a memory range as a file.
+ * \param data Data.
+ * \param size Size of the data.
+ */
+adv_fz* fzopenmemory(const unsigned char* data, unsigned size)
+{
+	adv_fz* f = fzalloc();
+	if (!f)
+		return 0;
+
+	f->type = fz_memory_read;
+	f->virtual_pos = 0;
+	f->virtual_size = size;
+	f->data_read = data;
+
+	return f;
+}
+
+/**
+ * Close a file.
+ * The semantic is like the C fclose() function.
+ */
+adv_error fzclose(adv_fz* f)
+{
+	if (f->type == fz_file) {
+		fclose_lock(f->f);
+		free(f);
+	} else if (f->type == fz_file_part) {
+		fclose_lock(f->f);
+		free(f);
+	} else if (f->type == fz_file_compressed) {
+		compressed_done(f);
+		fclose_lock(f->f);
+		free(f);
+	} else if (f->type == fz_memory_read) {
+		free(f);
+	} else if (f->type == fz_memory_write) {
+		free(f->data_write);
+		free(f);
+	} else {
+		return -1;
+	}
+
+	return 0;
+}
+
+/**
+ * Read a char from the file.
+ * The semantic is like the C fgetc() function.
+ * It assume to read a binary file without any "\r", "\n" conversion.
+ */
+int fzgetc(adv_fz* f)
+{
+	if (f->type == fz_file) {
+		return fgetc_lock(f->f);
+	} else {
+		unsigned char r;
+		if (fzread(&r, 1, 1, f)==1)
+			return r;
+		else
+			return EOF;
+	}
+}
+
+
+/**
+ * Unread a char from the file.
+ * This function works only for files opened with fzopen(). 
+ * The semantic is like the C fungetc() function.
+ */
+adv_error fzungetc(int c, adv_fz* f)
+{
+	if (f->type == fz_file) {
+		return ungetc(c, f->f);
+	} else {
+		return -1;
+	}
+}
+
+/**
+ * Read a string from the file.
+ * The semantic is like the C fgets() function.
+ */
+char* fzgets(char *s, int n, adv_fz* f)
+{
+	char* r;
+
+	if (n < 2) {
+		r = 0;
+	} else {
+		int c = fzgetc(f);
+		if (c == EOF) {
+			r = 0;
+		} else {
+			r = s;
+			while (n > 1) {
+				*s++ = c;
+				--n;
+				if (c == '\n')
+					break;
+				if (n > 1)
+					c = fzgetc(f);
+			}
+			if (n) {
+				*s = 0;
+			} else {
+				r = 0;
+			}
+		}
+	}
+
+	return r;
+}
+
+/**
+ * Check if the file pointer is at the end.
+ * The semantic is like the C feof() function.
+ */
+adv_error fzeof(adv_fz* f)
+{
+	if (f->type == fz_file) {
+		return feof_lock(f->f);
+	} else {
+		return f->virtual_pos >= f->virtual_size;
+	}
+}
+
+/**
+ * Get the current position in the file.
+ * The semantic is like the C ftell() function.
+ */
+long fztell(adv_fz* f)
+{
+	if (f->type == fz_file) {
+		return ftell(f->f);
+	} else {
+		return f->virtual_pos;
+	}
+}
+
+/**
+ * Get the size of the file.
+ */
+long fzsize(adv_fz* f)
+{
+	if (f->type == fz_file) {
+		struct stat st;
+		if (fstat(fileno(f->f), &st) != 0) {
+			return -1;
+		}
+		return st.st_size;
+	} else {
+		return f->virtual_size;
+	}
+}
+
+/**
+ * Seek to an arbitrary position.
+ * The semantic is like the C fseek() function.
+ */
+adv_error fzseek(adv_fz* f, long offset, int mode)
+{
+	if (f->type == fz_file) {
+		switch (mode) {
+			case SEEK_SET :
+				return fseek(f->f, f->real_offset + offset, SEEK_SET);
+			case SEEK_CUR :
+				return fseek(f->f, offset, SEEK_CUR);
+			case SEEK_END :
+				if (f->real_size)
+					return fseek(f->f, f->real_size - offset, SEEK_SET);
+				else
+					return fseek(f->f, offset, SEEK_END);
+			default:
+				return -1;
+		}
+	} else {
+		int pos;
+		switch (mode) {
+			case SEEK_SET :
+				pos = offset;
+				break;
+			case SEEK_CUR :
+				pos = f->virtual_pos + offset;
+				break;
+			case SEEK_END :
+				pos = f->virtual_size - offset;
+				break;
+			default:
+				return -1;
+		}
+		if (pos < 0 || pos > f->virtual_size)
+			return -1;
+
+		if (f->type == fz_memory_read) {
+			f->virtual_pos = pos;
+			return 0;
+		} else if (f->type == fz_memory_write) {
+			if (fzgrow(f, pos) != 0)
+				return -1;
+			f->virtual_pos = pos;
+			return 0;
+		} else if (f->type == fz_file_part) {
+			if (fseek(f->f, f->real_offset + f->virtual_pos, SEEK_SET) != 0)
+				return -1;
+			f->virtual_pos = pos;
+			return 0;
+		} else if (f->type == fz_file_compressed) {
+			unsigned offset;
+
+			if (pos < f->virtual_pos) {
+				/* if backward reopen the file */
+				int err;
+				compressed_done(f);
+				err = fseek(f->f, f->real_offset, SEEK_SET);
+				f->virtual_pos = 0;
+				compressed_init(f);
+				if (err != 0)
+					return -1;
+			}
+
+			/* data to read */
+			offset = pos - f->virtual_pos;
+
+			/* read all the data */
+			while (offset > 0) {
+				unsigned char buffer[256];
+				unsigned run = offset;
+				if (run > 256)
+					run = 256;
+				if (fzread(buffer, run, 1, f) != 1)
+					return -1;
+				offset -= run;
+			}
+
+			return 0;
+		} else {
+			return -1;
+		}
+	}
+}
+
+adv_error le_uint8_fzread(adv_fz* f, unsigned* v)
+{
+	unsigned char p[1];
+
+	if (fzread(p, 1, 1, f) != 1)
+		return -1;
+	*v = le_uint8_read(p);
+
+	return 0;
+}
+
+adv_error le_uint16_fzread(adv_fz* f, unsigned* v)
+{
+	unsigned char p[2];
+
+	if (fzread(p, 2, 1, f) != 1)
+		return -1;
+	*v = le_uint16_read(p);
+
+	return 0;
+}
+
+adv_error le_uint32_fzread(adv_fz* f, unsigned* v)
+{
+	unsigned char p[4];
+
+	if (fzread(p, 4, 1, f) != 1)
+		return -1;
+	*v = le_uint32_read(p);
+
+	return 0;
+}
+
