#include "std.h"

#include <locale.h>
#include <stdarg.h>
#include <stdio.h>
#include <wchar.h>

int demo(const wchar_t *lhs, const wchar_t *rhs) {
    setlocale(LC_ALL, "en_US.utf-8");
    int rc = wcscmp(lhs, rhs);
    const char *rel = rc < 0 ? "precedes" : rc > 0 ? "follows" : "equals";
    if (rc != 0) {
        warn("[%ls] %s [%ls] (%d)", lhs, rel, rhs, rc);
        DumpHex(lhs, 16);
        DumpHex(rhs, 16);
    }
    return rc;
}

DLLEXPORT int check_string(wchar_t *stringx) {
    setlocale(LC_ALL, "en_US.utf-8");
    return demo(L"時空", stringx);
}

DLLEXPORT const wchar_t *get_string() {
    setlocale(LC_ALL, "en_US.utf-8");
    return L"時空";
}

typedef struct {
    char *c;
    wchar_t *w;
} WStruct;

DLLEXPORT int struct_string(WStruct wstruct) {
    setlocale(LC_ALL, "en_US.utf-8");
    return demo(L"時空", wstruct.w);
}

DLLEXPORT int check_char(wchar_t chr) {
    return chr == L'時' ? 1 : -1;
}

DLLEXPORT wchar_t get_char() {
    return L'時';
}

typedef int (*wchar_t_cb)();

DLLEXPORT wchar_t char_cb(wchar_t_cb cb) {
    return cb(L'時');
}