test/testfile.c
author Sam Lantinga <slouken@libsdl.org>
Fri, 28 Nov 2014 04:51:33 -0800
changeset 9246 a761913e5e91
parent 8149 681eb46b8ac4
child 9356 e87d6e1e812a
permissions -rw-r--r--
Fixed bug 2786 - "UCS-2-INTERNAL" iconv encoding is not supported everywhere, use UTF-16LE instead

Jonas Kulla

src/main/windows/SDL_windows_main.c:137:
cmdline = SDL_iconv_string("UTF-8", "UCS-2-INTERNAL", (char *)(text), (SDL_wcslen(text)+1)*sizeof(WCHAR));

I'm trying to compile an SDL2 application for windows using the mingw-w64 32bit toolchain provided by my distro (Fedora 19). However, even the simplest test program that does nothing at all fails to startup with a "Fatal error - out of memory" message because the mingw iconv library provided by my distro does not support the "UCS-2-INTERNAL" encoding and the conversion returns null.

From my little bit of research, it turns out that even though this encoding is supported by the external GNU libiconv library, some glibc versions (?) don't support it with their internal iconv routines, and will instead provide the native endian encoding when "UCS-2" is specified.

Nonetheless, I wonder why the native endianness is considered in the first place when Windows doesn't even run on any big endian archs (to my knowledge). And true enough, 'WIN_StringToUTF8' from core/windows/SDL_windows.h is used everywhere else in the windows backend, which is just a macro to iconv with "UTF-16LE" as source. Therefore it would IMO make sense to use this macro here as well, which would solve my problem (patch attached).
     1 /*
     2   Copyright (C) 1997-2014 Sam Lantinga <slouken@libsdl.org>
     3 
     4   This software is provided 'as-is', without any express or implied
     5   warranty.  In no event will the authors be held liable for any damages
     6   arising from the use of this software.
     7 
     8   Permission is granted to anyone to use this software for any purpose,
     9   including commercial applications, and to alter it and redistribute it
    10   freely.
    11 */
    12 
    13 /* sanity tests on SDL_rwops.c (usefull for alternative implementations of stdio rwops) */
    14 
    15 /* quiet windows compiler warnings */
    16 #define _CRT_NONSTDC_NO_WARNINGS
    17 
    18 #include <stdlib.h>
    19 
    20 #ifndef _MSC_VER
    21 #include <unistd.h>
    22 #endif
    23 
    24 #include "SDL.h"
    25 #include "SDL_endian.h"
    26 
    27 
    28 #include <stdio.h>
    29 
    30 /* WARNING ! those 2 files will be destroyed by this test program */
    31 
    32 #ifdef __IPHONEOS__
    33 #define FBASENAME1  "../Documents/sdldata1" /* this file will be created during tests */
    34 #define FBASENAME2  "../Documents/sdldata2"     /* this file should not exist before starting test */
    35 #else
    36 #define FBASENAME1  "sdldata1"      /* this file will be created during tests */
    37 #define FBASENAME2  "sdldata2"      /* this file should not exist before starting test */
    38 #endif
    39 
    40 #ifndef NULL
    41 #define NULL ((void *)0)
    42 #endif
    43 
    44 static void
    45 cleanup(void)
    46 {
    47     unlink(FBASENAME1);
    48     unlink(FBASENAME2);
    49 }
    50 
    51 static void
    52 rwops_error_quit(unsigned line, SDL_RWops * rwops)
    53 {
    54     SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "testfile.c(%d): failed\n", line);
    55     if (rwops) {
    56         rwops->close(rwops);    /* This calls SDL_FreeRW(rwops); */
    57     }
    58     cleanup();
    59     exit(1);                    /* quit with rwops error (test failed) */
    60 }
    61 
    62 #define RWOP_ERR_QUIT(x)    rwops_error_quit( __LINE__, (x) )
    63 
    64 
    65 
    66 int
    67 main(int argc, char *argv[])
    68 {
    69     SDL_RWops *rwops = NULL;
    70     char test_buf[30];
    71 
    72     /* Enable standard application logging */
    73 	SDL_LogSetPriority(SDL_LOG_CATEGORY_APPLICATION, SDL_LOG_PRIORITY_INFO);
    74 
    75     cleanup();
    76 
    77 /* test 1 : basic argument test: all those calls to SDL_RWFromFile should fail */
    78 
    79     rwops = SDL_RWFromFile(NULL, NULL);
    80     if (rwops)
    81         RWOP_ERR_QUIT(rwops);
    82     rwops = SDL_RWFromFile(NULL, "ab+");
    83     if (rwops)
    84         RWOP_ERR_QUIT(rwops);
    85     rwops = SDL_RWFromFile(NULL, "sldfkjsldkfj");
    86     if (rwops)
    87         RWOP_ERR_QUIT(rwops);
    88     rwops = SDL_RWFromFile("something", "");
    89     if (rwops)
    90         RWOP_ERR_QUIT(rwops);
    91     rwops = SDL_RWFromFile("something", NULL);
    92     if (rwops)
    93         RWOP_ERR_QUIT(rwops);
    94     SDL_Log("test1 OK\n");
    95 
    96 /* test 2 : check that inexistent file is not successfully opened/created when required */
    97 /* modes : r, r+ imply that file MUST exist
    98    modes : a, a+, w, w+ checks that it succeeds (file may not exists)
    99 
   100  */
   101     rwops = SDL_RWFromFile(FBASENAME2, "rb");   /* this file doesn't exist that call must fail */
   102     if (rwops)
   103         RWOP_ERR_QUIT(rwops);
   104     rwops = SDL_RWFromFile(FBASENAME2, "rb+");  /* this file doesn't exist that call must fail */
   105     if (rwops)
   106         RWOP_ERR_QUIT(rwops);
   107     rwops = SDL_RWFromFile(FBASENAME2, "wb");
   108     if (!rwops)
   109         RWOP_ERR_QUIT(rwops);
   110     rwops->close(rwops);
   111     unlink(FBASENAME2);
   112     rwops = SDL_RWFromFile(FBASENAME2, "wb+");
   113     if (!rwops)
   114         RWOP_ERR_QUIT(rwops);
   115     rwops->close(rwops);
   116     unlink(FBASENAME2);
   117     rwops = SDL_RWFromFile(FBASENAME2, "ab");
   118     if (!rwops)
   119         RWOP_ERR_QUIT(rwops);
   120     rwops->close(rwops);
   121     unlink(FBASENAME2);
   122     rwops = SDL_RWFromFile(FBASENAME2, "ab+");
   123     if (!rwops)
   124         RWOP_ERR_QUIT(rwops);
   125     rwops->close(rwops);
   126     unlink(FBASENAME2);
   127     SDL_Log("test2 OK\n");
   128 
   129 /* test 3 : creation, writing , reading, seeking,
   130             test : w mode, r mode, w+ mode
   131  */
   132     rwops = SDL_RWFromFile(FBASENAME1, "wb");   /* write only */
   133     if (!rwops)
   134         RWOP_ERR_QUIT(rwops);
   135     if (1 != rwops->write(rwops, "1234567890", 10, 1))
   136         RWOP_ERR_QUIT(rwops);
   137     if (10 != rwops->write(rwops, "1234567890", 1, 10))
   138         RWOP_ERR_QUIT(rwops);
   139     if (7 != rwops->write(rwops, "1234567", 1, 7))
   140         RWOP_ERR_QUIT(rwops);
   141     if (0 != rwops->seek(rwops, 0L, RW_SEEK_SET))
   142         RWOP_ERR_QUIT(rwops);
   143     if (0 != rwops->read(rwops, test_buf, 1, 1))
   144         RWOP_ERR_QUIT(rwops);   /* we are in write only mode */
   145     rwops->close(rwops);
   146 
   147     rwops = SDL_RWFromFile(FBASENAME1, "rb");   /* read mode, file must exists */
   148     if (!rwops)
   149         RWOP_ERR_QUIT(rwops);
   150     if (0 != rwops->seek(rwops, 0L, RW_SEEK_SET))
   151         RWOP_ERR_QUIT(rwops);
   152     if (20 != rwops->seek(rwops, -7, RW_SEEK_END))
   153         RWOP_ERR_QUIT(rwops);
   154     if (7 != rwops->read(rwops, test_buf, 1, 7))
   155         RWOP_ERR_QUIT(rwops);
   156     if (SDL_memcmp(test_buf, "1234567", 7))
   157         RWOP_ERR_QUIT(rwops);
   158     if (0 != rwops->read(rwops, test_buf, 1, 1))
   159         RWOP_ERR_QUIT(rwops);
   160     if (0 != rwops->read(rwops, test_buf, 10, 100))
   161         RWOP_ERR_QUIT(rwops);
   162     if (0 != rwops->seek(rwops, -27, RW_SEEK_CUR))
   163         RWOP_ERR_QUIT(rwops);
   164     if (2 != rwops->read(rwops, test_buf, 10, 3))
   165         RWOP_ERR_QUIT(rwops);
   166     if (SDL_memcmp(test_buf, "12345678901234567890", 20))
   167         RWOP_ERR_QUIT(rwops);
   168     if (0 != rwops->write(rwops, test_buf, 1, 1))
   169         RWOP_ERR_QUIT(rwops);   /* readonly mode */
   170     rwops->close(rwops);
   171 
   172 /* test 3: same with w+ mode */
   173     rwops = SDL_RWFromFile(FBASENAME1, "wb+");  /* write + read + truncation */
   174     if (!rwops)
   175         RWOP_ERR_QUIT(rwops);
   176     if (1 != rwops->write(rwops, "1234567890", 10, 1))
   177         RWOP_ERR_QUIT(rwops);
   178     if (10 != rwops->write(rwops, "1234567890", 1, 10))
   179         RWOP_ERR_QUIT(rwops);
   180     if (7 != rwops->write(rwops, "1234567", 1, 7))
   181         RWOP_ERR_QUIT(rwops);
   182     if (0 != rwops->seek(rwops, 0L, RW_SEEK_SET))
   183         RWOP_ERR_QUIT(rwops);
   184     if (1 != rwops->read(rwops, test_buf, 1, 1))
   185         RWOP_ERR_QUIT(rwops);   /* we are in read/write mode */
   186     if (0 != rwops->seek(rwops, 0L, RW_SEEK_SET))
   187         RWOP_ERR_QUIT(rwops);
   188     if (20 != rwops->seek(rwops, -7, RW_SEEK_END))
   189         RWOP_ERR_QUIT(rwops);
   190     if (7 != rwops->read(rwops, test_buf, 1, 7))
   191         RWOP_ERR_QUIT(rwops);
   192     if (SDL_memcmp(test_buf, "1234567", 7))
   193         RWOP_ERR_QUIT(rwops);
   194     if (0 != rwops->read(rwops, test_buf, 1, 1))
   195         RWOP_ERR_QUIT(rwops);
   196     if (0 != rwops->read(rwops, test_buf, 10, 100))
   197         RWOP_ERR_QUIT(rwops);
   198     if (0 != rwops->seek(rwops, -27, RW_SEEK_CUR))
   199         RWOP_ERR_QUIT(rwops);
   200     if (2 != rwops->read(rwops, test_buf, 10, 3))
   201         RWOP_ERR_QUIT(rwops);
   202     if (SDL_memcmp(test_buf, "12345678901234567890", 20))
   203         RWOP_ERR_QUIT(rwops);
   204     rwops->close(rwops);
   205     SDL_Log("test3 OK\n");
   206 
   207 /* test 4: same in r+ mode */
   208     rwops = SDL_RWFromFile(FBASENAME1, "rb+");  /* write + read + file must exists, no truncation */
   209     if (!rwops)
   210         RWOP_ERR_QUIT(rwops);
   211     if (1 != rwops->write(rwops, "1234567890", 10, 1))
   212         RWOP_ERR_QUIT(rwops);
   213     if (10 != rwops->write(rwops, "1234567890", 1, 10))
   214         RWOP_ERR_QUIT(rwops);
   215     if (7 != rwops->write(rwops, "1234567", 1, 7))
   216         RWOP_ERR_QUIT(rwops);
   217     if (0 != rwops->seek(rwops, 0L, RW_SEEK_SET))
   218         RWOP_ERR_QUIT(rwops);
   219     if (1 != rwops->read(rwops, test_buf, 1, 1))
   220         RWOP_ERR_QUIT(rwops);   /* we are in read/write mode */
   221     if (0 != rwops->seek(rwops, 0L, RW_SEEK_SET))
   222         RWOP_ERR_QUIT(rwops);
   223     if (20 != rwops->seek(rwops, -7, RW_SEEK_END))
   224         RWOP_ERR_QUIT(rwops);
   225     if (7 != rwops->read(rwops, test_buf, 1, 7))
   226         RWOP_ERR_QUIT(rwops);
   227     if (SDL_memcmp(test_buf, "1234567", 7))
   228         RWOP_ERR_QUIT(rwops);
   229     if (0 != rwops->read(rwops, test_buf, 1, 1))
   230         RWOP_ERR_QUIT(rwops);
   231     if (0 != rwops->read(rwops, test_buf, 10, 100))
   232         RWOP_ERR_QUIT(rwops);
   233     if (0 != rwops->seek(rwops, -27, RW_SEEK_CUR))
   234         RWOP_ERR_QUIT(rwops);
   235     if (2 != rwops->read(rwops, test_buf, 10, 3))
   236         RWOP_ERR_QUIT(rwops);
   237     if (SDL_memcmp(test_buf, "12345678901234567890", 20))
   238         RWOP_ERR_QUIT(rwops);
   239     rwops->close(rwops);
   240     SDL_Log("test4 OK\n");
   241 
   242 /* test5 : append mode */
   243     rwops = SDL_RWFromFile(FBASENAME1, "ab+");  /* write + read + append */
   244     if (!rwops)
   245         RWOP_ERR_QUIT(rwops);
   246     if (1 != rwops->write(rwops, "1234567890", 10, 1))
   247         RWOP_ERR_QUIT(rwops);
   248     if (10 != rwops->write(rwops, "1234567890", 1, 10))
   249         RWOP_ERR_QUIT(rwops);
   250     if (7 != rwops->write(rwops, "1234567", 1, 7))
   251         RWOP_ERR_QUIT(rwops);
   252     if (0 != rwops->seek(rwops, 0L, RW_SEEK_SET))
   253         RWOP_ERR_QUIT(rwops);
   254 
   255     if (1 != rwops->read(rwops, test_buf, 1, 1))
   256         RWOP_ERR_QUIT(rwops);
   257     if (0 != rwops->seek(rwops, 0L, RW_SEEK_SET))
   258         RWOP_ERR_QUIT(rwops);
   259 
   260     if (20 + 27 != rwops->seek(rwops, -7, RW_SEEK_END))
   261         RWOP_ERR_QUIT(rwops);
   262     if (7 != rwops->read(rwops, test_buf, 1, 7))
   263         RWOP_ERR_QUIT(rwops);
   264     if (SDL_memcmp(test_buf, "1234567", 7))
   265         RWOP_ERR_QUIT(rwops);
   266     if (0 != rwops->read(rwops, test_buf, 1, 1))
   267         RWOP_ERR_QUIT(rwops);
   268     if (0 != rwops->read(rwops, test_buf, 10, 100))
   269         RWOP_ERR_QUIT(rwops);
   270 
   271     if (27 != rwops->seek(rwops, -27, RW_SEEK_CUR))
   272         RWOP_ERR_QUIT(rwops);
   273 
   274     if (0 != rwops->seek(rwops, 0L, RW_SEEK_SET))
   275         RWOP_ERR_QUIT(rwops);
   276     if (3 != rwops->read(rwops, test_buf, 10, 3))
   277         RWOP_ERR_QUIT(rwops);
   278     if (SDL_memcmp(test_buf, "123456789012345678901234567123", 30))
   279         RWOP_ERR_QUIT(rwops);
   280     rwops->close(rwops);
   281     SDL_Log("test5 OK\n");
   282     cleanup();
   283     return 0;                   /* all ok */
   284 }