Mercurial > sdl-ios-xcode
comparison src/stdlib/SDL_iconv.c @ 2136:5a1b6fe6e90f
iconv() doesn't write to the data, just make compilers happy
author | Sam Lantinga <slouken@libsdl.org> |
---|---|
date | Thu, 28 Jun 2007 08:35:35 +0000 |
parents | 0313af081a84 |
children | ca80c942e69c |
comparison
equal
deleted
inserted
replaced
2135:0313af081a84 | 2136:5a1b6fe6e90f |
---|---|
25 | 25 |
26 #include "SDL_stdinc.h" | 26 #include "SDL_stdinc.h" |
27 #include "SDL_endian.h" | 27 #include "SDL_endian.h" |
28 | 28 |
29 #ifdef HAVE_ICONV | 29 #ifdef HAVE_ICONV |
30 | |
31 /* Depending on which standard the iconv() was implemented with, | |
32 iconv() may or may not use const char ** for the inbuf param. | |
33 If we get this wrong, it's just a warning, so no big deal. | |
34 */ | |
35 #if defined(_XGP6) || \ | |
36 defined(__GLIBC__) && ((__GLIBC__ > 2) || (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 2)) | |
37 #define ICONV_INBUF_NONCONST | |
38 #endif | |
30 | 39 |
31 #include <errno.h> | 40 #include <errno.h> |
32 | 41 |
33 size_t | 42 size_t |
34 SDL_iconv(SDL_iconv_t cd, | 43 SDL_iconv(SDL_iconv_t cd, |
35 const char **inbuf, size_t * inbytesleft, | 44 const char **inbuf, size_t * inbytesleft, |
36 char **outbuf, size_t * outbytesleft) | 45 char **outbuf, size_t * outbytesleft) |
37 { | 46 { |
38 size_t retCode; | 47 size_t retCode; |
39 #ifdef ICONV_REALLY_MODIFIES_INBUF | 48 #ifdef ICONV_INBUF_NONCONST |
40 if (inbuf && *inbuf && inbytesleft) { | 49 retCode = iconv(cd, (char **) inbuf, inbytesleft, outbuf, outbytesleft); |
41 char *tmp = SDL_stack_alloc(char, *inbytesleft); | |
42 char *ptr = tmp; | |
43 SDL_memcpy(tmp, inbuf, *inbytesleft); | |
44 retCode = iconv(cd, &ptr, inbytesleft, outbuf, outbytesleft); | |
45 inbuf += (ptr - tmp); | |
46 SDL_stack_free(tmp); | |
47 } else { | |
48 retCode = iconv(cd, NULL, inbytesleft, outbuf, outbytesleft); | |
49 } | |
50 #else | 50 #else |
51 retCode = iconv(cd, (char **) inbuf, inbytesleft, outbuf, outbytesleft); | 51 retCode = iconv(cd, inbuf, inbytesleft, outbuf, outbytesleft); |
52 #endif | 52 #endif |
53 if (retCode == (size_t) - 1) { | 53 if (retCode == (size_t) - 1) { |
54 switch (errno) { | 54 switch (errno) { |
55 case E2BIG: | 55 case E2BIG: |
56 return SDL_ICONV_E2BIG; | 56 return SDL_ICONV_E2BIG; |