]> git.sesse.net Git - mlt/commitdiff
Initial port to Windows using MinGW.
authorDan Dennedy <dan@dennedy.org>
Fri, 3 Dec 2010 09:00:21 +0000 (01:00 -0800)
committerDan Dennedy <dan@dennedy.org>
Mon, 24 Jan 2011 01:39:42 +0000 (17:39 -0800)
Much of the credit goes to Michael Zenov.

22 files changed:
configure
src/framework/Makefile
src/melt/Makefile
src/melt/io.c
src/mlt++/Makefile
src/mlt++/MltFactory.cpp
src/mlt++/MltFactory.h
src/mlt++/config.h
src/mlt++/configure
src/modules/avformat/Makefile
src/modules/core/Makefile
src/modules/core/producer_loader.c
src/modules/kino/configure
src/modules/motion_est/Makefile
src/modules/sdl/Makefile
src/modules/sdl/consumer_sdl.c
src/modules/sdl/consumer_sdl_audio.c
src/modules/sdl/consumer_sdl_preview.c
src/modules/sdl/consumer_sdl_still.c
src/win32/fnmatch.c [new file with mode: 0644]
src/win32/fnmatch.h [new file with mode: 0644]
src/win32/win32.c [new file with mode: 0644]

index 85f29b4f8371f0b92c79b7003026e268d8759b55..13769b88576bd5171eef8098980a9b2ed6368ece 100755 (executable)
--- a/configure
+++ b/configure
@@ -71,19 +71,19 @@ build_config()
                [ "$cpu" != "" ] && echo "TARGETCPU=-mcpu=$cpu"
                echo "OPTIMISATIONS=-O2 -pipe -fomit-frame-pointer"
 
-               echo "CFLAGS+=-Wall -fPIC -DPIC \$(TARGETARCH) \$(TARGETCPU) \$(OPTIMISATIONS) \$(MMX_FLAGS) \$(SSE_FLAGS) \$(SSE2_FLAGS) \$(DEBUG_FLAGS) \$(LARGE_FILE)"
+               echo "CFLAGS+=-Wall -DPIC \$(TARGETARCH) \$(TARGETCPU) \$(OPTIMISATIONS) \$(MMX_FLAGS) \$(SSE_FLAGS) \$(SSE2_FLAGS) \$(DEBUG_FLAGS) \$(LARGE_FILE)"
 
                case $targetos in
                Darwin)
                sysctl -a hw | grep "x86_64: 1" > /dev/null && echo "ARCH_X86_64=1" && echo "CFLAGS+=-DARCH_X86_64"
-               echo "CFLAGS+=-D__DARWIN__ `sdl-config --cflags`"
+               echo "CFLAGS+=-fPIC -D__DARWIN__ `sdl-config --cflags`"
                echo "SHFLAGS=-dynamiclib"
                echo "LDFLAGS+=`sdl-config --libs`"
                ;;
                Linux)
                [ "$(uname -m)" = "x86_64" ] && echo "ARCH_X86_64=1" && echo "CFLAGS+=-DARCH_X86_64"
                echo "OPTIMISATIONS+=-ffast-math"
-               echo "CFLAGS+=-pthread"
+               echo "CFLAGS+=-fPIC -pthread"
                echo "SHFLAGS=-shared"
                echo "LIBDL=-ldl"
                echo "RDYNAMIC=-rdynamic"
@@ -92,7 +92,7 @@ build_config()
                FreeBSD)
                [ "$(uname -m)" = "x86_64" ] && echo "ARCH_X86_64=1" && echo "CFLAGS+=-DARCH_X86_64"
                echo "OPTIMISATIONS+=-ffast-math"
-               echo "CFLAGS+=-pthread"
+               echo "CFLAGS+=-fPIC -pthread"
                echo "SHFLAGS=-shared"
                echo "RDYNAMIC=-rdynamic"
                echo "LDFLAGS+=-Wl,--no-undefined -Wl,--as-needed"
