SF.net SVN: mahogany: [7171] trunk/M/lib/dspam

[email protected]
Newsgroups gmane.mail.mahogany.cvs
Message-ID <[email protected]>
Revision: 7171
          http://svn.sourceforge.net/mahogany/?rev=7171&view=rev
Author:   vadz
Date:     2006-12-17 16:05:52 -0800 (Sun, 17 Dec 2006)

Log Message:
-----------
minimally possible fixes to make dspam (with hash driver) compile under Windows with MSVC

Modified Paths:
--------------
    trunk/M/lib/dspam/src/base64.c
    trunk/M/lib/dspam/src/bnr.c
    trunk/M/lib/dspam/src/diction.c
    trunk/M/lib/dspam/src/error.h
    trunk/M/lib/dspam/src/hash_drv.c
    trunk/M/lib/dspam/src/hash_drv.h
    trunk/M/lib/dspam/src/heap.c
    trunk/M/lib/dspam/src/libdspam.c
    trunk/M/lib/dspam/src/pref.c
    trunk/M/lib/dspam/src/read_config.c
    trunk/M/lib/dspam/src/storage_driver.h
    trunk/M/lib/dspam/src/tokenizer.c
    trunk/M/lib/dspam/src/util.c
    trunk/M/lib/dspam/src/util.h

Added Paths:
-----------
    trunk/M/lib/dspam/dspam.vcproj
    trunk/M/lib/dspam/src/auto-config.h.win32

