From 554180127de2d21f789f2c78e6d6cf3a1e4c4c14 Mon Sep 17 00:00:00 2001 From: Heng Li Date: Sat, 1 Aug 2009 23:32:07 +0000 Subject: [PATCH] * samtools-0.1.5-22 (r432) * faidx: fixed compitability issue with _WIN32 * razf: fixed potential compitability issue with _WIN32 * PDCurses support in Windows --- Makefile.mingw | 4 +- bamtk.c | 2 +- faidx.c | 23 +- razf.c | 26 +- win32/libcurses.a | Bin 0 -> 114764 bytes win32/xcurses.h | 1377 +++++++++++++++++++++++++++++++++++++++++++++ 6 files changed, 1420 insertions(+), 12 deletions(-) create mode 100644 win32/libcurses.a create mode 100644 win32/xcurses.h diff --git a/Makefile.mingw b/Makefile.mingw index fd00358..80e8009 100644 --- a/Makefile.mingw +++ b/Makefile.mingw @@ -1,7 +1,7 @@ CC= gcc.exe AR= ar.exe CFLAGS= -g -Wall -O2 -DFLAGS= -D_FILE_OFFSET_BITS=64 -D_CURSES_LIB=0 -D_USE_KNETFILE +DFLAGS= -D_FILE_OFFSET_BITS=64 -D_CURSES_LIB=2 -D_USE_KNETFILE LOBJS= bgzf.o kstring.o bam_aux.o bam.o bam_import.o sam.o bam_index.o \ bam_pileup.o bam_lpileup.o bam_md.o glf.o razf.o faidx.o bam_sort.o \ knetfile.o @@ -26,7 +26,7 @@ libbam.a:$(LOBJS) $(AR) -cru $@ $(LOBJS) samtools:lib $(AOBJS) - $(CC) $(CFLAGS) -o $@ $(AOBJS) $(LIBPATH) -lm -L. -lbam -Lwin32 -lz -lws2_32 + $(CC) $(CFLAGS) -o $@ $(AOBJS) $(LIBPATH) -lm -L. -lbam -Lwin32 -lz -lcurses -lws2_32 razip:razip.o razf.o $(CC) $(CFLAGS) -o $@ razf.o razip.o -lz diff --git a/bamtk.c b/bamtk.c index fb65838..6187e32 100644 --- a/bamtk.c +++ b/bamtk.c @@ -9,7 +9,7 @@ #endif #ifndef PACKAGE_VERSION -#define PACKAGE_VERSION "0.1.5-21 (r428)" +#define PACKAGE_VERSION "0.1.5-22 (r432)" #endif int bam_taf2baf(int argc, char *argv[]); diff --git a/faidx.c b/faidx.c index 36366c2..055445f 100644 --- a/faidx.c +++ b/faidx.c @@ -14,8 +14,13 @@ KHASH_MAP_INIT_STR(s, faidx1_t) #ifndef _NO_RAZF #include "razf.h" #else +#ifdef _WIN32 +#define ftello(fp) ftell(fp) +#define fseeko(fp, offset, whence) fseek(fp, offset, whence) +#else extern off_t ftello(FILE *stream); extern int fseeko(FILE *stream, off_t offset, int whence); +#endif #define RAZF FILE #define razf_read(fp, buf, size) fread(buf, 1, size, fp) #define razf_open(fn, mode) fopen(fn, mode) @@ -134,7 +139,11 @@ void fai_save(const faidx_t *fai, FILE *fp) faidx1_t x; k = kh_get(s, fai->hash, fai->name[i]); x = kh_value(fai->hash, k); +#ifdef _WIN32 + fprintf(fp, "%s\t%d\t%ld\t%d\t%d\n", fai->name[i], (int)x.len, (long)x.offset, (int)x.line_blen, (int)x.line_len); +#else fprintf(fp, "%s\t%d\t%lld\t%d\t%d\n", fai->name[i], (int)x.len, (long long)x.offset, (int)x.line_blen, (int)x.line_len); +#endif } } @@ -143,14 +152,22 @@ faidx_t *fai_read(FILE *fp) faidx_t *fai; char *buf, *p; int len, line_len, line_blen; +#ifdef _WIN32 + long offset; +#else long long offset; +#endif fai = (faidx_t*)calloc(1, sizeof(faidx_t)); fai->hash = kh_init(s); buf = (char*)calloc(0x10000, 1); while (!feof(fp) && fgets(buf, 0x10000, fp)) { for (p = buf; *p && isgraph(*p); ++p); *p = 0; ++p; +#ifdef _WIN32 + sscanf(p, "%d%ld%d%d", &len, &offset, &line_blen, &line_len); +#else sscanf(p, "%d%lld%d%d", &len, &offset, &line_blen, &line_len); +#endif fai_insert_index(fai, buf, len, line_len, line_blen, offset); } free(buf); @@ -183,7 +200,7 @@ int fai_build(const char *fn) } fai = fai_build_core(rz); razf_close(rz); - fp = fopen(str, "w"); + fp = fopen(str, "wb"); if (fp == 0) { fprintf(stderr, "[fai_build] fail to write FASTA index.\n"); fai_destroy(fai); free(str); @@ -203,7 +220,7 @@ faidx_t *fai_load(const char *fn) faidx_t *fai; str = (char*)calloc(strlen(fn) + 5, 1); sprintf(str, "%s.fai", fn); - fp = fopen(str, "r"); + fp = fopen(str, "rb"); if (fp == 0) { fprintf(stderr, "[fai_load] build FASTA index.\n"); fai_build(fn); @@ -216,7 +233,7 @@ faidx_t *fai_load(const char *fn) } fai = fai_read(fp); fclose(fp); - fai->rz = razf_open(fn, "r"); + fai->rz = razf_open(fn, "rb"); free(str); if (fai->rz == 0) { fprintf(stderr, "[fai_load] fail to open FASTA file.\n"); diff --git a/razf.c b/razf.c index b56065b..a5e8f51 100644 --- a/razf.c +++ b/razf.c @@ -136,6 +136,9 @@ static RAZF* razf_open_w(int fd) #else static RAZF* razf_open_w(int fd){ RAZF *rz; +#ifdef _WIN32 + setmode(fd, O_BINARY); +#endif rz = calloc(1, sizeof(RAZF)); rz->mode = 'w'; rz->filedes = fd; @@ -311,6 +314,9 @@ static RAZF* razf_open_r(int fd, int _load_index){ int n, is_be, ret; int64_t end; unsigned char c[] = "RAZF"; +#ifdef _WIN32 + setmode(fd, O_BINARY); +#endif rz = calloc(1, sizeof(RAZF)); rz->mode = 'r'; rz->filedes = fd; @@ -382,26 +388,34 @@ static RAZF* razf_open_r(int fd, int _load_index){ } RAZF* razf_dopen(int fd, const char *mode){ - if(strcasecmp(mode, "r") == 0) return razf_open_r(fd, 1); - else if(strcasecmp(mode, "w") == 0) return razf_open_w(fd); + if(strstr(mode, "r")) return razf_open_r(fd, 1); + else if(strstr(mode, "w")) return razf_open_w(fd); else return NULL; } RAZF* razf_dopen2(int fd, const char *mode) { - if(strcasecmp(mode, "r") == 0) return razf_open_r(fd, 0); - else if(strcasecmp(mode, "w") == 0) return razf_open_w(fd); + if(strstr(mode, "r")) return razf_open_r(fd, 0); + else if(strstr(mode, "w")) return razf_open_w(fd); else return NULL; } static inline RAZF* _razf_open(const char *filename, const char *mode, int _load_index){ int fd; RAZF *rz; - if(strcasecmp(mode, "r") == 0){ + if(strstr(mode, "r")){ +#ifdef _WIN32 + fd = open(filename, O_RDONLY | O_BINARY); +#else fd = open(filename, O_RDONLY); +#endif rz = razf_open_r(fd, _load_index); - } else if(strcasecmp(mode, "w") == 0){ + } else if(strstr(mode, "w")){ +#ifdef _WIN32 + fd = open(filename, O_WRONLY | O_CREAT | O_TRUNC | O_BINARY, 0644); +#else fd = open(filename, O_WRONLY | O_CREAT | O_TRUNC, 0644); +#endif rz = razf_open_w(fd); } else return NULL; return rz; diff --git a/win32/libcurses.a b/win32/libcurses.a new file mode 100644 index 0000000000000000000000000000000000000000..a3863b8f7cd261f199deacb4fd23b0145d93aeed GIT binary patch literal 114764 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 F{{gDEy~+Rp literal 0 HcmV?d00001 diff --git a/win32/xcurses.h b/win32/xcurses.h new file mode 100644 index 0000000..6f3ce19 --- /dev/null +++ b/win32/xcurses.h @@ -0,0 +1,1377 @@ +/* Public Domain Curses */ + +/* $Id: curses.h,v 1.295 2008/07/15 17:13:25 wmcbrine Exp $ */ + +/*----------------------------------------------------------------------* + * PDCurses * + *----------------------------------------------------------------------*/ + +#ifndef __PDCURSES__ +#define __PDCURSES__ 1 + +/*man-start************************************************************** + +PDCurses definitions list: (Only define those needed) + + XCURSES True if compiling for X11. + PDC_RGB True if you want to use RGB color definitions + (Red = 1, Green = 2, Blue = 4) instead of BGR. + PDC_WIDE True if building wide-character support. + PDC_DLL_BUILD True if building a Win32 DLL. + NCURSES_MOUSE_VERSION Use the ncurses mouse API instead + of PDCurses' traditional mouse API. + +PDCurses portable platform definitions list: + + PDC_BUILD Defines API build version. + PDCURSES Enables access to PDCurses-only routines. + XOPEN Always true. + SYSVcurses True if you are compiling for SYSV portability. + BSDcurses True if you are compiling for BSD portability. + +**man-end****************************************************************/ + +#define PDC_BUILD 3401 +#define PDCURSES 1 /* PDCurses-only routines */ +#define XOPEN 1 /* X/Open Curses routines */ +#define SYSVcurses 1 /* System V Curses routines */ +#define BSDcurses 1 /* BSD Curses routines */ +#define CHTYPE_LONG 1 /* size of chtype; long */ + +/*----------------------------------------------------------------------*/ + +#include +#include +#include /* Required by X/Open usage below */ + +#ifdef PDC_WIDE +# include +#endif + +#if defined(__cplusplus) || defined(__cplusplus__) || defined(__CPLUSPLUS) +extern "C" +{ +# define bool _bool +#endif + +/*---------------------------------------------------------------------- + * + * PDCurses Manifest Constants + * + */ + +#ifndef FALSE +# define FALSE 0 +#endif +#ifndef TRUE +# define TRUE 1 +#endif +#ifndef NULL +# define NULL (void *)0 +#endif +#ifndef ERR +# define ERR (-1) +#endif +#ifndef OK +# define OK 0 +#endif + +/*---------------------------------------------------------------------- + * + * PDCurses Type Declarations + * + */ + +typedef unsigned char bool; /* PDCurses Boolean type */ + +#ifdef CHTYPE_LONG +# if _LP64 +typedef unsigned int chtype; +# else +typedef unsigned long chtype; /* 16-bit attr + 16-bit char */ +# endif +#else +typedef unsigned short chtype; /* 8-bit attr + 8-bit char */ +#endif + +#ifdef PDC_WIDE +typedef chtype cchar_t; +#endif + +typedef chtype attr_t; + +/*---------------------------------------------------------------------- + * + * PDCurses Mouse Interface -- SYSVR4, with extensions + * + */ + +typedef struct +{ + int x; /* absolute column, 0 based, measured in characters */ + int y; /* absolute row, 0 based, measured in characters */ + short button[3]; /* state of each button */ + int changes; /* flags indicating what has changed with the mouse */ +} MOUSE_STATUS; + +#define BUTTON_RELEASED 0x0000 +#define BUTTON_PRESSED 0x0001 +#define BUTTON_CLICKED 0x0002 +#define BUTTON_DOUBLE_CLICKED 0x0003 +#define BUTTON_TRIPLE_CLICKED 0x0004 +#define BUTTON_MOVED 0x0005 /* PDCurses */ +#define WHEEL_SCROLLED 0x0006 /* PDCurses */ +#define BUTTON_ACTION_MASK 0x0007 /* PDCurses */ + +#define PDC_BUTTON_SHIFT 0x0008 /* PDCurses */ +#define PDC_BUTTON_CONTROL 0x0010 /* PDCurses */ +#define PDC_BUTTON_ALT 0x0020 /* PDCurses */ +#define BUTTON_MODIFIER_MASK 0x0038 /* PDCurses */ + +#define MOUSE_X_POS (Mouse_status.x) +#define MOUSE_Y_POS (Mouse_status.y) + +/* + * Bits associated with the .changes field: + * 3 2 1 0 + * 210987654321098765432109876543210 + * 1 <- button 1 has changed + * 10 <- button 2 has changed + * 100 <- button 3 has changed + * 1000 <- mouse has moved + * 10000 <- mouse position report + * 100000 <- mouse wheel up + * 1000000 <- mouse wheel down + */ + +#define PDC_MOUSE_MOVED 0x0008 +#define PDC_MOUSE_POSITION 0x0010 +#define PDC_MOUSE_WHEEL_UP 0x0020 +#define PDC_MOUSE_WHEEL_DOWN 0x0040 + +#define A_BUTTON_CHANGED (Mouse_status.changes & 7) +#define MOUSE_MOVED (Mouse_status.changes & PDC_MOUSE_MOVED) +#define MOUSE_POS_REPORT (Mouse_status.changes & PDC_MOUSE_POSITION) +#define BUTTON_CHANGED(x) (Mouse_status.changes & (1 << ((x) - 1))) +#define BUTTON_STATUS(x) (Mouse_status.button[(x) - 1]) +#define MOUSE_WHEEL_UP (Mouse_status.changes & PDC_MOUSE_WHEEL_UP) +#define MOUSE_WHEEL_DOWN (Mouse_status.changes & PDC_MOUSE_WHEEL_DOWN) + +/* mouse bit-masks */ + +#define BUTTON1_RELEASED 0x00000001L +#define BUTTON1_PRESSED 0x00000002L +#define BUTTON1_CLICKED 0x00000004L +#define BUTTON1_DOUBLE_CLICKED 0x00000008L +#define BUTTON1_TRIPLE_CLICKED 0x00000010L +#define BUTTON1_MOVED 0x00000010L /* PDCurses */ + +#define BUTTON2_RELEASED 0x00000020L +#define BUTTON2_PRESSED 0x00000040L +#define BUTTON2_CLICKED 0x00000080L +#define BUTTON2_DOUBLE_CLICKED 0x00000100L +#define BUTTON2_TRIPLE_CLICKED 0x00000200L +#define BUTTON2_MOVED 0x00000200L /* PDCurses */ + +#define BUTTON3_RELEASED 0x00000400L +#define BUTTON3_PRESSED 0x00000800L +#define BUTTON3_CLICKED 0x00001000L +#define BUTTON3_DOUBLE_CLICKED 0x00002000L +#define BUTTON3_TRIPLE_CLICKED 0x00004000L +#define BUTTON3_MOVED 0x00004000L /* PDCurses */ + +/* For the ncurses-compatible functions only, BUTTON4_PRESSED and + BUTTON5_PRESSED are returned for mouse scroll wheel up and down; + otherwise PDCurses doesn't support buttons 4 and 5 */ + +#define BUTTON4_RELEASED 0x00008000L +#define BUTTON4_PRESSED 0x00010000L +#define BUTTON4_CLICKED 0x00020000L +#define BUTTON4_DOUBLE_CLICKED 0x00040000L +#define BUTTON4_TRIPLE_CLICKED 0x00080000L + +#define BUTTON5_RELEASED 0x00100000L +#define BUTTON5_PRESSED 0x00200000L +#define BUTTON5_CLICKED 0x00400000L +#define BUTTON5_DOUBLE_CLICKED 0x00800000L +#define BUTTON5_TRIPLE_CLICKED 0x01000000L + +#define MOUSE_WHEEL_SCROLL 0x02000000L /* PDCurses */ +#define BUTTON_MODIFIER_SHIFT 0x04000000L /* PDCurses */ +#define BUTTON_MODIFIER_CONTROL 0x08000000L /* PDCurses */ +#define BUTTON_MODIFIER_ALT 0x10000000L /* PDCurses */ + +#define ALL_MOUSE_EVENTS 0x1fffffffL +#define REPORT_MOUSE_POSITION 0x20000000L + +/* ncurses mouse interface */ + +typedef unsigned long mmask_t; + +typedef struct +{ + short id; /* unused, always 0 */ + int x, y, z; /* x, y same as MOUSE_STATUS; z unused */ + mmask_t bstate; /* equivalent to changes + button[], but + in the same format as used for mousemask() */ +} MEVENT; + +#ifdef NCURSES_MOUSE_VERSION +# define BUTTON_SHIFT BUTTON_MODIFIER_SHIFT +# define BUTTON_CONTROL BUTTON_MODIFIER_CONTROL +# define BUTTON_CTRL BUTTON_MODIFIER_CONTROL +# define BUTTON_ALT BUTTON_MODIFIER_ALT +#else +# define BUTTON_SHIFT PDC_BUTTON_SHIFT +# define BUTTON_CONTROL PDC_BUTTON_CONTROL +# define BUTTON_ALT PDC_BUTTON_ALT +#endif + +/*---------------------------------------------------------------------- + * + * PDCurses Structure Definitions + * + */ + +typedef struct _win /* definition of a window */ +{ + int _cury; /* current pseudo-cursor */ + int _curx; + int _maxy; /* max window coordinates */ + int _maxx; + int _begy; /* origin on screen */ + int _begx; + int _flags; /* window properties */ + chtype _attrs; /* standard attributes and colors */ + chtype _bkgd; /* background, normally blank */ + bool _clear; /* causes clear at next refresh */ + bool _leaveit; /* leaves cursor where it is */ + bool _scroll; /* allows window scrolling */ + bool _nodelay; /* input character wait flag */ + bool _immed; /* immediate update flag */ + bool _sync; /* synchronise window ancestors */ + bool _use_keypad; /* flags keypad key mode active */ + chtype **_y; /* pointer to line pointer array */ + int *_firstch; /* first changed character in line */ + int *_lastch; /* last changed character in line */ + int _tmarg; /* top of scrolling region */ + int _bmarg; /* bottom of scrolling region */ + int _delayms; /* milliseconds of delay for getch() */ + int _parx, _pary; /* coords relative to parent (0,0) */ + struct _win *_parent; /* subwin's pointer to parent win */ +} WINDOW; + +/* Avoid using the SCREEN struct directly -- use the corresponding + functions if possible. This struct may eventually be made private. */ + +typedef struct +{ + bool alive; /* if initscr() called, and not endwin() */ + bool autocr; /* if cr -> lf */ + bool cbreak; /* if terminal unbuffered */ + bool echo; /* if terminal echo */ + bool raw_inp; /* raw input mode (v. cooked input) */ + bool raw_out; /* raw output mode (7 v. 8 bits) */ + bool audible; /* FALSE if the bell is visual */ + bool mono; /* TRUE if current screen is mono */ + bool resized; /* TRUE if TERM has been resized */ + bool orig_attr; /* TRUE if we have the original colors */ + short orig_fore; /* original screen foreground color */ + short orig_back; /* original screen foreground color */ + int cursrow; /* position of physical cursor */ + int curscol; /* position of physical cursor */ + int visibility; /* visibility of cursor */ + int orig_cursor; /* original cursor size */ + int lines; /* new value for LINES */ + int cols; /* new value for COLS */ + unsigned long _trap_mbe; /* trap these mouse button events */ + unsigned long _map_mbe_to_key; /* map mouse buttons to slk */ + int mouse_wait; /* time to wait (in ms) for a + button release after a press, in + order to count it as a click */ + int slklines; /* lines in use by slk_init() */ + WINDOW *slk_winptr; /* window for slk */ + int linesrippedoff; /* lines ripped off via ripoffline() */ + int linesrippedoffontop; /* lines ripped off on + top via ripoffline() */ + int delaytenths; /* 1/10ths second to wait block + getch() for */ + bool _preserve; /* TRUE if screen background + to be preserved */ + int _restore; /* specifies if screen background + to be restored, and how */ + bool save_key_modifiers; /* TRUE if each key modifiers saved + with each key press */ + bool return_key_modifiers; /* TRUE if modifier keys are + returned as "real" keys */ + bool key_code; /* TRUE if last key is a special key; + used internally by get_wch() */ +#ifdef XCURSES + int XcurscrSize; /* size of Xcurscr shared memory block */ + bool sb_on; + int sb_viewport_y; + int sb_viewport_x; + int sb_total_y; + int sb_total_x; + int sb_cur_y; + int sb_cur_x; +#endif + short line_color; /* color of line attributes - default -1 */ +} SCREEN; + +/*---------------------------------------------------------------------- + * + * PDCurses External Variables + * + */ + +#ifdef PDC_DLL_BUILD +# ifdef CURSES_LIBRARY +# define PDCEX __declspec(dllexport) extern +# else +# define PDCEX __declspec(dllimport) +# endif +#else +# define PDCEX extern +#endif + +PDCEX int LINES; /* terminal height */ +PDCEX int COLS; /* terminal width */ +PDCEX WINDOW *stdscr; /* the default screen window */ +PDCEX WINDOW *curscr; /* the current screen image */ +PDCEX SCREEN *SP; /* curses variables */ +PDCEX MOUSE_STATUS Mouse_status; +PDCEX int COLORS; +PDCEX int COLOR_PAIRS; +PDCEX int TABSIZE; +PDCEX chtype acs_map[]; /* alternate character set map */ +PDCEX char ttytype[]; /* terminal name/description */ + +/*man-start************************************************************** + +PDCurses Text Attributes +======================== + +Originally, PDCurses used a short (16 bits) for its chtype. To include +color, a number of things had to be sacrificed from the strict Unix and +System V support. The main problem was fitting all character attributes +and color into an unsigned char (all 8 bits!). + +Today, PDCurses by default uses a long (32 bits) for its chtype, as in +System V. The short chtype is still available, by undefining CHTYPE_LONG +and rebuilding the library. + +The following is the structure of a win->_attrs chtype: + +short form: + +------------------------------------------------- +|15|14|13|12|11|10| 9| 8| 7| 6| 5| 4| 3| 2| 1| 0| +------------------------------------------------- + color number | attrs | character eg 'a' + +The available non-color attributes are bold, reverse and blink. Others +have no effect. The high order char is an index into an array of +physical colors (defined in color.c) -- 32 foreground/background color +pairs (5 bits) plus 3 bits for other attributes. + +long form: + +---------------------------------------------------------------------------- +|31|30|29|28|27|26|25|24|23|22|21|20|19|18|17|16|15|14|13|12|..| 3| 2| 1| 0| +---------------------------------------------------------------------------- + color number | modifiers | character eg 'a' + +The available non-color attributes are bold, underline, invisible, +right-line, left-line, protect, reverse and blink. 256 color pairs (8 +bits), 8 bits for other attributes, and 16 bits for character data. + +**man-end****************************************************************/ + +/*** Video attribute macros ***/ + +#define A_NORMAL (chtype)0 + +#ifdef CHTYPE_LONG +# define A_ALTCHARSET (chtype)0x00010000 +# define A_RIGHTLINE (chtype)0x00020000 +# define A_LEFTLINE (chtype)0x00040000 +# define A_INVIS (chtype)0x00080000 +# define A_UNDERLINE (chtype)0x00100000 +# define A_REVERSE (chtype)0x00200000 +# define A_BLINK (chtype)0x00400000 +# define A_BOLD (chtype)0x00800000 + +# define A_ATTRIBUTES (chtype)0xffff0000 +# define A_CHARTEXT (chtype)0x0000ffff +# define A_COLOR (chtype)0xff000000 + +# define A_ITALIC A_INVIS +# define A_PROTECT (A_UNDERLINE | A_LEFTLINE | A_RIGHTLINE) + +# define PDC_ATTR_SHIFT 19 +# define PDC_COLOR_SHIFT 24 +#else +# define A_BOLD (chtype)0x0100 /* X/Open */ +# define A_REVERSE (chtype)0x0200 /* X/Open */ +# define A_BLINK (chtype)0x0400 /* X/Open */ + +# define A_ATTRIBUTES (chtype)0xff00 /* X/Open */ +# define A_CHARTEXT (chtype)0x00ff /* X/Open */ +# define A_COLOR (chtype)0xf800 /* System V */ + +# define A_ALTCHARSET A_NORMAL /* X/Open */ +# define A_PROTECT A_NORMAL /* X/Open */ +# define A_UNDERLINE A_NORMAL /* X/Open */ + +# define A_LEFTLINE A_NORMAL +# define A_RIGHTLINE A_NORMAL +# define A_ITALIC A_NORMAL +# define A_INVIS A_NORMAL + +# define PDC_ATTR_SHIFT 8 +# define PDC_COLOR_SHIFT 11 +#endif + +#define A_STANDOUT (A_REVERSE | A_BOLD) /* X/Open */ +#define A_DIM A_NORMAL + +#define CHR_MSK A_CHARTEXT /* Obsolete */ +#define ATR_MSK A_ATTRIBUTES /* Obsolete */ +#define ATR_NRM A_NORMAL /* Obsolete */ + +/* For use with attr_t -- X/Open says, "these shall be distinct", so + this is a non-conforming implementation. */ + +#define WA_ALTCHARSET A_ALTCHARSET +#define WA_BLINK A_BLINK +#define WA_BOLD A_BOLD +#define WA_DIM A_DIM +#define WA_INVIS A_INVIS +#define WA_LEFT A_LEFTLINE +#define WA_PROTECT A_PROTECT +#define WA_REVERSE A_REVERSE +#define WA_RIGHT A_RIGHTLINE +#define WA_STANDOUT A_STANDOUT +#define WA_UNDERLINE A_UNDERLINE + +#define WA_HORIZONTAL A_NORMAL +#define WA_LOW A_NORMAL +#define WA_TOP A_NORMAL +#define WA_VERTICAL A_NORMAL + +/*** Alternate character set macros ***/ + +/* 'w' = 32-bit chtype; acs_map[] index | A_ALTCHARSET + 'n' = 16-bit chtype; it gets the fallback set because no bit is + available for A_ALTCHARSET */ + +#ifdef CHTYPE_LONG +# define ACS_PICK(w, n) ((chtype)w | A_ALTCHARSET) +#else +# define ACS_PICK(w, n) ((chtype)n) +#endif + +/* VT100-compatible symbols -- box chars */ + +#define ACS_ULCORNER ACS_PICK('l', '+') +#define ACS_LLCORNER ACS_PICK('m', '+') +#define ACS_URCORNER ACS_PICK('k', '+') +#define ACS_LRCORNER ACS_PICK('j', '+') +#define ACS_RTEE ACS_PICK('u', '+') +#define ACS_LTEE ACS_PICK('t', '+') +#define ACS_BTEE ACS_PICK('v', '+') +#define ACS_TTEE ACS_PICK('w', '+') +#define ACS_HLINE ACS_PICK('q', '-') +#define ACS_VLINE ACS_PICK('x', '|') +#define ACS_PLUS ACS_PICK('n', '+') + +/* VT100-compatible symbols -- other */ + +#define ACS_S1 ACS_PICK('o', '-') +#define ACS_S9 ACS_PICK('s', '_') +#define ACS_DIAMOND ACS_PICK('`', '+') +#define ACS_CKBOARD ACS_PICK('a', ':') +#define ACS_DEGREE ACS_PICK('f', '\'') +#define ACS_PLMINUS ACS_PICK('g', '#') +#define ACS_BULLET ACS_PICK('~', 'o') + +/* Teletype 5410v1 symbols -- these are defined in SysV curses, but + are not well-supported by most terminals. Stick to VT100 characters + for optimum portability. */ + +#define ACS_LARROW ACS_PICK(',', '<') +#define ACS_RARROW ACS_PICK('+', '>') +#define ACS_DARROW ACS_PICK('.', 'v') +#define ACS_UARROW ACS_PICK('-', '^') +#define ACS_BOARD ACS_PICK('h', '#') +#define ACS_LANTERN ACS_PICK('i', '*') +#define ACS_BLOCK ACS_PICK('0', '#') + +/* That goes double for these -- undocumented SysV symbols. Don't use + them. */ + +#define ACS_S3 ACS_PICK('p', '-') +#define ACS_S7 ACS_PICK('r', '-') +#define ACS_LEQUAL ACS_PICK('y', '<') +#define ACS_GEQUAL ACS_PICK('z', '>') +#define ACS_PI ACS_PICK('{', 'n') +#define ACS_NEQUAL ACS_PICK('|', '+') +#define ACS_STERLING ACS_PICK('}', 'L') + +/* Box char aliases */ + +#define ACS_BSSB ACS_ULCORNER +#define ACS_SSBB ACS_LLCORNER +#define ACS_BBSS ACS_URCORNER +#define ACS_SBBS ACS_LRCORNER +#define ACS_SBSS ACS_RTEE +#define ACS_SSSB ACS_LTEE +#define ACS_SSBS ACS_BTEE +#define ACS_BSSS ACS_TTEE +#define ACS_BSBS ACS_HLINE +#define ACS_SBSB ACS_VLINE +#define ACS_SSSS ACS_PLUS + +/* cchar_t aliases */ + +#ifdef PDC_WIDE +# define WACS_ULCORNER (&(acs_map['l'])) +# define WACS_LLCORNER (&(acs_map['m'])) +# define WACS_URCORNER (&(acs_map['k'])) +# define WACS_LRCORNER (&(acs_map['j'])) +# define WACS_RTEE (&(acs_map['u'])) +# define WACS_LTEE (&(acs_map['t'])) +# define WACS_BTEE (&(acs_map['v'])) +# define WACS_TTEE (&(acs_map['w'])) +# define WACS_HLINE (&(acs_map['q'])) +# define WACS_VLINE (&(acs_map['x'])) +# define WACS_PLUS (&(acs_map['n'])) + +# define WACS_S1 (&(acs_map['o'])) +# define WACS_S9 (&(acs_map['s'])) +# define WACS_DIAMOND (&(acs_map['`'])) +# define WACS_CKBOARD (&(acs_map['a'])) +# define WACS_DEGREE (&(acs_map['f'])) +# define WACS_PLMINUS (&(acs_map['g'])) +# define WACS_BULLET (&(acs_map['~'])) + +# define WACS_LARROW (&(acs_map[','])) +# define WACS_RARROW (&(acs_map['+'])) +# define WACS_DARROW (&(acs_map['.'])) +# define WACS_UARROW (&(acs_map['-'])) +# define WACS_BOARD (&(acs_map['h'])) +# define WACS_LANTERN (&(acs_map['i'])) +# define WACS_BLOCK (&(acs_map['0'])) + +# define WACS_S3 (&(acs_map['p'])) +# define WACS_S7 (&(acs_map['r'])) +# define WACS_LEQUAL (&(acs_map['y'])) +# define WACS_GEQUAL (&(acs_map['z'])) +# define WACS_PI (&(acs_map['{'])) +# define WACS_NEQUAL (&(acs_map['|'])) +# define WACS_STERLING (&(acs_map['}'])) + +# define WACS_BSSB WACS_ULCORNER +# define WACS_SSBB WACS_LLCORNER +# define WACS_BBSS WACS_URCORNER +# define WACS_SBBS WACS_LRCORNER +# define WACS_SBSS WACS_RTEE +# define WACS_SSSB WACS_LTEE +# define WACS_SSBS WACS_BTEE +# define WACS_BSSS WACS_TTEE +# define WACS_BSBS WACS_HLINE +# define WACS_SBSB WACS_VLINE +# define WACS_SSSS WACS_PLUS +#endif + +/*** Color macros ***/ + +#define COLOR_BLACK 0 + +#ifdef PDC_RGB /* RGB */ +# define COLOR_RED 1 +# define COLOR_GREEN 2 +# define COLOR_BLUE 4 +#else /* BGR */ +# define COLOR_BLUE 1 +# define COLOR_GREEN 2 +# define COLOR_RED 4 +#endif + +#define COLOR_CYAN (COLOR_BLUE | COLOR_GREEN) +#define COLOR_MAGENTA (COLOR_RED | COLOR_BLUE) +#define COLOR_YELLOW (COLOR_RED | COLOR_GREEN) + +#define COLOR_WHITE 7 + +/*---------------------------------------------------------------------- + * + * Function and Keypad Key Definitions. + * Many are just for compatibility. + * + */ + +#define KEY_CODE_YES 0x100 /* If get_wch() gives a key code */ + +#define KEY_BREAK 0x101 /* Not on PC KBD */ +#define KEY_DOWN 0x102 /* Down arrow key */ +#define KEY_UP 0x103 /* Up arrow key */ +#define KEY_LEFT 0x104 /* Left arrow key */ +#define KEY_RIGHT 0x105 /* Right arrow key */ +#define KEY_HOME 0x106 /* home key */ +#define KEY_BACKSPACE 0x107 /* not on pc */ +#define KEY_F0 0x108 /* function keys; 64 reserved */ + +#define KEY_DL 0x148 /* delete line */ +#define KEY_IL 0x149 /* insert line */ +#define KEY_DC 0x14a /* delete character */ +#define KEY_IC 0x14b /* insert char or enter ins mode */ +#define KEY_EIC 0x14c /* exit insert char mode */ +#define KEY_CLEAR 0x14d /* clear screen */ +#define KEY_EOS 0x14e /* clear to end of screen */ +#define KEY_EOL 0x14f /* clear to end of line */ +#define KEY_SF 0x150 /* scroll 1 line forward */ +#define KEY_SR 0x151 /* scroll 1 line back (reverse) */ +#define KEY_NPAGE 0x152 /* next page */ +#define KEY_PPAGE 0x153 /* previous page */ +#define KEY_STAB 0x154 /* set tab */ +#define KEY_CTAB 0x155 /* clear tab */ +#define KEY_CATAB 0x156 /* clear all tabs */ +#define KEY_ENTER 0x157 /* enter or send (unreliable) */ +#define KEY_SRESET 0x158 /* soft/reset (partial/unreliable) */ +#define KEY_RESET 0x159 /* reset/hard reset (unreliable) */ +#define KEY_PRINT 0x15a /* print/copy */ +#define KEY_LL 0x15b /* home down/bottom (lower left) */ +#define KEY_ABORT 0x15c /* abort/terminate key (any) */ +#define KEY_SHELP 0x15d /* short help */ +#define KEY_LHELP 0x15e /* long help */ +#define KEY_BTAB 0x15f /* Back tab key */ +#define KEY_BEG 0x160 /* beg(inning) key */ +#define KEY_CANCEL 0x161 /* cancel key */ +#define KEY_CLOSE 0x162 /* close key */ +#define KEY_COMMAND 0x163 /* cmd (command) key */ +#define KEY_COPY 0x164 /* copy key */ +#define KEY_CREATE 0x165 /* create key */ +#define KEY_END 0x166 /* end key */ +#define KEY_EXIT 0x167 /* exit key */ +#define KEY_FIND 0x168 /* find key */ +#define KEY_HELP 0x169 /* help key */ +#define KEY_MARK 0x16a /* mark key */ +#define KEY_MESSAGE 0x16b /* message key */ +#define KEY_MOVE 0x16c /* move key */ +#define KEY_NEXT 0x16d /* next object key */ +#define KEY_OPEN 0x16e /* open key */ +#define KEY_OPTIONS 0x16f /* options key */ +#define KEY_PREVIOUS 0x170 /* previous object key */ +#define KEY_REDO 0x171 /* redo key */ +#define KEY_REFERENCE 0x172 /* ref(erence) key */ +#define KEY_REFRESH 0x173 /* refresh key */ +#define KEY_REPLACE 0x174 /* replace key */ +#define KEY_RESTART 0x175 /* restart key */ +#define KEY_RESUME 0x176 /* resume key */ +#define KEY_SAVE 0x177 /* save key */ +#define KEY_SBEG 0x178 /* shifted beginning key */ +#define KEY_SCANCEL 0x179 /* shifted cancel key */ +#define KEY_SCOMMAND 0x17a /* shifted command key */ +#define KEY_SCOPY 0x17b /* shifted copy key */ +#define KEY_SCREATE 0x17c /* shifted create key */ +#define KEY_SDC 0x17d /* shifted delete char key */ +#define KEY_SDL 0x17e /* shifted delete line key */ +#define KEY_SELECT 0x17f /* select key */ +#define KEY_SEND 0x180 /* shifted end key */ +#define KEY_SEOL 0x181 /* shifted clear line key */ +#define KEY_SEXIT 0x182 /* shifted exit key */ +#define KEY_SFIND 0x183 /* shifted find key */ +#define KEY_SHOME 0x184 /* shifted home key */ +#define KEY_SIC 0x185 /* shifted input key */ + +#define KEY_SLEFT 0x187 /* shifted left arrow key */ +#define KEY_SMESSAGE 0x188 /* shifted message key */ +#define KEY_SMOVE 0x189 /* shifted move key */ +#define KEY_SNEXT 0x18a /* shifted next key */ +#define KEY_SOPTIONS 0x18b /* shifted options key */ +#define KEY_SPREVIOUS 0x18c /* shifted prev key */ +#define KEY_SPRINT 0x18d /* shifted print key */ +#define KEY_SREDO 0x18e /* shifted redo key */ +#define KEY_SREPLACE 0x18f /* shifted replace key */ +#define KEY_SRIGHT 0x190 /* shifted right arrow */ +#define KEY_SRSUME 0x191 /* shifted resume key */ +#define KEY_SSAVE 0x192 /* shifted save key */ +#define KEY_SSUSPEND 0x193 /* shifted suspend key */ +#define KEY_SUNDO 0x194 /* shifted undo key */ +#define KEY_SUSPEND 0x195 /* suspend key */ +#define KEY_UNDO 0x196 /* undo key */ + +/* PDCurses-specific key definitions -- PC only */ + +#define ALT_0 0x197 +#define ALT_1 0x198 +#define ALT_2 0x199 +#define ALT_3 0x19a +#define ALT_4 0x19b +#define ALT_5 0x19c +#define ALT_6 0x19d +#define ALT_7 0x19e +#define ALT_8 0x19f +#define ALT_9 0x1a0 +#define ALT_A 0x1a1 +#define ALT_B 0x1a2 +#define ALT_C 0x1a3 +#define ALT_D 0x1a4 +#define ALT_E 0x1a5 +#define ALT_F 0x1a6 +#define ALT_G 0x1a7 +#define ALT_H 0x1a8 +#define ALT_I 0x1a9 +#define ALT_J 0x1aa +#define ALT_K 0x1ab +#define ALT_L 0x1ac +#define ALT_M 0x1ad +#define ALT_N 0x1ae +#define ALT_O 0x1af +#define ALT_P 0x1b0 +#define ALT_Q 0x1b1 +#define ALT_R 0x1b2 +#define ALT_S 0x1b3 +#define ALT_T 0x1b4 +#define ALT_U 0x1b5 +#define ALT_V 0x1b6 +#define ALT_W 0x1b7 +#define ALT_X 0x1b8 +#define ALT_Y 0x1b9 +#define ALT_Z 0x1ba + +#define CTL_LEFT 0x1bb /* Control-Left-Arrow */ +#define CTL_RIGHT 0x1bc +#define CTL_PGUP 0x1bd +#define CTL_PGDN 0x1be +#define CTL_HOME 0x1bf +#define CTL_END 0x1c0 + +#define KEY_A1 0x1c1 /* upper left on Virtual keypad */ +#define KEY_A2 0x1c2 /* upper middle on Virt. keypad */ +#define KEY_A3 0x1c3 /* upper right on Vir. keypad */ +#define KEY_B1 0x1c4 /* middle left on Virt. keypad */ +#define KEY_B2 0x1c5 /* center on Virt. keypad */ +#define KEY_B3 0x1c6 /* middle right on Vir. keypad */ +#define KEY_C1 0x1c7 /* lower left on Virt. keypad */ +#define KEY_C2 0x1c8 /* lower middle on Virt. keypad */ +#define KEY_C3 0x1c9 /* lower right on Vir. keypad */ + +#define PADSLASH 0x1ca /* slash on keypad */ +#define PADENTER 0x1cb /* enter on keypad */ +#define CTL_PADENTER 0x1cc /* ctl-enter on keypad */ +#define ALT_PADENTER 0x1cd /* alt-enter on keypad */ +#define PADSTOP 0x1ce /* stop on keypad */ +#define PADSTAR 0x1cf /* star on keypad */ +#define PADMINUS 0x1d0 /* minus on keypad */ +#define PADPLUS 0x1d1 /* plus on keypad */ +#define CTL_PADSTOP 0x1d2 /* ctl-stop on keypad */ +#define CTL_PADCENTER 0x1d3 /* ctl-enter on keypad */ +#define CTL_PADPLUS 0x1d4 /* ctl-plus on keypad */ +#define CTL_PADMINUS 0x1d5 /* ctl-minus on keypad */ +#define CTL_PADSLASH 0x1d6 /* ctl-slash on keypad */ +#define CTL_PADSTAR 0x1d7 /* ctl-star on keypad */ +#define ALT_PADPLUS 0x1d8 /* alt-plus on keypad */ +#define ALT_PADMINUS 0x1d9 /* alt-minus on keypad */ +#define ALT_PADSLASH 0x1da /* alt-slash on keypad */ +#define ALT_PADSTAR 0x1db /* alt-star on keypad */ +#define ALT_PADSTOP 0x1dc /* alt-stop on keypad */ +#define CTL_INS 0x1dd /* ctl-insert */ +#define ALT_DEL 0x1de /* alt-delete */ +#define ALT_INS 0x1df /* alt-insert */ +#define CTL_UP 0x1e0 /* ctl-up arrow */ +#define CTL_DOWN 0x1e1 /* ctl-down arrow */ +#define CTL_TAB 0x1e2 /* ctl-tab */ +#define ALT_TAB 0x1e3 +#define ALT_MINUS 0x1e4 +#define ALT_EQUAL 0x1e5 +#define ALT_HOME 0x1e6 +#define ALT_PGUP 0x1e7 +#define ALT_PGDN 0x1e8 +#define ALT_END 0x1e9 +#define ALT_UP 0x1ea /* alt-up arrow */ +#define ALT_DOWN 0x1eb /* alt-down arrow */ +#define ALT_RIGHT 0x1ec /* alt-right arrow */ +#define ALT_LEFT 0x1ed /* alt-left arrow */ +#define ALT_ENTER 0x1ee /* alt-enter */ +#define ALT_ESC 0x1ef /* alt-escape */ +#define ALT_BQUOTE 0x1f0 /* alt-back quote */ +#define ALT_LBRACKET 0x1f1 /* alt-left bracket */ +#define ALT_RBRACKET 0x1f2 /* alt-right bracket */ +#define ALT_SEMICOLON 0x1f3 /* alt-semi-colon */ +#define ALT_FQUOTE 0x1f4 /* alt-forward quote */ +#define ALT_COMMA 0x1f5 /* alt-comma */ +#define ALT_STOP 0x1f6 /* alt-stop */ +#define ALT_FSLASH 0x1f7 /* alt-forward slash */ +#define ALT_BKSP 0x1f8 /* alt-backspace */ +#define CTL_BKSP 0x1f9 /* ctl-backspace */ +#define PAD0 0x1fa /* keypad 0 */ + +#define CTL_PAD0 0x1fb /* ctl-keypad 0 */ +#define CTL_PAD1 0x1fc +#define CTL_PAD2 0x1fd +#define CTL_PAD3 0x1fe +#define CTL_PAD4 0x1ff +#define CTL_PAD5 0x200 +#define CTL_PAD6 0x201 +#define CTL_PAD7 0x202 +#define CTL_PAD8 0x203 +#define CTL_PAD9 0x204 + +#define ALT_PAD0 0x205 /* alt-keypad 0 */ +#define ALT_PAD1 0x206 +#define ALT_PAD2 0x207 +#define ALT_PAD3 0x208 +#define ALT_PAD4 0x209 +#define ALT_PAD5 0x20a +#define ALT_PAD6 0x20b +#define ALT_PAD7 0x20c +#define ALT_PAD8 0x20d +#define ALT_PAD9 0x20e + +#define CTL_DEL 0x20f /* clt-delete */ +#define ALT_BSLASH 0x210 /* alt-back slash */ +#define CTL_ENTER 0x211 /* ctl-enter */ + +#define SHF_PADENTER 0x212 /* shift-enter on keypad */ +#define SHF_PADSLASH 0x213 /* shift-slash on keypad */ +#define SHF_PADSTAR 0x214 /* shift-star on keypad */ +#define SHF_PADPLUS 0x215 /* shift-plus on keypad */ +#define SHF_PADMINUS 0x216 /* shift-minus on keypad */ +#define SHF_UP 0x217 /* shift-up on keypad */ +#define SHF_DOWN 0x218 /* shift-down on keypad */ +#define SHF_IC 0x219 /* shift-insert on keypad */ +#define SHF_DC 0x21a /* shift-delete on keypad */ + +#define KEY_MOUSE 0x21b /* "mouse" key */ +#define KEY_SHIFT_L 0x21c /* Left-shift */ +#define KEY_SHIFT_R 0x21d /* Right-shift */ +#define KEY_CONTROL_L 0x21e /* Left-control */ +#define KEY_CONTROL_R 0x21f /* Right-control */ +#define KEY_ALT_L 0x220 /* Left-alt */ +#define KEY_ALT_R 0x221 /* Right-alt */ +#define KEY_RESIZE 0x222 /* Window resize */ +#define KEY_SUP 0x223 /* Shifted up arrow */ +#define KEY_SDOWN 0x224 /* Shifted down arrow */ + +#define KEY_MIN KEY_BREAK /* Minimum curses key value */ +#define KEY_MAX KEY_SDOWN /* Maximum curses key */ + +#define KEY_F(n) (KEY_F0 + (n)) + +/*---------------------------------------------------------------------- + * + * PDCurses Function Declarations + * + */ + +/* Standard */ + +int addch(const chtype); +int addchnstr(const chtype *, int); +int addchstr(const chtype *); +int addnstr(const char *, int); +int addstr(const char *); +int attroff(chtype); +int attron(chtype); +int attrset(chtype); +int attr_get(attr_t *, short *, void *); +int attr_off(attr_t, void *); +int attr_on(attr_t, void *); +int attr_set(attr_t, short, void *); +int baudrate(void); +int beep(void); +int bkgd(chtype); +void bkgdset(chtype); +int border(chtype, chtype, chtype, chtype, chtype, chtype, chtype, chtype); +int box(WINDOW *, chtype, chtype); +bool can_change_color(void); +int cbreak(void); +int chgat(int, attr_t, short, const void *); +int clearok(WINDOW *, bool); +int clear(void); +int clrtobot(void); +int clrtoeol(void); +int color_content(short, short *, short *, short *); +int color_set(short, void *); +int copywin(const WINDOW *, WINDOW *, int, int, int, int, int, int, int); +int curs_set(int); +int def_prog_mode(void); +int def_shell_mode(void); +int delay_output(int); +int delch(void); +int deleteln(void); +void delscreen(SCREEN *); +int delwin(WINDOW *); +WINDOW *derwin(WINDOW *, int, int, int, int); +int doupdate(void); +WINDOW *dupwin(WINDOW *); +int echochar(const chtype); +int echo(void); +int endwin(void); +char erasechar(void); +int erase(void); +void filter(void); +int flash(void); +int flushinp(void); +chtype getbkgd(WINDOW *); +int getnstr(char *, int); +int getstr(char *); +WINDOW *getwin(FILE *); +int halfdelay(int); +bool has_colors(void); +bool has_ic(void); +bool has_il(void); +int hline(chtype, int); +void idcok(WINDOW *, bool); +int idlok(WINDOW *, bool); +void immedok(WINDOW *, bool); +int inchnstr(chtype *, int); +int inchstr(chtype *); +chtype inch(void); +int init_color(short, short, short, short); +int init_pair(short, short, short); +WINDOW *initscr(void); +int innstr(char *, int); +int insch(chtype); +int insdelln(int); +int insertln(void); +int insnstr(const char *, int); +int insstr(const char *); +int instr(char *); +int intrflush(WINDOW *, bool); +bool isendwin(void); +bool is_linetouched(WINDOW *, int); +bool is_wintouched(WINDOW *); +char *keyname(int); +int keypad(WINDOW *, bool); +char killchar(void); +int leaveok(WINDOW *, bool); +char *longname(void); +int meta(WINDOW *, bool); +int move(int, int); +int mvaddch(int, int, const chtype); +int mvaddchnstr(int, int, const chtype *, int); +int mvaddchstr(int, int, const chtype *); +int mvaddnstr(int, int, const char *, int); +int mvaddstr(int, int, const char *); +int mvchgat(int, int, int, attr_t, short, const void *); +int mvcur(int, int, int, int); +int mvdelch(int, int); +int mvderwin(WINDOW *, int, int); +int mvgetch(int, int); +int mvgetnstr(int, int, char *, int); +int mvgetstr(int, int, char *); +int mvhline(int, int, chtype, int); +chtype mvinch(int, int); +int mvinchnstr(int, int, chtype *, int); +int mvinchstr(int, int, chtype *); +int mvinnstr(int, int, char *, int); +int mvinsch(int, int, chtype); +int mvinsnstr(int, int, const char *, int); +int mvinsstr(int, int, const char *); +int mvinstr(int, int, char *); +int mvprintw(int, int, const char *, ...); +int mvscanw(int, int, const char *, ...); +int mvvline(int, int, chtype, int); +int mvwaddchnstr(WINDOW *, int, int, const chtype *, int); +int mvwaddchstr(WINDOW *, int, int, const chtype *); +int mvwaddch(WINDOW *, int, int, const chtype); +int mvwaddnstr(WINDOW *, int, int, const char *, int); +int mvwaddstr(WINDOW *, int, int, const char *); +int mvwchgat(WINDOW *, int, int, int, attr_t, short, const void *); +int mvwdelch(WINDOW *, int, int); +int mvwgetch(WINDOW *, int, int); +int mvwgetnstr(WINDOW *, int, int, char *, int); +int mvwgetstr(WINDOW *, int, int, char *); +int mvwhline(WINDOW *, int, int, chtype, int); +int mvwinchnstr(WINDOW *, int, int, chtype *, int); +int mvwinchstr(WINDOW *, int, int, chtype *); +chtype mvwinch(WINDOW *, int, int); +int mvwinnstr(WINDOW *, int, int, char *, int); +int mvwinsch(WINDOW *, int, int, chtype); +int mvwinsnstr(WINDOW *, int, int, const char *, int); +int mvwinsstr(WINDOW *, int, int, const char *); +int mvwinstr(WINDOW *, int, int, char *); +int mvwin(WINDOW *, int, int); +int mvwprintw(WINDOW *, int, int, const char *, ...); +int mvwscanw(WINDOW *, int, int, const char *, ...); +int mvwvline(WINDOW *, int, int, chtype, int); +int napms(int); +WINDOW *newpad(int, int); +SCREEN *newterm(const char *, FILE *, FILE *); +WINDOW *newwin(int, int, int, int); +int nl(void); +int nocbreak(void); +int nodelay(WINDOW *, bool); +int noecho(void); +int nonl(void); +void noqiflush(void); +int noraw(void); +int notimeout(WINDOW *, bool); +int overlay(const WINDOW *, WINDOW *); +int overwrite(const WINDOW *, WINDOW *); +int pair_content(short, short *, short *); +int pechochar(WINDOW *, chtype); +int pnoutrefresh(WINDOW *, int, int, int, int, int, int); +int prefresh(WINDOW *, int, int, int, int, int, int); +int printw(const char *, ...); +int putwin(WINDOW *, FILE *); +void qiflush(void); +int raw(void); +int redrawwin(WINDOW *); +int refresh(void); +int reset_prog_mode(void); +int reset_shell_mode(void); +int resetty(void); +int ripoffline(int, int (*)(WINDOW *, int)); +int savetty(void); +int scanw(const char *, ...); +int scr_dump(const char *); +int scr_init(const char *); +int scr_restore(const char *); +int scr_set(const char *); +int scrl(int); +int scroll(WINDOW *); +int scrollok(WINDOW *, bool); +SCREEN *set_term(SCREEN *); +int setscrreg(int, int); +int slk_attroff(const chtype); +int slk_attr_off(const attr_t, void *); +int slk_attron(const chtype); +int slk_attr_on(const attr_t, void *); +int slk_attrset(const chtype); +int slk_attr_set(const attr_t, short, void *); +int slk_clear(void); +int slk_color(short); +int slk_init(int); +char *slk_label(int); +int slk_noutrefresh(void); +int slk_refresh(void); +int slk_restore(void); +int slk_set(int, const char *, int); +int slk_touch(void); +int standend(void); +int standout(void); +int start_color(void); +WINDOW *subpad(WINDOW *, int, int, int, int); +WINDOW *subwin(WINDOW *, int, int, int, int); +int syncok(WINDOW *, bool); +chtype termattrs(void); +attr_t term_attrs(void); +char *termname(void); +void timeout(int); +int touchline(WINDOW *, int, int); +int touchwin(WINDOW *); +int typeahead(int); +int untouchwin(WINDOW *); +void use_env(bool); +int vidattr(chtype); +int vid_attr(attr_t, short, void *); +int vidputs(chtype, int (*)(int)); +int vid_puts(attr_t, short, void *, int (*)(int)); +int vline(chtype, int); +int vw_printw(WINDOW *, const char *, va_list); +int vwprintw(WINDOW *, const char *, va_list); +int vw_scanw(WINDOW *, const char *, va_list); +int vwscanw(WINDOW *, const char *, va_list); +int waddchnstr(WINDOW *, const chtype *, int); +int waddchstr(WINDOW *, const chtype *); +int waddch(WINDOW *, const chtype); +int waddnstr(WINDOW *, const char *, int); +int waddstr(WINDOW *, const char *); +int wattroff(WINDOW *, chtype); +int wattron(WINDOW *, chtype); +int wattrset(WINDOW *, chtype); +int wattr_get(WINDOW *, attr_t *, short *, void *); +int wattr_off(WINDOW *, attr_t, void *); +int wattr_on(WINDOW *, attr_t, void *); +int wattr_set(WINDOW *, attr_t, short, void *); +void wbkgdset(WINDOW *, chtype); +int wbkgd(WINDOW *, chtype); +int wborder(WINDOW *, chtype, chtype, chtype, chtype, + chtype, chtype, chtype, chtype); +int wchgat(WINDOW *, int, attr_t, short, const void *); +int wclear(WINDOW *); +int wclrtobot(WINDOW *); +int wclrtoeol(WINDOW *); +int wcolor_set(WINDOW *, short, void *); +void wcursyncup(WINDOW *); +int wdelch(WINDOW *); +int wdeleteln(WINDOW *); +int wechochar(WINDOW *, const chtype); +int werase(WINDOW *); +int wgetch(WINDOW *); +int wgetnstr(WINDOW *, char *, int); +int wgetstr(WINDOW *, char *); +int whline(WINDOW *, chtype, int); +int winchnstr(WINDOW *, chtype *, int); +int winchstr(WINDOW *, chtype *); +chtype winch(WINDOW *); +int winnstr(WINDOW *, char *, int); +int winsch(WINDOW *, chtype); +int winsdelln(WINDOW *, int); +int winsertln(WINDOW *); +int winsnstr(WINDOW *, const char *, int); +int winsstr(WINDOW *, const char *); +int winstr(WINDOW *, char *); +int wmove(WINDOW *, int, int); +int wnoutrefresh(WINDOW *); +int wprintw(WINDOW *, const char *, ...); +int wredrawln(WINDOW *, int, int); +int wrefresh(WINDOW *); +int wscanw(WINDOW *, const char *, ...); +int wscrl(WINDOW *, int); +int wsetscrreg(WINDOW *, int, int); +int wstandend(WINDOW *); +int wstandout(WINDOW *); +void wsyncdown(WINDOW *); +void wsyncup(WINDOW *); +void wtimeout(WINDOW *, int); +int wtouchln(WINDOW *, int, int, int); +int wvline(WINDOW *, chtype, int); + +/* Wide-character functions */ + +#ifdef PDC_WIDE +int addnwstr(const wchar_t *, int); +int addwstr(const wchar_t *); +int add_wch(const cchar_t *); +int add_wchnstr(const cchar_t *, int); +int add_wchstr(const cchar_t *); +int border_set(const cchar_t *, const cchar_t *, const cchar_t *, + const cchar_t *, const cchar_t *, const cchar_t *, + const cchar_t *, const cchar_t *); +int box_set(WINDOW *, const cchar_t *, const cchar_t *); +int echo_wchar(const cchar_t *); +int erasewchar(wchar_t *); +int getbkgrnd(cchar_t *); +int getcchar(const cchar_t *, wchar_t *, attr_t *, short *, void *); +int getn_wstr(wint_t *, int); +int get_wch(wint_t *); +int get_wstr(wint_t *); +int hline_set(const cchar_t *, int); +int innwstr(wchar_t *, int); +int ins_nwstr(const wchar_t *, int); +int ins_wch(const cchar_t *); +int ins_wstr(const wchar_t *); +int inwstr(wchar_t *); +int in_wch(cchar_t *); +int in_wchnstr(cchar_t *, int); +int in_wchstr(cchar_t *); +char *key_name(wchar_t); +int killwchar(wchar_t *); +int mvaddnwstr(int, int, const wchar_t *, int); +int mvaddwstr(int, int, const wchar_t *); +int mvadd_wch(int, int, const cchar_t *); +int mvadd_wchnstr(int, int, const cchar_t *, int); +int mvadd_wchstr(int, int, const cchar_t *); +int mvgetn_wstr(int, int, wint_t *, int); +int mvget_wch(int, int, wint_t *); +int mvget_wstr(int, int, wint_t *); +int mvhline_set(int, int, const cchar_t *, int); +int mvinnwstr(int, int, wchar_t *, int); +int mvins_nwstr(int, int, const wchar_t *, int); +int mvins_wch(int, int, const cchar_t *); +int mvins_wstr(int, int, const wchar_t *); +int mvinwstr(int, int, wchar_t *); +int mvin_wch(int, int, cchar_t *); +int mvin_wchnstr(int, int, cchar_t *, int); +int mvin_wchstr(int, int, cchar_t *); +int mvvline_set(int, int, const cchar_t *, int); +int mvwaddnwstr(WINDOW *, int, int, const wchar_t *, int); +int mvwaddwstr(WINDOW *, int, int, const wchar_t *); +int mvwadd_wch(WINDOW *, int, int, const cchar_t *); +int mvwadd_wchnstr(WINDOW *, int, int, const cchar_t *, int); +int mvwadd_wchstr(WINDOW *, int, int, const cchar_t *); +int mvwgetn_wstr(WINDOW *, int, int, wint_t *, int); +int mvwget_wch(WINDOW *, int, int, wint_t *); +int mvwget_wstr(WINDOW *, int, int, wint_t *); +int mvwhline_set(WINDOW *, int, int, const cchar_t *, int); +int mvwinnwstr(WINDOW *, int, int, wchar_t *, int); +int mvwins_nwstr(WINDOW *, int, int, const wchar_t *, int); +int mvwins_wch(WINDOW *, int, int, const cchar_t *); +int mvwins_wstr(WINDOW *, int, int, const wchar_t *); +int mvwin_wch(WINDOW *, int, int, cchar_t *); +int mvwin_wchnstr(WINDOW *, int, int, cchar_t *, int); +int mvwin_wchstr(WINDOW *, int, int, cchar_t *); +int mvwinwstr(WINDOW *, int, int, wchar_t *); +int mvwvline_set(WINDOW *, int, int, const cchar_t *, int); +int pecho_wchar(WINDOW *, const cchar_t*); +int setcchar(cchar_t*, const wchar_t*, const attr_t, short, const void*); +int slk_wset(int, const wchar_t *, int); +int unget_wch(const wchar_t); +int vline_set(const cchar_t *, int); +int waddnwstr(WINDOW *, const wchar_t *, int); +int waddwstr(WINDOW *, const wchar_t *); +int wadd_wch(WINDOW *, const cchar_t *); +int wadd_wchnstr(WINDOW *, const cchar_t *, int); +int wadd_wchstr(WINDOW *, const cchar_t *); +int wbkgrnd(WINDOW *, const cchar_t *); +void wbkgrndset(WINDOW *, const cchar_t *); +int wborder_set(WINDOW *, const cchar_t *, const cchar_t *, + const cchar_t *, const cchar_t *, const cchar_t *, + const cchar_t *, const cchar_t *, const cchar_t *); +int wecho_wchar(WINDOW *, const cchar_t *); +int wgetbkgrnd(WINDOW *, cchar_t *); +int wgetn_wstr(WINDOW *, wint_t *, int); +int wget_wch(WINDOW *, wint_t *); +int wget_wstr(WINDOW *, wint_t *); +int whline_set(WINDOW *, const cchar_t *, int); +int winnwstr(WINDOW *, wchar_t *, int); +int wins_nwstr(WINDOW *, const wchar_t *, int); +int wins_wch(WINDOW *, const cchar_t *); +int wins_wstr(WINDOW *, const wchar_t *); +int winwstr(WINDOW *, wchar_t *); +int win_wch(WINDOW *, cchar_t *); +int win_wchnstr(WINDOW *, cchar_t *, int); +int win_wchstr(WINDOW *, cchar_t *); +wchar_t *wunctrl(cchar_t *); +int wvline_set(WINDOW *, const cchar_t *, int); +#endif + +/* Quasi-standard */ + +chtype getattrs(WINDOW *); +int getbegx(WINDOW *); +int getbegy(WINDOW *); +int getmaxx(WINDOW *); +int getmaxy(WINDOW *); +int getparx(WINDOW *); +int getpary(WINDOW *); +int getcurx(WINDOW *); +int getcury(WINDOW *); +void traceoff(void); +void traceon(void); +char *unctrl(chtype); + +int crmode(void); +int nocrmode(void); +int draino(int); +int resetterm(void); +int fixterm(void); +int saveterm(void); +int setsyx(int, int); + +int mouse_set(unsigned long); +int mouse_on(unsigned long); +int mouse_off(unsigned long); +int request_mouse_pos(void); +int map_button(unsigned long); +void wmouse_position(WINDOW *, int *, int *); +unsigned long getmouse(void); +unsigned long getbmap(void); + +/* ncurses */ + +int assume_default_colors(int, int); +const char *curses_version(void); +bool has_key(int); +int use_default_colors(void); +int wresize(WINDOW *, int, int); + +int mouseinterval(int); +mmask_t mousemask(mmask_t, mmask_t *); +bool mouse_trafo(int *, int *, bool); +int nc_getmouse(MEVENT *); +int ungetmouse(MEVENT *); +bool wenclose(const WINDOW *, int, int); +bool wmouse_trafo(const WINDOW *, int *, int *, bool); + +/* PDCurses */ + +int addrawch(chtype); +int insrawch(chtype); +bool is_termresized(void); +int mvaddrawch(int, int, chtype); +int mvdeleteln(int, int); +int mvinsertln(int, int); +int mvinsrawch(int, int, chtype); +int mvwaddrawch(WINDOW *, int, int, chtype); +int mvwdeleteln(WINDOW *, int, int); +int mvwinsertln(WINDOW *, int, int); +int mvwinsrawch(WINDOW *, int, int, chtype); +int raw_output(bool); +int resize_term(int, int); +WINDOW *resize_window(WINDOW *, int, int); +int waddrawch(WINDOW *, chtype); +int winsrawch(WINDOW *, chtype); +char wordchar(void); + +#ifdef PDC_WIDE +wchar_t *slk_wlabel(int); +#endif + +void PDC_debug(const char *, ...); +int PDC_ungetch(int); +int PDC_set_blink(bool); +int PDC_set_line_color(short); +void PDC_set_title(const char *); + +int PDC_clearclipboard(void); +int PDC_freeclipboard(char *); +int PDC_getclipboard(char **, long *); +int PDC_setclipboard(const char *, long); + +unsigned long PDC_get_input_fd(void); +unsigned long PDC_get_key_modifiers(void); +int PDC_return_key_modifiers(bool); +int PDC_save_key_modifiers(bool); + +#ifdef XCURSES +WINDOW *Xinitscr(int, char **); +void XCursesExit(void); +int sb_init(void); +int sb_set_horz(int, int, int); +int sb_set_vert(int, int, int); +int sb_get_horz(int *, int *, int *); +int sb_get_vert(int *, int *, int *); +int sb_refresh(void); +#endif + +/*** Functions defined as macros ***/ + +/* getch() and ungetch() conflict with some DOS libraries */ + +#define getch() wgetch(stdscr) +#define ungetch(ch) PDC_ungetch(ch) + +#define COLOR_PAIR(n) (((chtype)(n) << PDC_COLOR_SHIFT) & A_COLOR) +#define PAIR_NUMBER(n) (((n) & A_COLOR) >> PDC_COLOR_SHIFT) + +/* These will _only_ work as macros */ + +#define getbegyx(w, y, x) (y = getbegy(w), x = getbegx(w)) +#define getmaxyx(w, y, x) (y = getmaxy(w), x = getmaxx(w)) +#define getparyx(w, y, x) (y = getpary(w), x = getparx(w)) +#define getyx(w, y, x) (y = getcury(w), x = getcurx(w)) + +#define getsyx(y, x) { if (curscr->_leaveit) (y)=(x)=-1; \ + else getyx(curscr,(y),(x)); } + +#ifdef NCURSES_MOUSE_VERSION +# define getmouse(x) nc_getmouse(x) +#endif + +/* return codes from PDC_getclipboard() and PDC_setclipboard() calls */ + +#define PDC_CLIP_SUCCESS 0 +#define PDC_CLIP_ACCESS_ERROR 1 +#define PDC_CLIP_EMPTY 2 +#define PDC_CLIP_MEMORY_ERROR 3 + +/* PDCurses key modifier masks */ + +#define PDC_KEY_MODIFIER_SHIFT 1 +#define PDC_KEY_MODIFIER_CONTROL 2 +#define PDC_KEY_MODIFIER_ALT 4 +#define PDC_KEY_MODIFIER_NUMLOCK 8 + +#if defined(__cplusplus) || defined(__cplusplus__) || defined(__CPLUSPLUS) +# undef bool +} +#endif + +#endif /* __PDCURSES__ */ -- 2.39.5