Building libdvdread with MSVC

Steve Lhomme <[email protected]> Mon, 13 Sep 2004 14:44:13 +0200
Newsgroups gmane.comp.video.ogle.devel
Message-ID <[email protected]>
Hi,

I have modified libdvdread to be able to be compiled with Microsoft 
compilers. Here is the patch attached.

The makefile is generated with bakefile. It can be modified to generate 
autoconf makefiles too (used to generate the wxWidgets makefiles).

I'll keep these sources in a Matroska related project...
libdvdread.diff (text/plain, 39.8 KB)
diff -urN libdvdread-0.9.4\dvdread\bswap.h Dvdmenuxtractor\libdvdread\dvdread\bswap.h
--- libdvdread-0.9.4\dvdread\bswap.h	Sun Dec 15 02:09:12 2002
+++ Dvdmenuxtractor\libdvdread\dvdread\bswap.h	Mon Sep 13 12:01:05 2004
@@ -65,7 +65,7 @@
  * functionality! 
  */
 
-#elif defined(__FreeBSD__) || defined(__sun) || defined(__bsdi__)
+#elif defined(__FreeBSD__) || defined(__sun) || defined(__bsdi__) || defined(WIN32)
 #define B2N_16(x) \
  x = ((((x) & 0xff00) >> 8) | \
       (((x) & 0x00ff) << 8))
diff -urN libdvdread-0.9.4\dvdread\dvd_input.c Dvdmenuxtractor\libdvdread\dvdread\dvd_input.c
--- libdvdread-0.9.4\dvdread\dvd_input.c	Thu Feb 13 23:48:24 2003
+++ Dvdmenuxtractor\libdvdread\dvdread\dvd_input.c	Mon Sep 13 14:01:27 2004
@@ -22,7 +22,9 @@
 #include <stdio.h>
 #include <stdlib.h>
 #include <fcntl.h>
+#ifdef HAVE_UNISTD_H
 #include <unistd.h>
+#endif
 
 #include "dvd_reader.h"
 #include "dvd_input.h"
@@ -46,7 +48,9 @@
 #define DVDcss_error   dvdcss_error
 #else
 /* dlopening libdvdcss */
+#ifdef HAVE_DLFCN_H
 #include <dlfcn.h>
+#endif
 typedef struct dvdcss_s *dvdcss_handle;
 static dvdcss_handle (*DVDcss_open)  (const char *);
 static int           (*DVDcss_close) (dvdcss_handle);
@@ -257,13 +261,17 @@
   return 0;
 }
 
+#if !defined(WIN32)
+typedef void *HMODULE;
+#endif
+
 
 /**
  * Setup read functions with either libdvdcss or minimal DVD access.
  */
 int dvdinput_setup(void)
 {
-  void *dvdcss_library = NULL;
+  HMODULE dvdcss_library = NULL;
   char **dvdcss_version = NULL;
 
 #ifdef HAVE_DVDCSS_DVDCSS_H
@@ -274,7 +282,11 @@
 
 #else
   /* dlopening libdvdcss */
+#if defined(WIN32)
+  dvdcss_library = LoadLibrary("libdvdcss.dll");
+#else /* !WIN32 */
   dvdcss_library = dlopen("libdvdcss.so.2", RTLD_LAZY);
+#endif /* !WIN32 */
   
   if(dvdcss_library != NULL) {
 #if defined(__OpenBSD__) && !defined(__ELF__)
diff -urN libdvdread-0.9.4\dvdread\dvd_reader.c Dvdmenuxtractor\libdvdread\dvdread\dvd_reader.c
--- libdvdread-0.9.4\dvdread\dvd_reader.c	Fri Feb 14 00:31:22 2003
+++ Dvdmenuxtractor\libdvdread\dvdread\dvd_reader.c	Mon Sep 13 13:55:30 2004
@@ -22,13 +22,17 @@
 
 #include <sys/types.h>
 #include <sys/stat.h>
+#ifdef HAVE_SYS_TIME_H
 #include <sys/time.h> /* For the timing of dvdcss_title crack. */
+#endif
 #include <fcntl.h>
 #include <stdlib.h>
 #include <stdio.h>
 #include <errno.h>
 #include <string.h>
+#ifdef HAVE_UNISTD_H
 #include <unistd.h>
+#endif
 #include <limits.h>
 #include <dirent.h>
  
@@ -125,12 +129,32 @@
 }
 
 
+#if defined(WIN32)
+#include <windows.h>
+#  define GETTIME(v)  v = GetTickCount ()
+#  define TIMEDIFF(v) (v.end - v.start)
+#else /* !WIN32 */
+#  define GETTIME(v)  gettimeofday (&v, NULL)
+#  define TIMEDIFF(v) (v.end.tv_sec - v.start.tv_sec)
+#endif /* !WIN32 */
+
+struct TimeVal
+{
+#if defined(WIN32)
+  DWORD start;
+  DWORD end;
+#else /* !WIN32 */
+  struct timeval start;
+  struct timeval end;
+#endif /* !WIN32 */
+};
+
 
 /* Loop over all titles and call dvdcss_title to crack the keys. */
 static int initAllCSSKeys( dvd_reader_t *dvd )
 {
-    struct timeval all_s, all_e;
-    struct timeval t_s, t_e;
+    struct TimeVal all_time;
+    struct TimeVal t_time;
     char filename[ MAX_UDF_FILE_NAME_LEN ];
     uint32_t start, len;
     int title;
@@ -144,10 +168,10 @@
     fprintf( stderr, "libdvdread: This can take a _long_ time, "
 	     "please be patient\n\n" );
 	
-    gettimeofday(&all_s, NULL);
+    GETTIME( all_time.start );
 	
     for( title = 0; title < 100; title++ ) {
-	gettimeofday( &t_s, NULL );
+	GETTIME( t_time.start );
 	if( title == 0 ) {
 	    sprintf( filename, "/VIDEO_TS/VIDEO_TS.VOB" );
 	} else {
@@ -161,14 +185,14 @@
 	    if( dvdinput_title( dvd->dev, (int)start ) < 0 ) {
 		fprintf( stderr, "libdvdread: Error cracking CSS key for %s (0x%08x)\n", filename, start);
 	    }
-	    gettimeofday( &t_e, NULL );
+	    GETTIME( t_time.end );
 	    fprintf( stderr, "libdvdread: Elapsed time %ld\n",  
-		     (long int) t_e.tv_sec - t_s.tv_sec );
+		     (long int) TIMEDIFF(t_time) );
 	}
 	    
 	if( title == 0 ) continue;
 	    
-	gettimeofday( &t_s, NULL );
+	GETTIME( t_time.start );
 	sprintf( filename, "/VIDEO_TS/VTS_%02d_%d.VOB", title, 1 );
 	start = UDFFindFile( dvd, filename, &len );
 	if( start == 0 || len == 0 ) break;
@@ -179,16 +203,16 @@
 	if( dvdinput_title( dvd->dev, (int)start ) < 0 ) {
 	    fprintf( stderr, "libdvdread: Error cracking CSS key for %s (0x%08x)!!\n", filename, start);
 	}
-	gettimeofday( &t_e, NULL );
+	GETTIME( t_time.end );
 	fprintf( stderr, "libdvdread: Elapsed time %ld\n",  
-		 (long int) t_e.tv_sec - t_s.tv_sec );
+		 (long int) TIMEDIFF(t_time) );
     }
     title--;
     
     fprintf( stderr, "libdvdread: Found %d VTS's\n", title );