Added: trunk/M/lib/dspam/dspam.vcproj
===================================================================
--- trunk/M/lib/dspam/dspam.vcproj	                        (rev 0)
+++ trunk/M/lib/dspam/dspam.vcproj	2006-12-18 00:05:52 UTC (rev 7171)
@@ -0,0 +1,284 @@
+<?xml version="1.0" encoding="Windows-1252"?>
+<VisualStudioProject
+	ProjectType="Visual C++"
+	Version="7.10"
+	Name="dspam"
+	ProjectGUID="{62156246-DCEA-4713-95E0-C01F595F1A20}"
+	RootNamespace="dspam"
+	SccProjectName=""
+	SccLocalPath="">
+	<Platforms>
+		<Platform
+			Name="Win32"/>
+	</Platforms>
+	<Configurations>
+		<Configuration
+			Name="Debug|Win32"
+			OutputDirectory="debug"
+			IntermediateDirectory="debug"
+			ConfigurationType="4"
+			UseOfMFC="0"
+			ATLMinimizesCRunTimeLibraryUsage="FALSE"
+			CharacterSet="2">
+			<Tool
+				Name="VCCLCompilerTool"
+				Optimization="0"
+				AdditionalIncludeDirectories="src"
+				PreprocessorDefinitions="HAVE_CONFIG_H;_DEBUG"
+				ExceptionHandling="FALSE"
+				BasicRuntimeChecks="3"
+				RuntimeLibrary="3"
+				UsePrecompiledHeader="0"
+				PrecompiledHeaderFile="debug\dspam.pch"
+				WarningLevel="4"
+				SuppressStartupBanner="TRUE"
+				DebugInformationFormat="3"
+				CompileAs="1"/>
+			<Tool
+				Name="VCCustomBuildTool"/>
+			<Tool
+				Name="VCLibrarianTool"
+				OutputFile="debug\dspam.lib"
+				SuppressStartupBanner="TRUE"/>
+			<Tool
+				Name="VCMIDLTool"/>
+			<Tool
+				Name="VCPostBuildEventTool"/>
+			<Tool
+				Name="VCPreBuildEventTool"/>
+			<Tool
+				Name="VCPreLinkEventTool"/>
+			<Tool
+				Name="VCResourceCompilerTool"
+				PreprocessorDefinitions="_DEBUG"
+				Culture="1033"/>
+			<Tool
+				Name="VCWebServiceProxyGeneratorTool"/>
+			<Tool
+				Name="VCXMLDataGeneratorTool"/>
+			<Tool
+				Name="VCManagedWrapperGeneratorTool"/>
+			<Tool
+				Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
+		</Configuration>
+		<Configuration
+			Name="Release|Win32"
+			OutputDirectory="release"
+			IntermediateDirectory="release"
+			ConfigurationType="4"
+			UseOfMFC="0"
+			ATLMinimizesCRunTimeLibraryUsage="FALSE"
+			CharacterSet="2">
+			<Tool
+				Name="VCCLCompilerTool"
+				Optimization="2"
+				InlineFunctionExpansion="1"
+				AdditionalIncludeDirectories="src"
+				PreprocessorDefinitions="HAVE_CONFIG_H;NDEBUG"
+				StringPooling="TRUE"
+				ExceptionHandling="FALSE"
+				RuntimeLibrary="2"
+				EnableFunctionLevelLinking="TRUE"
+				UsePrecompiledHeader="0"
+				PrecompiledHeaderFile="release\dspam.pch"
+				WarningLevel="4"
+				SuppressStartupBanner="TRUE"
+				DebugInformationFormat="3"
+				CompileAs="1"/>
+			<Tool
+				Name="VCCustomBuildTool"/>
+			<Tool
+				Name="VCLibrarianTool"
+				OutputFile="release\dspam.lib"
+				SuppressStartupBanner="TRUE"/>
+			<Tool
+				Name="VCMIDLTool"/>
+			<Tool
+				Name="VCPostBuildEventTool"/>
+			<Tool
+				Name="VCPreBuildEventTool"/>
+			<Tool
+				Name="VCPreLinkEventTool"/>
+			<Tool
+				Name="VCResourceCompilerTool"
+				PreprocessorDefinitions="NDEBUG"
+				Culture="1033"/>
+			<Tool
+				Name="VCWebServiceProxyGeneratorTool"/>
+			<Tool
+				Name="VCXMLDataGeneratorTool"/>
+			<Tool
+				Name="VCManagedWrapperGeneratorTool"/>
+			<Tool
+				Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
+		</Configuration>
+		<Configuration
+			Name="Debug Purify|Win32"
+			OutputDirectory="debugpurify"
+			IntermediateDirectory="debugpurify"
+			ConfigurationType="4"
+			UseOfMFC="0"
+			ATLMinimizesCRunTimeLibraryUsage="FALSE"
+			CharacterSet="2">
+			<Tool
+				Name="VCCLCompilerTool"
+				Optimization="0"
+				AdditionalIncludeDirectories="src"
+				PreprocessorDefinitions="HAVE_CONFIG_H;_DEBUG"
+				ExceptionHandling="FALSE"
+				BasicRuntimeChecks="3"
+				RuntimeLibrary="3"
+				UsePrecompiledHeader="0"
+				PrecompiledHeaderFile="debug\dspam.pch"
+				WarningLevel="4"
+				SuppressStartupBanner="TRUE"
+				DebugInformationFormat="3"
+				CompileAs="1"/>
+			<Tool
+				Name="VCCustomBuildTool"/>
+			<Tool
+				Name="VCLibrarianTool"
+				OutputFile="debugpurify\dspam.lib"
+				SuppressStartupBanner="TRUE"/>
+			<Tool
+				Name="VCMIDLTool"/>
+			<Tool
+				Name="VCPostBuildEventTool"/>
+			<Tool
+				Name="VCPreBuildEventTool"/>
+			<Tool
+				Name="VCPreLinkEventTool"/>
+			<Tool
+				Name="VCResourceCompilerTool"
+				PreprocessorDefinitions="_DEBUG"
+				Culture="1033"/>
+			<Tool
+				Name="VCWebServiceProxyGeneratorTool"/>
+			<Tool
+				Name="VCXMLDataGeneratorTool"/>
+			<Tool
+				Name="VCManagedWrapperGeneratorTool"/>
+			<Tool
+				Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
+		</Configuration>
+	</Configurations>
+	<References>
+	</References>
+	<Files>
+		<Filter
+			Name="Source Files"
+			Filter="cpp;c;cxx;rc;def;r;odl;idl;hpj;bat">
+			<File
+				RelativePath="src\base64.c">
+			</File>
+			<File
+				RelativePath="src\bnr.c">
+			</File>
+			<File
+				RelativePath="src\buffer.c">
+			</File>
+			<File
+				RelativePath="src\config_shared.c">
+			</File>
+			<File
+				RelativePath="src\decode.c">
+			</File>
+			<File
+				RelativePath=".\src\diction.c">
+			</File>
+			<File
+				RelativePath="src\error.c">
+			</File>
+			<File
+				RelativePath=".\src\hash.c">
+			</File>
+			<File
+				RelativePath=".\src\hash_drv.c">
+			</File>
+			<File
+				RelativePath=".\src\heap.c">
+			</File>
+			<File
+				RelativePath="src\libdspam.c">
+			</File>
+			<File
+				RelativePath=".\src\list.c">
+			</File>
+			<File
+				RelativePath="src\nodetree.c">
+			</File>
+			<File
+				RelativePath="src\pref.c">
+			</File>
+			<File
+				RelativePath="src\read_config.c">
+			</File>
+			<File
+				RelativePath=".\src\tokenizer.c">
+			</File>
+			<File
+				RelativePath="src\util.c">
+			</File>
+		</Filter>
+		<Filter
+			Name="Header Files"
+			Filter="h;hpp;hxx;hm;inl">
+			<File
+				RelativePath="src\auto-config.h">
+			</File>
+			<File
+				RelativePath="src\buffer.h">
+			</File>
+			<File
+				RelativePath="src\decode.h">
+			</File>
+			<File
+				RelativePath="src\error.h">
+			</File>
+			<File
+				RelativePath="src\lht.h">
+			</File>
+			<File
+				RelativePath="src\libdspam.h">
+			</File>
+			<File
+				RelativePath="src\libdspam_objects.h">
+			</File>
+			<File
+				RelativePath="src\nodetree.h">
+			</File>
+			<File
+				RelativePath="src\storage_driver.h">
+			</File>
+		</Filter>
+		<File
+			RelativePath=".\src\auto-config.h.win32">
+			<FileConfiguration
+				Name="Debug|Win32">
+				<Tool
+					Name="VCCustomBuildTool"
+					Description="Creating auto-config.h"
+					CommandLine="copy $(InputPath) $(InputDir)\auto-config.h"
+					Outputs="$(InputDir)\auto-config.h"/>
+			</FileConfiguration>
+			<FileConfiguration
+				Name="Release|Win32">
+				<Tool
+					Name="VCCustomBuildTool"
+					Description="Creating auto-config.h"
+					CommandLine="copy $(InputPath) $(InputDir)\auto-config.h"
+					Outputs="$(InputDir)\auto-config.h"/>
+			</FileConfiguration>
+			<FileConfiguration
+				Name="Debug Purify|Win32">
+				<Tool
+					Name="VCCustomBuildTool"
+					Description="Creating auto-config.h"
+					CommandLine="copy $(InputPath) $(InputDir)\auto-config.h"
+					Outputs="$(InputDir)\auto-config.h"/>
+			</FileConfiguration>
+		</File>
+	</Files>
+	<Globals>
+	</Globals>
+</VisualStudioProject>


