X-Git-Url: http://ncurses.scripts.mit.edu/?p=ncurses.git;a=blobdiff_plain;f=ncurses%2Fcurses.priv.h;h=0ef4879548d9cb690dc96a228cf22b3399d5f4b1;hp=31f41a885c150036b2de6824794b9f3848cb27e2;hb=c6540b9c89dda1a6a8bd681726831e8924176504;hpb=3f5a74a97cf8d86a8a8a78c7b268f49ccdc4101c diff --git a/ncurses/curses.priv.h b/ncurses/curses.priv.h index 31f41a88..0ef48795 100644 --- a/ncurses/curses.priv.h +++ b/ncurses/curses.priv.h @@ -1,5 +1,5 @@ /**************************************************************************** - * Copyright (c) 1998-2008,2009 Free Software Foundation, Inc. * + * Copyright (c) 1998-2009,2010 Free Software Foundation, Inc. * * * * Permission is hereby granted, free of charge, to any person obtaining a * * copy of this software and associated documentation files (the * @@ -35,7 +35,7 @@ /* - * $Id: curses.priv.h,v 1.435 2009/08/22 22:33:25 tom Exp $ + * $Id: curses.priv.h,v 1.450 2010/01/23 22:05:30 tom Exp $ * * curses.priv.h * @@ -61,6 +61,7 @@ extern "C" { #define MODULE_ID(id) /*nothing*/ #endif +#include /* for offsetof */ #include #include #include @@ -196,11 +197,10 @@ extern NCURSES_EXPORT(void *) _nc_memmove (void *, const void *, size_t); /* * Options for terminal drivers, etc... */ -#if 0 +#ifdef USE_TERM_DRIVER #define USE_SP_RIPOFF 1 #define USE_SP_TERMTYPE 1 #define USE_SP_WINDOWLIST 1 -#define USE_TERM_DRIVER 1 #endif /* @@ -481,6 +481,36 @@ extern NCURSES_EXPORT(int) _nc_sigprocmask(int, const sigset_t *, sigset_t *); #endif /* USE_PTHREADS */ +/* + * When using sp-funcs, locks are targeted to SCREEN-level granularity. + * So the locking is done in the non-sp-func (which calls the sp-func) rather + * than in the sp-func itself. + * + * Use the _nc_nonsp_XXX functions in the function using "NCURSES_SP_NAME()". + * Use the _nc_sp_XXX functions in the function using "#if NCURSES_SP_FUNCS". + */ +#if NCURSES_SP_FUNCS + +#define _nc_nonsp_lock_global(name) /* nothing */ +#define _nc_nonsp_try_global(name) 0 +#define _nc_nonsp_unlock_global(name) /* nothing */ + +#define _nc_sp_lock_global(name) _nc_lock_global(name) +#define _nc_sp_try_global(name) _nc_try_global(name) +#define _nc_sp_unlock_global(name) _nc_unlock_global(name) + +#else + +#define _nc_nonsp_lock_global(name) _nc_lock_global(name) +#define _nc_nonsp_try_global(name) _nc_try_global(name) +#define _nc_nonsp_unlock_global(name) _nc_unlock_global(name) + +#define _nc_sp_lock_global(name) /* nothing */ +#define _nc_sp_try_global(name) 0 +#define _nc_sp_unlock_global(name) /* nothing */ + +#endif + #if HAVE_GETTIMEOFDAY # define PRECISE_GETTIME 1 # define TimeType struct timeval @@ -657,8 +687,10 @@ typedef struct { */ #if MIXEDCASE_FILENAMES #define LEAF_FMT "%c" +#define LEAF_LEN 1 #else #define LEAF_FMT "%02x" +#define LEAF_LEN 2 #endif /* @@ -671,6 +703,13 @@ typedef struct { #define TRACEMSE_MAX (80 + (5 * 10) + (32 * 15)) #define TRACEMSE_FMT "id %2d at (%2d, %2d, %2d) state %4lx = {" /* } */ +#ifdef USE_TERM_DRIVER +struct DriverTCB; /* Terminal Control Block forward declaration */ +#define INIT_TERM_DRIVER() _nc_globals.term_driver = _nc_get_driver +#else +#define INIT_TERM_DRIVER() /* nothing */ +#endif + /* * Global data which is not specific to a screen. */ @@ -717,6 +756,10 @@ typedef struct { int safeprint_rows; #endif +#ifdef USE_TERM_DRIVER + int (*term_driver)(struct DriverTCB*, const char*, int*); +#endif + #ifdef TRACE bool init_trace; char trace_fname[PATH_MAX]; @@ -776,6 +819,7 @@ typedef struct { #if NCURSES_NO_PADDING bool _no_padding; /* flag to set if padding disabled */ #endif + NCURSES_SP_OUTC _outch; /* output handler if not putc */ #if BROKEN_LINKER || USE_REENTRANT chtype *real_acs_map; int _LINES; @@ -939,9 +983,6 @@ struct screen { bool _nc_sp_idlok; bool _nc_sp_idcok; -#define _nc_idlok SP_PARM->_nc_sp_idlok -#define _nc_idcok SP_PARM->_nc_sp_idcok - /* * These are the data that support the mouse interface. */ @@ -1058,9 +1099,9 @@ extern NCURSES_EXPORT_VAR(SCREEN *) _nc_screen_chain; extern NCURSES_EXPORT_VAR(SIG_ATOMIC_T) _nc_have_sigwinch; WINDOWLIST { - WINDOW win; /* first, so WINDOW_EXT() works */ WINDOWLIST *next; SCREEN *screen; /* screen containing the window */ + WINDOW win; /* WINDOW_EXT() needs to account for offset */ #ifdef _XOPEN_SOURCE_EXTENDED char addch_work[(MB_LEN_MAX * 9) + 1]; unsigned addch_used; /* number of bytes in addch_work[] */ @@ -1069,7 +1110,7 @@ extern NCURSES_EXPORT_VAR(SIG_ATOMIC_T) _nc_have_sigwinch; #endif }; -#define WINDOW_EXT(win,field) (((WINDOWLIST *)(win))->field) +#define WINDOW_EXT(w,m) (((WINDOWLIST *)((char *)(w) - offsetof(WINDOWLIST, win)))->m) #define SP_PRE_INIT(sp) \ sp->_cursrow = -1; \ @@ -1231,7 +1272,7 @@ extern NCURSES_EXPORT_VAR(SIG_ATOMIC_T) _nc_have_sigwinch; putc(PUTC_ch,b); \ break; \ } \ - fwrite(PUTC_buf, (unsigned) PUTC_n, 1, b); \ + IGNORE_RC(fwrite(PUTC_buf, (unsigned) PUTC_n, 1, b)); \ } \ COUNT_OUTCHARS(PUTC_i); \ } } } while (0) @@ -1400,11 +1441,14 @@ extern NCURSES_EXPORT(void) _nc_locked_tracef (const char *, ...) GCC_PRINTFLIKE #define T(a) TR(TRACE_CALLS, a) #define TRACE_RETURN(value,type) return _nc_retrace_##type(value) +#define NonNull(s) ((s) != 0 ? s : "") + #define returnAttr(code) TRACE_RETURN(code,attr_t) #define returnBits(code) TRACE_RETURN(code,unsigned) #define returnBool(code) TRACE_RETURN(code,bool) #define returnCPtr(code) TRACE_RETURN(code,cptr) #define returnCVoidPtr(code) TRACE_RETURN(code,cvoid_ptr) +#define returnChar(code) TRACE_RETURN(code,char) #define returnChtype(code) TRACE_RETURN(code,chtype) #define returnCode(code) TRACE_RETURN(code,int) #define returnPtr(code) TRACE_RETURN(code,ptr) @@ -1424,6 +1468,7 @@ extern NCURSES_EXPORT(char *) _nc_varargs (const char *, va_list); extern NCURSES_EXPORT(chtype) _nc_retrace_chtype (chtype); extern NCURSES_EXPORT(const char *) _nc_altcharset_name(attr_t, chtype); extern NCURSES_EXPORT(const char *) _nc_retrace_cptr (const char *); +extern NCURSES_EXPORT(char) _nc_retrace_char (char); extern NCURSES_EXPORT(int) _nc_retrace_int (int); extern NCURSES_EXPORT(unsigned) _nc_retrace_unsigned (unsigned); extern NCURSES_EXPORT(void *) _nc_retrace_void_ptr (void *); @@ -1464,6 +1509,7 @@ extern NCURSES_EXPORT(const char *) _nc_viscbuf (const NCURSES_CH_T *, int); #define returnBool(code) return code #define returnCPtr(code) return code #define returnCVoidPtr(code) return code +#define returnChar(code) return ((char) code) #define returnChtype(code) return code #define returnCode(code) return code #define returnPtr(code) return code @@ -1474,6 +1520,15 @@ extern NCURSES_EXPORT(const char *) _nc_viscbuf (const NCURSES_CH_T *, int); #endif /* TRACE/!TRACE */ +/* + * Workaround for defective implementation of gcc attribute warn_unused_result + */ +#if defined(__GNUC__) && defined(_FORTIFY_SOURCE) +#define IGNORE_RC(func) errno = func +#else +#define IGNORE_RC(func) (void) func +#endif /* gcc workarounds */ + /* * Return-codes for tgetent() and friends. */ @@ -1684,6 +1739,7 @@ extern NCURSES_EXPORT(char *) _nc_get_locale(void); extern NCURSES_EXPORT(int) _nc_unicode_locale(void); extern NCURSES_EXPORT(int) _nc_locale_breaks_acs(TERMINAL *); extern NCURSES_EXPORT(int) _nc_setupterm(NCURSES_CONST char *, int, int *, bool); +extern NCURSES_EXPORT(void) _nc_tinfo_cmdch(TERMINAL *, char); /* lib_set_term.c */ extern NCURSES_EXPORT(int) _nc_ripoffline(int, int(*)(WINDOW*, int)); @@ -1782,6 +1838,10 @@ extern NCURSES_EXPORT(int) _nc_waddch_nosync (WINDOW *, const NCURSES_CH_T); extern NCURSES_EXPORT(void) _nc_scroll_window (WINDOW *, int const, NCURSES_SIZE_T const, NCURSES_SIZE_T const, NCURSES_CH_T); #endif +#if USE_WIDEC_SUPPORT +extern NCURSES_EXPORT(int) _nc_insert_wch(WINDOW *, const cchar_t *); +#endif + #if USE_WIDEC_SUPPORT && !defined(USE_TERMLIB) extern NCURSES_EXPORT(size_t) _nc_wcrtomb (char *, wchar_t, mbstate_t *); #endif @@ -1803,6 +1863,26 @@ extern NCURSES_EXPORT(int) _nc_eventlist_timeout(_nc_eventlist *); #define wgetnstr_events(win, str, maxlen, evl) wgetnstr(win, str, maxlen) #endif +/* + * Wide-character macros to hide some platform-differences. + */ +#if USE_WIDEC_SUPPORT +#if HAVE_MBTOWC && HAVE_MBLEN +#define reset_mbytes(state) IGNORE_RC(mblen(NULL, 0)), IGNORE_RC(mbtowc(NULL, NULL, 0)) +#define count_mbytes(buffer,length,state) mblen(buffer,length) +#define check_mbytes(wch,buffer,length,state) \ + (int) mbtowc(&wch, buffer, length) +#define state_unused +#elif HAVE_MBRTOWC && HAVE_MBRLEN +#define reset_mbytes(state) init_mb(state) +#define count_mbytes(buffer,length,state) mbrlen(buffer,length,&state) +#define check_mbytes(wch,buffer,length,state) \ + (int) mbrtowc(&wch, buffer, length, &state) +#else +make an error +#endif +#endif + /* * Not everyone has vsscanf(), but we'd like to use it for scanw(). */ @@ -1838,7 +1918,7 @@ extern NCURSES_EXPORT_VAR(SCREEN *) SP; #define _nc_set_screen(sp) SP = sp #endif -#if NCURSES_SP_FUNCS && 0 +#if NCURSES_SP_FUNCS #define CURRENT_SCREEN_PRE (IsPreScreen(CURRENT_SCREEN) ? CURRENT_SCREEN : new_prescr()) #else #define CURRENT_SCREEN_PRE CURRENT_SCREEN @@ -1898,7 +1978,6 @@ extern NCURSES_EXPORT(int) _nc_get_tty_mode(TTY *); sp->jump = outc #ifdef USE_TERM_DRIVER -struct DriverTCB; /* Terminal Control Block forward declaration */ typedef void* TERM_HANDLE; typedef struct _termInfo @@ -2057,7 +2136,6 @@ extern NCURSES_EXPORT(WINDOW *) _nc_stdscr_of(SCREEN*); extern NCURSES_EXPORT(int) _nc_outc_wrapper(SCREEN*,int); #if USE_REENTRANT -extern NCURSES_EXPORT(char *) NCURSES_SP_NAME(_nc_ttytype)(SCREEN*); extern NCURSES_EXPORT(int) NCURSES_SP_NAME(_nc_TABSIZE)(SCREEN*); extern NCURSES_EXPORT(char *) NCURSES_SP_NAME(longname)(SCREEN*); #endif