@@ -105,6 +105,14 @@ build_config()
                echo "RDYNAMIC=-rdynamic"
                echo "LDFLAGS+=-Wl,--no-undefined -Wl,--as-needed"
                ;;
+               MinGW)
+               [ "$(uname -m)" = "x86_64" ] && echo "ARCH_X86_64=1" && echo "CFLAGS+=-DARCH_X86_64"
+               echo "OPTIMISATIONS+=-ffast-math"
+               echo "SHFLAGS=-shared"
+               echo "LIBDL=-ldl"
+               echo "RDYNAMIC="
+               echo "LDFLAGS+=-Wl,--no-undefined -Wl,--as-needed"
+               ;;              
                *)
                ;;
                esac
@@ -182,6 +190,10 @@ case $targetos in
        Linux|FreeBSD|NetBSD)
        LIBSUF=".so"
        ;;
+       MINGW32_NT-*)
+       targetos="MinGW"
+       LIBSUF=".dll"
+       ;;
        *)
        LIBSUF=".so"
        ;;
index 0c61cee035bf86d04483a77a2808246b673dace0..dff362913427b03467d3479ba71fadff568c90f5 100644 (file)
@@ -3,16 +3,20 @@ include ../../config.mak
 NAME = libmlt$(LIBSUF)
 TARGET = $(NAME).$(version)
 
-ifneq ($(targetos), Darwin)
-NAME = libmlt$(LIBSUF)
-TARGET = $(NAME).$(version)
-SONAME = $(NAME).$(soversion)
-SHFLAGS += -Wl,-soname,$(SONAME)
-else
+ifeq ($(targetos), Darwin)
 NAME = libmlt$(LIBSUF)
 TARGET = libmlt.$(version)$(LIBSUF)
 SONAME = libmlt.$(soversion)$(LIBSUF)
 SHFLAGS += -install_name $(libdir)/$(SONAME) -current_version $(version) -compatibility_version $(soversion)
+else ifeq ($(targetos), MinGW)
+NAME = libmlt$(LIBSUF)
+TARGET = libmlt-$(soversion)$(LIBSUF)
+libdir = $(prefix)
+else
+NAME = libmlt$(LIBSUF)
+TARGET = $(NAME).$(version)
+SONAME = $(NAME).$(soversion)
+SHFLAGS += -Wl,-soname,$(SONAME)
 endif
 
 OBJS = mlt_frame.o \
@@ -78,7 +82,9 @@ all:  $(TARGET)
 $(TARGET): $(OBJS)
                $(CC) $(SHFLAGS) -o $@ $(OBJS) $(LDFLAGS)
                ln -sf $(TARGET) $(NAME)
-               ln -sf $(TARGET) $(SONAME)
+               if [ "$(targetos)" != "MinGW" ]; then \
+                       ln -sf $(TARGET) $(SONAME) ; \
+               fi
 
 depend:        $(SRCS)
        $(CC) -MM $(CFLAGS) $^ 1>.depend
@@ -92,8 +98,10 @@ clean:
 install:
        install -d $(DESTDIR)$(libdir)
        install -m 755 $(TARGET) $(DESTDIR)$(libdir)
-       ln -sf $(TARGET) $(DESTDIR)$(libdir)/$(SONAME)
-       ln -sf $(TARGET) $(DESTDIR)$(libdir)/$(NAME)
+       if [ "$(targetos)" != "MinGW" ]; then \
+               ln -sf $(TARGET) $(DESTDIR)$(libdir)/$(SONAME) ; \
+               ln -sf $(TARGET) $(DESTDIR)$(libdir)/$(NAME) ; \
+       fi
        install -d "$(DESTDIR)$(prefix)/include/mlt/framework"
        install -m 644 $(INCS) "$(DESTDIR)$(prefix)/include/mlt/framework"
        install -d "$(DESTDIR)$(datadir)/mlt"
@@ -101,8 +109,10 @@ install:
 
 uninstall:
        rm -f "$(DESTDIR)$(libdir)/$(TARGET)"
