--- expandstr.c~0	2010-06-06 00:41:10.000000000 +0300
+++ expandstr.c	2012-02-25 15:11:19.431375000 +0200
@@ -91,7 +91,7 @@ static int compute_length(const char *p)
   first = 1;
   len = 0;
   while (*p) {
-    if (first && (*p == '~') && (p[1] == '/')) {
+    if (first && (*p == '~') && (ISSLASH(p[1]))) {
       /* Make no attempt to expand ~other_user form */
       len += home_dir_len();
       p++;
@@ -154,7 +154,7 @@ static void do_expand(const char *p, cha
   int first;
   first = 1;
   while (*p) {
-    if (first && (*p == '~') && (p[1] == '/')) {
+    if (first && (*p == '~') && (ISSLASH(p[1]))) {
       result = append_home_dir(result);
       p++;
     } else if ((*p == '$') && (p[1] == '{')) {
--- glob.c~0	2010-06-06 00:41:10.000000000 +0300
+++ glob.c	2012-02-25 15:16:48.056375000 +0200
@@ -255,7 +255,7 @@ static char *copy_folder_name(const char
   for (p=result, q=start;
        end ? (q < end) : *q;
        q++) {
-    if ((q[0] == '\\') && (q[1] == ':')) {
+    if ((q[0] == '\\') && (q[1] == COLON)) {
       /* Escaped colon : drop the backslash */
     } else {
       *p++ = *q;
@@ -294,12 +294,12 @@ void split_on_colons(const char *str, in
     char *colon;
     char *xx;
 
-    colon = strchr(left_to_do, ':');
+    colon = strchr(left_to_do, COLON);
     /* Allow backslash-escaped colons in filenames */
     if (colon && (colon > left_to_do) && (colon[-1]=='\\')) {
       int is_escaped;
       do {
-        colon = strchr(colon + 1, ':');
+        colon = strchr(colon + 1, COLON);
         is_escaped = (colon && (colon[-1] == '\\'));
       } while (colon && is_escaped);
     }
--- mairix.c~0	2010-06-06 00:41:10.000000000 +0300
+++ mairix.c	2012-03-05 21:20:50.285750000 +0200
@@ -105,7 +105,7 @@ int member_of (const char *complete_mfol
     struct stat mfolder_sb, src_folder_sb; /* for checking inode numbers */
 
     /* if the complete path names are the same, definitely a match */
-    if (strcmp (complete_mfolder, paths[i]) == 0)
+    if (fncmp (complete_mfolder, paths[i]) == 0)
       return 1;
     /* also a match if they point to the same file or directory but
        via different routes (e.g. absolute path for one but path with
@@ -115,8 +115,10 @@ int member_of (const char *complete_mfol
     if (stat (complete_mfolder, &mfolder_sb) != 0 ||
         stat (paths[i], &src_folder_sb) != 0)
       continue;
+#ifndef __MINGW32__
     if (mfolder_sb.st_ino == src_folder_sb.st_ino)
       return 1;
+#endif	/* not __MINGW32__ */
   }
   return 0;
 }
@@ -146,7 +148,8 @@ static void add_folders(char **folders, 
     extra_len = strlen(extra_folders);
     new_folders = new_array(char, old_len + extra_len + 2);
     strcpy(new_folders, old_folders);
-    strcpy(new_folders + old_len, ":");
+    new_folders[old_len] = COLON;
+    new_folders[old_len + 1] = '\0';
     strcpy(new_folders + old_len + 1, extra_folders);
     *folders = new_folders;
     free(old_folders);
@@ -221,7 +224,7 @@ static void parse_rc_file(char *name)/*{
     }
 
     /* Strip trailing comments. */
-    for (p=line; *p && !strchr("#!;%", *p); p++) ;
+    for (p=line; *p && !strchr("#", *p); p++) ;
     if (*p) *p = '\0';
 
     /* Discard blank lines */
@@ -627,9 +630,13 @@ int main (int argc, char **argv)/*{{{*/
    * cron jobs).
    * Prevent concurrent searching and indexing. */
 
+#ifdef SIGHUP
   signal(SIGHUP, handlesig);
+#endif
   signal(SIGINT, handlesig);
+#ifdef SIGQUIT
   signal(SIGQUIT, handlesig);
+#endif
 
   lock_database(database_path, do_forced_unlock);
 
@@ -656,8 +663,8 @@ int main (int argc, char **argv)/*{{{*/
 
     /* complete_mfolder is needed by search_top() and member_of() so
        compute it once here rather than in search_top() as well */
-    if ((mfolder[0] == '/') ||
-        ((mfolder[0] == '.') && (mfolder[1] == '/'))) {
+    if (IS_ABSOLUTE(mfolder) ||
+	(mfolder[0] == '.' && ISSLASH(mfolder[1]))) {
       complete_mfolder = new_string(mfolder);
     } else {
       len = strlen(folder_base) + strlen(mfolder) + 2;
--- mairix.h~0	2010-06-06 00:41:10.000000000 +0300
+++ mairix.h	2012-03-03 21:39:46.958219900 +0200
@@ -33,6 +33,31 @@
 
 #include "memmac.h"
 
+#ifdef __MINGW32__
+#define ISSLASH(C)      ((C) == '/' || (C) == '\\')
+#define COLON           ';'
+#define fncmp           fname_cmp
+extern int fname_cmp (const char *, const char *);
+#define IS_ABSOLUTE(F)  (ISSLASH((F)[0]) || ((F)[0] && (F)[1] == ':'))
+#define lstat           stat
+#define S_ISLNK(S)      (0)
+#define bzero(P,S)      memset(P,0,S)
+/* Must include unistd.h before redefining mkdir, since unistd.h gives
+   the prototype of mkdir.  */
+#include <unistd.h>
+#define mkdir(N,F)      _mkdir(N)
+extern int link (const char *, const char *);
+#define fsync(F)        _commit(F)
+#else  /* not __MINGW32__ */
+#define ISSLASH(C)      ((C) == '/')
+#define COLON           ':'
+#define fncmp           strcmp
+#define IS_ABSOLUTE(F)  (ISSLASH((F)[0])
+#ifndef O_BINARY
+#define O_BINARY        0
+#endif
+#endif /* not __MINGW32__ */
+
 struct msgpath {/*{{{*/
   /* The 'selector' for this union is the corresponding entry of type 'enum
    * message_type' */
--- mbox.c~0	2010-06-06 00:41:10.000000000 +0300
+++ mbox.c	2012-02-25 18:12:29.853250000 +0200
@@ -457,7 +457,7 @@ static char *find_last_slash(char *in)/*
   char *p = in;
   char *result = NULL;
   while (*p) {
-    if (*p == '/') result = p;
+    if (ISSLASH(*p)) result = p;
     p++;
   }
   return result;
@@ -689,7 +689,7 @@ static void handle_one_path(const char *
   char *last_comp;
   int base_len;
 
-  is_abs = (path[0] == '/') ? 1 : 0;
+  is_abs = (IS_ABSOLUTE(path)) ? 1 : 0;
   if (is_abs) {
     full_path = new_string(path);
     base_len = 0;
--- reader.c~0	2010-06-06 00:41:10.000000000 +0300
+++ reader.c	2012-02-25 18:19:15.556375000 +0200
@@ -90,7 +90,7 @@ struct read_db *open_db(char *filename)/
   unsigned int *uidata;
   unsigned char *ucdata;
 
-  fd = open(filename, O_RDONLY);
+  fd = open(filename, O_RDONLY | O_BINARY);
   if (fd < 0) {
     report_error("open", filename);
     unlock_and_exit (2);
--- rfc822.c~0	2010-06-06 00:41:10.000000000 +0300
+++ rfc822.c	2012-03-03 21:30:51.723844900 +0200
@@ -1319,6 +1319,7 @@ void create_ro_mapping(const char *filen
     }
     free(p);
     xx_zclose(zf);
+    fflush(tmpf);	/* needed to get all the data to the disk */
 
     if(*len > 0) {
       ro = add_ro_cache(filename, fileno(tmpf), *len);
@@ -1352,7 +1353,7 @@ comp_error:
     return;
   }
 
-  fd = open(filename, O_RDONLY);
+  fd = open(filename, O_RDONLY | O_BINARY);
   if (fd < 0)
   {
     report_error("open", filename);
--- search.c~0	2010-06-06 00:41:10.000000000 +0300
+++ search.c	2012-03-03 15:49:30.255094900 +0200
@@ -33,6 +33,8 @@
 #include <dirent.h>
 #include <errno.h>
 
+#include <windows.h>
+
 /* Lame fix for systems where NAME_MAX isn't defined after including the above
  * set of .h files (Solaris, FreeBSD so far).  Probably grossly oversized but
  * it'll do. */
@@ -642,10 +644,10 @@ static int looks_like_maildir_new_p(cons
   const char *s1, *s2;
   s2 = p;
   while (*s2) s2++;
-  while ((s2 > p) && (*s2 != '/')) s2--;
+  while ((s2 > p) && !ISSLASH(*s2)) s2--;
   if (s2 <= p) return 0;
   s1 = s2 - 1;
-  while ((s1 > p) && (*s1 != '/')) s1--;
+  while ((s1 > p) && !ISSLASH(*s1)) s1--;
   if (s1 <= p) return 0;
   if (!strncmp(s1, "/new/", 5)) {
     return 1;
@@ -656,12 +658,40 @@ static int looks_like_maildir_new_p(cons
 /*}}}*/
 static void create_symlink(char *link_target, char *new_link)/*{{{*/
 {
+#if defined(S_IFLNK)
   if (symlink(link_target, new_link) < 0) {
     if (verbose) {
       perror("symlink");
       fprintf(stderr, "Failed path <%s> -> <%s>\n", link_target, new_link);
     }
   }
+#elif defined(__MINGW32__)
+  if (!CopyFile(link_target, new_link, TRUE)) {
+    if (verbose) {
+      DWORD err = GetLastError();
+
+      switch (err) {
+	  case ERROR_FILE_EXISTS:
+	  case ERROR_ACCESS_DENIED:
+	    errno = EEXIST;
+	    break;
+	  case ERROR_CANNOT_COPY:
+	    errno = EACCES;
+	    break;
+	  default:
+	    errno = ENOSPC;
+	    break;
+	}
+      perror("CopyFile");
+      fprintf(stderr, "Failed path <%s> -> <%s>\n", link_target, new_link);
+    }
+  }
+#else
+  if (verbose) {
+    perror("symlink");
+    fprintf(stderr, "Failed path <%s> -> <%s>\n", link_target, new_link);
+  }
+#endif
 }
 /*}}}*/
 static void append_file_to_mbox(const char *path, FILE *out)/*{{{*/
--- writer.c~0	2010-06-06 00:41:10.000000000 +0300
+++ writer.c	2012-03-03 21:39:20.739469900 +0200
@@ -92,7 +92,7 @@ static void create_rw_mapping(char *file
   char *data;
   struct stat sb;
 
-  fd = open(filename, O_RDWR | O_CREAT, 0600);
+  fd = open(filename, O_RDWR | O_BINARY | O_CREAT, 0600);
   if (fd < 0) {
     report_error("open", filename);
     unlock_and_exit(2);
--- /dev/null	1970-01-01 02:00:00.000000000 +0200
+++ pwd.h	2012-03-03 15:15:29.270719900 +0200
@@ -0,0 +1,24 @@
+/* pwd.h for w32 build  */
+
+#ifndef PWD_H
+#define PWD_H
+
+struct passwd {
+  char     *pw_name;
+  char     *pw_passwd;
+  unsigned  pw_uid;
+  unsigned  pw_gid;
+  int       pw_quota;
+  char     *pw_gecos;
+  char     *pw_dir;
+  char     *pw_shell;
+};
+
+typedef unsigned uid_t;
+typedef unsigned gid_t;
+
+struct passwd * getpwuid (int);
+int getuid (void);
+
+#endif /* PWD_H */
+
--- /dev/null	1970-01-01 02:00:00.000000000 +0200
+++ sys/mman.h	2012-03-03 15:23:04.051969900 +0200
@@ -0,0 +1,35 @@
+/* sys/mman.h for w32 */
+
+#ifndef SYS_MMAN_H
+#define SYS_MMAN_H
+
+#define	PROT_NONE	 0x00	/* No access.  */
+#define	PROT_READ	 0x04	/* Pages can be read.  */
+#define	PROT_WRITE	 0x02	/* Pages can be written.  */
+#define	PROT_EXEC	 0x01	/* Pages can be executed.  */
+
+/* Flags contain mapping type, sharing type and options.  */
+
+/* Mapping type (must choose one and only one of these).  */
+#define MAP_FILE	 0x0001	/* Mapped from a file or device.  */
+#define MAP_ANON	 0x0002	/* Allocated from anonymous virtual memory.  */
+#define MAP_TYPE	 0x000f	/* Mask for type field.  */
+#define MAP_ANONYMOUS  MAP_ANON /* Linux name. */
+
+/* Sharing types (must choose one and only one of these).  */
+#define MAP_COPY	 0x0020	/* Virtual copy of region at mapping time.  */
+#define	MAP_SHARED	 0x0010	/* Share changes.  */
+#define	MAP_PRIVATE	 0x0000	/* Changes private; copy pages on write.  */
+
+/* Other flags.  */
+#define	MAP_FIXED	 0x0100	/* Map address must be exactly as requested. */
+#define MAP_NOEXTEND	 0x0200	/* For MAP_FILE, don't change file size.  */
+#define MAP_HASSEMPHORE  0x0400	/* Region may contain semaphores.  */
+#define MAP_INHERIT	 0x0800	/* Region is retained after exec.  */
+
+#define MAP_FAILED	 ((void *)-1)
+
+void *mmap (void *, size_t, int, int, int, off_t);
+int munmap (void *, size_t);
+
+#endif	/* SYS_MMAN_H */
--- /dev/null	1970-01-01 02:00:00.000000000 +0200
+++ sys/utsname.h	2012-03-03 14:13:20.786344900 +0200
@@ -0,0 +1,16 @@
+/* sys/utsname.h for w32.  */
+
+#ifndef SYS_UTSNAME_H
+#define SYS_UTSNAME_H
+
+struct utsname {
+  char sysname[9];
+  char release[9];
+  char version[9];
+  char machine[9];
+  char nodename[256];
+};
+
+int uname (struct utsname *);
+
+#endif	/* SYS_UTSNAME_H */
--- /dev/null	1970-01-01 02:00:00.000000000 +0200
+++ w32supp.c	2012-03-03 17:41:49.145719900 +0200
@@ -0,0 +1,275 @@
+/* Windows support code for Mairix.  */
+
+#include <io.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <errno.h>
+
+#include <sys/utsname.h>
+#include <pwd.h>
+#include <sys/mman.h>
+
+#define _WIN32_WINNT 0x0500
+#include <windows.h>
+#define LODWORD(l)   ((DWORD)((DWORDLONG)(l)))
+#define HIDWORD(l)   ((DWORD)(((DWORDLONG)(l)>>32)&0xFFFFFFFF))
+
+int
+uname (struct utsname *u)
+{
+  if (u)
+    {
+      DWORD packed_version, major, minor, build;
+      char *plev = getenv ("PROCESSOR_LEVEL");
+      DWORD nodename_size;
+
+      /* FIXME: The CPU stuff is only correct for 32-bit machines.  */
+
+      /* sysname[] */
+      strcpy (u->sysname, "MinGW32");
+
+      /* release[] and version[] */
+      packed_version = GetVersion();
+      major = (DWORD)(LOBYTE (LOWORD (packed_version)));
+      minor = (DWORD)(HIBYTE (LOWORD (packed_version)));
+      snprintf (u->release, sizeof(u->release), "%lu.%lu", major, minor);
+
+      if (packed_version < 0x80000000)
+        build = (DWORD)(HIWORD (packed_version));
+      else
+	build = 0;
+      snprintf (u->version, sizeof(u->version), "%lu", build);
+
+      /* machine[] */
+      strcpy (u->machine, "i686-pc");
+      if (plev)
+	{
+	  if (strcmp (plev, "15") == 0)
+	    u->machine[1] = '7'; /* Pentium 4 */
+	  else
+	    u->machine[1] = plev[0];
+	}
+
+      /* nodename[] */
+      nodename_size = 256;
+      if (!GetComputerName (u->nodename, &nodename_size))
+	strcpy (u->nodename, "unknown");
+
+      return 0;
+    }
+  return -1;
+}
+
+struct passwd *
+getpwuid (int uid)
+{
+  static struct passwd pwentry;
+  char *homedir = getenv("HOME");
+
+  if (!homedir)
+    homedir = getenv("USERPROFILE");
+
+  pwentry.pw_name = getenv("USERNAME");
+  pwentry.pw_dir = homedir;
+  pwentry.pw_passwd = "";
+  pwentry.pw_uid = pwentry.pw_gid = 42;
+  pwentry.pw_shell = getenv("COMSPEC");
+
+  return &pwentry;
+}
+
+pid_t
+getuid (void)
+{
+  return 42;
+}
+
+int
+fname_cmp (const char *fn1, const char *fn2)
+{
+  char name1[MAX_PATH], name2[MAX_PATH];
+  char n1[MAX_PATH], n2[MAX_PATH];
+  char *p;
+
+  if (stricmp(fn1, fn2) == 0)
+    return 0;
+  strcpy(n1, fn1);
+  strcpy(n2, fn2);
+  for (p = n1; *p; p++)
+    if (*p == '/')
+      *p = '\\';
+  for (p = n2; *p; p++)
+    if (*p == '/')
+      *p = '\\';
+  if (GetFullPathName(n1, MAX_PATH, name1, NULL)
+      && GetFullPathName(n2, MAX_PATH, name2, NULL))
+    {
+      if (stricmp(name1, name2) == 0)
+	return 0;
+      if (GetShortPathName(name1, n1, MAX_PATH)
+	  && GetShortPathName(name2, n2, MAX_PATH)
+	  && stricmp(name1, name2) == 0)
+	return 0;
+    }
+  if (GetShortPathName(n1, name1, MAX_PATH)
+      && GetShortPathName(n2, name2, MAX_PATH)
+      && stricmp(name1, name2) == 0)
+    return 0;
+
+  return stricmp(n1, n2);
+}
+
+int
+link (const char *oldname, const char *newname)
+{
+  if (!CreateHardLink(newname, oldname, NULL)) {
+    errno = EACCES;
+    return -1;
+  }
+  return 0;
+}
+
+/* The mmap/munmap implementation was shamelessly stolen, with minimal
+   changes, from libgwc32, a Windows port of glibc.  */
+
+static DWORD granularity = 0;
+static int isw9x = -1;
+
+void *
+mmap (void *addr, size_t len, int prot, int flags, int fd, off_t offset)
+{
+  void *map = NULL;
+  char *gran_addr = addr;
+  HANDLE handle = INVALID_HANDLE_VALUE;
+  DWORD cfm_flags = 0, mvf_flags = 0, sysgran;
+  off_t gran_offset = offset, filelen = _filelength(fd);
+  off_t mmlen = len;
+
+  if (!granularity)
+    {
+      SYSTEM_INFO si;
+
+      GetSystemInfo (&si);
+      granularity = si.dwAllocationGranularity;
+    }
+  sysgran = granularity;
+
+  switch (prot) {
+    case PROT_READ | PROT_WRITE | PROT_EXEC:
+    case PROT_WRITE | PROT_EXEC:
+      cfm_flags = PAGE_EXECUTE_READWRITE;
+      mvf_flags = FILE_MAP_ALL_ACCESS;
+      break;
+    case PROT_READ | PROT_WRITE:
+      cfm_flags = PAGE_READWRITE;
+      mvf_flags = FILE_MAP_ALL_ACCESS;
+      break;
+    case PROT_WRITE:
+      cfm_flags = PAGE_READWRITE;
+      mvf_flags = FILE_MAP_WRITE;
+      break;
+    case PROT_READ:
+      cfm_flags = PAGE_READONLY;
+      mvf_flags = FILE_MAP_READ;
+      break;
+    case PROT_NONE:
+      cfm_flags = PAGE_NOACCESS;
+      mvf_flags = FILE_MAP_READ;
+      break;
+    case PROT_EXEC:
+      cfm_flags = PAGE_EXECUTE;
+      mvf_flags = FILE_MAP_READ;
+      break;
+  }
+  if (flags & MAP_PRIVATE)
+    {
+      if (isw9x == -1)
+	isw9x = ((DWORD)(LOBYTE (LOWORD (GetVersion()))) < 5);
+      if (isw9x == 1)
+	cfm_flags = PAGE_WRITECOPY;
+      mvf_flags = FILE_MAP_COPY;
+    }
+  if (flags & MAP_FIXED)
+    {
+      gran_offset = offset;
+      gran_addr = addr;
+    }
+  else
+    {
+      gran_offset = offset & ~(sysgran - 1);
+      gran_addr = (char *) (((DWORD) gran_addr / sysgran) * sysgran);
+    }
+  mmlen = (filelen < gran_offset + len ? filelen - gran_offset : len);
+
+  handle = CreateFileMapping ((HANDLE) _get_osfhandle(fd), NULL, cfm_flags,
+			      0, mmlen, NULL);
+  if (!handle)
+    {
+      errno = EINVAL;	/* FIXME */
+      return MAP_FAILED;
+    }
+  map = MapViewOfFileEx (handle, mvf_flags, HIDWORD(gran_offset),
+			 LODWORD(gran_offset), (SIZE_T) mmlen,
+			 (LPVOID) gran_addr);
+  if (map == NULL && (flags & MAP_FIXED))
+    {
+      map = MapViewOfFileEx (handle, mvf_flags, HIDWORD(gran_offset),
+			     LODWORD(gran_offset), (SIZE_T) mmlen,
+			     (LPVOID) NULL);
+    }
+  CloseHandle(handle);
+
+  if (map == NULL)
+    {
+      errno = EINVAL; 	/* FIXME */
+      return MAP_FAILED;
+    }
+  return map;
+}
+
+int munmap (void *addr, size_t len)
+{
+  if (!UnmapViewOfFile (addr))
+    return -1;
+  return 0;
+}
+
+#ifdef TEST
+
+#define COMPARE(F1,F2)					\
+  printf ("fname_cmp: `%s' %sthe same as `%s'\n", F1,	\
+	  (fname_cmp (F1, F2) == 0) ? "" : "NOT ", F2);
+
+int
+main (int argc, char *argv[])
+{
+  struct utsname uts;
+  struct passwd *pe;
+  int status;
+
+  if ((status = uname (&uts)) != 0)
+    {
+      fprintf (stderr, "uname: %d\n", status);
+      return 1;
+    }
+  printf ("uname: `%s' `%s' `%s' `%s' `%s'\n",
+	  uts.sysname, uts.release, uts.version, uts.machine, uts.nodename);
+
+  printf ("getuid: %d\n", getuid ());
+  pe = getpwuid (getuid ());
+  printf ("getpwuid: name=`%s' dir=`%s' uid=%d shell=`%s'\n",
+	  pe->pw_name, pe->pw_dir, pe->pw_uid, pe->pw_shell);
+
+  COMPARE ("c:\\Program Files", "C:\\PROGRA~1")
+  COMPARE ("c:/Program Files", "C:\\PROGRA~1")
+    ;
+  unlink ("ltest");
+  if (link ("w32supp.c", "ltest") == -1)
+    fprintf (stderr, "link failed\n");
+  else
+    printf ("ltest -> w32supp.c\n");
+
+  return 0;
+}
+#endif
--- Makefile.in	2010-06-06 00:41:10.000000000 +0300
+++ Makefile	2012-03-06 21:26:33.738875000 +0200
@@ -21,11 +21,14 @@
 
 #########################################################################
 # Edit the following variables as required
-CC=@cc@
-CFLAGS=@cflags@ @defs@
-CPPFLAGS=@CPPFLAGS@
-LDFLAGS=@LDFLAGS@
-LIBS=@LIBS@
+CC=gcc
+DEFS=-DHAS_STDINT_H -DHAS_INTTYPES_H -DUSE_GZIP_MBOX -DUSE_BZIP_MBOX
+CFLAGS=$(DEFS) -O2 -Wall -gdwarf-2 -g3
+CPPFLAGS=-I.
+LDFLAGS=
+LIBS=-lz -lbz2
+revision=0.22
+EXEEXT=.exe
 
 #######################################################################
 # If you're generating a package, you may want to use
@@ -36,37 +39,37 @@
 
 #######################################################################
 
-prefix=$(DESTDIR)@prefix@
-bindir=$(DESTDIR)@bindir@
-mandir=$(DESTDIR)@mandir@
+prefix=d:/usr
+bindir=$(prefix)/bin
+mandir=$(prefix)/share/man
 man1dir=$(mandir)/man1
 man5dir=$(mandir)/man5
-infodir=$(DESTDIR)@infodir@
-docdir=$(DESTDIR)@docdir@
+infodir=$(prefix)/share/info
+docdir=$(prefix)/share/doc/mairix-$(revision)
 
 #########################################################################
 # Things below this point shouldn't need to be edited.
 
-OBJ = mairix.o db.o rfc822.o tok.o hash.o dirscan.o writer.o \
-      reader.o search.o stats.o dates.o datescan.o mbox.o md5.o \
-  	  fromcheck.o glob.o dumper.o expandstr.o dotlock.o \
-			nvp.o nvpscan.o
+OBJ = mairix.o db.o rfc822.o tok.o hash.o dirscan.o writer.o\
+ reader.o search.o stats.o dates.o datescan.o mbox.o md5.o\
+ fromcheck.o glob.o dumper.o expandstr.o dotlock.o nvp.o nvpscan.o\
+ w32supp.o
 
-all : mairix
+all : mairix$(EXEEXT)
 
-mairix : $(OBJ)
-	$(CC) -o mairix $(CFLAGS) $(LDFLAGS) $(OBJ) $(LIBS)
+mairix$(EXEEXT) : $(OBJ)
+	$(CC) -o $@ $(CFLAGS) $(LDFLAGS) $(OBJ) $(LIBS)
 
 %.o : %.c memmac.h mairix.h reader.h Makefile
 	$(CC) -c $(CFLAGS) $(CPPFLAGS) -o $@ $<
 
-datescan.c datescan.h : datescan.nfa ./dfasyn/dfasyn
+datescan.c datescan.h : datescan.nfa ./dfasyn/dfasyn$(EXEEXT)
 	./dfasyn/dfasyn -o datescan.c -ho datescan.h -r datescan.report -v -u datescan.nfa
 
-fromcheck.c fromcheck.h : fromcheck.nfa ./dfasyn/dfasyn
+fromcheck.c fromcheck.h : fromcheck.nfa ./dfasyn/dfasyn$(EXEEXT)
 	./dfasyn/dfasyn -o fromcheck.c -ho fromcheck.h -r fromcheck.report -v -u fromcheck.nfa
 
-nvpscan.c nvpscan.h : nvp.nfa ./dfasyn/dfasyn
+nvpscan.c nvpscan.h : nvp.nfa ./dfasyn/dfasyn$(EXEEXT)
 	./dfasyn/dfasyn -o nvpscan.c -ho nvpscan.h -r nvpscan.report -v -u nvp.nfa
 
 dates.o : datescan.h
@@ -74,29 +77,30 @@
 nvp.o : nvpscan.h
 
 version.h:
-	./mkversion
+	mkversion.bat
 
-./dfasyn/dfasyn:
-	if [ -d dfasyn ]; then cd dfasyn ; make CC="$(CC)" CFLAGS="$(CFLAGS)" ; else echo "No dfasyn subdirectory?" ; exit 1 ; fi
+./dfasyn/dfasyn$(EXEEXT):
+	$(MAKE) -C dfasyn CC="$(CC)" CFLAGS="$(CFLAGS)"
 
 clean:
-	-rm -f *~ *.o mairix *.s core
+	-rm -f *~ *.o mairix$(EXEEXT) *.s core
 	-rm -f mairix.cp mairix.fn mairix.aux mairix.log mairix.ky mairix.pg mairix.toc mairix.tp mairix.vr
 	-rm -f fromcheck.[ch] datescan.[ch]
 	-rm -f nvpscan.[ch]
-	if [ -d dfasyn ]; then cd dfasyn ; make clean ; fi
+	-$(MAKE) -C dfasyn clean
 
 distclean: clean
 	-rm -f Makefile config.log
 
 install:
-	[ -d $(prefix) ] || mkdir -p $(prefix)
-	[ -d $(bindir) ] || mkdir -p $(bindir)
-	[ -d $(mandir) ] || mkdir -p $(mandir)
-	[ -d $(man1dir) ] || mkdir -p $(man1dir)
-	[ -d $(man5dir) ] || mkdir -p $(man5dir)
-	cp -f mairix $(bindir)
-	chmod 555 $(bindir)/mairix
+	-mkdir "$(prefix)"
+	-mkdir "$(bindir)"
+	-mkdir "$(prefix)"/share
+	-mkdir "$(mandir)"
+	-mkdir "$(man1dir)"
+	-mkdir "$(man5dir)"
+	cp -f mairix$(EXEEXT) $(bindir)
+	chmod 555 $(bindir)/mairix$(EXEEXT)
 	cp -f mairix.1 $(man1dir)
 	chmod 444 $(man1dir)/mairix.1
 	cp -f mairixrc.5 $(man5dir)
--- dfasyn/Makefile.orig	2010-06-06 00:41:10.000000000 +0300
+++ dfasyn/Makefile	2012-03-06 21:23:35.660750000 +0200
@@ -21,9 +21,10 @@
 CFLAGS=-Wall
 prefix?=/usr/local
 bindir=$(prefix)/bin
-mandir?=$(prefix)/man
+mandir?=$(prefix)/share/man
 man1dir=$(mandir)/man1
 man5dir=$(mandir)/man5
+EXEEXT=.exe
 
 OBJ = dfasyn.o parse.o scan.o \
 	tokens.o abbrevs.o charclass.o \
@@ -32,18 +33,18 @@
 	n2d.o expr.o evaluator.o \
 	tabcompr.o compdfa.o
 
-all : dfasyn
+all : dfasyn$(EXEEXT)
 
 install : all
-	[ -d $(bindir) ] || mkdir -p $(bindir)
-	[ -d $(man1dir) ] || mkdir -p $(man1dir)
-	[ -d $(man5dir) ] || mkdir -p $(man5dir)
-	cp dfasyn $(bindir)
+	-mkdir $(bindir)
+	-mkdir $(man1dir)
+	-mkdir $(man5dir)
+	cp dfasyn$(EXEEXT) $(bindir)
 	cp dfasyn.1 $(man1dir)
 	cp dfasyn.5 $(man5dir)
 
-dfasyn : $(OBJ)
-	$(CC) $(CFLAGS) -o dfasyn $(OBJ)
+dfasyn$(EXEEXT) : $(OBJ)
+	$(CC) $(CFLAGS) -o $@ $(OBJ)
 
 parse.c parse.h : parse.y
 	bison -v -d parse.y
@@ -60,5 +61,5 @@
 $(OBJ) : dfasyn.h
 
 clean:
-	rm -f dfasyn *.o scan.c parse.c parse.h parse.output
+	rm -f dfasyn$(EXEEXT) *.o scan.c parse.c parse.h parse.output
 
--- NUL	1970-01-01 02:00:00.000000000 +0200
+++ mkversion.bat	2012-02-25 14:41:09.415750000 +0200
@@ -0,0 +1,13 @@
+@echo off
+setlocal
+del /f/q version.h 2> NUL
+echo #ifndef VERSION_H > version.h
+echo #define VERSION_H 1 >> version.h
+if not exist version.txt goto noversiontxt
+set/p VER=<version.txt
+echo #define PROGRAM_VERSION "%VER%" >> version.h
+goto done
+:noversiontxt
+echo #define PROGRAM_VERSION "DEVELOPMENT" >> version.h
+:done
+echo #endif /* VERSION_H */ >> version.h
