| version 1.38, 2006/01/15 11:43:54 |
version 1.38.6.1, 2007/01/21 11:38:59 |
|
|
| * |
* |
| */ |
*/ |
| |
|
| |
/* Modified by Ruibiao Qiu <ruibiao@arl.wustl.edu,ruibiao@gmail.com> |
| |
* to add support for wide characters |
| |
* Changes: |
| |
* - Add a compiler variable HAVE_WCHAR for wide character only code |
| |
* - Add a pointer to liked list of non-spacing characters in __ldata |
| |
* and the macro to access the width field in the attribute field |
| |
* - Add a circular input character buffer in __screen to handle wide |
| |
* character input (used in get_wch()) |
| |
*/ |
| |
|
| #include <termios.h> |
#include <termios.h> |
| |
|
| /* Private structure definitions for curses. */ |
/* Private structure definitions for curses. */ |
| Line 59 extern char *__tc_ac, *__tc_AB, *__tc_ae |
|
| Line 69 extern char *__tc_ac, *__tc_AB, *__tc_ae |
|
| *__tc_uc, *__tc_ue, *__tc_UP, *__tc_up, *__tc_us, |
*__tc_uc, *__tc_ue, *__tc_UP, *__tc_up, *__tc_us, |
| *__tc_vb, *__tc_ve, *__tc_vi, *__tc_vs; |
*__tc_vb, *__tc_ve, *__tc_vi, *__tc_vs; |
| |
|
| |
#ifdef HAVE_WCHAR |
| |
extern char *__tc_Xh, *__tc_Xl, *__tc_Xo, *__tc_Xr, *__tc_Xt, |
| |
*__tc_Xv; |
| |
/* |
| |
* Add a list of non-spacing characters to each spacing |
| |
* character in a singly linked list |
| |
*/ |
| |
typedef struct nschar_t { |
| |
wchar_t ch; /* Non-spacing character */ |
| |
struct nschar_t *next; /* Next non-spacing character */ |
| |
} nschar_t; |
| |
#endif /* HAVE_WCHAR */ |
| |
|
| /* |
/* |
| * A window an array of __LINE structures pointed to by the 'lines' pointer. |
* A window an array of __LINE structures pointed to by the 'lines' pointer. |
| * A line is an array of __LDATA structures pointed to by the 'line' pointer. |
* A line is an array of __LDATA structures pointed to by the 'line' pointer. |
| Line 73 extern char *__tc_ac, *__tc_AB, *__tc_ae |
|
| Line 96 extern char *__tc_ac, *__tc_AB, *__tc_ae |
|
| struct __ldata { |
struct __ldata { |
| wchar_t ch; /* Character */ |
wchar_t ch; /* Character */ |
| attr_t attr; /* Attributes */ |
attr_t attr; /* Attributes */ |
| |
#ifdef HAVE_WCHAR |
| |
nschar_t *nsp; /* Foreground non-spacing character pointer */ |
| |
#endif /* HAVE_WCHAR */ |
| }; |
}; |
| |
|
| |
#ifdef HAVE_WCHAR |
| |
/* macros to extract the width of a wide character */ |
| |
#define __WCWIDTH 0xfc000000 |
| |
#define WCW_SHIFT 26 |
| |
#define WCOL(wc) ((((unsigned) (wc).attr) >> WCW_SHIFT ) > MB_LEN_MAX ? ((int)(((unsigned) (wc).attr ) >> WCW_SHIFT )) - 64 : ((int)(((unsigned) (wc).attr ) >> WCW_SHIFT))) |
| |
#define SET_WCOL(c, w) do { \ |
| |
((c).attr) = ((((c).attr) & WA_ATTRIBUTES ) | ((w) << WCW_SHIFT )); \ |
| |
} while(/*CONSTCOND*/0) |
| |
#define BGWCOL(wc) ((((wc).battr) >> WCW_SHIFT ) > MB_LEN_MAX ? (((wc).battr ) >> WCW_SHIFT ) - 64 : (((wc).battr ) >> WCW_SHIFT )) |
| |
#define SET_BGWCOL(c, w) do { \ |
| |
((c).battr) = ((((c).battr) & WA_ATTRIBUTES ) | ((w) << WCW_SHIFT )); \ |
| |
} while(/*CONSTCOND*/0) |
| |
#endif /* HAVE_WCHAR */ |
| |
|
| #define __LDATASIZE (sizeof(__LDATA)) |
#define __LDATASIZE (sizeof(__LDATA)) |
| |
|
| struct __line { |
struct __line { |
| #ifdef DEBUG |
#ifdef DEBUG |
| #define SENTINEL_VALUE 0xaac0ffee |
#define SENTINEL_VALUE 0xaac0ffee |
| |
|
| unsigned int sentinel; /* try to catch line overflows */ |
unsigned int sentinel; /* try to catch line overflows */ |
| #endif |
#endif |
| #define __ISDIRTY 0x01 /* Line is dirty. */ |
#define __ISDIRTY 0x01 /* Line is dirty. */ |
| Line 125 struct __window { /* Window structure. |
|
| Line 165 struct __window { /* Window structure. |
|
| int pbegy, pbegx, |
int pbegy, pbegx, |
| sbegy, sbegx, |
sbegy, sbegx, |
| smaxy, smaxx; /* Saved prefresh() values */ |
smaxy, smaxx; /* Saved prefresh() values */ |
| |
#ifdef HAVE_WCHAR |
| |
nschar_t *bnsp; /* Background non-spacing char list */ |
| |
#endif /* HAVE_WCHAR */ |
| }; |
}; |
| |
|
| /* Set of attributes unset by 'me' - 'mb', 'md', 'mh', 'mk', 'mp' and 'mr'. */ |
/* Set of attributes unset by 'me' - 'mb', 'md', 'mh', 'mk', 'mp' and 'mr'. */ |
| |
#ifndef HAVE_WCHAR |
| #define __TERMATTR \ |
#define __TERMATTR \ |
| (__REVERSE | __BLINK | __DIM | __BOLD | __BLANK | __PROTECT) |
(__REVERSE | __BLINK | __DIM | __BOLD | __BLANK | __PROTECT) |
| |
#else |
| |
#define __TERMATTR \ |
| |
(__REVERSE | __BLINK | __DIM | __BOLD | __BLANK | __PROTECT \ |
| |
| WA_TOP | WA_LOW | WA_LEFT | WA_RIGHT | WA_HORIZONTAL | WA_VERTICAL) |
| |
#endif /* HAVE_WCHAR */ |
| |
|
| struct __winlist { |
struct __winlist { |
| struct __window *winp; /* The window. */ |
struct __window *winp; /* The window. */ |
| Line 203 struct __screen { |
|
| Line 252 struct __screen { |
|
| *tc_SF, *tc_Sf, *tc_sf, *tc_so, *tc_sp, |
*tc_SF, *tc_Sf, *tc_sf, *tc_so, *tc_sp, |
| *tc_SR, *tc_sr, *tc_ta, *tc_te, *tc_ti, |
*tc_SR, *tc_sr, *tc_ta, *tc_te, *tc_ti, |
| *tc_uc, *tc_ue, *tc_UP, *tc_up, *tc_us, |
*tc_uc, *tc_ue, *tc_UP, *tc_up, *tc_us, |
| |
#ifndef HAVE_WCHAR |
| *tc_vb, *tc_ve, *tc_vi, *tc_vs; |
*tc_vb, *tc_ve, *tc_vi, *tc_vs; |
| |
#else |
| |
*tc_vb, *tc_ve, *tc_vi, *tc_vs, *tc_Xh, |
| |
*tc_Xl, *tc_Xo, *tc_Xr, *tc_Xt, *tc_Xv; |
| |
#endif /* HAVE_WCHAR */ |
| char CA; |
char CA; |
| int str_count; |
int str_count; |
| chtype acs_char[NUM_ACS]; |
chtype acs_char[NUM_ACS]; |
| |
#ifdef HAVE_WCHAR |
| |
cchar_t wacs_char[ NUM_ACS ]; |
| |
#endif /* HAVE_WCHAR */ |
| struct __color colours[MAX_COLORS]; |
struct __color colours[MAX_COLORS]; |
| struct __pair colour_pairs[MAX_PAIRS]; |
struct __pair colour_pairs[MAX_PAIRS]; |
| attr_t nca; |
attr_t nca; |
| Line 247 struct __screen { |
|
| Line 304 struct __screen { |
|
| int notty; |
int notty; |
| int half_delay; |
int half_delay; |
| int resized; |
int resized; |
| |
#ifdef HAVE_WCHAR |
| |
#define MB_LEN_MAX 8 |
| |
#define MAX_CBUF_SIZE MB_LEN_MAX |
| |
int cbuf_head; /* header to cbuf */ |
| |
int cbuf_tail; /* tail to cbuf */ |
| |
int cbuf_cur; /* the current char in cbuf */ |
| |
mbstate_t sp; /* wide char processing state */ |
| |
char cbuf[ MAX_CBUF_SIZE ]; /* input character buffer */ |
| |
#endif /* HAVE_WCHAR */ |
| }; |
}; |
| |
|
| |
|
| Line 265 void __cputchar_args(char, void *); |
|
| Line 331 void __cputchar_args(char, void *); |
|
| void _cursesi_free_keymap(keymap_t *); |
void _cursesi_free_keymap(keymap_t *); |
| int _cursesi_gettmode(SCREEN *); |
int _cursesi_gettmode(SCREEN *); |
| void _cursesi_reset_acs(SCREEN *); |
void _cursesi_reset_acs(SCREEN *); |
| |
#ifdef HAVE_WCHAR |
| |
void _cursesi_reset_wacs(SCREEN *); |
| |
#endif /* HAVE_WCHAR */ |
| void _cursesi_resetterm(SCREEN *); |
void _cursesi_resetterm(SCREEN *); |
| int _cursesi_setterm(char *, SCREEN *); |
int _cursesi_setterm(char *, SCREEN *); |
| int __delay(void); |
int __delay(void); |
| Line 273 u_int __hash_more(const void *, size_t, |
|
| Line 342 u_int __hash_more(const void *, size_t, |
|
| void __id_subwins(WINDOW *); |
void __id_subwins(WINDOW *); |
| void __init_getch(SCREEN *); |
void __init_getch(SCREEN *); |
| void __init_acs(SCREEN *); |
void __init_acs(SCREEN *); |
| |
#ifdef HAVE_WCHAR |
| |
void __init_get_wch(SCREEN *); |
| |
void __init_wacs(SCREEN *); |
| |
void __cputwchar_args( wchar_t, void * ); |
| |
int _cursesi_copy_nsp(nschar_t *src_nsp, struct __ldata *ch); |
| |
#endif /* HAVE_WCHAR */ |
| char *__longname(char *, char *); /* Original BSD version */ |
char *__longname(char *, char *); /* Original BSD version */ |
| int __mvcur(int, int, int, int, int); |
int __mvcur(int, int, int, int, int); |
| WINDOW *__newwin(SCREEN *, int, int, int, int, int); |
WINDOW *__newwin(SCREEN *, int, int, int, int, int); |
| Line 303 void __unsetattr(int); |
|
| Line 378 void __unsetattr(int); |
|
| void __unset_color(WINDOW *win); |
void __unset_color(WINDOW *win); |
| int __waddch(WINDOW *, __LDATA *); |
int __waddch(WINDOW *, __LDATA *); |
| int __wgetnstr(WINDOW *, char *, int); |
int __wgetnstr(WINDOW *, char *, int); |
| |
#ifdef HAVE_WCHAR |
| |
int __wgetn_wstr(WINDOW *, wchar_t *, int); |
| |
#endif /* HAVE_WCHAR */ |
| void __winch_signal_handler(int); |
void __winch_signal_handler(int); |
| |
|
| /* Private #defines. */ |
/* Private #defines. */ |