diff options
author | martin-s <martin-s@ffa7fe5e-494d-0410-b361-a75ebd5db220> | 2008-10-09 22:07:14 +0000 |
---|---|---|
committer | martin-s <martin-s@ffa7fe5e-494d-0410-b361-a75ebd5db220> | 2008-10-09 22:07:14 +0000 |
commit | 92abcf4315a196e724acfb7592dfad2de12a79ee (patch) | |
tree | 232b90fe676bcecfa6424a7437110fcf0e6a70b4 /navit/util.c | |
parent | da120197c519919c32dc7f04903776bb1725d49a (diff) | |
download | navit-svn-92abcf4315a196e724acfb7592dfad2de12a79ee.tar.gz |
Add:Core:Beginning of adding support for wince and cleanup of win32 support
git-svn-id: http://svn.code.sf.net/p/navit/code/trunk/navit@1437 ffa7fe5e-494d-0410-b361-a75ebd5db220
Diffstat (limited to 'navit/util.c')
-rw-r--r-- | navit/util.c | 141 |
1 files changed, 141 insertions, 0 deletions
diff --git a/navit/util.c b/navit/util.c index d3125b05..ea164419 100644 --- a/navit/util.c +++ b/navit/util.c @@ -70,3 +70,144 @@ g_strconcat_printf(gchar *buffer, gchar *fmt, ...) g_free(str); return ret; } + +#if defined(_WIN32) || defined(__CEGCC__) +#include <stdio.h> +char *stristr(const char *String, const char *Pattern) +{ + char *pptr, *sptr, *start; + + for (start = (char *)String; *start != (int)NULL; start++) + { + /* find start of pattern in string */ + for ( ; ((*start!=(int)NULL) && (toupper(*start) != toupper(*Pattern))); start++) + ; + if ((int)NULL == *start) + return NULL; + + pptr = (char *)Pattern; + sptr = (char *)start; + + while (toupper(*sptr) == toupper(*pptr)) + { + sptr++; + pptr++; + + /* if end of pattern then pattern was found */ + + if ((int)NULL == *pptr) + return (start); + } + } + return NULL; +} + +#ifndef SIZE_MAX +# define SIZE_MAX ((size_t) -1) +#endif +#ifndef SSIZE_MAX +# define SSIZE_MAX ((ssize_t) (SIZE_MAX / 2)) +#endif +#if !HAVE_FLOCKFILE +# undef flockfile +# define flockfile(x) ((void) 0) +#endif +#if !HAVE_FUNLOCKFILE +# undef funlockfile +# define funlockfile(x) ((void) 0) +#endif + +/* Some systems, like OSF/1 4.0 and Woe32, don't have EOVERFLOW. */ +#ifndef EOVERFLOW +# define EOVERFLOW E2BIG +#endif + +/* Read up to (and including) a DELIMITER from FP into *LINEPTR (and + NUL-terminate it). *LINEPTR is a pointer returned from malloc (or + NULL), pointing to *N characters of space. It is realloc'ed as + necessary. Returns the number of characters read (not including + the null terminator), or -1 on error or EOF. */ + +ssize_t +getdelim (char **lineptr, size_t *n, int delimiter, FILE *fp) +{ + ssize_t result; + size_t cur_len = 0; + + if (lineptr == NULL || n == NULL || fp == NULL) + { + return -1; + } + + flockfile (fp); + + if (*lineptr == NULL || *n == 0) + { + *n = 120; + *lineptr = (char *) realloc (*lineptr, *n); + if (*lineptr == NULL) + { + result = -1; + goto unlock_return; + } + } + + for (;;) + { + int i; + + i = getc (fp); + if (i == EOF) + { + result = -1; + break; + } + + /* Make enough space for len+1 (for final NUL) bytes. */ + if (cur_len + 1 >= *n) + { + size_t needed_max = + SSIZE_MAX < SIZE_MAX ? (size_t) SSIZE_MAX + 1 : SIZE_MAX; + size_t needed = 2 * *n + 1; /* Be generous. */ + char *new_lineptr; + + if (needed_max < needed) + needed = needed_max; + if (cur_len + 1 >= needed) + { + result = -1; + goto unlock_return; + } + + new_lineptr = (char *) realloc (*lineptr, needed); + if (new_lineptr == NULL) + { + result = -1; + goto unlock_return; + } + + *lineptr = new_lineptr; + *n = needed; + } + + (*lineptr)[cur_len] = i; + cur_len++; + + if (i == delimiter) + break; + } + (*lineptr)[cur_len] = '\0'; + result = cur_len ? cur_len : result; + + unlock_return: + funlockfile (fp); /* doesn't set errno */ + + return result; +} + +ssize_t +getline (char **lineptr, size_t *n, FILE *stream) +{ + return getdelim (lineptr, n, '\n', stream); +} +#endif |