+#ifndef O_BINARY
+#define O_BINARY 0
+#endif
+
+#ifdef TRACE
+#define TRACE_OUTCHARS(n) _nc_outchars += (n);
+#else
+#define TRACE_OUTCHARS(n) /* nothing */
+#endif
+
+#define UChar(c) ((unsigned char)(c))
+#define ChCharOf(c) ((c) & (chtype)A_CHARTEXT)
+#define ChAttrOf(c) ((c) & (chtype)A_ATTRIBUTES)
+
+#ifndef MB_LEN_MAX
+#define MB_LEN_MAX 8 /* should be >= MB_CUR_MAX, but that may be a function */
+#endif
+
+#if USE_WIDEC_SUPPORT /* { */
+#define NulChar 0,0,0,0 /* FIXME: see CCHARW_MAX */
+#define CharOf(c) ((c).chars[0])
+#define AttrOf(c) ((c).attr)
+#define AddAttr(c,a) (c).attr |= a
+#define RemAttr(c,a) (c).attr &= ~(a)
+#define SetAttr(c,a) (c).attr = a
+#define NewChar(ch) { ChAttrOf(ch), { ChCharOf(ch), NulChar } }
+#define NewChar2(c,a) { a, { c, NulChar } }
+#define CharEq(a,b) (!memcmp(&a, &b, sizeof(a)))
+#define SetChar(ch,c,a) do { \
+ NCURSES_CH_T *_cp = &ch; \
+ memset(_cp,0,sizeof(ch)); _cp->chars[0] = c; _cp->attr = a; \
+ } while (0)
+#define CHREF(wch) (&wch)
+#define CHDEREF(wch) (*wch)
+#define ARG_CH_T NCURSES_CH_T *
+#define CARG_CH_T const NCURSES_CH_T *
+#define PUTC_DATA char PUTC_buf[MB_LEN_MAX]; int PUTC_i, PUTC_n; \
+ mbstate_t PUT_st; wchar_t PUTC_ch
+#define PUTC_INIT memset (&PUT_st, '\0', sizeof (PUT_st)); \
+ PUTC_i = 0
+#define PUTC(ch,b) do { if(!isnac(ch)) { \
+ if (Charable(ch)) { \
+ fputc(CharOf(ch), b); \
+ TRACE_OUTCHARS(1); \
+ } else { \
+ PUTC_INIT; \
+ do { \
+ PUTC_ch = PUTC_i < CCHARW_MAX ? \
+ (ch).chars[PUTC_i] : L'\0'; \
+ PUTC_n = wcrtomb(PUTC_buf, \
+ (ch).chars[PUTC_i], &PUT_st); \
+ if (PUTC_ch == L'\0') \
+ --PUTC_n; \
+ if (PUTC_n <= 0) \
+ break; \
+ fwrite(PUTC_buf, (unsigned) PUTC_n, 1, b); \
+ ++PUTC_i; \
+ } while (PUTC_ch != L'\0'); \
+ TRACE_OUTCHARS(PUTC_i); \
+ } } } while (0)
+
+#define BLANK { WA_NORMAL, ' ' }
+#define ISBLANK(ch) ((ch).chars[0] == L' ' && (ch).chars[1] == L'\0')
+
+#define WA_NAC 1
+#define isnac(ch) (AttrOf(ch) & WA_NAC)
+#define if_WIDEC(code) code
+#define Charable(ch) ((SP != 0 && SP->_posix_locale) \
+ || (!isnac(ch) && \
+ (ch).chars[1] == L'\0' && \
+ _nc_is_charable(CharOf(ch))))
+
+#define L(ch) L ## ch
+#else /* }{ */
+#define CharOf(c) ChCharOf(c)
+#define AttrOf(c) ChAttrOf(c)
+#define AddAttr(c,a) c |= a
+#define RemAttr(c,a) c &= ~(a & A_ATTRIBUTES)
+#define SetAttr(c,a) c = (c & ~A_ATTRIBUTES) | a
+#define NewChar(ch) (ch)
+#define NewChar2(c,a) (c | a)
+#define CharEq(a,b) (a == b)
+#define SetChar(ch,c,a) ch = c | a
+#define CHREF(wch) wch
+#define CHDEREF(wch) wch
+#define ARG_CH_T NCURSES_CH_T
+#define CARG_CH_T NCURSES_CH_T
+#define PUTC_DATA int data = 0
+#define PUTC(a,b) do { data = CharOf(ch); putc(data,b); } while (0)
+
+#define BLANK (' '|A_NORMAL)
+#define ISBLANK(ch) (CharOf(ch) == ' ')
+
+#define isnac(ch) (0)
+#define if_WIDEC(code) /* nothing */
+
+#define L(ch) ch
+#endif /* } */
+
+#define AttrOfD(ch) AttrOf(CHDEREF(ch))
+#define CharOfD(ch) CharOf(CHDEREF(ch))
+#define SetChar2(wch,ch) SetChar(wch,ChCharOf(ch),ChAttrOf(ch))
+
+#define BLANK_ATTR A_NORMAL
+#define BLANK_TEXT L(' ')