# HG changeset patch # User Sam Lantinga # Date 1183013828 0 # Node ID 0313af081a84de8c491c4098a6b550fbe97f4a53 # Parent 180fa05e98e2ec7bbc3e26758fba1ed068848d3e Merge iconv const changes from 1.2 I'm not entirely happy with them. Maybe the right way to go is to leave SDL_iconv() taking a non-const inbuf? How often are we converting const strings anyway? diff -r 180fa05e98e2 -r 0313af081a84 include/SDL_stdinc.h --- a/include/SDL_stdinc.h Wed Jun 27 10:17:35 2007 +0000 +++ b/include/SDL_stdinc.h Thu Jun 28 06:57:08 2007 +0000 @@ -640,24 +640,21 @@ #define SDL_iconv_t iconv_t #define SDL_iconv_open iconv_open #define SDL_iconv_close iconv_close -extern DECLSPEC size_t SDLCALL SDL_iconv(SDL_iconv_t cd, char **inbuf, - size_t * inbytesleft, char **outbuf, - size_t * outbytesleft); #else typedef struct _SDL_iconv_t *SDL_iconv_t; extern DECLSPEC SDL_iconv_t SDLCALL SDL_iconv_open(const char *tocode, const char *fromcode); extern DECLSPEC int SDLCALL SDL_iconv_close(SDL_iconv_t cd); -extern DECLSPEC size_t SDLCALL SDL_iconv(SDL_iconv_t cd, char **inbuf, +#endif +extern DECLSPEC size_t SDLCALL SDL_iconv(SDL_iconv_t cd, const char **inbuf, size_t * inbytesleft, char **outbuf, size_t * outbytesleft); -#endif /* This function converts a string between encodings in one pass, returning a string that must be freed with SDL_free() or NULL on error. */ extern DECLSPEC char *SDLCALL SDL_iconv_string(const char *tocode, const char *fromcode, - char *inbuf, + const char *inbuf, size_t inbytesleft); #define SDL_iconv_utf8_ascii(S) SDL_iconv_string("ASCII", "UTF-8", S, SDL_strlen(S)+1) #define SDL_iconv_utf8_latin1(S) SDL_iconv_string("LATIN1", "UTF-8", S, SDL_strlen(S)+1) diff -r 180fa05e98e2 -r 0313af081a84 src/stdlib/SDL_iconv.c --- a/src/stdlib/SDL_iconv.c Wed Jun 27 10:17:35 2007 +0000 +++ b/src/stdlib/SDL_iconv.c Thu Jun 28 06:57:08 2007 +0000 @@ -32,10 +32,24 @@ size_t SDL_iconv(SDL_iconv_t cd, - char **inbuf, size_t * inbytesleft, + const char **inbuf, size_t * inbytesleft, char **outbuf, size_t * outbytesleft) { - size_t retCode = iconv(cd, inbuf, inbytesleft, outbuf, outbytesleft); + size_t retCode; +#ifdef ICONV_REALLY_MODIFIES_INBUF + if (inbuf && *inbuf && inbytesleft) { + char *tmp = SDL_stack_alloc(char, *inbytesleft); + char *ptr = tmp; + SDL_memcpy(tmp, inbuf, *inbytesleft); + retCode = iconv(cd, &ptr, inbytesleft, outbuf, outbytesleft); + inbuf += (ptr - tmp); + SDL_stack_free(tmp); + } else { + retCode = iconv(cd, NULL, inbytesleft, outbuf, outbytesleft); + } +#else + retCode = iconv(cd, (char **) inbuf, inbytesleft, outbuf, outbytesleft); +#endif if (retCode == (size_t) - 1) { switch (errno) { case E2BIG: @@ -154,13 +168,14 @@ size_t SDL_iconv(SDL_iconv_t cd, - char **inbuf, size_t * inbytesleft, + const char **inbuf, size_t * inbytesleft, char **outbuf, size_t * outbytesleft) { /* For simplicity, we'll convert everything to and from UCS-4 */ - char *src, *dst; + const char *src; + char *dst; size_t srclen, dstlen; - Uint32 ch; + Uint32 ch = 0; size_t total; if (!inbuf || !*inbuf) { @@ -755,7 +770,7 @@ #endif /* !HAVE_ICONV */ char * -SDL_iconv_string(const char *tocode, const char *fromcode, char *inbuf, +SDL_iconv_string(const char *tocode, const char *fromcode, const char *inbuf, size_t inbytesleft) { SDL_iconv_t cd;