21
#include "SDL_internal.h"
23
#include "SDL_dialog_utils.h"
25
char *convert_filters(const SDL_DialogFileFilter *filters, int nfilters,
26
NameTransform ntf, const char *prefix,
27
const char *separator, const char *suffix,
28
const char *filt_prefix, const char *filt_separator,
29
const char *filt_suffix, const char *ext_prefix,
30
const char *ext_separator, const char *ext_suffix)
35
const char *terminator;
40
SDL_SetError("Called convert_filters() with NULL filters (SDL bug)");
44
combined = SDL_strdup(prefix);
50
for (i = 0; i < nfilters; i++) {
51
const SDL_DialogFileFilter *f = &filters[i];
53
converted = convert_filter(*f, ntf, filt_prefix, filt_separator,
54
filt_suffix, ext_prefix, ext_separator,
62
terminator = f[1].name ? separator : suffix;
63
new_length = SDL_strlen(combined) + SDL_strlen(converted)
64
+ SDL_strlen(terminator) + 1;
66
new_combined = (char *)SDL_realloc(combined, new_length);
74
combined = new_combined;
76
SDL_strlcat(combined, converted, new_length);
77
SDL_strlcat(combined, terminator, new_length);
82
if (!filters->name || !filters->pattern) {
83
new_length = SDL_strlen(combined) + SDL_strlen(suffix) + 1;
85
new_combined = (char *)SDL_realloc(combined, new_length);
92
combined = new_combined;
94
SDL_strlcat(combined, suffix, new_length);
100
char *convert_filter(const SDL_DialogFileFilter filter, NameTransform ntf,
101
const char *prefix, const char *separator,
102
const char *suffix, const char *ext_prefix,
103
const char *ext_separator, const char *ext_suffix)
110
list = convert_ext_list(filter.pattern, ext_prefix, ext_separator,
118
name_filtered = ntf(filter.name);
121
name_filtered = SDL_strdup(filter.name);
124
if (!name_filtered) {
129
total_length = SDL_strlen(prefix) + SDL_strlen(name_filtered)
130
+ SDL_strlen(separator) + SDL_strlen(list)
131
+ SDL_strlen(suffix) + 1;
133
converted = (char *) SDL_malloc(total_length);
137
SDL_free(name_filtered);
141
SDL_snprintf(converted, total_length, "%s%s%s%s%s", prefix, name_filtered,
142
separator, list, suffix);
145
SDL_free(name_filtered);
150
char *convert_ext_list(const char *list, const char *prefix,
151
const char *separator, const char *suffix)
159
for (const char *c = list; *c; c++) {
160
semicolons += (*c == ';');
164
SDL_strlen(list) - semicolons
165
+ semicolons * SDL_strlen(separator)
166
+ SDL_strlen(prefix) + SDL_strlen(suffix)
169
converted = (char *) SDL_malloc(total_length);
177
SDL_strlcat(converted, prefix, total_length);
181
if (SDL_strcmp(list, "*") == 0) {
182
SDL_strlcat(converted, "*", total_length);
184
for (const char *c = list; *c; c++) {
185
if ((*c >= 'a' && *c <= 'z') || (*c >= 'A' && *c <= 'Z')
186
|| (*c >= '0' && *c <= '9') || *c == '-' || *c == '_'
191
SDL_strlcat(converted, str, total_length);
192
} else if (*c == ';') {
193
if (c == list || c[-1] == ';') {
194
SDL_SetError("Empty pattern not allowed");
199
SDL_strlcat(converted, separator, total_length);
201
SDL_SetError("Invalid character '%c' in pattern (Only [a-zA-Z0-9_.-] allowed, or a single *)", *c);
208
if (list[SDL_strlen(list) - 1] == ';') {
209
SDL_SetError("Empty pattern not allowed");
214
SDL_strlcat(converted, suffix, total_length);
219
const char *validate_filters(const SDL_DialogFileFilter *filters, int nfilters)
222
for (int i = 0; i < nfilters; i++) {
223
const char *msg = validate_list(filters[i].pattern);
234
const char *validate_list(const char *list)
236
if (SDL_strcmp(list, "*") == 0) {
239
for (const char *c = list; *c; c++) {
240
if ((*c >= 'a' && *c <= 'z') || (*c >= 'A' && *c <= 'Z')
241
|| (*c >= '0' && *c <= '9') || *c == '-' || *c == '_'
244
} else if (*c == ';') {
245
if (c == list || c[-1] == ';') {
246
return "Empty pattern not allowed";
249
return "Invalid character in pattern (Only [a-zA-Z0-9_.-] allowed, or a single *)";
254
if (list[SDL_strlen(list) - 1] == ';') {
255
return "Empty pattern not allowed";