packages feed

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
}