7
static iconv_t iconv_init_codepage(int codepage)
10
char codepage_name[16];
11
snprintf(codepage_name, sizeof(codepage_name), "CP%d", codepage);
12
result = iconv_open(nl_langinfo(CODESET), codepage_name);
13
if (result == (iconv_t) - 1)
14
perror(codepage_name);
18
static iconv_t dos_to_local;
21
* Initialize conversion from codepage.
22
* codepage = -1 means default codepage.
23
* Returns 0 on success, non-zero on failure
25
static int init_conversion(int codepage)
27
static int initialized = -1;
28
if (initialized < 0) {
31
codepage = DEFAULT_DOS_CODEPAGE;
32
setlocale(LC_ALL, ""); /* initialize locale */
33
dos_to_local = iconv_init_codepage(codepage);
34
if (dos_to_local == (iconv_t) - 1 && codepage != DEFAULT_DOS_CODEPAGE) {
35
printf("Trying to set fallback DOS codepage %d\n",
36
DEFAULT_DOS_CODEPAGE);
37
dos_to_local = iconv_init_codepage(DEFAULT_DOS_CODEPAGE);
38
if (dos_to_local == (iconv_t) - 1)
39
initialized = 0; /* no conversion available */
45
int set_dos_codepage(int codepage)
47
return init_conversion(codepage);
50
int dos_char_to_printable(char **p, unsigned char c)
56
if (!init_conversion(-1))
58
return iconv(dos_to_local, &pin, &bytes_in, p, &bytes_out) != -1;