hscdio-0.1.0.0: src/c/cdio/compat/cdtext.c
#include "cdio/compat/cdtext.h"
#include "stdlib.h"
#include "string.h"
#include "cdio/compat/device.h"
#include "cdio/memory.h"
#include "cdio/compat/track.h"
#include "cdio/compat/version.h"
// FFI-compatible wrappers
cdtext_genre_t genre_unused() {
return CDTEXT_GENRE_UNUSED;
}
cdtext_lang_t language_unknown() {
return CDTEXT_LANGUAGE_UNKNOWN;
}
cdtext_lang_t language_invalid() {
#if LIBCDIO_SINCE_VERSION_2_1
return CDTEXT_LANGUAGE_INVALID;
#else
return CDTEXT_LANGUAGE_UNKNOWN;
#endif
}
cdtext_lang_t language_unused() {
#if LIBCDIO_SINCE_VERSION_2_1
return CDTEXT_LANGUAGE_BLOCK_UNUSED;
#else
return CDTEXT_LANGUAGE_UNKNOWN;
#endif
}
// Symbol compatibility definitions
cdtext_lang_t cdtext_str2lang_safe(const char* str) {
#if LIBCDIO_SINCE_VERSION_2_1
return cdtext_str2lang(str);
#else
return CDTEXT_LANGUAGE_UNKNOWN;
#endif
}
int cdtext_data_init_safe(cdtext_t* cdtext, uint8_t* data, size_t len) {
#if LIBCDIO_SINCE_VERSION_0_94
return cdtext_data_init(cdtext, data, len);
#else
return -1;
#endif
}
cdtext_lang_t* cdtext_list_languages_v2_safe(cdtext_t* cdtext) {
#if LIBCDIO_SINCE_VERSION_2_1
return cdtext_list_languages_v2(cdtext);
#else
return cdtext_list_languages(cdtext);
#endif
}
bool cdtext_set_language_index_safe(cdtext_t* cdtext, int i) {
#if LIBCDIO_SINCE_VERSION_2_1
return cdtext_set_language_index(cdtext, i);
#else
// If we don't have a builtin index function, fall back on the list of
// languages we *do* have, and derive an index from that.
cdtext_lang_t* langs = cdtext_list_languages(cdtext);
cdtext_lang_t nub_langs[CDTEXT_NUM_BLOCKS_MAX];
// The Haskell interface drops both blocks without a known language and
// blocks with a language which was already used (since
// `cdtext_select_language` is unable to select either), but the C list is
// messier and needs to be cleaned for the index to be predictable.
int found = 0;
for (int j = 0; j < CDTEXT_NUM_BLOCKS_MAX; ++j) {
if (langs[j] == CDTEXT_LANGUAGE_UNKNOWN)
continue;
for (int k = 0; k <= found; ++k) {
if (k == found) {
nub_langs[found] = langs[j];
++found;
break;
} else if (langs[k] == langs[j])
break;
}
}
if (i < 0 || i >= found)
return cdtext_select_language(cdtext, CDTEXT_LANGUAGE_UNKNOWN);
else
return cdtext_select_language(cdtext, nub_langs[i]);
#endif
}