1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117
|
#include "gtoption.h"
#ifdef LOCAL_NCURSESW
#include <curses.h>
#include <stdlib.h>
#include <wchar.h>
#include <memory.h>
/* only needed for local_* prototypes */
#include "glk.h"
#include "glkterm.h"
int local_get_wch (wint_t *ch)
{
int i;
int status = 0;
char *buffer = (char *) calloc (MB_CUR_MAX + 1, sizeof (char));
mbstate_t state;
for ( i = 0; status != ERR && i < MB_CUR_MAX; ++ i ) {
status = getch();
if ( status == ERR ) {
break;
}
if ( ((unsigned) status) >= 0x100 ) {
/* returned a function key */
*ch = status;
status = KEY_CODE_YES;
free (buffer);
return status;
}
buffer[i] = status;
memset (&state, '\0', sizeof (state));
status = mbrlen (buffer, i + 1, &state);
switch (status) {
case -2: /* continue reading */
status = i + 1 < MB_CUR_MAX ? OK : ERR;
break;
case -1: /* abort */
status = ERR;
break;
default: /* got a character */
memset (&state, '\0', sizeof (state));
status = mbrtowc ((wchar_t *) ch, buffer, i + 1, &state);
status = OK;
/* This is just to break the loop */
i = MB_CUR_MAX;
break;
}
}
free (buffer);
return status;
}
int local_addnwstr(const wchar_t *wstr, int n)
{
int i;
int status = OK;
size_t size = 0;
char *buffer = (char *) calloc (MB_CUR_MAX + 1, sizeof (char));
mbstate_t state;
for ( i = 0; status != ERR && i < n && wstr[i] != L'\0'; ++ i ) {
memset (&state, '\0', sizeof (state));
size = wcrtomb (buffer, wstr[i], &state);
if ( size == (size_t) -1 ) {
status = ERR;
}
else {
addnstr(buffer, size);
}
}
free (buffer);
return status;
}
int local_addwstr(const wchar_t *wstr)
{
return local_addnwstr(wstr, wcslen(wstr));
}
int local_mvaddnwstr(int y, int x, const wchar_t *wstr, int n)
{
move (y, x);
return local_addnwstr(wstr, n);
}
#else /* LOCAL_NCURSESW */
#define _XOPEN_SOURCE_EXTENDED /* ncursesw *wch* and *wstr* functions */
#include <ncursesw/ncurses.h>
int local_get_wch (wint_t *ch)
{
return get_wch(ch);
}
int local_addwstr(const wchar_t *wstr)
{
return addwstr(wstr);
}
int local_mvaddnwstr(int y, int x, const wchar_t *wstr, int n)
{
return mvaddnwstr(y, x, wstr, n);
}
int local_addnwstr(const wchar_t *wstr, int n)
{
return addnwstr(wstr, n);
}
#endif /* LOCAL_NCURSESW */
|