-       rm -f "$(DESTDIR)$(libdir)/$(SONAME)"
-       rm -f "$(DESTDIR)$(libdir)/$(NAME)"
+       if [ "$(targetos)" != "MinGW" ]; then \
+               rm -f "$(DESTDIR)$(libdir)/$(SONAME)" ; \
+               rm -f "$(DESTDIR)$(libdir)/$(NAME)" ; \
+       fi
        rm -rf "$(DESTDIR)$(prefix)/include/mlt/framework"
        rm -f "$(DESTDIR)$(datadir)/mlt/metaschema.yaml"
 
index e89e98cfa4a454620180a07c5d39ea3cc97268e4..41959939d1466051775f9b9cf3c9b178017942aa 100644 (file)
@@ -10,6 +10,12 @@ LDFLAGS += -L../framework -lmlt -lpthread
 
 SRCS := $(OBJS:.o=.c)
 
+ifeq ($(targetos), MinGW)
+OBJS += ../win32/win32.o
+SRCS += ../win32/win32.c
+bindir = $(prefix)
+endif
+
 all: $(TARGET)
 
 $(TARGET): $(OBJS)
index 520d74fc0d48b962cd0828c471a5080a7aa2c409..8499a6cbda5dbdb11f3bcc866783299f594b574e 100644 (file)
@@ -27,7 +27,9 @@
 #include <stdlib.h>
 #include <string.h>
 #include <ctype.h>
+#ifndef WIN32
 #include <termios.h>
+#endif
 #include <unistd.h>
 #include <sys/time.h>
 