-    gettimeofday(&all_e, NULL);
+    GETTIME( all_time.end );
     fprintf( stderr, "libdvdread: Elapsed time %ld\n",  
-	     (long int) all_e.tv_sec - all_s.tv_sec );
+	     (long int) TIMEDIFF(all_time) );
     
     return 0;
 }
@@ -343,6 +367,7 @@
 	if( !(path_copy = strdup( path ) ) ) return 0;
 
 	/* Resolve any symlinks and get the absolut dir name. */
+#if !defined(WIN32)
 	{
 	    char *new_path;
 	    int cdir = open( ".", O_RDONLY );
@@ -358,6 +383,7 @@
 		}
 	    }
 	}
+#endif
 	
 	/**
 	 * If we're being asked to open a directory, check if that directory
diff -urN libdvdread-0.9.4\dvdread\dvd_reader.h Dvdmenuxtractor\libdvdread\dvdread\dvd_reader.h
--- libdvdread-0.9.4\dvdread\dvd_reader.h	Thu Feb 13 23:31:10 2003
+++ Dvdmenuxtractor\libdvdread\dvdread\dvd_reader.h	Mon Sep 13 13:11:46 2004
@@ -21,6 +21,7 @@
  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  */
 
+#include <inttypes.h>
 #include <sys/types.h>
 
 /**
diff -urN libdvdread-0.9.4\dvdread\dvd_udf.c Dvdmenuxtractor\libdvdread\dvdread\dvd_udf.c
--- libdvdread-0.9.4\dvdread\dvd_udf.c	Thu Feb 13 23:57:18 2003
+++ Dvdmenuxtractor\libdvdread\dvdread\dvd_udf.c	Mon Sep 13 11:56:55 2004
@@ -33,10 +33,14 @@
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
+#ifdef HAVE_SYS_IOCTL_H
 #include <sys/ioctl.h>
+#endif
 #include <sys/types.h>
 #include <sys/stat.h>
+#ifdef HAVE_UNISTD_H
 #include <unistd.h>
+#endif
 #include <inttypes.h>
 
 #include "dvd_reader.h"
diff -urN libdvdread-0.9.4\dvdread\ifo_print.c Dvdmenuxtractor\libdvdread\dvdread\ifo_print.c
--- libdvdread-0.9.4\dvdread\ifo_print.c	Sun Feb 02 04:23:54 2003
+++ Dvdmenuxtractor\libdvdread\dvdread\ifo_print.c	Mon Sep 13 12:46:50 2004
@@ -22,7 +22,9 @@
 
 #include <stdio.h>
 #include <stdlib.h>
+#ifdef HAVE_UNISTD_H
 #include <unistd.h>
+#endif
 #include <inttypes.h>
 #include <string.h>
 #include <ctype.h>
diff -urN libdvdread-0.9.4\makefile.vc Dvdmenuxtractor\libdvdread\makefile.vc
--- libdvdread-0.9.4\makefile.vc	Thu Jan 01 01:00:00 1970
+++ Dvdmenuxtractor\libdvdread\makefile.vc	Mon Sep 13 13:56:43 2004
@@ -0,0 +1,192 @@
+# =========================================================================
+#     This makefile was generated by
+#     Bakefile 0.1.4 (http://bakefile.sourceforge.net)
+#     Do not modify, all changes will be overwritten!
+# =========================================================================
+
+
+
+# -------------------------------------------------------------------------
+# These are configurable options:
+# -------------------------------------------------------------------------
+
+# C compiler 
+CC = cl
+
+# Standard flags for CC 
+CFLAGS = 
+
+# Standard preprocessor flags (common for CC and CXX) 
+CPPFLAGS = 
+
+# Standard linker flags 
+LDFLAGS = 
+
+# Type of compiled binaries [debug,release]
+BUILD = release
+
+
+
+# -------------------------------------------------------------------------
+# Do not modify the rest of this file!
+# -------------------------------------------------------------------------
+
+### Variables: ###
+
+LIBDVDREAD_CFLAGS = /MD$(__DEBUG_FLAG_8) /DWIN32 $(__DEBUG_FLAG) \
+	/Fdbuild\libdvdread.pdb $(____DEBUG_FLAG) $(__OPTIMIZE) /DHAVE_CONFIG_H \
+	/Iwin32 /I. $(CPPFLAGS) $(CFLAGS)
+LIBDVDREAD_OBJECTS =  \
+	build\libdvdread_ifo_read.obj \
+	build\libdvdread_dvd_udf.obj \
+	build\libdvdread_ifo_print.obj \
+	build\libdvdread_nav_read.obj \
+	build\libdvdread_nav_print.obj \
+	build\libdvdread_md5.obj \
+	build\libdvdread_dvd_reader.obj \
+	build\libdvdread_dvd_input.obj \
+	build\libdvdread_dirent.obj
+DISC_ID_CFLAGS = /MD$(__DEBUG_FLAG_8) /DWIN32 $(__DEBUG_FLAG) \
+	/Fdbuild\disc_id.pdb $(____DEBUG_FLAG) $(__OPTIMIZE) /Iwin32 /I. $(CPPFLAGS) \
+	$(CFLAGS)
+DISC_ID_OBJECTS =  \
+	build\disc_id_disc_id.obj
+IFO_DUMP_CFLAGS = /MD$(__DEBUG_FLAG_8) /DWIN32 $(__DEBUG_FLAG) \
+	/Fdbuild\ifo_dump.pdb $(____DEBUG_FLAG) $(__OPTIMIZE) /Iwin32 /I. $(CPPFLAGS) \
+	$(CFLAGS)
+IFO_DUMP_OBJECTS =  \
+	build\ifo_dump_ifo_dump.obj
+PLAY_TITLE_CFLAGS = /MD$(__DEBUG_FLAG_8) /DWIN32 $(__DEBUG_FLAG) \
+	/Fdbuild\play_title.pdb $(____DEBUG_FLAG) $(__OPTIMIZE) /Iwin32 /I. \
+	$(CPPFLAGS) $(CFLAGS)
+PLAY_TITLE_OBJECTS =  \
+	build\play_title_play_title.obj
+TITLE_INFO_CFLAGS = /MD$(__DEBUG_FLAG_8) /DWIN32 $(__DEBUG_FLAG) \
+	/Fdbuild\title_info.pdb $(____DEBUG_FLAG) $(__OPTIMIZE) /Iwin32 /I. \
+	$(CPPFLAGS) $(CFLAGS)
+TITLE_INFO_OBJECTS =  \
+	build\title_info_title_info.obj
+
+### Conditionally set variables: ###
+
+!if "$(BUILD)" == "debug"
+__DEBUG_FLAG = /Zi
+!endif
+!if "$(BUILD)" == "release"
+__DEBUG_FLAG = 
+!endif
+!if "$(BUILD)" == "debug"
+__DEBUG_FLAG_7 = /DEBUG
+!endif
+!if "$(BUILD)" == "release"
+__DEBUG_FLAG_7 = 
+!endif
+!if "$(BUILD)" == "debug"
+____DEBUG_FLAG = /D_DEBUG
+!endif
+!if "$(BUILD)" == "release"
+____DEBUG_FLAG = 
+!endif
+!if "$(BUILD)" == "debug"
+__DEBUG_FLAG_8 = d
+!endif
+!if "$(BUILD)" == "release"
+__DEBUG_FLAG_8 = 
+!endif
+!if "$(BUILD)" == "debug"
+__OPTIMIZE = /Od
+!endif
+!if "$(BUILD)" == "release"
+__OPTIMIZE = /O2
+!endif
+
+
+all: build
+build:
+	-if not exist build mkdir build
+
+### Targets: ###
+
+all: build\libdvdread.lib build\disc_id.exe build\ifo_dump.exe build\play_title.exe build\title_info.exe
+
+clean: 
+	-if exist build\*.obj del build\*.obj
+	-if exist build\*.res del build\*.res
+	-if exist build\libdvdread.lib del build\libdvdread.lib
+	-if exist build\disc_id.exe del build\disc_id.exe
+	-if exist build\disc_id.ilk del build\disc_id.ilk
+	-if exist build\disc_id.pdb del build\disc_id.pdb
+	-if exist build\ifo_dump.exe del build\ifo_dump.exe
+	-if exist build\ifo_dump.ilk del build\ifo_dump.ilk
+	-if exist build\ifo_dump.pdb del build\ifo_dump.pdb
+	-if exist build\play_title.exe del build\play_title.exe
+	-if exist build\play_title.ilk del build\play_title.ilk
+	-if exist build\play_title.pdb del build\play_title.pdb
+	-if exist build\title_info.exe del build\title_info.exe
+	-if exist build\title_info.ilk del build\title_info.ilk
+	-if exist build\title_info.pdb del build\title_info.pdb
+
+build\libdvdread.lib: $(LIBDVDREAD_OBJECTS)
+	if exist $@ del $@
+	lib /NOLOGO /OUT:$@ @<<
+	$(LIBDVDREAD_OBJECTS)
+<<
+
+build\disc_id.exe: $(DISC_ID_OBJECTS) build\libdvdread.lib
+	link /NOLOGO /OUT:$@ $(LDFLAGS) $(__DEBUG_FLAG_7) /LIBPATH:build @<<
+	$(DISC_ID_OBJECTS)  libdvdread.lib
+<<
+
+build\ifo_dump.exe: $(IFO_DUMP_OBJECTS) build\libdvdread.lib
+	link /NOLOGO /OUT:$@ $(LDFLAGS) $(__DEBUG_FLAG_7) /LIBPATH:build @<<
+	$(IFO_DUMP_OBJECTS)  libdvdread.lib
+<<
+
+build\play_title.exe: $(PLAY_TITLE_OBJECTS) build\libdvdread.lib
+	link /NOLOGO /OUT:$@ $(LDFLAGS) $(__DEBUG_FLAG_7) /LIBPATH:build @<<
+	$(PLAY_TITLE_OBJECTS)  libdvdread.lib
+<<
+
+build\title_info.exe: $(TITLE_INFO_OBJECTS) build\libdvdread.lib
+	link /NOLOGO /OUT:$@ $(LDFLAGS) $(__DEBUG_FLAG_7) /LIBPATH:build @<<
+	$(TITLE_INFO_OBJECTS)  libdvdread.lib
+<<
+
+build\libdvdread_ifo_read.obj: .\dvdread\ifo_read.c
+	$(CC) /c /nologo /TC /Fo$@ $(LIBDVDREAD_CFLAGS) $**
+
+build\libdvdread_dvd_udf.obj: .\dvdread\dvd_udf.c
+	$(CC) /c /nologo /TC /Fo$@ $(LIBDVDREAD_CFLAGS) $**
+
+build\libdvdread_ifo_print.obj: .\dvdread\ifo_print.c
+	$(CC) /c /nologo /TC /Fo$@ $(LIBDVDREAD_CFLAGS) $**
+
+build\libdvdread_nav_read.obj: .\dvdread\nav_read.c
+	$(CC) /c /nologo /TC /Fo$@ $(LIBDVDREAD_CFLAGS) $**
+
+build\libdvdread_nav_print.obj: .\dvdread\nav_print.c
+	$(CC) /c /nologo /TC /Fo$@ $(LIBDVDREAD_CFLAGS) $**
+
+build\libdvdread_md5.obj: .\dvdread\md5.c
+	$(CC) /c /nologo /TC /Fo$@ $(LIBDVDREAD_CFLAGS) $**
+
+build\libdvdread_dvd_reader.obj: .\dvdread\dvd_reader.c
+	$(CC) /c /nologo /TC /Fo$@ $(LIBDVDREAD_CFLAGS) $**
+
+build\libdvdread_dvd_input.obj: .\dvdread\dvd_input.c
+	$(CC) /c /nologo /TC /Fo$@ $(LIBDVDREAD_CFLAGS) $**
+
+build\libdvdread_dirent.obj: .\win32\dirent.c
+	$(CC) /c /nologo /TC /Fo$@ $(LIBDVDREAD_CFLAGS) $**
+
+build\disc_id_disc_id.obj: .\src\disc_id.c
+	$(CC) /c /nologo /TC /Fo$@ $(DISC_ID_CFLAGS) $**
+
+build\ifo_dump_ifo_dump.obj: .\src\ifo_dump.c
+	$(CC) /c /nologo /TC /Fo$@ $(IFO_DUMP_CFLAGS) $**
+
+build\play_title_play_title.obj: .\src\play_title.c
+	$(CC) /c /nologo /TC /Fo$@ $(PLAY_TITLE_CFLAGS) $**
+
+build\title_info_title_info.obj: .\src\title_info.c
+	$(CC) /c /nologo /TC /Fo$@ $(TITLE_INFO_CFLAGS) $**
diff -urN libdvdread-0.9.4\src\disc_id.c Dvdmenuxtractor\libdvdread\src\disc_id.c
--- libdvdread-0.9.4\src\disc_id.c	Sun Jan 12 11:33:50 2003
+++ Dvdmenuxtractor\libdvdread\src\disc_id.c	Mon Sep 13 13:23:06 2004
@@ -18,9 +18,13 @@
  * USA
  */
 
