diff options
Diffstat (limited to 'src/port.c')
-rw-r--r-- | src/port.c | 145 |
1 files changed, 145 insertions, 0 deletions
diff --git a/src/port.c b/src/port.c new file mode 100644 index 0000000..dc25f16 --- /dev/null +++ b/src/port.c @@ -0,0 +1,145 @@ +/* + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ +/* + * This file contains definitions that might be included in one system, but + * omited in another. + * + * Created by Serge van den Boom + */ + +#include "port.h" + +#include <ctype.h> +#include <errno.h> +#ifdef _MSC_VER +# include <stdarg.h> +# include <stdio.h> +#endif /* _MSC_VER */ +#include <stdlib.h> +#include <string.h> +#if !defined (_MSC_VER) && !defined (HAVE_READDIR_R) +# include <dirent.h> +#endif + +#ifndef HAVE_STRUPR +char * +strupr (char *str) +{ + char *ptr; + + ptr = str; + while (*ptr) + { + *ptr = (char) toupper (*ptr); + ptr++; + } + return str; +} +#endif + +#ifndef HAVE_SETENV +int +setenv (const char *name, const char *value, int overwrite) +{ + char *string, *ptr; + size_t nameLen, valueLen; + + if (!overwrite) + { + char *old; + + old = getenv (name); + if (old != NULL) + return 0; + } + + nameLen = strlen (name); + valueLen = strlen (value); + + string = malloc (nameLen + valueLen + 2); + // "NAME=VALUE\0" + // putenv() does NOT make a copy, but uses the string passed. + + ptr = string; + + strcpy (string, name); + ptr += nameLen; + + *ptr = '='; + ptr++; + + strcpy (ptr, value); + + return putenv (string); +} +#endif + +#if !defined (_MSC_VER) && !defined (HAVE_READDIR_R) +// NB. This function calls readdir() directly, and as such has the same +// reentrance issues as that function. For the purposes of UQM it will +// do though. +// Note the POSIX requires that "The pointer returned by readdir() +// points to data which may be overwritten by another call to +// readdir( ) on the same directory stream. This data is not +// overwritten by another call to readdir() on a different directory +// stream." +// NB. This function makes an extra copy of the dirent and will hence be +// slower than a direct call to readdir() or readdir_r(). +int +readdir_r(DIR *dirp, struct dirent *entry, struct dirent **result) { + struct dirent *readdir_entry; + + readdir_entry = readdir(dirp); + if (readdir_entry == NULL) { + *result = NULL; + return errno; + } + + *entry = *readdir_entry; + *result = entry; + return 0; +} +#endif + +#ifdef _MSC_VER +// MSVC does not have snprintf() and vsnprintf(). It does have a _snprintf() +// and _vsnprintf(), but these do not terminate a truncated string as +// the C standard prescribes. +int +snprintf(char *str, size_t size, const char *format, ...) +{ + int result; + va_list args; + + va_start (args, format); + result = _vsnprintf (str, size, format, args); + if (str != NULL && size != 0) + str[size - 1] = '\0'; + va_end (args); + + return result; +} + +int +vsnprintf(char *str, size_t size, const char *format, va_list args) +{ + int result = _vsnprintf (str, size, format, args); + if (str != NULL && size != 0) + str[size - 1] = '\0'; + return result; +} +#endif /* _MSC_VER */ + |