SDL

Форк
0
/
testiconv.c 
150 строк · 3.7 Кб
1
/*
2
  Copyright (C) 1997-2024 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 <SDL3/SDL.h>
14
#include <SDL3/SDL_main.h>
15
#include <SDL3/SDL_test.h>
16
#include "testutils.h"
17

18
static size_t
19
widelen(char *data)
20
{
21
    size_t len = 0;
22
    Uint32 *p = (Uint32 *)data;
23
    while (*p++) {
24
        ++len;
25
    }
26
    return len;
27
}
28

29
static char *get_next_line(Uint8 **fdataptr, size_t *fdatalen)
30
{
31
    char *retval = (char *) *fdataptr;
32
    Uint8 *ptr = *fdataptr;
33
    size_t len = *fdatalen;
34

35
    if (len == 0) {
36
        return NULL;
37
    }
38

39
    while (len > 0) {
40
        if (*ptr == '\r') {
41
            *ptr = '\0';
42
        } else if (*ptr == '\n') {
43
            *ptr = '\0';
44
            ptr++;
45
            len--;
46
            break;
47
        }
48
        ptr++;
49
        len--;
50
    }
51

52
    *fdataptr = ptr;
53
    *fdatalen = len;
54
    return retval;
55
}
56

57
int main(int argc, char *argv[])
58
{
59
    const char *formats[] = {
60
        "UTF8",
61
        "UTF-8",
62
        "UTF16BE",
63
        "UTF-16BE",
64
        "UTF16LE",
65
        "UTF-16LE",
66
        "UTF32BE",
67
        "UTF-32BE",
68
        "UTF32LE",
69
        "UTF-32LE",
70
        "UCS4",
71
        "UCS-4",
72
    };
73

74
    char *fname = NULL;
75
    char *ucs4;
76
    char *test[2];
77
    int i;
78
    int errors = 0;
79
    SDLTest_CommonState *state;
80
    Uint8 *fdata = NULL;
81
    Uint8 *fdataptr = NULL;
82
    char *line = NULL;
83
    size_t fdatalen = 0;
84

85
    /* Initialize test framework */
86
    state = SDLTest_CommonCreateState(argv, 0);
87
    if (!state) {
88
        return 1;
89
    }
90

91
    /* Enable standard application logging */
92
    SDL_SetLogPriority(SDL_LOG_CATEGORY_APPLICATION, SDL_LOG_PRIORITY_INFO);
93

94
    /* Parse commandline */
95
    for (i = 1; i < argc;) {
96
        int consumed;
97

98
        consumed = SDLTest_CommonArg(state, i);
99
        if (!consumed) {
100
            if (!fname) {
101
                fname = argv[i];
102
                consumed = 1;
103
            }
104
        }
105
        if (consumed <= 0) {
106
            static const char *options[] = { "[utf8.txt]", NULL };
107
            SDLTest_CommonLogUsage(state, argv[0], options);
108
            return 1;
109
        }
110

111
        i += consumed;
112
    }
113

114
    fname = GetResourceFilename(fname, "utf8.txt");
115
    fdata = (Uint8 *) (fname ? SDL_LoadFile(fname, &fdatalen) : NULL);
116
    if (!fdata) {
117
        SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Unable to load %s\n", fname);
118
        return 1;
119
    }
120

121
    fdataptr = fdata;
122
    while ((line = get_next_line(&fdataptr, &fdatalen)) != NULL) {
123
        /* Convert to UCS-4 */
124
        size_t len;
125
        ucs4 = SDL_iconv_string("UCS-4", "UTF-8", line, SDL_strlen(line) + 1);
126
        len = (widelen(ucs4) + 1) * 4;
127

128
        for (i = 0; i < SDL_arraysize(formats); ++i) {
129
            test[0] = SDL_iconv_string(formats[i], "UCS-4", ucs4, len);
130
            test[1] = SDL_iconv_string("UCS-4", formats[i], test[0], len);
131
            if (!test[1] || SDL_memcmp(test[1], ucs4, len) != 0) {
132
                SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "FAIL: %s\n", formats[i]);
133
                ++errors;
134
            }
135
            SDL_free(test[0]);
136
            SDL_free(test[1]);
137
        }
138
        test[0] = SDL_iconv_string("UTF-8", "UCS-4", ucs4, len);
139
        SDL_free(ucs4);
140
        SDL_Log("%s", test[0]);
141
        SDL_free(test[0]);
142
    }
143
    SDL_free(fdata);
144
    SDL_free(fname);
145

146
    SDL_LogInfo(SDL_LOG_CATEGORY_APPLICATION, "Total errors: %d\n", errors);
147
    SDL_Quit();
148
    SDLTest_CommonDestroyState(state);
149
    return errors ? errors + 1 : 0;
150
}
151

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.