Property changes on: trunk/M/lib/dspam/dspam.vcproj
___________________________________________________________________
Name: svn:eol-style
   + native

Added: trunk/M/lib/dspam/src/auto-config.h.win32
===================================================================
--- trunk/M/lib/dspam/src/auto-config.h.win32	                        (rev 0)
+++ trunk/M/lib/dspam/src/auto-config.h.win32	2006-12-18 00:05:52 UTC (rev 7171)
@@ -0,0 +1,38 @@
+/* src/auto-config.h for Win32 systems */
+
+
+#ifndef __auto_config_h
+#define __auto_config_h
+
+#define CONFIG_DEFAULT (_ds_win32_configfile())
+#define LOGDIR  (_ds_win32_dir())
+
+/* Dynamic drivers loading not supported under Windows currently */
+#define STATIC_DRIVER
+
+#ifdef _DEBUG
+  #define DEBUG
+#endif
+
+#if defined(_MSC_VER) && (_MSC_VER < 1400)
+  #undef HAVE_VARIADIC_MACROS
+#endif
+
+#ifdef _MSC_VER
+  #define inline _inline
+  #define snprintf _snprintf
+  #define strcasecmp _stricmp
+  #define strncasecmp _strnicmp
+  #define vsnprintf _vsnprintf
+
+  /*
+     this is a potentially useful warning (about possible loss of data due to
+     implicit conversions between types) but there are too many instances of it
+     in dspam sources currently so disable it to be able to compile at max
+     warning level otherwise
+   */
+  #pragma warning(disable:4244)
+#endif
+
+#endif /* !__auto_config_h */
+


Property changes on: trunk/M/lib/dspam/src/auto-config.h.win32
___________________________________________________________________
Name: svn:eol-style
   + native

Modified: trunk/M/lib/dspam/src/base64.c
===================================================================
--- trunk/M/lib/dspam/src/base64.c	2006-12-17 23:59:05 UTC (rev 7170)
+++ trunk/M/lib/dspam/src/base64.c	2006-12-18 00:05:52 UTC (rev 7171)
@@ -40,7 +40,7 @@
 char *
 base64decode (const char *buf)
 {
-  unsigned char alphabet[64] =
+  unsigned char alphabet[] =
     "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
   static char first_time = 1,inalphabet[256], decoder[256];
   int i, bits, c, char_count, errors = 0;
@@ -130,7 +130,7 @@
 char *
 base64encode (const char *buf)
 {
-  unsigned char alphabet[64] =
+  unsigned char alphabet[] =
     "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
   int cols, bits, c, char_count;
   char *out;

Modified: trunk/M/lib/dspam/src/bnr.c
===================================================================
--- trunk/M/lib/dspam/src/bnr.c	2006-12-17 23:59:05 UTC (rev 7170)
+++ trunk/M/lib/dspam/src/bnr.c	2006-12-18 00:05:52 UTC (rev 7171)
@@ -68,7 +68,7 @@
   BTX->identifier  = identifier;
   BTX->window_size = 3;
   BTX->ex_radius   = 0.25;
-  BTX->in_radius   = 0.33;
+  BTX->in_radius   = 0.33f;
   BTX->stream     = bnr_list_create(type);
   BTX->patterns   = bnr_hash_create(1543ul);
   if (BTX->stream == NULL || BTX->patterns == NULL) {
@@ -120,7 +120,7 @@
 
 int bnr_instantiate(BNR_CTX *BTX) {
   int BNR_SIZE = BTX->window_size;
-  float previous_bnr_probs[BNR_SIZE];
+  float *previous_bnr_probs = malloc(BNR_SIZE*sizeof(float));
   struct bnr_list_node *node_list;
   struct bnr_list_c c_list;
   char bnr_token[64];
@@ -152,6 +152,8 @@
     node_list = c_bnr_list_next(BTX->stream, &c_list);
   }
 
+  free(previous_bnr_probs);
+
   return 0;
 }
 
@@ -256,8 +258,9 @@
 
 int bnr_finalize(BNR_CTX *BTX) {
   int BNR_SIZE = BTX->window_size;
-  struct bnr_list_node * previous_bnr_tokens[BNR_SIZE];
-  float previous_bnr_probs[BNR_SIZE];
+  struct bnr_list_node **
+    previous_bnr_tokens = malloc(BNR_SIZE*sizeof(struct bnr_list_node *));
+  float *previous_bnr_probs = malloc(BNR_SIZE*sizeof(float));
   struct bnr_list_node *node_list;
   struct bnr_list_c c_list;
   char bnr_token[64];
@@ -321,6 +324,9 @@
     node_list = c_bnr_list_next(BTX->stream, &c_list);
   }
 
+  free(previous_bnr_probs);
+  free(previous_bnr_tokens);
+
   return 0;
 }
 

Modified: trunk/M/lib/dspam/src/diction.c
===================================================================
--- trunk/M/lib/dspam/src/diction.c	2006-12-17 23:59:05 UTC (rev 7170)
+++ trunk/M/lib/dspam/src/diction.c	2006-12-18 00:05:52 UTC (rev 7171)
@@ -157,7 +157,7 @@
   const char *name, 
   int flags)
 {
-  unsigned long bucket = key % diction->size;
+  unsigned long long bucket = key % diction->size;
   ds_term_t parent = NULL;
   ds_term_t insert = NULL;
   ds_term_t term;
@@ -202,7 +202,7 @@
 void
 ds_diction_delete(ds_diction_t diction, ds_key_t key)
 {
-  unsigned long bucket = key % diction->size;
+  unsigned long long bucket = key % diction->size;
   ds_term_t parent = NULL;
   ds_term_t delete = NULL;
   ds_term_t term;

Modified: trunk/M/lib/dspam/src/error.h
===================================================================
--- trunk/M/lib/dspam/src/error.h	2006-12-17 23:59:05 UTC (rev 7170)
+++ trunk/M/lib/dspam/src/error.h	2006-12-18 00:05:52 UTC (rev 7171)
@@ -45,14 +45,22 @@
 #endif
 
 #ifndef DEBUG
+#ifdef HAVE_VARIADIC_MACROS
 #define LOGDEBUG( ... );
 #else
+inline void LOGDEBUG (const char *err, ...) { }
+#endif
+#else
 void LOGDEBUG (const char *err, ... );
 #endif
 
 #ifdef _WIN32
+#ifdef HAVE_VARIADIC_MACROS
 #define LOG ( ... );
 #else
+inline void LOG (int priority, const char *err, ... ) { priority; err; }
+#endif
+#else
 void LOG (int priority, const char *err, ... );
 #endif
 

Modified: trunk/M/lib/dspam/src/hash_drv.c
===================================================================
--- trunk/M/lib/dspam/src/hash_drv.c	2006-12-17 23:59:05 UTC (rev 7170)
+++ trunk/M/lib/dspam/src/hash_drv.c	2006-12-18 00:05:52 UTC (rev 7171)
@@ -40,11 +40,13 @@
 
 #include <string.h>
 #include <sys/types.h>
+#include <sys/stat.h>
+#ifndef _WIN32
 #include <sys/mman.h>
-#include <sys/stat.h>
 #include <sys/uio.h>
 #include <dirent.h>
 #include <unistd.h>
+#endif
 #include <errno.h>
 #include <stdlib.h>
 #include <stdio.h>
@@ -62,6 +64,23 @@
 #   endif
 #endif
 
+#ifdef _WIN32
+#   include <winsock2.h>
+#   include <windows.h>
+#   include <io.h>
+#   include <process.h>
+
+#   define close _close
+#   define getpid _getpid
+#   define lseek _lseek
+#   define open _open
+#   define stat _stat
+#   define write _write
+
+#   define O_RDWR _O_RDWR
+#   define MAP_FAILED NULL
+#endif
+
 #include "storage_driver.h"
 #include "config_shared.h"
 #include "hash_drv.h"
@@ -244,6 +263,8 @@
       }
     }
   }