+#include "config.h"
+
 #include <stdio.h>
 #include <stdlib.h>
+#ifdef HAVE_UNISTD_H
 #include <unistd.h>
+#endif
 
 #include <dvdread/ifo_print.h>
 
diff -urN libdvdread-0.9.4\src\ifo_dump.c Dvdmenuxtractor\libdvdread\src\ifo_dump.c
--- libdvdread-0.9.4\src\ifo_dump.c	Sat Jan 25 21:45:46 2003
+++ Dvdmenuxtractor\libdvdread\src\ifo_dump.c	Mon Sep 13 13:26:00 2004
@@ -18,9 +18,13 @@
  * USA
  */
 
+#include "config.h"
+
 #include <stdio.h>
 #include <stdlib.h>
+#ifdef HAVE_UNISTD_H
 #include <unistd.h>
+#endif
 
 #include <dvdread/ifo_print.h>
 
diff -urN libdvdread-0.9.4\win32\config.h Dvdmenuxtractor\libdvdread\win32\config.h
--- libdvdread-0.9.4\win32\config.h	Thu Jan 01 01:00:00 1970
+++ Dvdmenuxtractor\libdvdread\win32\config.h	Mon Sep 13 13:34:39 2004
@@ -0,0 +1,109 @@
+/* config.h.in.  Generated from configure.in by autoheader.  */
+
+/* Define to 1 if you have the <byteswap.h> header file. */
+#undef HAVE_BYTESWAP_H
+
+/* Define to 1 if you have the <dlfcn.h> header file. */
+#undef HAVE_DLFCN_H
+
+/* Define to 1 if you have the <dvdcss/dvdcss.h> header file. */
+#undef HAVE_DVDCSS_DVDCSS_H
+
+/* Define to 1 if you have the <inttypes.h> header file. */
+#undef HAVE_INTTYPES_H
+
+/* Define to 1 if you have the <limits.h> header file. */
+#undef HAVE_LIMITS_H
+
+#define HAVE_MEMCPY 1
+
+/* Define to 1 if you have the <memory.h> header file. */
+#undef HAVE_MEMORY_H
+
+/* Define to 1 if you have the <stdint.h> header file. */
+#undef HAVE_STDINT_H
+
+/* Define to 1 if you have the <stdlib.h> header file. */
+#undef HAVE_STDLIB_H
+
+/* Define to 1 if you have the <strings.h> header file. */
+#undef HAVE_STRINGS_H
+
+/* Define to 1 if you have the <string.h> header file. */
+#undef HAVE_STRING_H
+
+/* Define to 1 if you have the <sys/bswap.h> header file. */
+#undef HAVE_SYS_BSWAP_H
+
+/* Define to 1 if you have the <sys/endian.h> header file. */
+#undef HAVE_SYS_ENDIAN_H
+
+/* Define to 1 if you have the <sys/ioctl.h> header file. */
+#undef HAVE_SYS_IOCTL_H
+
+/* Define to 1 if you have the <sys/param.h> header file. */
+#undef HAVE_SYS_PARAM_H
+
+/* Define to 1 if you have the <sys/stat.h> header file. */
+#define HAVE_SYS_STAT_H 1
+
+/* Define to 1 if you have the <sys/types.h> header file. */
+#define HAVE_SYS_TYPES_H 1
+
+/* Define to 1 if you have the <unistd.h> header file. */
+#undef HAVE_UNISTD_H
+
+/* Name of package */
+#undef PACKAGE
+
+/* Define to the address where bug reports for this package should be sent. */
+#undef PACKAGE_BUGREPORT
+
+/* Define to the full name of this package. */
+#undef PACKAGE_NAME
+
+/* Define to the full name and version of this package. */
+#undef PACKAGE_STRING
+
+/* Define to the one symbol short name of this package. */
+#undef PACKAGE_TARNAME
+
+/* Define to the version of this package. */
+#undef PACKAGE_VERSION
+
+/* The size of a `char', as computed by sizeof. */
+#undef SIZEOF_CHAR
+
+/* The size of a `int', as computed by sizeof. */
+#undef SIZEOF_INT
+
+/* The size of a `long long', as computed by sizeof. */
+#undef SIZEOF_LONG_LONG
+
+/* The size of a `short', as computed by sizeof. */
+#undef SIZEOF_SHORT
+
+/* Define to 1 if you have the ANSI C header files. */
+#undef STDC_HEADERS
+
+/* Version number of package */
+#undef VERSION
+
+/* Define to 1 if your processor stores words with the most significant byte
+   first (like Motorola and SPARC, unlike Intel and VAX). */
+#undef WORDS_BIGENDIAN
+
+/* Have a Mac OS X system */
+#undef __DARWIN__
+
+/* Define to empty if `const' does not conform to ANSI C. */
+/* #undef const */
+
+/* Define as `__inline' if that's what the C compiler calls it, or to nothing
+   if it is not supported. */
+#define inline
+
+/* Define to `unsigned' if <sys/types.h> does not define. */
+/* #undef size_t */
+
+#define PATH_MAX 512
diff -urN libdvdread-0.9.4\win32\dirent.c Dvdmenuxtractor\libdvdread\win32\dirent.c
--- libdvdread-0.9.4\win32\dirent.c	Thu Jan 01 01:00:00 1970
+++ Dvdmenuxtractor\libdvdread\win32\dirent.c	Thu Apr 29 04:52:21 2004
@@ -0,0 +1,292 @@
+/*
+ * dirent.c
+ *
+ * Derived from DIRLIB.C by Matt J. Weinstein 
+ * This note appears in the DIRLIB.H
+ * DIRLIB.H by M. J. Weinstein   Released to public domain 1-Jan-89
+ *
+ * Updated by Jeremy Bettis <[email protected]>
+ * Significantly revised and rewinddir, seekdir and telldir added by Colin
+ * Peters <[email protected]>
+ *	
+ * $Revision: 1.1 $
+ * $Author: ds $
+ * $Date: 2004/04/29 02:52:21 $
+ *
+ */
+
+#include <stdlib.h>
+#include <errno.h>
+#include <string.h>
+#include <io.h>
+#include <direct.h>
+#include <dirent.h>
+#include <gtchar.h>
+#define SUFFIX	_T("*")
+#define	SLASH	_T("\\")
+
+#include <stdio.h>
+
+#define WIN32_LEAN_AND_MEAN
+#include <windows.h>            /* for GetFileAttributes */
+
+/*
+ * opendir
+ *
+ * Returns a pointer to a DIR structure appropriately filled in to begin
+ * searching a directory.
+ */
+_TDIR *
+_topendir (const _TCHAR * szPath)
+{
+  _TDIR *nd;
+  unsigned int rc;
+  _TCHAR szFullPath[MAX_PATH];
+
+  errno = 0;
+
+  if (!szPath) {
+    errno = EFAULT;
+    return (_TDIR *) 0;
+  }
+
+  if (szPath[0] == _T ('\0')) {
+    errno = ENOTDIR;
+    return (_TDIR *) 0;
+  }
+
+  /* Attempt to determine if the given path really is a directory. */
+  rc = GetFileAttributes (szPath);
+  if (rc == (unsigned int) -1) {
+    /* call GetLastError for more error info */
+    errno = ENOENT;
+    return (_TDIR *) 0;
+  }
+  if (!(rc & FILE_ATTRIBUTE_DIRECTORY)) {
+    /* Error, entry exists but not a directory. */
+    errno = ENOTDIR;
+    return (_TDIR *) 0;
+  }
+
+  /* Make an absolute pathname.  */
+  _tfullpath (szFullPath, szPath, MAX_PATH);
+
+  /* Allocate enough space to store DIR structure and the complete
+   * directory path given. */
+  nd = (_TDIR *) malloc (sizeof (_TDIR) + (_tcslen (szFullPath) +
+          _tcslen (SLASH) + _tcslen (SUFFIX) + 1) * sizeof (_TCHAR));
+
+  if (!nd) {
+    /* Error, out of memory. */
+    errno = ENOMEM;
+    return (_TDIR *) 0;
+  }
+
+  /* Create the search expression. */
+  _tcscpy (nd->dd_name, szFullPath);
+
+  /* Add on a slash if the path does not end with one. */
+  if (nd->dd_name[0] != _T ('\0') &&
+      nd->dd_name[_tcslen (nd->dd_name) - 1] != _T ('/') &&
+      nd->dd_name[_tcslen (nd->dd_name) - 1] != _T ('\\')) {
+    _tcscat (nd->dd_name, SLASH);
+  }
+
+  /* Add on the search pattern */
+  _tcscat (nd->dd_name, SUFFIX);
+
+  /* Initialize handle to -1 so that a premature closedir doesn't try
+   * to call _findclose on it. */
+  nd->dd_handle = -1;
+
+  /* Initialize the status. */
+  nd->dd_stat = 0;
+
+  /* Initialize the dirent structure. ino and reclen are invalid under
+   * Win32, and name simply points at the appropriate part of the
+   * findfirst_t structure. */
+  nd->dd_dir.d_ino = 0;
+  nd->dd_dir.d_reclen = 0;
+  nd->dd_dir.d_namlen = 0;
+  // Added by jcsston 02/04/2004, memset was writing to a bad pointer
+  nd->dd_dir.d_name = malloc (FILENAME_MAX);
+  // End add
+  memset (nd->dd_dir.d_name, 0, FILENAME_MAX);
+
+  return nd;
+}
+
+
+/*
+ * readdir
+ *
+ * Return a pointer to a dirent structure filled with the information on the
+ * next entry in the directory.
+ */
+struct _tdirent *
+_treaddir (_TDIR * dirp)
+{
+  errno = 0;
+
+  /* Check for valid DIR struct. */
+  if (!dirp) {
+    errno = EFAULT;
+    return (struct _tdirent *) 0;
+  }
+
+  if (dirp->dd_stat < 0) {
+    /* We have already returned all files in the directory
+     * (or the structure has an invalid dd_stat). */
+    return (struct _tdirent *) 0;
+  } else if (dirp->dd_stat == 0) {
+    /* We haven't started the search yet. */
+    /* Start the search */
+    dirp->dd_handle = _tfindfirst (dirp->dd_name, &(dirp->dd_dta));
+
+    if (dirp->dd_handle == -1) {
+      /* Whoops! Seems there are no files in that
+       * directory. */
+      dirp->dd_stat = -1;
+    } else {
+      dirp->dd_stat = 1;
+    }
+  } else {
+    /* Get the next search entry. */
+    if (_tfindnext (dirp->dd_handle, &(dirp->dd_dta))) {
+      /* We are off the end or otherwise error.     
+         _findnext sets errno to ENOENT if no more file
+         Undo this. */
+      DWORD winerr = GetLastError ();
+
+      if (winerr == ERROR_NO_MORE_FILES)
+        errno = 0;
+      _findclose (dirp->dd_handle);
+      dirp->dd_handle = -1;
+      dirp->dd_stat = -1;
+    } else {
+      /* Update the status to indicate the correct
+       * number. */
+      dirp->dd_stat++;
+    }
+  }
+
+  if (dirp->dd_stat > 0) {
+    /* Successfully got an entry. Everything about the file is
+     * already appropriately filled in except the length of the
+     * file name. */
+    dirp->dd_dir.d_namlen = _tcslen (dirp->dd_dta.name);
+    _tcscpy (dirp->dd_dir.d_name, dirp->dd_dta.name);
+    return &dirp->dd_dir;
+  }
+
+  return (struct _tdirent *) 0;
+}
+
+
+/*
+ * closedir
+ *
+ * Frees up resources allocated by opendir.
+ */
+int
+_tclosedir (_TDIR * dirp)
+{
+  int rc;
+
+  errno = 0;
+  rc = 0;
+
+  if (!dirp) {
+    errno = EFAULT;
+    return -1;
+  }
+
+  if (dirp->dd_handle != -1) {
+    rc = _findclose (dirp->dd_handle);
+  }
+
+  /* Delete the dir structure. */
+  free (dirp);
+
+  return rc;
+}
+
+/*
+ * rewinddir
+ *
+ * Return to the beginning of the directory "stream". We simply call findclose
+ * and then reset things like an opendir.
+ */
+void
+_trewinddir (_TDIR * dirp)
+{
+  errno = 0;
+
+  if (!dirp) {
+    errno = EFAULT;
+    return;
+  }
+
+  if (dirp->dd_handle != -1) {
+    _findclose (dirp->dd_handle);
+  }
+
+  dirp->dd_handle = -1;
+  dirp->dd_stat = 0;
+}
+
+/*
+ * telldir
+ *
+ * Returns the "position" in the "directory stream" which can be used with
+ * seekdir to go back to an old entry. We simply return the value in stat.
+ */
+long
+_ttelldir (_TDIR * dirp)
+{
+  errno = 0;
+
+  if (!dirp) {
+    errno = EFAULT;
+    return -1;
+  }
+  return dirp->dd_stat;
+}
+
+/*
+ * seekdir
+ *
+ * Seek to an entry previously returned by telldir. We rewind the directory
+ * and call readdir repeatedly until either dd_stat is the position number
+ * or -1 (off the end). This is not perfect, in that the directory may
+ * have changed while we weren't looking. But that is probably the case with
+ * any such system.
+ */
+void
+_tseekdir (_TDIR * dirp, long lPos)
+{
+  errno = 0;
+
+  if (!dirp) {
+    errno = EFAULT;
+    return;
+  }
+
+  if (lPos < -1) {
+    /* Seeking to an invalid position. */
+    errno = EINVAL;
+    return;
+  } else if (lPos == -1) {
+    /* Seek past end. */
+    if (dirp->dd_handle != -1) {
+      _findclose (dirp->dd_handle);
+    }
+    dirp->dd_handle = -1;
+    dirp->dd_stat = -1;
+  } else {
+    /* Rewind and read forward to the appropriate index. */
+    _trewinddir (dirp);
+
+    while ((dirp->dd_stat < lPos) && _treaddir (dirp));
+  }
+}
diff -urN libdvdread-0.9.4\win32\dirent.h Dvdmenuxtractor\libdvdread\win32\dirent.h
--- libdvdread-0.9.4\win32\dirent.h	Thu Jan 01 01:00:00 1970
+++ Dvdmenuxtractor\libdvdread\win32\dirent.h	Mon Sep 13 13:11:12 2004
@@ -0,0 +1,147 @@
+/*
+ * DIRENT.H (formerly DIRLIB.H)
+ *
+ * by M. J. Weinstein   Released to public domain 1-Jan-89
+ *
+ * Because I have heard that this feature (opendir, readdir, closedir)
+ * it so useful for programmers coming from UNIX or attempting to port
+ * UNIX code, and because it is reasonably light weight, I have included
+ * it in the Mingw32 package. I have also added an implementation of
+ * rewinddir, seekdir and telldir.
+ *   - Colin Peters <[email protected]>
+ *
+ *  This code is distributed in the hope that is will be useful but
+ *  WITHOUT ANY WARRANTY. ALL WARRANTIES, EXPRESS OR IMPLIED ARE HEREBY
+ *  DISCLAIMED. This includeds but is not limited to warranties of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ * $Revision: 1.1 $
+ * $Author: ds $
+ * $Date: 2004/04/29 02:52:21 $
+ *
+ */
+
+#ifndef	__STRICT_ANSI__
+
+#ifndef _DIRENT_H_
+#define _DIRENT_H_
+
+/* All the headers include this file. */
+/*#include <_mingw.h>*/
+
+#include <io.h>
+
+#ifndef RC_INVOKED
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+struct dirent
+{
+	long		d_ino;		/* Always zero. */
+	unsigned short	d_reclen;	/* Always zero. */
+	unsigned short	d_namlen;	/* Length of name in d_name. */
+	char*		d_name;		/* File name. */
+	/* NOTE: The name in the dirent structure points to the name in the
+	 *       finddata_t structure in the DIR. */
+};
+
+/*
+ * This is an internal data structure. Good programmers will not use it
+ * except as an argument to one of the functions below.
+ * dd_stat field is now int (was short in older versions).
+ */
+typedef struct
+{
+	/* disk transfer area for this dir */
+	struct _finddata_t	dd_dta;
+
+	/* dirent struct to return from dir (NOTE: this makes this thread
+	 * safe as long as only one thread uses a particular DIR struct at
+	 * a time) */
+	struct dirent		dd_dir;
+
+	/* _findnext handle */
+	long			dd_handle;
+
+	/*
+         * Status of search:
+	 *   0 = not started yet (next entry to read is first entry)
+	 *  -1 = off the end
+	 *   positive = 0 based index of next entry
+	 */
+	int			dd_stat;
+
+	/* given path for dir with search pattern (struct is extended) */
+	char			dd_name[1];
+} DIR;
+
+DIR*		opendir (const char*);
+struct dirent*	readdir (DIR*);
+int		closedir (DIR*);
+void		rewinddir (DIR*);
+long		telldir (DIR*);
+void		seekdir (DIR*, long);
+
+
+/* wide char versions */
+
+struct _wdirent
+{
+	long		d_ino;		/* Always zero. */
+	unsigned short	d_reclen;	/* Always zero. */
+	unsigned short	d_namlen;	/* Length of name in d_name. */
+	wchar_t*	d_name;		/* File name. */
+	/* NOTE: The name in the dirent structure points to the name in the	 *       wfinddata_t structure in the _WDIR. */
+};
+
+/*
+ * This is an internal data structure. Good programmers will not use it
+ * except as an argument to one of the functions below.
+ */
+typedef struct
+{
+	/* disk transfer area for this dir */
+	struct _wfinddata_t	dd_dta;
+
+	/* dirent struct to return from dir (NOTE: this makes this thread
+	 * safe as long as only one thread uses a particular DIR struct at
+	 * a time) */
+	struct _wdirent		dd_dir;
+
+	/* _findnext handle */
+	long			dd_handle;
+
+	/*
+         * Status of search:
+	 *   0 = not started yet (next entry to read is first entry)
+	 *  -1 = off the end
+	 *   positive = 0 based index of next entry
+	 */
+	int			dd_stat;
+
+	/* given path for dir with search pattern (struct is extended) */
+	wchar_t			dd_name[1];
+} _WDIR;
+
+
+
+_WDIR*		_wopendir (const wchar_t*);
+struct _wdirent* _wreaddir (_WDIR*);
+int		_wclosedir (_WDIR*);
+void		_wrewinddir (_WDIR*);
+long		_wtelldir (_WDIR*);
+void		_wseekdir (_WDIR*, long);
+
+
+#ifdef	__cplusplus
+}
+#endif
+
+#endif	/* Not RC_INVOKED */
+
+#endif	/* Not _DIRENT_H_ */
+
+#endif	/* Not __STRICT_ANSI__ */
+
diff -urN libdvdread-0.9.4\win32\gtchar.h Dvdmenuxtractor\libdvdread\win32\gtchar.h
--- libdvdread-0.9.4\win32\gtchar.h	Thu Jan 01 01:00:00 1970
+++ Dvdmenuxtractor\libdvdread\win32\gtchar.h	Thu Apr 29 04:52:21 2004
@@ -0,0 +1,397 @@
+/* 
+ * tchar.h
+ *
+ * Unicode mapping layer for the standard C library. By including this
+ * file and using the 't' names for string functions
+ * (eg. _tprintf) you can make code which can be easily adapted to both
+ * Unicode and non-unicode environments. In a unicode enabled compile define
+ * _UNICODE before including tchar.h, otherwise the standard non-unicode
+ * library functions will be used.
+ *
+ * Note that you still need to include string.h or stdlib.h etc. to define
+ * the appropriate functions. Also note that there are several defines
+ * included for non-ANSI functions which are commonly available (but using
+ * the convention of prepending an underscore to non-ANSI library function
+ * names).
+ *
+ * This file is part of the Mingw32 package.
+ *
+ * Contributors:
+ *  Created by Colin Peters <[email protected]>
+ *
+ *  THIS SOFTWARE IS NOT COPYRIGHTED
+ *
+ *  This source code is offered for use in the public domain. You may
+ *  use, modify or distribute it freely.
+ *
+ *  This code is distributed in the hope that it will be useful but
+ *  WITHOUT ANY WARRANTY. ALL WARRANTIES, EXPRESS OR IMPLIED ARE HEREBY
+ *  DISCLAIMED. This includes but is not limited to warranties of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ * $Revision: 1.1 $
+ * $Author: ds $
+ * $Date: 2004/04/29 02:52:21 $
+ *
+ */
+
+#ifndef	_TCHAR_H_
+#define _TCHAR_H_
+
+/* All the headers include this file. */
+/*#include <_mingw.h>*/
+
+/*
+ * NOTE: This tests _UNICODE, which is different from the UNICODE define
+ *       used to differentiate Win32 API calls.
+ */
+#ifdef	_UNICODE
+
+
+/*
+ * Use TCHAR instead of char or wchar_t. It will be appropriately translated
+ * if _UNICODE is correctly defined (or not).
+ */
+#ifndef _TCHAR_DEFINED
+#ifndef RC_INVOKED
+typedef	wchar_t	TCHAR;
+typedef wchar_t _TCHAR;
+#endif	/* Not RC_INVOKED */
+#define _TCHAR_DEFINED
+#endif
+
+
+/*
+ * __TEXT is a private macro whose specific use is to force the expansion of a
+ * macro passed as an argument to the macros _T or _TEXT.  DO NOT use this
+ * macro within your programs.  It's name and function could change without
+ * notice.
+ */
+#define	__TEXT(q)	L##q
+
+/*  for porting from other Windows compilers */
+#if 0  // no  wide startup module
+#define _tmain      wmain
+#define _tWinMain   wWinMain
+#define _tenviron   _wenviron
+#define __targv     __wargv
+#endif
+
+/*
+ * Unicode functions
+ */
+#define	_tprintf	wprintf
+#define	_ftprintf	fwprintf
+#define	_stprintf	swprintf
+#define	_sntprintf	_snwprintf
+#define	_vtprintf	vwprintf
+#define	_vftprintf	vfwprintf
+#define _vstprintf	vswprintf
+#define	_vsntprintf	_vsnwprintf
+#define	_tscanf		wscanf
+#define	_ftscanf	fwscanf
+#define	_stscanf	swscanf
+#define	_fgettc		fgetwc
+#define	_fgettchar	_fgetwchar
+#define	_fgetts		fgetws
+#define	_fputtc		fputwc
+#define	_fputtchar	_fputwchar
+#define	_fputts		fputws
+#define	_gettc		getwc
+#define	_getts		_getws
+#define	_puttc		putwc
+#define	_putts		_putws
+#define	_ungettc	ungetwc
+#define	_tcstod		wcstod
+#define	_tcstol		wcstol
+#define _tcstoul	wcstoul
+#define	_itot		_itow
+#define	_ltot		_ltow
+#define	_ultot		_ultow
+#define	_ttoi		_wtoi
+#define	_ttol		_wtol
+#define	_tcscat		wcscat
+#define _tcschr		wcschr
+#define _tcscmp		wcscmp
+#define _tcscpy		wcscpy
+#define _tcscspn	wcscspn
+#define	_tcslen		wcslen
+#define	_tcsncat	wcsncat
+#define	_tcsncmp	wcsncmp
+#define	_tcsncpy	wcsncpy
+#define	_tcspbrk	wcspbrk
+#define	_tcsrchr	wcsrchr
+#define _tcsspn		wcsspn
+#define	_tcsstr		wcsstr
+#define _tcstok		wcstok
+#define	_tcsdup		_wcsdup
+#define	_tcsicmp	_wcsicmp
+#define	_tcsnicmp	_wcsnicmp
+#define	_tcsnset	_wcsnset
+#define	_tcsrev		_wcsrev
+#define _tcsset		_wcsset
+#define	_tcslwr		_wcslwr
+#define	_tcsupr		_wcsupr
+#define	_tcsxfrm	wcsxfrm
+#define	_tcscoll	wcscoll
+#define	_tcsicoll	_wcsicoll
+#define	_istalpha	iswalpha
+#define	_istupper	iswupper
+#define	_istlower	iswlower
+#define	_istdigit	iswdigit
+#define	_istxdigit	iswxdigit
+#define	_istspace	iswspace
+#define	_istpunct	iswpunct
+#define	_istalnum	iswalnum
+#define	_istprint	iswprint
+#define	_istgraph	iswgraph
+#define	_istcntrl	iswcntrl
+#define	_istascii	iswascii
+#define _totupper	towupper
+#define	_totlower	towlower
+#define _tcsftime	wcsftime
+/* Macro functions */ 
+#define _tcsdec     _wcsdec
+#define _tcsinc     _wcsinc
+#define _tcsnbcnt   _wcsncnt
+#define _tcsnccnt   _wcsncnt
+#define _tcsnextc   _wcsnextc
+#define _tcsninc    _wcsninc
+#define _tcsspnp    _wcsspnp
+#define _wcsdec(_wcs1, _wcs2) ((_wcs1)>=(_wcs2) ? NULL : (_wcs2)-1)
+#define _wcsinc(_wcs)  ((_wcs)+1)
+#define _wcsnextc(_wcs) ((unsigned int) *(_wcs))
+#define _wcsninc(_wcs, _inc) (((_wcs)+(_inc)))
+#define _wcsncnt(_wcs, _cnt) ((wcslen(_wcs)>_cnt) ? _count : wcslen(_wcs))
+#define _wcsspnp(_wcs1, _wcs2) ((*((_wcs1)+wcsspn(_wcs1,_wcs2))) ? ((_wcs1)+wcsspn(_wcs1,_wcs2)) : NULL)
+
+#if 1  /* defined __MSVCRT__ */
+/*
+ *   These wide functions not in crtdll.dll.
+ *   Define macros anyway so that _wfoo rather than _tfoo is undefined
+ */
+#define _ttoi64     _wtoi64
+#define _i64tot     _i64tow
+#define _ui64tot    _ui64tow
+#define	_tasctime	_wasctime
+#define	_tctime		_wctime
+#define	_tstrdate	_wstrdate
+#define	_tstrtime	_wstrtime
+#define	_tutime		_wutime
+#define _tcsnccoll  _wcsncoll
+#define _tcsncoll   _wcsncoll
+#define _tcsncicoll _wcsnicoll
+#define _tcsnicoll  _wcsnicoll
+#define _taccess    _waccess
+#define _tchmod     _wchmod
+#define _tcreat     _wcreat
+#define _tfindfirst _wfindfirst
+#define _tfindnext  _wfindnext
+#define _tfdopen    _wfdopen
+#define _tfopen     _wfopen
+#define _tgetenv    _wgetenv
+#define _tputenv    _wputenv
+#define _tsearchenv _wsearchenv
+#define _tmakepath  _wmakepath
+#define _tsplitpath _wsplitpath
+#define _tfullpath  _wfullpath
+#define _tmktemp    _wmktemp
+#define _topen      _wopen
+#define _tremove    _wremove
+#define _trename    _wrename
+#define _tsopen     _wsopen
+#define _tsetlocale _wsetlocale
+#define _tunlink    _wunlink
+#define _tfinddata_t    _wfinddata_t
+#define _tfindfirsti64  _wfindfirsti64
+#define _tfindnexti64   _wfindnexti64
+#define _tfinddatai64_t _wfinddatai64_t
+#endif  /* __MSVCRT__ */
+
+/* dirent structures and functions */
+#define _tdirent	_wdirent
+#define _TDIR 		_WDIR
+#define _topendir	_wopendir
+#define _tclosedir	_wclosedir
+#define _treaddir	_wreaddir
+#define _trewinddir	_wrewinddir
+#define _ttelldir	_wtelldir
+#define _tseekdir	_wseekdir
+#else	/* Not _UNICODE */
+
+/*
+ * TCHAR, the type you should use instead of char.
+ */
+#ifndef _TCHAR_DEFINED
+#ifndef RC_INVOKED
+typedef char	TCHAR;
+typedef char	_TCHAR;
+#endif
+#define _TCHAR_DEFINED
+#endif
+
+/*
+ * __TEXT is a private macro whose specific use is to force the expansion of a
+ * macro passed as an argument to the macros _T or _TEXT.  DO NOT use this
+ * macro within your programs.  It's name and function could change without
+ * notice.
+ */
+#define	__TEXT(q)	q
+
+/*  for porting from other Windows compilers */
+#define _tmain      main
+#define _tWinMain   WinMain
+#define _tenviron  _environ
+#define __targv     __argv
+
+/*
+ * Non-unicode (standard) functions
+ */
+
+#define	_tprintf	printf
+#define _ftprintf	fprintf
+#define	_stprintf	sprintf
+#define	_sntprintf	_snprintf
+#define	_vtprintf	vprintf
+#define	_vftprintf	vfprintf
+#define _vstprintf	vsprintf
+#define	_vsntprintf	_vsnprintf
+#define	_tscanf		scanf
+#define	_ftscanf	fscanf
+#define	_stscanf	sscanf
+#define	_fgettc		fgetc
+#define	_fgettchar	_fgetchar
+#define	_fgetts		fgets
+#define	_fputtc		fputc
+#define	_fputtchar	_fputchar
+#define	_fputts		fputs
+#define _tfdopen	_fdopen
+#define	_tfopen		fopen
+#define	_tgetenv	getenv
+#define	_tputenv	_putenv
+#define	_tsearchenv	_searchenv
+#define	_tmakepath	_makepath
+#define	_tsplitpath	_splitpath
+#define	_tfullpath	_fullpath
+#define	_gettc		getc
+#define	_getts		gets
+#define	_puttc		putc
+#define	_putts		puts
+#define	_ungettc	ungetc
+#define	_tcstod		strtod
+#define	_tcstol		strtol
+#define _tcstoul	strtoul
+#define	_itot		_itoa
+#define	_ltot		_ltoa
+#define	_ultot		_ultoa
+#define	_ttoi		atoi
+#define	_ttol		atol
+#define	_tcscat		strcat
+#define _tcschr		strchr
+#define _tcscmp		strcmp
+#define _tcscpy		strcpy
+#define _tcscspn	strcspn
+#define	_tcslen		strlen
+#define	_tcsncat	strncat
+#define	_tcsncmp	strncmp
+#define	_tcsncpy	strncpy
+#define	_tcspbrk	strpbrk
+#define	_tcsrchr	strrchr
+#define _tcsspn		strspn
+#define	_tcsstr		strstr
+#define _tcstok		strtok
+#define	_tcsdup		_strdup
+#define	_tcsicmp	_stricmp
+#define	_tcsnicmp	_strnicmp
+#define	_tcsnset	_strnset
+#define	_tcsrev		_strrev
+#define _tcsset		_strset
+#define	_tcslwr		_strlwr
+#define	_tcsupr		_strupr
+#define	_tcsxfrm	strxfrm
+#define	_tcscoll	strcoll
+#define	_tcsicoll	_stricoll
+#define	_istalpha	isalpha
+#define	_istupper	isupper
+#define	_istlower	islower
+#define	_istdigit	isdigit
+#define	_istxdigit	isxdigit
+#define	_istspace	isspace
+#define	_istpunct	ispunct
+#define	_istalnum	isalnum
+#define	_istprint	isprint
+#define	_istgraph	isgraph
+#define	_istcntrl	iscntrl
+#define	_istascii	isascii
+#define _totupper	toupper
+#define	_totlower	tolower
+#define	_tasctime	asctime
+#define	_tctime		ctime
+#define	_tstrdate	_strdate
+#define	_tstrtime	_strtime
+#define	_tutime		_utime
+#define _tcsftime	strftime
+/* Macro functions */ 
+#define _tcsdec     _strdec
+#define _tcsinc     _strinc
+#define _tcsnbcnt   _strncnt
+#define _tcsnccnt   _strncnt
+#define _tcsnextc   _strnextc
+#define _tcsninc    _strninc
+#define _tcsspnp    _strspnp
+#define _strdec(_str1, _str2) ((_str1)>=(_str2) ? NULL : (_str2)-1)
+#define _strinc(_str)  ((_str)+1)
+#define _strnextc(_str) ((unsigned int) *(_str))
+#define _strninc(_str, _inc) (((_str)+(_inc)))
+#define _strncnt(_str, _cnt) ((strlen(_str)>_cnt) ? _count : strlen(_str))
+#define _strspnp(_str1, _str2) ((*((_str1)+strspn(_str1,_str2))) ? ((_str1)+strspn(_str1,_str2)) : NULL)
+
+#define _tchmod     _chmod
+#define _tcreat     _creat
+#define _tfindfirst _findfirst
+#define _tfindnext  _findnext
+#define _tmktemp    _mktemp
+#define _topen      _open
+#define _taccess    _access
+#define _tremove    remove
+#define _trename    rename
+#define _tsopen     _sopen
+#define _tsetlocale setlocale
+#define _tunlink    _unlink
+#define _tfinddata_t    _finddata_t
+
+#if 1  /* defined __MSVCRT__ */
+/* Not in crtdll.dll. Define macros anyway? */
+#define _ttoi64     _atoi64
+#define _i64tot     _i64toa
+#define _ui64tot    _ui64toa
+#define _tcsnccoll  _strncoll
+#define _tcsncoll   _strncoll
+#define _tcsncicoll _strnicoll
+#define _tcsnicoll  _strnicoll
+#define _tfindfirsti64  _findfirsti64
+#define _tfindnexti64   _findnexti64
+#define _tfinddatai64_t _finddatai64_t
+#endif  /* __MSVCRT__ */
+
+/* dirent structures and functions */
+#define _tdirent	dirent
+#define _TDIR 		DIR
+#define _topendir	opendir
+#define _tclosedir	closedir
+#define _treaddir	readdir
+#define _trewinddir	rewinddir
+#define _ttelldir	telldir
+#define _tseekdir	seekdir
+
+#endif	/* Not _UNICODE */
+
+/*
+ * UNICODE a constant string when _UNICODE is defined else returns the string
+ * unmodified.  Also defined in w32api/winnt.h.
+ */
+#define _TEXT(x)	__TEXT(x)
+#define	_T(x)		__TEXT(x)
+
+#endif	/* Not _TCHAR_H_ */
+
diff -urN libdvdread-0.9.4\win32\inttypes.h Dvdmenuxtractor\libdvdread\win32\inttypes.h
--- libdvdread-0.9.4\win32\inttypes.h	Thu Jan 01 01:00:00 1970
+++ Dvdmenuxtractor\libdvdread\win32\inttypes.h	Mon Sep 13 14:08:25 2004
@@ -0,0 +1,44 @@
+#ifndef _LOCAL_INTTYPES_H_
+#define _LOCAL_INTTYPES_H_
+
+
+#if defined(WIN32)
+#include <windows.h>
+
+typedef unsigned char uint8_t;
+typedef unsigned short int uint16_t;
+typedef unsigned int uint32_t;
+typedef unsigned __int64 uint64_t;
+
+typedef unsigned int ssize_t;
+typedef __int64 int64_t;
+typedef int int32_t;
+typedef short int16_t;
+
+#define strcasecmp(x,y)    stricmp(x,y)
+#define strncasecmp(x,y,z) strnicmp(x,y,z)
+
+#ifndef S_ISREG
+#define S_ISREG(mode) ((mode)&_S_IFREG)
+#endif
+#ifndef S_ISDIR
+#define S_ISDIR(mode) ((mode)&_S_IFDIR)
+#endif
+#ifndef S_ISCHR
+#define S_ISCHR(mode) ((mode)&_S_IFMT)
+#endif
+#ifndef S_ISSOCK
+#define S_ISSOCK(x) (0)
+#endif
+#ifndef S_ISBLK
+#define S_ISBLK(x) (0)
+#endif
+
+#define dlclose(x)	FreeLibrary(x)
+#define dlsym(x,y)	GetProcAddress(x,y)
+
+#else /* !WIN32 */
+#include <inttypes.h>
+#endif /* !WIN32 */
+
+#endif /* _LOCAL_INTTYPES_H_ */