#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 }