+#else
+  DTX; /* unused parameter */
 #endif
 
   return 0;
@@ -305,9 +326,11 @@
   int flags) 
 {
   struct _hash_drv_header header;
+#ifdef _WIN32
+  HANDLE hMapping;
+#endif
+
   int open_flags = O_RDWR;
-  int mmap_flags = PROT_READ + PROT_WRITE;
-
   map->fd = open(filename, open_flags);
 
   /*
@@ -319,7 +342,7 @@
   if (map->fd < 0 && recmaxifnew) {
     FILE *f;
     struct _hash_drv_spam_record rec;
-    int i;
+    unsigned i;
 
     memset(&header, 0, sizeof(struct _hash_drv_header));
     memset(&rec, 0, sizeof(struct _hash_drv_spam_record));
@@ -355,7 +378,19 @@
   read(map->fd, map->header, sizeof(struct _hash_drv_header));
   map->file_len = lseek(map->fd, 0, SEEK_END); 
 
-  map->addr = mmap(NULL, map->file_len, mmap_flags, MAP_SHARED, map->fd, 0);
+#ifndef _WIN32
+  map->addr = mmap(NULL, map->file_len, PROT_READ | PROT_WRITE,
+                   MAP_SHARED, map->fd, 0);
+#else /* _WIN32 */
+  hMapping = CreateFileMapping((HANDLE)_get_osfhandle(map->fd), NULL,
+                               PAGE_READWRITE, 0, 0, NULL);
+  map->addr = MapViewOfFile(hMapping, FILE_MAP_WRITE, 0, 0, 0);
+
+  /* we can close this handle immediately because the mapping created by
+   * MapViewOfFile() uses it too so the file mapping will continue to exist
+   * until we call UnmapViewOfFile() later */
+  CloseHandle(hMapping);
+#endif /* !_WIN32/_WIN32 */
   if (map->addr == MAP_FAILED) {
     free(map->header);
     close(map->fd);
@@ -383,10 +418,19 @@
 
   memcpy(&header, map->header, sizeof(struct _hash_drv_header));
 
+#ifndef _WIN32
   r = munmap(map->addr, map->file_len);
   if (r) {
     LOG(LOG_WARNING, "munmap failed on error %d: %s", r, strerror(errno));
   }
+#else /* _WIN32 */
+  if ( !UnmapViewOfFile(map->addr) ) {
+    LOG(LOG_WARNING, "UnmapViewOfFile failed with error %lu", GetLastError());
+    r = -1;
+  }
+  else
+    r = 0;
+#endif /* !_WIN32/_WIN32 */
  
   lseek (map->fd, 0, SEEK_SET);
   write (map->fd, &header, sizeof(struct _hash_drv_header));
@@ -525,8 +569,10 @@
 _ds_shutdown_storage (DSPAM_CTX * CTX)
 {
   struct _hash_drv_storage *s;
+#ifndef _WIN32
   struct nt_node *node_nt;
   struct nt_c c_nt;
+#endif
   int lock_result;
 
   if (!CTX || !CTX->storage)
@@ -536,6 +582,8 @@
 
   /* Close open file handles to directories (iteration functions) */
 
+  /* FIXME-WIN32: this code is currently unused and doesn't compile */
+#ifndef _WIN32
   node_nt = c_nt_first (s->dir_handles, &c_nt);
   while (node_nt != NULL)
   {
@@ -544,6 +592,7 @@
     closedir (dir);
     node_nt = c_nt_next (s->dir_handles, &c_nt);
   }
+#endif /* _WIN32 */
   nt_destroy (s->dir_handles);
 
   if (CTX->operating_mode != DSM_CLASSIFY)
@@ -785,6 +834,7 @@
 
 void *_ds_connect (DSPAM_CTX *CTX)
 {
+  CTX; /* unused parameter */
   return NULL;
 }
 
@@ -795,6 +845,8 @@
   char digit[6];
   int pid, j;
  
+  CTX; /* unused parameter */
+
   pid = getpid ();
   snprintf (session, sizeof (session), "%8lx%d", (long) time (NULL), pid);
  
@@ -835,7 +887,7 @@
   struct _hash_drv_storage *s = (struct _hash_drv_storage *) CTX->storage;
   struct _hash_drv_spam_record rec;
   struct _ds_storage_record *sr;
-  struct _ds_spam_stat stat;
+  struct _ds_spam_stat stat = { 0 };
 
   rec.hashcode = 0;
 
@@ -846,7 +898,7 @@
   }
 
   if (s->offset_nexttoken == 0) {
-    s->offset_header = s->map->addr;
+    s->offset_header = (hash_drv_header_t)s->map->addr;
     s->offset_nexttoken = sizeof(struct _hash_drv_header);
     memcpy(&rec,
            s->map->addr+s->offset_nexttoken, 
@@ -867,8 +919,8 @@
       (s->offset_header->hash_rec_max * sizeof(struct _hash_drv_spam_record)))
     { 
       if (s->offset_nexttoken < s->map->file_len) {
-        s->offset_header = s->map->addr + 
-          (s->offset_nexttoken - sizeof(struct _hash_drv_spam_record));
+        s->offset_header = (hash_drv_header_t)(s->map->addr + 
+          (s->offset_nexttoken - sizeof(struct _hash_drv_spam_record)));
 
         s->offset_nexttoken += sizeof(struct _hash_drv_header);
         s->offset_nexttoken -= sizeof(struct _hash_drv_spam_record);
@@ -907,6 +959,8 @@
   return unlink(filename);
 }
 
+/* FIXME-WIN32: this code doesn't compile currently but it's only for tools */
+#ifndef _WIN32
 char * 
 _ds_get_nextuser (DSPAM_CTX * CTX) 
 {
@@ -1021,16 +1075,19 @@
   user[0] = 0;
   return NULL;
 }
+#endif /* _WIN32 */
 
 struct _ds_storage_signature *
 _ds_get_nextsignature (DSPAM_CTX * CTX)
 {
+  CTX; /* unused parameter */
   return NULL;
 }
 
 int
 _ds_delall_spamrecords (DSPAM_CTX * CTX, ds_diction_t diction)
 {
+  CTX; diction; /* unused parameter */
   return 0;
 }
 
@@ -1041,7 +1098,7 @@
 {
   struct _hash_drv_header header;
   struct _hash_drv_spam_record rec;
-  int i;
+  unsigned i;
 
   _hash_drv_close(map);
 
@@ -1079,7 +1136,7 @@
   unsigned long long hashcode,
   int flags)
 {
-  hash_drv_header_t header = map->addr + offset;
+  hash_drv_header_t header = (hash_drv_header_t)(map->addr + offset);
   hash_drv_spam_record_t rec;
   unsigned long long fpos;
   unsigned long iterations = 0;
@@ -1090,7 +1147,7 @@
   fpos = sizeof(struct _hash_drv_header) + 
     ((hashcode % header->hash_rec_max) * sizeof(struct _hash_drv_spam_record));
 
-  rec = map->addr + offset + fpos;
+  rec = (hash_drv_spam_record_t)(map->addr + offset + fpos);
   while(rec->hashcode != hashcode  &&   /* Match token     */ 
         rec->hashcode != 0         &&   /* Insert on empty */
         iterations < map->max_seek)     /* Max Iterations  */
@@ -1100,7 +1157,7 @@
 
     if (fpos >= (header->hash_rec_max * sizeof(struct _hash_drv_spam_record)))
       fpos = sizeof(struct _hash_drv_header);
-    rec = map->addr + offset + fpos;
+    rec = (hash_drv_spam_record_t)(map->addr + offset + fpos);
   }     
 
   if (rec->hashcode == hashcode) 
@@ -1125,13 +1182,13 @@
     return EINVAL;
 
   if (map_offset) {
-    rec = map->addr + map_offset;
+    rec = (hash_drv_spam_record_t)(map->addr + map_offset);
   } else {
     while(rec_offset <= 0 && offset < map->file_len)
     {
       rec_offset = _hash_drv_seek(map, offset, wrec->hashcode, HSEEK_INSERT);
       if (rec_offset <= 0) {
-        hash_drv_header_t header = map->addr + offset;
+        hash_drv_header_t header = (hash_drv_header_t)(map->addr + offset);
         offset += sizeof(struct _hash_drv_header) +
           (sizeof(struct _hash_drv_spam_record) * header->hash_rec_max);
         last_extent_size = header->hash_rec_max;
@@ -1153,7 +1210,7 @@
       }
     }
   
-    rec = map->addr + offset + rec_offset;
+    rec = (hash_drv_spam_record_t)(map->addr + offset + rec_offset);
   }
   rec->hashcode = wrec->hashcode;
   rec->nonspam  = wrec->nonspam;
@@ -1181,7 +1238,7 @@
   {
     rec_offset = _hash_drv_seek(map, offset, wrec->hashcode, 0);
     if (rec_offset <= 0) {
-      hash_drv_header_t header = map->addr + offset;
+      hash_drv_header_t header = (hash_drv_header_t)(map->addr + offset);
       offset += sizeof(struct _hash_drv_header) +
         (sizeof(struct _hash_drv_spam_record) * header->hash_rec_max);
       extents++;
@@ -1192,7 +1249,7 @@
     return 0;
 
   offset += rec_offset;
-  rec = map->addr + offset;
+  rec = (hash_drv_spam_record_t)(map->addr + offset);
   
   wrec->nonspam  = rec->nonspam;
   wrec->spam     = rec->spam;

Modified: trunk/M/lib/dspam/src/hash_drv.h
===================================================================
--- trunk/M/lib/dspam/src/hash_drv.h	2006-12-17 23:59:05 UTC (rev 7170)
+++ trunk/M/lib/dspam/src/hash_drv.h	2006-12-18 00:05:52 UTC (rev 7171)
@@ -44,7 +44,7 @@
 
 typedef struct _hash_drv_map
 {
-  void *addr;
+  char *addr;
   int fd;
   size_t file_len;
   hash_drv_header_t header;

Modified: trunk/M/lib/dspam/src/heap.c
===================================================================
--- trunk/M/lib/dspam/src/heap.c	2006-12-17 23:59:05 UTC (rev 7170)
+++ trunk/M/lib/dspam/src/heap.c	2006-12-18 00:05:52 UTC (rev 7171)
@@ -28,6 +28,10 @@
  *   is a small window-size of 'peak' values, such as the 15 bayes slots.
  */
 
+#ifdef HAVE_CONFIG_H
+#include <auto-config.h>
+#endif
+
 #include <stdlib.h>
 #include <math.h>
 #include "heap.h"

Modified: trunk/M/lib/dspam/src/libdspam.c
===================================================================
--- trunk/M/lib/dspam/src/libdspam.c	2006-12-17 23:59:05 UTC (rev 7170)
+++ trunk/M/lib/dspam/src/libdspam.c	2006-12-18 00:05:52 UTC (rev 7171)
@@ -49,7 +49,9 @@
 #include <sys/types.h>
 #include <sys/stat.h>
 #include <fcntl.h>
+#ifndef _WIN32
 #include <dlfcn.h>
+#endif
 
 #ifdef TIME_WITH_SYS_TIME
 #   include <sys/time.h>
@@ -90,8 +92,14 @@
 
 #ifdef DEBUG
 int DO_DEBUG = 0;
+
+/* TODO-WIN32: timings debugging code currently doesn't compile */
+#ifndef _WIN32
+#define DEBUG_TIMINGS
 #endif
 
+#endif
+
 #ifdef NCORE
 nc_dev_t g_ncDevice;
 
@@ -452,14 +460,14 @@
 int
 dspam_process (DSPAM_CTX * CTX, const char *message)
 {
-#ifdef DEBUG
+#ifdef DEBUG_TIMINGS
   struct timeval tp1, tp2;
   struct timezone tzp;
 #endif
   buffer *header, *body;
   int spam_result = 0, is_toe = 0, is_undertrain = 0;
 
-#ifdef DEBUG
+#ifdef DEBUG_TIMINGS
   if (DO_DEBUG)
     gettimeofday(&tp1, &tzp);
 #endif
@@ -604,7 +612,7 @@
   if (is_undertrain)
     CTX->training_mode = DST_TOE;
 
-#ifdef DEBUG
+#ifdef DEBUG_TIMINGS
   if (DO_DEBUG) {
     if (CTX->source == DSS_NONE) {
       gettimeofday(&tp2, &tzp);
@@ -1547,9 +1555,10 @@
 int
 _ds_calc_result(DSPAM_CTX *CTX, ds_heap_t heap_sort, ds_diction_t diction)
 {
-  struct _ds_spam_stat stat;
+  struct _ds_spam_stat stat = { 0. };
   ds_heap_element_t node_heap;
-  ds_heap_element_t heap_list[heap_sort->items];
+  ds_heap_element_t *
+    heap_list = malloc(heap_sort->items*sizeof(ds_heap_element_t));
 
   /* Naive-Bayesian */
   float nbay_top = 0.0;
@@ -1585,7 +1594,7 @@
   long chi_used  = 0, chi_sx = 0, chi_hx = 0;
   double chi_s = 1.0, chi_h = 1.0;
   struct nt *factor_chi = nt_create(NT_PTR);
-  int i;
+  unsigned i;
 
   /* Invert the heap */
   node_heap = heap_sort->root;
@@ -1759,6 +1768,8 @@
     }
   }
 
+  free(heap_list);
+
   /* END Combine Token Values */
 
   /* Fisher-Robinson's Inverse Chi-Square */
@@ -2147,6 +2158,8 @@
       return EFAILURE;
     }
   }
+#else
+  driver; /* unused parameter */
 #endif
 
 #ifdef NCORE

Modified: trunk/M/lib/dspam/src/pref.c
===================================================================
--- trunk/M/lib/dspam/src/pref.c	2006-12-17 23:59:05 UTC (rev 7170)
+++ trunk/M/lib/dspam/src/pref.c	2006-12-18 00:05:52 UTC (rev 7171)
@@ -170,6 +170,8 @@
   char *p, *q, *bufptr;
   int i = 0;
 
+  config; ignore; /* unused parameters */
+
   if (PTX == NULL) {
     LOG(LOG_CRIT, ERR_MEM_ALLOC);
     return NULL;
@@ -306,6 +308,8 @@
   char filename[MAX_FILENAME_LENGTH];
   FILE *out_file;
 
+  config; ignore; /* unused parameters */
+
   if (username == NULL) {
     snprintf(filename, MAX_FILENAME_LENGTH, "%s/default.prefs", home);
   } else {
@@ -333,6 +337,8 @@
   FILE *out_file;
   int nlines; 
 
+  config; ignore; /* unused parameters */
+
   if (username == NULL) {
     snprintf(filename, MAX_FILENAME_LENGTH, "%s/default.prefs", home);
   } else {

Modified: trunk/M/lib/dspam/src/read_config.c
===================================================================
--- trunk/M/lib/dspam/src/read_config.c	2006-12-17 23:59:05 UTC (rev 7170)
+++ trunk/M/lib/dspam/src/read_config.c	2006-12-18 00:05:52 UTC (rev 7171)
@@ -122,11 +122,15 @@
     chomp(buffer);
 
     /* Remove comments */
-    if ((c = strchr(buffer, '#')) || (c = strchr(buffer, ';')))
+    c = strchr(buffer, '#');
+    if (!c)
+      c = strchr(buffer, ';');
+    if (c)
       *c = 0;
 
     /* Parse attribute name */
-    if (!(a = tokenize(buffer, &bufptr)))
+    a = tokenize(buffer, &bufptr);
+    if (!a)
       continue; /* Ignore whitespace-only lines */
 
     while ((v = tokenize(NULL, &bufptr)) != NULL) {

Modified: trunk/M/lib/dspam/src/storage_driver.h
===================================================================
--- trunk/M/lib/dspam/src/storage_driver.h	2006-12-17 23:59:05 UTC (rev 7170)
+++ trunk/M/lib/dspam/src/storage_driver.h	2006-12-18 00:05:52 UTC (rev 7171)
@@ -186,7 +186,13 @@
 #define DRS_OFFLINE	0x02
 #define DRS_UNKNOWN	0xFF
 
-#define CONTROL_TOKEN	11624422384514212933llu
+#ifdef _MSC_VER
+  #define ULL_CONST(x)  x ## ui64
+#else
+  #define ULL_CONST(x)  x ## llu
+#endif
+
+#define CONTROL_TOKEN	ULL_CONST(11624422384514212933)
 			/* $$CONTROL$$ */
 
 #endif /* _STORAGE_DRIVER_H */

Modified: trunk/M/lib/dspam/src/tokenizer.c
===================================================================
--- trunk/M/lib/dspam/src/tokenizer.c	2006-12-17 23:59:05 UTC (rev 7170)
+++ trunk/M/lib/dspam/src/tokenizer.c	2006-12-18 00:05:52 UTC (rev 7171)
@@ -528,8 +528,8 @@
                       char **previous_tokens, ds_diction_t diction,
                       const char *heading, const char *bitpattern)
 {
-  int i, t, keylen, breadth;
-  u_int32_t mask;
+  int i, t, keylen;
+  u_int32_t mask, breadth;
   unsigned long long crc;
   char key[256];
   int active = 0, top, tokenizer = CTX->tokenizer;
@@ -633,12 +633,12 @@
   ds_diction_t diction, 
   const char *bitpattern)
 {
-  int i, t, keylen, breadth;
+  int i, t, keylen;
   int top, tokenizer = CTX->tokenizer;
   unsigned long long crc;
   char key[256];
   int active = 0;
-  u_int32_t mask;
+  u_int32_t mask, breadth;
 
   /* Shift all previous tokens up */
   for(i=0;i<SPARSE_WINDOW_SIZE-1;i++) {
@@ -1052,7 +1052,7 @@
 
   bitpattern = malloc(SPARSE_WINDOW_SIZE * breadth);
 
-  for(mask=0;mask<breadth;mask++) {
+  for(mask=0;mask<(unsigned long)breadth;mask++) {
       for(i=0;i<SPARSE_WINDOW_SIZE;i++) {
           exp = (i) ? _ds_pow2(i) : 1;
           /* Reverse pos = SPARSE_WINDOW_SIZE - (i+1); */

Modified: trunk/M/lib/dspam/src/util.c
===================================================================
--- trunk/M/lib/dspam/src/util.c	2006-12-17 23:59:05 UTC (rev 7170)
+++ trunk/M/lib/dspam/src/util.c	2006-12-18 00:05:52 UTC (rev 7171)
@@ -58,6 +58,7 @@
 #include "libdspam.h"
 
 #ifdef _WIN32
+    #include <winsock.h>
     #include <direct.h>
 
     #define mkdir(filename, perm) _mkdir(filename)
@@ -175,10 +176,7 @@
  * If retval >= siz, truncation occurred.
  */
 size_t
-strlcat (dst, src, siz)
-     char *dst;
-     const char *src;
-     size_t siz;
+strlcat (char *dst, const char *src, size_t siz)
 {
   register char *d = dst;
   register const char *s = src;
@@ -213,10 +211,7 @@
  * Returns strlen(src); if retval >= siz, truncation occurred.
  */
 size_t
-strlcpy (dst, src, siz)
-     char *dst;
-     const char *src;
-     size_t siz;
+strlcpy (char *dst, const char *src, size_t siz)
 {
   register char *d = dst;
   register const char *s = src;
@@ -631,6 +626,8 @@
 
 int _ds_get_fcntl_lock(int fd) {
 #ifdef _WIN32
+  fd;
+
   return 0;
 #else
   struct flock f;
@@ -646,6 +643,8 @@
 
 int _ds_free_fcntl_lock(int fd) {
 #ifdef _WIN32
+  fd;
+
   return 0;
 #else
   struct flock f;
@@ -677,8 +676,7 @@
 
 #ifndef HAVE_STRCASESTR
 char *
-strcasestr(s, find)
-	const char *s, *find;
+strcasestr(const char *s, const char *find)
 {
 	char c, sc;
 	size_t len;
@@ -743,7 +741,7 @@
   snprintf(b, sizeof(b),
   "%d.%d.%d.%d", UC(p[0]), UC(p[1]), UC(p[2]), UC(p[3]));
 
-  if (len <= strlen(b)) {
+  if (len <= (int)strlen(b)) {
     errno = ERANGE;
     return(NULL);
   }
@@ -751,3 +749,44 @@
   return strcpy(buf, b);
 }
 #endif
+
+#ifdef _WIN32
+
+const char *_ds_win32_configfile()
+{
+  static char s_dspamConfig[MAX_FILENAME_LENGTH];
+
+  if ( !*s_dspamConfig ) {
+    snprintf(s_dspamConfig, sizeof(s_dspamConfig) - 1,
+             "%s/dspam.conf", _ds_win32_dir());
+    s_dspamConfig[sizeof(s_dspamConfig) - 1] = '\0';
+  }
+
+  return s_dspamConfig;
+}
+
+const char *_ds_win32_dir()
+{
+  static char s_dspamDir[MAX_FILENAME_LENGTH];
+
+  if ( !*s_dspamDir ) {
+    /*
+       We should normally use SHGetFolderLocation() for this but it doesn't
+       exist on all Win32 systems and loading it dynamically is painful.
+       SHGetSpecialFolderLocation() does exist everywhere but we need to
+       initialize OLE and use IMalloc to free its return value which is quite
+       painful too. So just use the standard environment variables instead.
+     */
+    const char *home = getenv("USERPROFILE");
+    if ( !home )
+      home = getenv("HOME");
+    if ( !home )
+      home = "c:"; /* have to fall back on something... */
+
+    strlcpy(s_dspamDir, home, sizeof(s_dspamDir));
+  }
+
+  return s_dspamDir;
+}
+
+#endif /* _WIN32 */

Modified: trunk/M/lib/dspam/src/util.h
===================================================================
--- trunk/M/lib/dspam/src/util.h	2006-12-17 23:59:05 UTC (rev 7170)
+++ trunk/M/lib/dspam/src/util.h	2006-12-18 00:05:52 UTC (rev 7171)
@@ -28,13 +28,15 @@
 #endif
 
 #include <sys/types.h>
+
+#ifndef _WIN32
 #include <sys/socket.h>
 #include <netinet/in.h>
 #include <arpa/inet.h>
-
-#ifndef _WIN32
 #include <pwd.h>
-#endif
+#else /* _WIN32 */
+#include <winsock2.h>
+#endif /* !_WIN32/_WIN32 */
 
 void	chomp	(char *string);
 char *	ltrim	(char *str);
@@ -121,4 +123,19 @@
 float _ds_round
   (float n);
 
+#ifdef _WIN32
+
+/*
+ * Win32 support functions:
+ *
+ *   _ds_win32_dir() returns the directory for DSPAM data/config files
+ *
+ *   _ds_win32_configfile() returns the default config file name
+ */
+
+const char *_ds_win32_configfile();
+const char *_ds_win32_dir();
+
+#endif /* _WIN32 */
+
 #endif /* _UTIL_H */


This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.

-------------------------------------------------------------------------
Take Surveys. Earn Cash. Influence the Future of IT
Join SourceForge.net's Techsay panel and you'll get the chance to share your
opinions on IT & business topics through brief surveys - and earn cash
http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.