]> granicus.if.org Git - graphviz/commitdiff
Modify library code to work on Windows
authorerg <devnull@localhost>
Thu, 3 May 2007 23:19:43 +0000 (23:19 +0000)
committererg <devnull@localhost>
Thu, 3 May 2007 23:19:43 +0000 (23:19 +0000)
lib/expr/exeval.c
lib/gvc/gvconfig.c
lib/vmalloc/vmbest.c
lib/vmalloc/vmhdr.h

index 22f05260e10f4fdb7d375a432611e5823ad9dbe9..2d8072f2605a1e9977ffde9674ebe142e44d7d24 100644 (file)
 #include "exop.h"
 #include <string.h>
 #include <time.h>
+#ifdef WIN32
+#include <stdlib.h>
+#define srand48 srand
+#define drand48 rand
+#endif
+
 
 static Extype_t eval(Expr_t *, Exnode_t *, void *);
 
index e033cba1e7356a8b60f68ca09a6b2c48bc450f9d..07c776766e42b1a99b4f19a4daa3f2219ad8a2a4 100644 (file)
 
 #ifdef ENABLE_LTDL
 #include       <sys/types.h>
-#include       <regex.h>
+#ifdef WIN32
+#include        <regex_win32.c>
+typedef struct {
+    int gl_pathc;           /* count of total paths so far */
+    int gl_matchc;          /* count of paths matching pattern */
+    int gl_offs;            /* reserved at beginning of gl_pathv */
+    int gl_flags;           /* returned flags */
+    char **gl_pathv;        /* list of paths matching pattern */
+} glob_t;
+static void globfree (glob_t* pglob);
+static int glob (char*, int, int (*errfunc)(const char *, int), glob_t*);
+#else
+#include        <regex.h>
+#include       <glob.h>
+#endif 
 #include       <sys/stat.h>
+#ifdef HAVE_UNISTD_H
 #include       <unistd.h>
-#include       <glob.h>
+#endif
 #endif
 
 #include        "memory.h"
@@ -242,6 +257,12 @@ char * gvconfig_libdir(void)
 
     if (!libdir) {
 
+#ifdef WIN32
+        /* this code has to be modified to read value from 
+         * registry or argg[0] -- +/lib etc method.  FIX
+         */
+        libdir="C:/unix/local/lib/Graphviz";
+#else
         /* this only works on linux, other systems will get GVLIBDIR only */
        libdir = GVLIBDIR;
         f = fopen ("/proc/self/maps", "r");
@@ -268,6 +289,7 @@ char * gvconfig_libdir(void)
             }
             fclose (f);
         }
+#endif
     }
     return libdir;
 }
@@ -530,3 +552,68 @@ void gvconfig(GVC_t * gvc, boolean rescan)
 #endif
     gvtextlayout_select(gvc);   /* choose best available textlayout plugin immediately */
 }
+
+#ifdef ENABLE_LTDL
+#ifdef WIN32
+#include <windows.h>
+#define GLOB_NOSPACE    1   /* Ran out of memory.  */
+#define GLOB_ABORTED    2   /* Read error.  */
+#define GLOB_NOMATCH    3   /* No matches found.  */
+#define GLOB_NOSORT     4
+#define DMKEY "Software\\Microsoft" //key to look for library dir
+
+/* Emulating windows glob */
+
+/* glob:
+ * Assumes only GLOB_NOSORT flag given. That is, there is no offset,
+ * and no previous call to glob.
+ */
+char * gvconfig_libdir(void);
+
+static int
+glob (char* pattern, int flags, int (*errfunc)(const char *, int),
+         glob_t *pglob)
+{
+    char* libdir;
+    WIN32_FIND_DATA wfd;
+    HANDLE h;
+    char** str=0;
+    int arrsize=0;
+    int cnt = 0;
+    h = FindFirstFile (pattern, &wfd);
+    if (h == INVALID_HANDLE_VALUE) return GLOB_NOMATCH;
+    libdir = gvconfig_libdir();
+    do {
+      if (cnt >= arrsize-1) {
+        arrsize += 512;
+        if (str) str = (char**)realloc (str, arrsize*sizeof(char*));
+        else str = (char**)malloc (arrsize*sizeof(char*));
+        if (!str) return GLOB_NOSPACE;
+      }
+      str[cnt] = (char*)malloc (strlen(libdir)+1+strlen(wfd.cFileName)+1);
+      if (!str[cnt]) return GLOB_NOSPACE;
+       (str[cnt])[0]="/0";
+
+      strcpy(str[cnt],libdir);
+      strcat(str[cnt],"/");
+      strcat(str[cnt],wfd.cFileName);
+      cnt++;
+    } while (FindNextFile (h, &wfd));
+    str[cnt] = 0;
+
+    pglob->gl_pathc = cnt;
+    pglob->gl_pathv = (char**)realloc(str, (cnt+1)*sizeof(char*));
+    
+    return 0;
+}
+
+static void
+globfree (glob_t* pglob)
+{
+    int i;
+    for (i = 0; i < pglob->gl_pathc; i++)
+      free (pglob->gl_pathv[i]);
+    free (pglob->gl_pathv);
+}
+#endif
+#endif
index ad5028dc72b069fa70ab65c5b73a0c4c98988d47..f345b69023c63b300e273858fa89c2751e2e5f33 100644 (file)
@@ -1147,10 +1147,6 @@ size_t align;
     return (Void_t *) data;
 }
 
-#if defined(_WIN32)
-#include       <windows.h>
-#endif /*_WIN32*/
-
 /*     A discipline to get memory using sbrk() or VirtualAlloc on win32 */
 #if __STD_C
 static Void_t *sbrkmem(Vmalloc_t * vm, Void_t * caddr,
index ca36da0fcb8ae7c402225aa720e5cd40fd216806..790a9376e742496206a99950edf53f5cedc9d1ae 100644 (file)
@@ -23,6 +23,9 @@ extern "C" {
 #ifndef _BLD_vmalloc
 #define _BLD_vmalloc   1
 #endif
+#ifdef WIN32
+#include <io.h>
+#endif
 
 /*     Common types, and macros for vmalloc functions.
 **
@@ -437,8 +440,13 @@ extern "C" {
 #if !_PACKAGE_ast
 
     extern size_t getpagesize _ARG_((void));
+
+#ifdef WIN32
+typedef unsigned int ssize_t;
+#else
     extern void abort _ARG_((void));
     extern ssize_t write _ARG_((int, const void *, size_t));
+#endif
 
 #if !__STDC__ && !_hdr_stdlib
     extern size_t strlen _ARG_((const char *));
@@ -458,13 +466,17 @@ extern "C" {
 #endif
 
 /* for malloc.c */
+#ifndef WIN32
     extern int creat _ARG_((const char *, int));
     extern int close _ARG_((int));
+#endif
     extern int getpid _ARG_((void));
 
 /* for vmexit.c */
+#ifndef WIN32
     extern int onexit _ARG_((void (*)(void)));
     extern void _exit _ARG_((int));
+#endif
     extern void _cleanup _ARG_((void));
 
 #endif                         /*!PACKAGE_ast */