testiconv.c (2278B)
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#include <stdio.h> 14 15#include "SDL.h" 16 17static size_t 18widelen(char *data) 19{ 20 size_t len = 0; 21 Uint32 *p = (Uint32 *) data; 22 while (*p++) { 23 ++len; 24 } 25 return len; 26} 27 28int 29main(int argc, char *argv[]) 30{ 31 const char *formats[] = { 32 "UTF8", 33 "UTF-8", 34 "UTF16BE", 35 "UTF-16BE", 36 "UTF16LE", 37 "UTF-16LE", 38 "UTF32BE", 39 "UTF-32BE", 40 "UTF32LE", 41 "UTF-32LE", 42 "UCS4", 43 "UCS-4", 44 }; 45 char buffer[BUFSIZ]; 46 char *ucs4; 47 char *test[2]; 48 int i; 49 FILE *file; 50 int errors = 0; 51 52 /* Enable standard application logging */ 53 SDL_LogSetPriority(SDL_LOG_CATEGORY_APPLICATION, SDL_LOG_PRIORITY_INFO); 54 55 if (!argv[1]) { 56 argv[1] = "utf8.txt"; 57 } 58 file = fopen(argv[1], "rb"); 59 if (!file) { 60 SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Unable to open %s\n", argv[1]); 61 return (1); 62 } 63 64 while (fgets(buffer, sizeof(buffer), file)) { 65 /* Convert to UCS-4 */ 66 size_t len; 67 ucs4 = 68 SDL_iconv_string("UCS-4", "UTF-8", buffer, 69 SDL_strlen(buffer) + 1); 70 len = (widelen(ucs4) + 1) * 4; 71 for (i = 0; i < SDL_arraysize(formats); ++i) { 72 test[0] = SDL_iconv_string(formats[i], "UCS-4", ucs4, len); 73 test[1] = SDL_iconv_string("UCS-4", formats[i], test[0], len); 74 if (!test[1] || SDL_memcmp(test[1], ucs4, len) != 0) { 75 SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "FAIL: %s\n", formats[i]); 76 ++errors; 77 } 78 SDL_free(test[0]); 79 SDL_free(test[1]); 80 } 81 test[0] = SDL_iconv_string("UTF-8", "UCS-4", ucs4, len); 82 SDL_free(ucs4); 83 fputs(test[0], stdout); 84 SDL_free(test[0]); 85 } 86 fclose(file); 87 return (errors ? errors + 1 : 0); 88}