--- sbbs/uifc/uifc.h 2018/04/24 16:37:52 1.1 +++ sbbs/uifc/uifc.h 2018/04/24 16:37:52 1.1.1.2 @@ -1,8 +1,13 @@ /* UIFC.H */ +/* Rob Swindell's Text-mode User Interface Library */ + +/* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */ + +#include #include #include -#include +#include #include #include #include @@ -11,9 +16,77 @@ #include #include -#define MAX_OPTS 128 /* Maximum number of options per menu call */ -#define MAX_OPLN 81 /* Maximum length of each option per menu call */ -#define MAX_BUFS 8 /* Maximum number of screen buffers to save */ +/* OS Specific */ +#if defined(__FLAT__) + #define far +#endif + +#if !defined(__OS2__) + #include +#endif + + +/****************************************************************************/ +/* MALLOC/FREE Macros for various compilers and environments */ +/* MALLOC is used for allocations of 64k or less */ +/* FREE is used to free buffers allocated with MALLOC */ +/* LMALLOC is used for allocations of possibly larger than 64k */ +/* LFREE is used to free buffers allocated with LMALLOC */ +/* REALLOC is used to re-size a previously MALLOCed or LMALLOCed buffer */ +/****************************************************************************/ +#if defined(__COMPACT__) || defined(__LARGE__) || defined(__HUGE__) + #if defined(__TURBOC__) + #define REALLOC(x,y) farrealloc(x,y) + #define LMALLOC(x) farmalloc(x) + #define MALLOC(x) farmalloc(x) + #define LFREE(x) farfree(x) + #define FREE(x) farfree(x) + #elif defined(__WATCOMC__) + #define REALLOC realloc + #define LMALLOC(x) halloc(x,1) /* far heap, but slow */ + #define MALLOC malloc /* far heap, but 64k max */ + #define LFREE hfree + #define FREE free + #else /* Other 16-bit Compiler */ + #define REALLOC realloc + #define LMALLOC malloc + #define MALLOC malloc + #define LFREE free + #define FREE free + #endif +#else /* 32-bit Compiler or Small Memory Model */ + #define REALLOC realloc + #define LMALLOC malloc + #define MALLOC malloc + #define LFREE free + #define FREE free +#endif + +#ifdef __DPMI32__ + #define INT_86(i,j,k) int386(i,j,k) +#else + #define INT_86(i,j,k) int86(i,j,k) +#endif + +#ifdef __FLAT__ + #define MAX_OPTS 1000 + #define MSK_ON 0xf0000000 + #define MSK_OFF 0x0fffffff + #define MSK_INS 0x10000000 + #define MSK_DEL 0x20000000 + #define MSK_GET 0x30000000 + #define MSK_PUT 0x40000000 +#else + #define MAX_OPTS 500 /* Maximum number of options per menu call */ + #define MSK_ON 0xf000 + #define MSK_OFF 0x0fff + #define MSK_INS 0x1000 + #define MSK_DEL 0x2000 + #define MSK_GET 0x3000 + #define MSK_PUT 0x4000 +#endif +#define MAX_OPLN 75 /* Maximum length of each option per menu call */ +#define MAX_BUFS 7 /* Maximum number of screen buffers to save */ #define MAX_BFLN 8000 /* Maximum size of screen buffers - 80x50 */ #ifndef uint @@ -21,6 +94,9 @@ #endif #define UIFC_INMSG (1<<0) /* Currently in Message Routine non-recursive */ +#define UIFC_MOUSE (1<<1) /* Mouse installed and available */ +#define UIFC_MONO (1<<2) /* Force monochrome mode */ +#define UIFC_COLOR (1<<3) /* Force color mode */ #define WIN_ORG (1<<0) /* Original menu - destroy valid screen area */ #define WIN_SAV (1<<1) /* Save existing text and replace when finished */ @@ -32,55 +108,68 @@ #define WIN_DEL (1<<7) /* Allows user to use delete key */ #define WIN_DELACT (1<<8) /* Remains active after delete key */ #define WIN_ESC (1<<9) /* Screen is active when escape is hit */ -#define WIN_EDT (1<<10) /* Edit mode for input() function */ -#define WIN_RHT (1<<11) /* Place window against right side of screen */ -#define WIN_BOT (1<<12) /* Place window against botton of screen */ -#define WIN_GET (1<<13) /* Allows F5 to Get a menu item */ -#define WIN_PUT (1<<14) /* Allows F6 to Put a menu item */ -#define WIN_CHE (1<<15) /* Stay active after escape if changes */ +#define WIN_RHT (1<<10) /* Place window against right side of screen */ +#define WIN_BOT (1<<11) /* Place window against botton of screen */ +#define WIN_GET (1<<12) /* Allows F5 to Get a menu item */ +#define WIN_PUT (1<<13) /* Allows F6 to Put a menu item */ +#define WIN_CHE (1<<14) /* Stay active after escape if changes */ +#define WIN_XTR (1<<15) /* Add extra line at end for inserting at end */ #define WIN_MID WIN_L2R|WIN_T2B /* Place window in middle of screen */ -#define MSK_INS 0x0100 -#define MSK_DEL 0x0200 -#define MSK_GET 0x0300 -#define MSK_PUT 0x0400 - #define SCRN_TOP 3 #define SCRN_LEFT 5 #define SCRN_RIGHT 76 -#define NO_CURSOR 0x2100 -#define BIG_CURSOR 0x000f - - /* Bits in 'mode' for getkey and getstr */ -#define K_UPPER (1<<0) /* Converts all letters to upper case */ -#define K_UPRLWR (1<<1) /* Upper/Lower case automatically */ -#define K_NUMBER (1<<2) /* Allow numbers only */ -#define K_WRAP (1<<3) /* Allows word wrap */ -#define K_MSG (1<<4) /* Allows ANSI, ^N ^A ^G */ -#define K_SPIN (1<<5) /* Spinning cursor (same as SPIN) */ -#define K_LINE (1<<6) /* Input line (inverse color) */ -#define K_EDIT (1<<7) /* Edit string passed */ -#define K_CHAT (1<<8) /* In chat multi-chat */ -#define K_NOCRLF (1<<9) /* Don't print CRLF after string input */ -#define K_ALPHA (1<<10) /* Only allow alphabetic characters */ + /* Bits in 'mode' for getkey and getstr */ +#define K_UPPER (1L<<0) /* Converts all letters to upper case */ +#define K_UPRLWR (1L<<1) /* Upper/Lower case automatically */ +#define K_NUMBER (1L<<2) /* Allow numbers only */ +#define K_WRAP (1L<<3) /* Allows word wrap */ +#define K_MSG (1L<<4) /* Allows ANSI, ^N ^A ^G */ +#define K_SPIN (1L<<5) /* Spinning cursor (same as SPIN) */ +#define K_LINE (1L<<6) /* Input line (inverse color) */ +#define K_EDIT (1L<<7) /* Edit string passed */ +#define K_CHAT (1L<<8) /* In chat multi-chat */ +#define K_NOCRLF (1L<<9) /* Don't print CRLF after string input */ +#define K_ALPHA (1L<<10) /* Only allow alphabetic characters */ + +#define HELPBUF_SIZE 4000 + +#define SETHELP(where) helpline=__LINE__; helpfile=__FILE__ + +#ifndef TAB + /* Control characters */ +#define STX 0x02 /* Start of text ^B */ +#define ETX 0x03 /* End of text ^C */ +#define BS 0x08 /* Back space ^H */ +#define TAB 0x09 /* Horizontal tabulation ^I */ +#define LF 0x0a /* Line feed ^J */ +#define FF 0x0c /* Form feed ^L */ +#define CR 0x0d /* Carriage return ^M */ +#define ESC 0x1b /* Escape ^[ */ +#define SP 0x20 /* Space */ +#endif +#define CLREOL 256 -#define BS 8 -#define FF 12 -#define LF 10 -#define CR 13 -#define ESC 27 -#define SP 32 +#ifndef uchar /* Short-hand for unsigned data types */ +#define uchar unsigned char +#endif +#ifndef uint +#define uint unsigned int +#endif +#ifndef ulong +#define ulong unsigned long +#endif -#define CLREOL 256 typedef struct { char left,top,right,bot,*buf; } win_t; + /* LCLOLL.ASM */ int lclini(int); void lclxy(int,int); @@ -90,23 +179,32 @@ int lclatr(int); void lputc(int); long lputs(char far *); +#if defined(__OS2__) || !defined(__FLAT__) +void mswait(int msecs); +extern mswtyp; +#endif extern char scrn_len,lclr,hclr,bclr,cclr,blk_scrn[MAX_BFLN],savdepth - ,changes,savnum,uifc_status; + ,changes,show_free_mem,savnum,uifc_status,*helpfile,*helpbuf + ,helpdatfile[256] + ,helpixbfile[256]; extern win_t sav[MAX_BUFS]; -extern uint cursor; +extern uint cursor,helpline; void uifcini(void); -void uscrn(char *str); -int ulist(int mode, char left, char top, char width, int *dflt - ,char *title, char option[][MAX_OPLN]); -char uinput(int imode, char left, char top, char *prompt, char *str, char len - ,int kmode); +int uscrn(char *str); +int ulist(int mode, char left, int top, char width, int *dflt, int *bar + ,char *title, char **option); +int uinput(int imode, char left, char top, char *prompt, char *str + ,char len ,int kmode); +int uprintf(char x, char y, char attr, char *fmt,...); void umsg(char *str); -int getstr(char *str, int maxlen, int mode); -uint getcursortype(); -void setcursortype(uint cursor); +void upop(char *str); +int getstr(char *str, int maxlen, long mode); void timedisplay(); void puttextinfo(struct text_info txt); int lprintf(char *fmt,...); char *timestr(time_t *intime); +void help(void); +void truncsp(char *str); +void uifcbail(void);