Skip to content

Commit

Permalink
Implement fl_putenv() as cross-platform putenv()
Browse files Browse the repository at this point in the history
  • Loading branch information
Albrecht Schlosser committed Feb 10, 2020
1 parent dcb848c commit 4c1b92e
Show file tree
Hide file tree
Showing 9 changed files with 79 additions and 58 deletions.
3 changes: 2 additions & 1 deletion CHANGES.txt
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
Changes in FLTK 1.4.0 Released: ??? ?? 2019
Changes in FLTK 1.4.0 Released: ??? ?? 2020

General Information about this Release

Expand All @@ -18,6 +18,7 @@ Changes in FLTK 1.4.0 Released: ??? ?? 2019
New Features and Extensions

- (add new items here)
- New fl_putenv() is a cross-platform putenv() wrapper (see docs).
- New Fl::keyboard_screen_scaling(0) call stops recognition of ctrl/+/-/0/
keystrokes as scaling all windows of a screen.
- New "Preview" switch added to the GTK native file chooser dialog
Expand Down
9 changes: 6 additions & 3 deletions FL/fl_utf8.h
Original file line number Diff line number Diff line change
Expand Up @@ -3,17 +3,17 @@
*
* Author: Jean-Marc Lienher ( http://oksid.ch )
* Copyright 2000-2010 by O'ksi'D.
* Copyright 2016-2018 by Bill Spitzak and others.
* Copyright 2016-2020 by Bill Spitzak and others.
*
* This library is free software. Distribution and use rights are outlined in
* the file "COPYING" which should have been included with this file. If this
* file is missing or damaged, see the license at:
*
* http://www.fltk.org/COPYING.php
* https://www.fltk.org/COPYING.php
*
* Please report all bugs and problems on the following page:
*
* http://www.fltk.org/str.php
* https://www.fltk.org/str.php
*/

/* Merged in some functionality from the fltk-2 version. IMM.
Expand Down Expand Up @@ -191,6 +191,9 @@ FL_EXPORT int fl_rmdir(const char *f);
/* OD: Portable UTF-8 aware getenv wrapper */
FL_EXPORT char* fl_getenv(const char *name);

/* Portable UTF-8 aware putenv wrapper */
FL_EXPORT int fl_putenv(const char *var);

/* OD: Portable UTF-8 aware execvp wrapper */
FL_EXPORT int fl_mkdir(const char* f, int mode);

Expand Down
8 changes: 4 additions & 4 deletions src/Fl_System_Driver.H
Original file line number Diff line number Diff line change
Expand Up @@ -4,17 +4,17 @@
// A base class for platform specific system calls
// for the Fast Light Tool Kit (FLTK).
//
// Copyright 2010-2018 by Bill Spitzak and others.
// Copyright 2010-2020 by Bill Spitzak and others.
//
// This library is free software. Distribution and use rights are outlined in
// the file "COPYING" which should have been included with this file. If this
// file is missing or damaged, see the license at:
//
// http://www.fltk.org/COPYING.php
// https://www.fltk.org/COPYING.php
//
// Please report all bugs and problems on the following page:
//
// http://www.fltk.org/str.php
// https://www.fltk.org/str.php
//

/**
Expand Down Expand Up @@ -97,7 +97,7 @@ public:
// implement these to support cross-platform file operations
virtual char *utf2mbcs(const char *s) {return (char*)s;}
virtual char *getenv(const char* v) {return NULL;}
virtual int putenv(char* v) {return -1;}
virtual int putenv(const char *var) {return -1;}
virtual int open(const char* f, int oflags, int pmode) {return -1;}

// Note: the default implementation ignores the 'binary' argument.
Expand Down
8 changes: 4 additions & 4 deletions src/drivers/Android/Fl_Android_System_Driver.H
Original file line number Diff line number Diff line change
Expand Up @@ -3,17 +3,17 @@
//
// Definition of Android system driver for the Fast Light Tool Kit (FLTK).
//
// Copyright 2010-2018 by Bill Spitzak and others.
// Copyright 2010-2020 by Bill Spitzak and others.
//
// This library is free software. Distribution and use rights are outlined in
// the file "COPYING" which should have been included with this file. If this
// file is missing or damaged, see the license at:
//
// http://www.fltk.org/COPYING.php
// https://www.fltk.org/COPYING.php
//
// Please report all bugs and problems on the following page:
//
// http://www.fltk.org/str.php
// https://www.fltk.org/str.php
//

/**
Expand Down Expand Up @@ -48,7 +48,7 @@ public:
virtual void fatal(const char *format, va_list args);
virtual char *utf2mbcs(const char *s);
virtual char *getenv(const char *var);
virtual int putenv(char *var) {return ::putenv(var);} // *FIXME* needs string conversion
virtual int putenv(const char *var) { return ::putenv(strdup(var)); }
virtual int open(const char *fnam, int oflags, int pmode);
virtual int open_ext(const char *fnam, int binary, int oflags, int pmode);
virtual FILE *fopen(const char *fnam, const char *mode);
Expand Down
12 changes: 6 additions & 6 deletions src/drivers/Posix/Fl_Posix_System_Driver.H
Original file line number Diff line number Diff line change
@@ -1,20 +1,20 @@
//
// "$Id$"
//
// Definition of Posix system driver
// Definition of POSIX system driver
// for the Fast Light Tool Kit (FLTK).
//
// Copyright 2010-2017 by Bill Spitzak and others.
// Copyright 2010-2020 by Bill Spitzak and others.
//
// This library is free software. Distribution and use rights are outlined in
// the file "COPYING" which should have been included with this file. If this
// file is missing or damaged, see the license at:
//
// http://www.fltk.org/COPYING.php
// https://www.fltk.org/COPYING.php
//
// Please report all bugs and problems on the following page:
//
// http://www.fltk.org/str.php
// https://www.fltk.org/str.php
//

/**
Expand Down Expand Up @@ -52,8 +52,8 @@ public:
virtual int open(const char* f, int oflags, int pmode) {
return pmode == -1 ? ::open(f, oflags) : ::open(f, oflags, pmode);
}
virtual char *getenv(const char *v) { return ::getenv(v); }
virtual int putenv(char* v) {return ::putenv(v);}
virtual char *getenv(const char *v) { return ::getenv(v); }
virtual int putenv(const char *var) {return ::putenv(strdup(var));}
virtual int system(const char* cmd) {return ::system(cmd);}
virtual int execvp(const char *file, char *const *argv) {return ::execvp(file, argv);}
virtual int chmod(const char* f, int mode) {return ::chmod(f, mode);}
Expand Down
10 changes: 5 additions & 5 deletions src/drivers/WinAPI/Fl_WinAPI_System_Driver.H
Original file line number Diff line number Diff line change
@@ -1,19 +1,19 @@
//
// "$Id$"
//
// Definition of Windows system driver for the Fast Light Tool Kit (FLTK).
// Windows system driver for the Fast Light Tool Kit (FLTK).
//
// Copyright 2010-2018 by Bill Spitzak and others.
// Copyright 2010-2020 by Bill Spitzak and others.
//
// This library is free software. Distribution and use rights are outlined in
// the file "COPYING" which should have been included with this file. If this
// file is missing or damaged, see the license at:
//
// http://www.fltk.org/COPYING.php
// https://www.fltk.org/COPYING.php
//
// Please report all bugs and problems on the following page:
//
// http://www.fltk.org/str.php
// https://www.fltk.org/str.php
//

/**
Expand Down Expand Up @@ -46,7 +46,7 @@ public:
virtual void fatal(const char *format, va_list args);
virtual char *utf2mbcs(const char *s);
virtual char *getenv(const char *var);
virtual int putenv(char *var) {return _putenv(var);} // *FIXME* needs string conversion
virtual int putenv(const char *var);
virtual int open(const char *fnam, int oflags, int pmode);
virtual int open_ext(const char *fnam, int binary, int oflags, int pmode);
virtual FILE *fopen(const char *fnam, const char *mode);
Expand Down
19 changes: 15 additions & 4 deletions src/drivers/WinAPI/Fl_WinAPI_System_Driver.cxx
Original file line number Diff line number Diff line change
@@ -1,19 +1,19 @@
//
// "$Id$"
//
// Definition of Apple Darwin system driver.
// Definition of Windows system driver for the Fast Light Tool Kit (FLTK).
//
// Copyright 1998-2018 by Bill Spitzak and others.
// Copyright 1998-2020 by Bill Spitzak and others.
//
// This library is free software. Distribution and use rights are outlined in
// the file "COPYING" which should have been included with this file. If this
// file is missing or damaged, see the license at:
//
// http://www.fltk.org/COPYING.php
// https://www.fltk.org/COPYING.php
//
// Please report all bugs and problems on the following page:
//
// http://www.fltk.org/str.php
// https://www.fltk.org/str.php
//

#include "../../config_lib.h"
Expand Down Expand Up @@ -196,6 +196,17 @@ char *Fl_WinAPI_System_Driver::getenv(const char *var) {
return wchar_to_utf8(ret, buf);
}

int Fl_WinAPI_System_Driver::putenv(const char *var) {
unsigned len = (unsigned)strlen(var);
unsigned wn = fl_utf8toUtf16(var, len, NULL, 0) + 1; // Query length
wchar_t *wbuf = (wchar_t *)malloc(sizeof(wchar_t) * wn);
wn = fl_utf8toUtf16(var, len, (unsigned short *)wbuf, wn);
wbuf[wn] = 0;
int ret = _wputenv(wbuf);
free(wbuf);
return ret;
}

int Fl_WinAPI_System_Driver::open(const char *fnam, int oflags, int pmode) {
utf8_to_wchar(fnam, wbuf);
if (pmode == -1) return _wopen(wbuf, oflags);
Expand Down
47 changes: 35 additions & 12 deletions src/fl_utf8.cxx
Original file line number Diff line number Diff line change
Expand Up @@ -5,17 +5,17 @@
//
// Author: Jean-Marc Lienher ( http://oksid.ch )
// Copyright 2000-2010 by O'ksi'D.
// Copyright 2016-2017 by Bill Spitzak and others.
// Copyright 2016-2020 by Bill Spitzak and others.
//
// This library is free software. Distribution and use rights are outlined in
// the file "COPYING" which should have been included with this file. If this
// file is missing or damaged, see the license at:
//
// http://www.fltk.org/COPYING.php
// https://www.fltk.org/COPYING.php
//
// Please report all bugs and problems on the following page:
//
// http://www.fltk.org/str.php
// https://www.fltk.org/str.php
//

#include <FL/Fl.H>
Expand Down Expand Up @@ -314,6 +314,38 @@ char *fl_getenv(const char* v) {
}


/** Cross-platform function to write environment variables with a UTF-8
encoded name or value.
This function is especially useful on the Windows platform where
non-ASCII environment variables are encoded as wide characters.
The given argument \p var must be encoded in UTF-8 in the form "name=value".
The \p 'name' part must conform to platform dependent restrictions on
environment variable names.
The string given in \p var is copied and optionally converted to the
required encoding for the platform. On platforms other than Windows
this function calls putenv directly.
The return value is zero on success and non-zero in case of error.
The value in case of error is platform specific and returned as-is.
\note The copied string is allocated on the heap and "lost" on some platforms,
i.e. calling fl_putenv() to change environment variables frequently may cause
memory leaks. There may be an option to avoid this in a future implementation.
\note This function is not thread-safe.
\param[in] var the UTF-8 encoded environment variable \p 'name=value'
\return 0 on success, non-zero in case of error.
*/

int fl_putenv(const char* var) {
return Fl::system_driver()->putenv(var);
}


/** Cross-platform function to open files with a UTF-8 encoded name.
This function is especially useful on the Windows platform where the
Expand Down Expand Up @@ -579,11 +611,6 @@ void fl_make_path_for_file( const char *path ) {
free( p );
} // fl_make_path_for_file()


//============================================================
// this part comes from file src/fl_utf.c of FLTK 1.3
//============================================================

/** Set to 1 to turn bad UTF-8 bytes into ISO-8859-1. If this is zero
they are instead turned into the Unicode REPLACEMENT CHARACTER, of
value 0xfffd.
Expand Down Expand Up @@ -1331,10 +1358,6 @@ unsigned fl_utf8from_mb(char* dst, unsigned dstlen, const char* src, unsigned sr
return Fl::system_driver()->utf8from_mb(dst, dstlen, src, srclen);
}

//============================================================
// end of the part from file src/fl_utf.c of FLTK 1.3
//============================================================

/** @} */

//
Expand Down
21 changes: 2 additions & 19 deletions test/demo.cxx
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
//
// Main demo program for the Fast Light Tool Kit (FLTK).
//
// Copyright 1998-2019 by Bill Spitzak and others.
// Copyright 1998-2020 by Bill Spitzak and others.
//
// This library is free software. Distribution and use rights are outlined in
// the file "COPYING" which should have been included with this file. If this
Expand All @@ -20,23 +20,6 @@
#include <string.h>
#include <stdlib.h>

// *FIXME*
// Implement fl_putenv(). Then remove the following comment
// and the #define's of fl_putenv below

// Visual C++ 2005 incorrectly displays a warning about the use of
// POSIX APIs on Windows, which is supposed to be POSIX compliant...

#if defined(_MSC_VER)
# define fl_putenv _putenv
#else
# define fl_putenv putenv
#endif // _MSC_VER

// *FIXME* To do:
// Check whether '#include <unistd.h>' can be removed since chdir()
// has been replaced with fl_chdir() (AlbrechtS, Nov 12, 2017)

#if defined __APPLE__
#include <ApplicationServices/ApplicationServices.h>
#endif
Expand Down Expand Up @@ -459,7 +442,7 @@ int load_the_menu(char* fname) {
}

int main(int argc, char **argv) {
fl_putenv((char *)"FLTK_DOCDIR=../documentation/html");
fl_putenv("FLTK_DOCDIR=../documentation/html");
char buf[FL_PATH_MAX];
strcpy(buf, argv[0]);
#if DEBUG_EXE_WITH_D
Expand Down

0 comments on commit 4c1b92e

Please sign in to comment.