@@ -102,11 +104,13 @@ static int mode = 0;
 
 void term_exit(void)
 {
+#ifndef WIN32
        if ( mode == 1 )
        {
                tcsetattr( 0, TCSANOW, &oldtty );
                mode = 0;
        }
+#endif
 }
 
 /** Init terminal so that we can grab keys without blocking.
@@ -114,6 +118,7 @@ void term_exit(void)
 
 void term_init( )
 {
+#ifndef WIN32
        struct termios tty;
 
        tcgetattr( 0, &tty );
@@ -132,6 +137,7 @@ void term_init( )
        mode = 1;
 
        atexit( term_exit );
+#endif
 }
 
 /** Check for a keypress without blocking infinitely.
@@ -140,6 +146,7 @@ void term_init( )
 
 int term_read( )
 {
+#ifndef WIN32
     int n = 1;
     unsigned char ch;
     struct timeval tv;
@@ -158,6 +165,7 @@ int term_read( )
             return ch;
         return n;
     }
+#endif
     return -1;
 }
 
index 14c73b7e354e794c34d29ba7e635b8e18078dff7..efaa9a1b2e476b349e87fb23c21f497f783daf1b 100644 (file)
@@ -2,16 +2,20 @@ include ../../config.mak
 include config.mak
 INSTALL = install
 
-ifneq ($(targetos), Darwin)
-NAME = libmlt++$(LIBSUF)
-TARGET = $(NAME).$(version)
-SONAME = $(NAME).$(soversion)
-LIBFLAGS += -Wl,-soname,$(SONAME)
-else
+ifeq ($(targetos), Darwin)
 NAME = libmlt++$(LIBSUF)
 TARGET = libmlt++.$(version)$(LIBSUF)
 SONAME = libmlt++.$(soversion)$(LIBSUF)
 LIBFLAGS += -install_name $(libdir)/$(SONAME) -current_version $(version) -compatibility_version $(soversion)
+else ifeq ($(targetos), MinGW)
+NAME = libmlt++$(LIBSUF)
+TARGET = libmlt++-$(soversion)$(LIBSUF)
+libdir = $(prefix)
+else
+NAME = libmlt++$(LIBSUF)
+TARGET = $(NAME).$(version)
+SONAME = $(NAME).$(soversion)
+LIBFLAGS += -Wl,-soname,$(SONAME)
 endif
 
 CXXFLAGS += -I.. $(RDYNAMIC) -DVERSION=\"$(version)\"
@@ -49,7 +53,9 @@ all:          $(TARGET)
 $(TARGET):     $(OBJS)
        $(CXX) $(LIBFLAGS) -o $@ $(OBJS) $(LDFLAGS)
        ln -sf $(TARGET) $(NAME)
-       ln -sf $(TARGET) $(SONAME)
+       if [ "$(targetos)" != "MinGW" ]; then \
+               ln -sf $(TARGET) $(SONAME) ; \
+       fi
 
 depend:        $(SRCS)
        $(CXX) -MM $(CXXFLAGS) $^ 1>.depend
@@ -62,15 +68,19 @@ distclean:  clean
 install:
        $(INSTALL) -d "$(DESTDIR)$(libdir)"
        $(INSTALL) -m 755 $(TARGET) $(DESTDIR)$(libdir)
-       ln -sf $(TARGET) $(DESTDIR)$(libdir)/$(NAME)
-       ln -sf $(TARGET) $(DESTDIR)$(libdir)/$(SONAME)
+       if [ "$(targetos)" != "MinGW" ]; then \
+               ln -sf $(TARGET) $(DESTDIR)$(libdir)/$(NAME) ; \
+               ln -sf $(TARGET) $(DESTDIR)$(libdir)/$(SONAME) ; \
+       fi
        $(INSTALL) -d "$(DESTDIR)$(prefix)/include/mlt++"
        $(INSTALL) -m 644 $(HEADERS) "$(DESTDIR)$(prefix)/include/mlt++"
 
 uninstall:
        rm -f "$(DESTDIR)$(libdir)/$(TARGET)"
-       rm -f "$(DESTDIR)$(libdir)/$(NAME)"
-       rm -f "$(DESTDIR)$(libdir)/$(SONAME)"
+       if [ "$(targetos)" != "MinGW" ]; then \
+               rm -f "$(DESTDIR)$(libdir)/$(NAME)" ; \
+               rm -f "$(DESTDIR)$(libdir)/$(SONAME)" ; \
+       fi
        rm -rf "$(DESTDIR)$(prefix)/include/mlt++"
 
 ifneq ($(wildcard .depend),)
index 4c9d1f5abf783a4d97f5eced09fb993792eb8843..17b7c318f62408c0ebad2503a503259a522c5a23 100644 (file)
@@ -57,18 +57,6 @@ Consumer *Factory::consumer( Profile& profile, char *id, char *arg )
        return new Consumer( profile, id, arg );
 }
 
-#ifdef WIN32
-char *Factory::getenv( const char *name )
-{
-       return mlt_getenv( name );
-}
-
-int Factory::setenv( const char *name, const char *value )
-{
-       return mlt_setenv( name, value );
-}
-#endif
-
 void Factory::close( )
 {
        mlt_factory_close( );
index 382bedeee5d4b14bc805725570aadac242f4ce32..0f1a693d18561c22db13a5abad5e92cee6059006 100644 (file)
@@ -49,10 +49,6 @@ namespace Mlt
                        static Filter *filter( Profile& profile, char *id, char *arg = NULL );
                        static Transition *transition( Profile& profile, char *id, char *arg = NULL );
                        static Consumer *consumer( Profile& profile, char *id, char *arg = NULL );
-#ifdef WIN32
-                       static char *getenv( const char * );
-                       static int setenv( const char *, const char * );
-#endif
                        static void close( );
        };
 }
index ccda822d81c16f0fe3969ef7958420d5538dd429..454771e2787b57810478b15553822fa36c7bafc6 100644 (file)
@@ -21,7 +21,7 @@
 #ifndef MLTPP_CONFIG_H_
 #define MLTPP_CONFIG_H_
 
-#ifdef WIN32
+#if defined(WIN32) && defined(_MSC_VER)
     #ifdef MLTPP_EXPORTS
         #define MLTPP_DECLSPEC __declspec( dllexport )
     #else
index e7c0de62b92c57a7b5c5a3e48ce77aeb672fd38e..8fe14f6bf9a1511bcdb41ad1589dcc02b62d2abc 100755 (executable)
@@ -4,7 +4,6 @@ echo "mlt++     -I$prefix/include -I$prefix/include/mlt++ -D_REENTRANT  -L$libdir -lm
 
 WARNINGS="-W -Wwrite-strings -Wcast-qual -Wpointer-arith -Wcast-align -Wredundant-decls"
 
-targetos=$(uname -s)
 case $targetos in 
        Darwin)
                echo LIBSUF=.dylib
@@ -16,4 +15,9 @@ case $targetos in
                echo "CXXFLAGS+=-Wall $WARNINGS -fPIC -DPIC"
                echo "LIBFLAGS=-shared"
                ;;
+       MinGW)
+               echo LIBSUF=.dll
+               echo "CXXFLAGS+=-Wall $WARNINGS -DPIC"
+               echo "LIBFLAGS=-enable-auto-import -shared"
+               ;;
 esac >> config.mak
index 75d84668c2b81f085ff6d204aae8a65ba3654e9d..30d8f401d0ad63f21fd1fda2f7d0cdcf79abd354 100644 (file)
@@ -56,6 +56,11 @@ endif
 
 SRCS := $(OBJS:.o=.c)
 
+ifeq ($(targetos), MinGW)
+OBJS += ../../win32/win32.o
+SRCS += ../../win32/win32.c
+endif
+
 all:   $(TARGET)
 
 $(LOCAL_FFMPEG_OBJS):
index a619286841ad714fcf7b312e40d89cb956957ef0..788319c9f622ade2232ddf5af98d59dd50f7217b 100644 (file)
@@ -43,6 +43,12 @@ ASM_OBJS =
 
 SRCS := $(OBJS:.o=.c)
 
+ifeq ($(targetos), MinGW)
+CFLAGS += -I../../win32
+OBJS += ../../win32/fnmatch.o
+SRCS += ../../win32/fnmatch.c
+endif
+
 all:   $(TARGET)
 
 $(TARGET): $(OBJS) $(ASM_OBJS)
index 35229d22e10ba8cff5c2d9c33421336d3b257974..2600b62cc46b6374ea85a9fc916dd2b3921051d8 100644 (file)
@@ -53,7 +53,8 @@ static mlt_producer create_producer( mlt_profile profile, char *file )
        mlt_producer result = NULL;
 
        // 1st Line - check for service:resource handling
-       if ( strchr( file, ':' ) )
+       // And ignore drive letters on Win32 - no single char services supported.
+       if ( strchr( file, ':' ) > file + 1 )
        {
                char *temp = strdup( file );
                char *service = temp;
index f6524f38959c3d9a33b0dc363b049afee800ad07..88009a00e08c6ad573f71eb7551b5d450403b44f 100755 (executable)
@@ -3,9 +3,9 @@
 if [ "$help" != "1" ]
 then
 
-       if [ "$targetos" = "Darwin" ]
+       if [ "$targetos" = "Darwin" ] || [ "$targetos" = "MinGW" ]
        then
-               echo "- does not build on Darwin: disabling"
+               echo "- does not build on Darwin or Windows: disabling"
                touch ../disable-kino
                exit 0
        fi
index 78bcd22ca95672eb468e6e84d2dc695fde1fbbe1..b0eefc766f4730769cfd599931dcc9668054a43c 100644 (file)
@@ -4,7 +4,7 @@ LDFLAGS += -L../../framework -lmlt -lm
 
 include ../../../config.mak
 
-TARGET = ../libmltmotion_est.so
+TARGET = ../libmltmotion_est.$(LIBSUF)
 
 OBJS = factory.o \
           filter_motion_est.o \
index 24a0faf244374929d3a585beb273635d2cc08f9f..1bb3b7a68c2e19e121395318297d2dccd4a8bf6a 100644 (file)
@@ -17,7 +17,7 @@ OBJS = factory.o \
 ifeq ($(targetos),Darwin)
 CFLAGS += -ObjC
 LDFLAGS += -lobjc -framework Foundation
-else
+else ifeq ($(targetos), Linux|FreeBSD)
 LDFLAGS += -lX11
 endif
 
@@ -37,6 +37,11 @@ OBJS += consumer_sdl_osx.o
 SRCS += consumer_sdl_osx.m consumer_sdl_osx.h
 endif
 
+ifeq ($(targetos), MinGW)
+OBJS += ../../win32/win32.o
+SRCS += ../../win32/win32.c
+endif
+
 all:   $(TARGET)
 
 $(TARGET): $(OBJS)
index f58e73de84b937bfa81340cf15aa9cef47fded9f..92957cdf2375d1ce1d99433f4ae90b79fb04a253 100644 (file)
@@ -264,7 +264,9 @@ int consumer_stop( mlt_consumer parent )
                // Kill the thread and clean up
                this->joined = 1;
                this->running = 0;
+#ifndef WIN32
                if ( this->thread )
+#endif
                        pthread_join( this->thread, NULL );
 
                // internal cleanup
@@ -855,6 +857,7 @@ static int consumer_get_dimensions( int *width, int *height )
        // Get the wm structure
        if ( SDL_GetWMInfo( &wm ) == 1 )
        {
+#ifndef WIN32
                // Check that we have the X11 wm
                if ( wm.subsystem == SDL_SYSWM_X11 ) 
                {
@@ -875,6 +878,7 @@ static int consumer_get_dimensions( int *width, int *height )
                        *width = attr.width;
                        *height = attr.height;
                }
+#endif
        }
 #endif
 
index c6103fbb4667dc1a0d20960f4817ddf7d7b4e418..f15bbf2106efc5140c5ba4311a30ed8e5aabdfea 100644 (file)
@@ -193,7 +193,9 @@ int consumer_stop( mlt_consumer parent )
                pthread_mutex_unlock( &this->refresh_mutex );
 
                // Cleanup the main thread
+#ifndef WIN32
                if ( this->thread )
+#endif
                        pthread_join( this->thread, NULL );
 
                // Unlatch the audio callback
index 94a5598ee1d4aabdba175a256c3ac08b1d8ab945..9d336dad707d01142c45fe663fda1a4a96b6892e 100644 (file)
@@ -249,7 +249,9 @@ static int consumer_stop( mlt_consumer parent )
                pthread_mutex_lock( &this->refresh_mutex );
                pthread_cond_broadcast( &this->refresh_cond );
                pthread_mutex_unlock( &this->refresh_mutex );
+#ifndef WIN32
                if ( this->thread )
+#endif
                        pthread_join( this->thread, NULL );
                this->joined = 1;
 
index 8a423db940ffb8906861adca907d90367341de41..57dc410662494c3689606d5b5302ebc90ca8fe86 100644 (file)
@@ -614,10 +614,11 @@ static int consumer_get_dimensions( int *width, int *height )
        // Specify the SDL Version
        SDL_VERSION( &wm.version );
 
+#ifndef __DARWIN__
        // Get the wm structure
        if ( SDL_GetWMInfo( &wm ) == 1 )
        {
-#ifndef __DARWIN__
+#ifndef WIN32
                // Check that we have the X11 wm
                if ( wm.subsystem == SDL_SYSWM_X11 ) 
                {
@@ -640,6 +641,7 @@ static int consumer_get_dimensions( int *width, int *height )
                }
 #endif
        }
+#endif
 
        return changed;
 }
diff --git a/src/win32/fnmatch.c b/src/win32/fnmatch.c
new file mode 100644 (file)
index 0000000..1fbc548
--- /dev/null
@@ -0,0 +1,198 @@
+/*
+ * Copyright (c) 1989, 1993, 1994
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Guido van Rossum.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * From FreeBSD fnmatch.c 1.11
+ * $Id$
+ */
+
+#if defined(LIBC_SCCS) && !defined(lint)
+static char sccsid[] = "@(#)fnmatch.c  8.2 (Berkeley) 4/16/94";
+#endif /* LIBC_SCCS and not lint */
+
+/*
+ * Function fnmatch() as specified in POSIX 1003.2-1992, section B.6.
+ * Compares a filename or pathname to a pattern.
+ */
+
+#include <ctype.h>
+#include <string.h>
+#include <stdio.h>
+
+#include "fnmatch.h"
+
+#define        EOS     '\0'
+
+static const char *rangematch(const char *, char, int);
+
+int fnmatch(const char *pattern, const char *string, int flags)
+{
+       const char *stringstart;
+       char c, test;
+
+       for (stringstart = string;;)
+               switch (c = *pattern++) {
+               case EOS:
+                       if ((flags & FNM_LEADING_DIR) && *string == '/')
+                               return (0);
+                       return (*string == EOS ? 0 : FNM_NOMATCH);
+               case '?':
+                       if (*string == EOS)
+                               return (FNM_NOMATCH);
+                       if (*string == '/' && (flags & FNM_PATHNAME))
+                               return (FNM_NOMATCH);
+                       if (*string == '.' && (flags & FNM_PERIOD) &&
+                           (string == stringstart ||
+                           ((flags & FNM_PATHNAME) && *(string - 1) == '/')))
+                               return (FNM_NOMATCH);
+                       ++string;
+                       break;
+               case '*':
+                       c = *pattern;
+                       /* Collapse multiple stars. */
+                       while (c == '*')
+                               c = *++pattern;
+
+                       if (*string == '.' && (flags & FNM_PERIOD) &&
+                           (string == stringstart ||
+                           ((flags & FNM_PATHNAME) && *(string - 1) == '/')))
+                               return (FNM_NOMATCH);
+
+                       /* Optimize for pattern with * at end or before /. */
+                       if (c == EOS)
+                               if (flags & FNM_PATHNAME)
+                                       return ((flags & FNM_LEADING_DIR) ||
+                                           strchr(string, '/') == NULL ?
+                                           0 : FNM_NOMATCH);
+                               else
+                                       return (0);
+                       else if (c == '/' && flags & FNM_PATHNAME) {
+                               if ((string = strchr(string, '/')) == NULL)
+                                       return (FNM_NOMATCH);
+                               break;
+                       }
+
+                       /* General case, use recursion. */
+                       while ((test = *string) != EOS) {
+                               if (!fnmatch(pattern, string, flags & ~FNM_PERIOD))
+                                       return (0);
+                               if (test == '/' && flags & FNM_PATHNAME)
+                                       break;
+                               ++string;
+                       }
+                       return (FNM_NOMATCH);
+               case '[':
+                       if (*string == EOS)
+                               return (FNM_NOMATCH);
+                       if (*string == '/' && flags & FNM_PATHNAME)
+                               return (FNM_NOMATCH);
+                       if ((pattern =
+                           rangematch(pattern, *string, flags)) == NULL)
+                               return (FNM_NOMATCH);
+                       ++string;
+                       break;
+               case '\\':
+                       if (!(flags & FNM_NOESCAPE)) {
+                               if ((c = *pattern++) == EOS) {
+                                       c = '\\';
+                                       --pattern;
+                               }
+                       }
+                       /* FALLTHROUGH */
+               default:
+                       if (c == *string)
+                               ;
+                       else if ((flags & FNM_CASEFOLD) &&
+                                (tolower((unsigned char)c) ==
+                                 tolower((unsigned char)*string)))
+                               ;
+                       else if ((flags & FNM_PREFIX_DIRS) && *string == EOS &&
+                            (c == '/' && string != stringstart ||
+                            string == stringstart+1 && *stringstart == '/') )
+                               return (0);
+                       else
+                               return (FNM_NOMATCH);
+                       string++;
+                       break;
+               }
+       /* NOTREACHED */
+}
+
+static const char *
+rangematch(const char *pattern, char test, int flags)
+{
+       int negate, ok;
+       char c, c2;
+
+       /*
+        * A bracket expression starting with an unquoted circumflex
+        * character produces unspecified results (IEEE 1003.2-1992,
+        * 3.13.2).  This implementation treats it like '!', for
+        * consistency with the regular expression syntax.
+        * J.T. Conklin (conklin@ngai.kaleida.com)
+        */
+       if ( (negate = (*pattern == '!' || *pattern == '^')) )
+               ++pattern;
+
+       if (flags & FNM_CASEFOLD)
+               test = tolower((unsigned char)test);
+
+       for (ok = 0; (c = *pattern++) != ']';) {
+               if (c == '\\' && !(flags & FNM_NOESCAPE))
+                       c = *pattern++;
+               if (c == EOS)
+                       return (NULL);
+
+               if (flags & FNM_CASEFOLD)
+                       c = tolower((unsigned char)c);
+
+               if (*pattern == '-'
+                   && (c2 = *(pattern+1)) != EOS && c2 != ']') {
+                       pattern += 2;
+                       if (c2 == '\\' && !(flags & FNM_NOESCAPE))
+                               c2 = *pattern++;
+                       if (c2 == EOS)
+                               return (NULL);
+
+                       if (flags & FNM_CASEFOLD)
+                               c2 = tolower((unsigned char)c2);
+
+                       if ((unsigned char)c <= (unsigned char)test &&
+                           (unsigned char)test <= (unsigned char)c2)
+                               ok = 1;
+               } else if (c == test)
+                       ok = 1;
+       }
+       return (ok == negate ? NULL : pattern);
+}
diff --git a/src/win32/fnmatch.h b/src/win32/fnmatch.h
new file mode 100644 (file)
index 0000000..e2af699
--- /dev/null
@@ -0,0 +1,54 @@
+/*-
+ * Copyright (c) 1992, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ *     @(#)fnmatch.h   8.1 (Berkeley) 6/2/93
+ *
+ * From FreeBSD fnmatch.h 1.7
+ * $Id$
+ */
+
+#ifndef        _FNMATCH_H_
+#define        _FNMATCH_H_
+
+
+#define        FNM_NOMATCH     1       /* Match failed. */
+
+#define        FNM_NOESCAPE    0x01    /* Disable backslash escaping. */
+#define        FNM_PATHNAME    0x02    /* Slash must be matched by slash. */
+#define        FNM_PERIOD      0x04    /* Period must be matched by period. */
+#define        FNM_LEADING_DIR 0x08    /* Ignore /<tail> after Imatch. */
+#define        FNM_CASEFOLD    0x10    /* Case insensitive search. */
+#define FNM_PREFIX_DIRS        0x20    /* Directory prefixes of pattern match too. */
+
+int fnmatch(const char *pattern, const char *string, int flags);
+
+#endif /* !_FNMATCH_H_ */
diff --git a/src/win32/win32.c b/src/win32/win32.c
new file mode 100644 (file)
index 0000000..5105efc
--- /dev/null
@@ -0,0 +1,43 @@
+
+#include <errno.h> 
+#include <time.h> 
+#include <windows.h>
+#include <pthread.h>
+
+int usleep(unsigned int useconds)
+{
+       HANDLE timer;
+       LARGE_INTEGER due;
+
+       due.QuadPart = -(10 * (__int64)useconds);
+
+       timer = CreateWaitableTimer(NULL, TRUE, NULL);
+       SetWaitableTimer(timer, &due, 0, NULL, NULL, 0);
+       WaitForSingleObject(timer, INFINITE);
+       CloseHandle(timer);
+       return 0;
+}
+
+
+int nanosleep( const struct timespec * rqtp, struct timespec * rmtp )
+{
+       if (rqtp->tv_nsec > 999999999) {
+               /* The time interval specified 1,000,000 or more microseconds. */
+               errno = EINVAL;
+               return -1;
+       }
+       return usleep( rqtp->tv_sec * 1000000 + rqtp->tv_nsec / 1000 );
+} 
+
+int setenv(const char *name, const char *value, int overwrite)
+{
+       int result = 1; 
+       if (overwrite == 0 && getenv (name))  {
+               result = 0;
+       } else  {
+               result = SetEnvironmentVariable (name,value); 
+        }
+
+       return result; 
+} 
+