summaryrefslogtreecommitdiff
path: root/src/drivers
diff options
context:
space:
mode:
Diffstat (limited to 'src/drivers')
-rw-r--r--src/drivers/Posix/Fl_Posix_System_Driver.H1
-rw-r--r--src/drivers/Posix/Fl_Posix_System_Driver.cxx15
-rw-r--r--src/drivers/WinAPI/Fl_WinAPI_System_Driver.H1
-rw-r--r--src/drivers/WinAPI/Fl_WinAPI_System_Driver.cxx16
4 files changed, 33 insertions, 0 deletions
diff --git a/src/drivers/Posix/Fl_Posix_System_Driver.H b/src/drivers/Posix/Fl_Posix_System_Driver.H
index 5b2060283..9ef8a2909 100644
--- a/src/drivers/Posix/Fl_Posix_System_Driver.H
+++ b/src/drivers/Posix/Fl_Posix_System_Driver.H
@@ -75,6 +75,7 @@ public:
virtual const char *home_directory_name() { return ::getenv("HOME"); }
virtual int dot_file_hidden() {return 1;}
virtual void gettime(time_t *sec, int *usec);
+ virtual void* gzopen(const char *fname, const char *mode);
};
#endif // FL_POSIX_SYSTEM_DRIVER_H
diff --git a/src/drivers/Posix/Fl_Posix_System_Driver.cxx b/src/drivers/Posix/Fl_Posix_System_Driver.cxx
index c2576b268..f603c2d17 100644
--- a/src/drivers/Posix/Fl_Posix_System_Driver.cxx
+++ b/src/drivers/Posix/Fl_Posix_System_Driver.cxx
@@ -34,6 +34,9 @@
#include <pwd.h>
#include <unistd.h>
#include <time.h>
+#if defined(HAVE_LIBZ)
+# include <zlib.h>
+#endif
//
// Define missing POSIX/XPG4 macros as needed...
@@ -99,6 +102,18 @@ void Fl_Posix_System_Driver::gettime(time_t *sec, int *usec) {
*usec = tv.tv_usec;
}
+void* Fl_Posix_System_Driver::gzopen(const char *fname, const char *mode) {
+#if defined(HAVE_LIBZ)
+ FILE *in = fl_fopen(fname, mode);
+ if (!in) return NULL;
+ int fd = dup(fileno(in));
+ fclose(in);
+ return gzdopen(fd, mode);
+#else
+ return NULL;
+#endif
+}
+
//
// End of "$Id$".
//
diff --git a/src/drivers/WinAPI/Fl_WinAPI_System_Driver.H b/src/drivers/WinAPI/Fl_WinAPI_System_Driver.H
index 43e0f54e2..99b5b0871 100644
--- a/src/drivers/WinAPI/Fl_WinAPI_System_Driver.H
+++ b/src/drivers/WinAPI/Fl_WinAPI_System_Driver.H
@@ -117,6 +117,7 @@ public:
virtual void remove_fd(int, int when);
virtual void remove_fd(int);
virtual void gettime(time_t *sec, int *usec);
+ virtual void* gzopen(const char *fname, const char *mode);
};
#endif // FL_WINAPI_SYSTEM_DRIVER_H
diff --git a/src/drivers/WinAPI/Fl_WinAPI_System_Driver.cxx b/src/drivers/WinAPI/Fl_WinAPI_System_Driver.cxx
index efbe65d01..b0a4c52e1 100644
--- a/src/drivers/WinAPI/Fl_WinAPI_System_Driver.cxx
+++ b/src/drivers/WinAPI/Fl_WinAPI_System_Driver.cxx
@@ -50,6 +50,9 @@ typedef RPC_STATUS (WINAPI* uuid_func)(UUID __RPC_FAR *Uuid);
#ifdef __CYGWIN__
# include <mntent.h>
#endif
+#if defined(HAVE_LIBZ)
+# include <zlib.h>
+#endif
inline int isdirsep(char c) { return c == '/' || c == '\\'; }
@@ -908,6 +911,19 @@ void Fl_WinAPI_System_Driver::gettime(time_t *sec, int *usec) {
*usec = t.millitm * 1000;
}
+void* Fl_WinAPI_System_Driver::gzopen(const char *fname, const char *mode) {
+#if defined(HAVE_LIBZ)
+ unsigned wl = fl_utf8towc(fname, strlen(fname), NULL, 0) + 1;
+ wchar_t *wc = new wchar_t[wl];
+ fl_utf8towc(fname, strlen(fname), wc, wl);
+ gzFile gzf = gzopen_w(wc, mode);
+ delete[] wc;
+ return gzf;
+#else
+ return NULL;
+#endif
+}
+
//
// End of "$Id$".
//