Blame src/LYStrings.h

Packit f574b8
/*
Packit f574b8
 * $LynxId: LYStrings.h,v 1.117 2018/05/04 22:47:10 tom Exp $
Packit f574b8
 */
Packit f574b8
#ifndef LYSTRINGS_H
Packit f574b8
#define LYSTRINGS_H
Packit f574b8
Packit f574b8
#include <LYCurses.h>
Packit f574b8
Packit f574b8
#ifdef __cplusplus
Packit f574b8
extern "C" {
Packit f574b8
#endif
Packit f574b8
Packit f574b8
#define SQUOTE '\''
Packit f574b8
#define DQUOTE '"'
Packit f574b8
#define ESCAPE '\\'
Packit f574b8
#define LPAREN '('
Packit f574b8
#define RPAREN ')'
Packit f574b8
Packit f574b8
    typedef const char *const Const2CharPtr;
Packit f574b8
    typedef enum {
Packit f574b8
	NORECALL = 0
Packit f574b8
	,RECALL_URL
Packit f574b8
	,RECALL_CMD
Packit f574b8
	,RECALL_MAIL
Packit f574b8
    } RecallType;
Packit f574b8
Packit f574b8
#define IS_UTF8_TTY (BOOLEAN) (LYCharSet_UC[current_char_set].enc == UCT_ENC_UTF8)
Packit f574b8
#define IS_CJK_TTY  (BOOLEAN) (HTCJK != NOCJK)
Packit f574b8
Packit f574b8
#define is8bits(ch) (BOOLEAN) (UCH(ch) >= 128)	/* isascii(ch) is not POSIX */
Packit f574b8
Packit f574b8
/*  UPPER8(ch1,ch2) is an extension of (TOUPPER(ch1) - TOUPPER(ch2))  */
Packit f574b8
    extern int UPPER8(int ch1,
Packit f574b8
		      int ch2);
Packit f574b8
Packit f574b8
    extern int get_mouse_link(void);
Packit f574b8
    extern int peek_mouse_link(void);
Packit f574b8
    extern int peek_mouse_levent(void);
Packit f574b8
    extern int fancy_mouse(WINDOW * win, int row, int *position);
Packit f574b8
Packit f574b8
    extern char *LYstrncpy(char *dst,
Packit f574b8
			   const char *src,
Packit f574b8
			   int n);
Packit f574b8
#define LYStrNCpy(dst,src,n) LYstrncpy(dst,src,(int)(n))
Packit f574b8
    extern void ena_csi(int flag);
Packit f574b8
    extern int get_popup_number(const char *msg,
Packit f574b8
				int *c,
Packit f574b8
				int *rel);
Packit f574b8
    extern int LYarrayLength(STRING2PTR list);
Packit f574b8
    extern int LYarrayWidth(STRING2PTR list);
Packit f574b8
    extern int LYgetch(void);
Packit f574b8
    extern int LYgetch_choice(void);
Packit f574b8
    extern int LYgetch_input(void);
Packit f574b8
    extern int LYgetch_single(void);
Packit f574b8
    extern int LYgetstr(char *inputline,
Packit f574b8
			int masked,
Packit f574b8
			unsigned bufsize,
Packit f574b8
			RecallType recall);
Packit f574b8
#define LYGetStr(input,masked,bufsize,recall) \
Packit f574b8
	LYgetstr(input,masked,(unsigned)(bufsize),recall)
Packit f574b8
    extern int LYgetBString(bstring **inputline,
Packit f574b8
			    int masked,
Packit f574b8
			    unsigned max_cols,
Packit f574b8
			    RecallType recall);
Packit f574b8
    extern int LYscanFloat(const char *source, float *result);
Packit f574b8
    extern int LYscanFloat2(const char **source, float *result);
Packit f574b8
    extern char *LYstrsep(char **stringp,
Packit f574b8
			  const char *delim);
Packit f574b8
    extern char *LYstrstr(char *chptr,
Packit f574b8
			  const char *tarptr);
Packit f574b8
    extern char *LYmbcsstrncpy(char *dst,
Packit f574b8
			       const char *src,
Packit f574b8
			       int n_bytes,
Packit f574b8
			       int n_glyphs,
Packit f574b8
			       int utf_flag);
Packit f574b8
    extern const char *LYmbcs_skip_cells(const char *data,
Packit f574b8
					 int n_cells,
Packit f574b8
					 int utf_flag);
Packit f574b8
    extern const char *LYmbcs_skip_glyphs(const char *data,
Packit f574b8
					  int n_glyphs,
Packit f574b8
					  int utf_flag);
Packit f574b8
    extern int LYmbcsstrlen(const char *str,
Packit f574b8
			    int utf_flag,
Packit f574b8
			    int count_gcells);
Packit f574b8
Packit f574b8
    extern const char *LYno_attr_mbcs_strstr(const char *chptr,
Packit f574b8
					     const char *tarptr,
Packit f574b8
					     int utf_flag,
Packit f574b8
					     int count_gcells,
Packit f574b8
					     int *nstartp,
Packit f574b8
					     int *nendp);
Packit f574b8
    extern const char *LYno_attr_mbcs_case_strstr(const char *chptr,
Packit f574b8
						  const char *tarptr,
Packit f574b8
						  int utf_flag,
Packit f574b8
						  int count_gcells,
Packit f574b8
						  int *nstartp,
Packit f574b8
						  int *nendp);
Packit f574b8
Packit f574b8
#define LYno_attr_mb_strstr(chptr, tarptr, utf_flag, count_gcells, nstartp, nendp) \
Packit f574b8
	(LYcase_sensitive \
Packit f574b8
	    ? LYno_attr_mbcs_strstr(chptr, tarptr, utf_flag, count_gcells, nstartp, nendp) \
Packit f574b8
	    : LYno_attr_mbcs_case_strstr(chptr, tarptr, utf_flag, count_gcells, nstartp, nendp))
Packit f574b8
Packit f574b8
    extern const char *LYno_attr_char_strstr(const char *chptr,
Packit f574b8
					     const char *tarptr);
Packit f574b8
    extern const char *LYno_attr_char_case_strstr(const char *chptr,
Packit f574b8
						  const char *tarptr);
Packit f574b8
Packit f574b8
#define LYno_attr_strstr(chptr, tarptr) \
Packit f574b8
	(LYcase_sensitive \
Packit f574b8
	? LYno_attr_char_strstr(chptr, tarptr) \
Packit f574b8
	: LYno_attr_char_case_strstr(chptr, tarptr))
Packit f574b8
Packit f574b8
    extern char *SNACopy(char **dest,
Packit f574b8
			 const char *src,
Packit f574b8
			 size_t n);
Packit f574b8
    extern char *SNACat(char **dest,
Packit f574b8
			const char *src,
Packit f574b8
			size_t n);
Packit f574b8
Packit f574b8
#define StrnAllocCopy(dest, src, n)  SNACopy (&(dest), src, n)
Packit f574b8
#define StrnAllocCat(dest, src, n)   SNACat  (&(dest), src, n)
Packit f574b8
Packit f574b8
    extern char *LYSafeGets(char **src, FILE *fp);
Packit f574b8
Packit f574b8
#ifdef USE_CMD_LOGGING
Packit f574b8
    extern BOOL LYHaveCmdScript(void);
Packit f574b8
    extern int LYReadCmdKey(int mode);
Packit f574b8
    extern void LYCloseCmdLogfile(void);
Packit f574b8
    extern void LYOpenCmdLogfile(int argc, char **argv);
Packit f574b8
    extern void LYOpenCmdScript(void);
Packit f574b8
    extern void LYWriteCmdKey(int ch);
Packit f574b8
Packit f574b8
#else
Packit f574b8
#define LYHaveCmdScript() FALSE
Packit f574b8
#define LYReadCmdKey(mode) LYgetch_for(mode)
Packit f574b8
#define LYCloseCmdLogfile()	/* nothing */
Packit f574b8
#endif
Packit f574b8
Packit f574b8
/* values for LYgetch */
Packit f574b8
    /* The following are lynxkeycodes, not to be confused with
Packit f574b8
     * lynxactioncodes (LYK_*) to which they are often mapped.
Packit f574b8
     * The lynxkeycodes include all single-byte keys as a subset.
Packit f574b8
     * These are "extra" keys which do not fit into a single byte.
Packit f574b8
     */
Packit f574b8
    typedef enum {
Packit f574b8
	UNKNOWN_KEY = -1
Packit f574b8
	,DEL_KEY = 127
Packit f574b8
	,UPARROW_KEY = 256
Packit f574b8
	,DNARROW_KEY
Packit f574b8
	,RTARROW_KEY
Packit f574b8
	,LTARROW_KEY
Packit f574b8
	,PGDOWN_KEY
Packit f574b8
	,PGUP_KEY
Packit f574b8
	,HOME_KEY
Packit f574b8
	,END_KEY
Packit f574b8
	,F1_KEY
Packit f574b8
	,DO_KEY
Packit f574b8
	,FIND_KEY
Packit f574b8
	,SELECT_KEY
Packit f574b8
	,INSERT_KEY
Packit f574b8
	,REMOVE_KEY
Packit f574b8
	,DO_NOTHING
Packit f574b8
	,BACKTAB_KEY
Packit f574b8
	/* these should be referenced by name in keymap, e.g., "f2" */
Packit f574b8
	,F2_KEY
Packit f574b8
	,F3_KEY
Packit f574b8
	,F4_KEY
Packit f574b8
	,F5_KEY
Packit f574b8
	,F6_KEY
Packit f574b8
	,F7_KEY
Packit f574b8
	,F8_KEY
Packit f574b8
	,F9_KEY
Packit f574b8
	,F10_KEY
Packit f574b8
	,F11_KEY
Packit f574b8
	,F12_KEY
Packit f574b8
	/* this has known value */
Packit f574b8
	,MOUSE_KEY = 285	/* 0x11D */
Packit f574b8
    } LYExtraKeys;
Packit f574b8
Packit f574b8
/*  ***** NOTES: *****
Packit f574b8
    If you add definitions for new lynxkeycodes to the above list that need to
Packit f574b8
    be mapped to LYK_* lynxactioncodes -
Packit f574b8
Packit f574b8
    - AT LEAST the tables keymap[] and key_override[] in LYKeymap.c have to be
Packit f574b8
      changed/reviewed, AS WELL AS the lineedit binding tables in LYEditmap.c !
Packit f574b8
Packit f574b8
    - KEYMAP_SIZE, defined in LYKeymap.h, may need to be changed !
Packit f574b8
Packit f574b8
    - See also table named_keys[] in LYKeymap.c for 'pretty' strings for the
Packit f574b8
      keys with codes >= 256 (to appear on the 'K'eymap page).  New keycodes
Packit f574b8
      should probably be assigned consecutively, so their key names can be
Packit f574b8
      easily added to named_keys[] (but see next point).  They should also be
Packit f574b8
      documented in lynx.cfg.
Packit f574b8
Packit f574b8
    - The DOS port uses its own native codes for some keys, unless they are
Packit f574b8
      remapped by the code in LYgetch().  See *.key files in docs/ directory.
Packit f574b8
      Adding new keys here may conflict with those codes (affecting DOS users),
Packit f574b8
      unless/until remapping is added or changed in LYgetch().  (N)curses
Packit f574b8
      keypad codes (KEY_* from curses.h) can also directly appear as
Packit f574b8
      lynxkeycodes and conflict with our assignments, although that shouldn't
Packit f574b8
      happen - the useful ones should be recognized in LYgetch().
Packit f574b8
Packit f574b8
    - The actual recognition of raw input keys or escape sequences, and mapping
Packit f574b8
      to our lynxkeycodes, take place in LYgetch() and/or its subsidiary
Packit f574b8
      functions and/or the curses/slang/etc.  libraries.
Packit f574b8
Packit f574b8
    The basic lynxkeycodes can appear combined with various flags in
Packit f574b8
    higher-order bits as extended lynxkeycodes; see macros in LYKeymap.h.  The
Packit f574b8
    range of possible basic values is therefore limited, they have to be less
Packit f574b8
    than LKC_ISLKC (even if KEYMAP_SIZE is increased).
Packit f574b8
*/
Packit f574b8
Packit f574b8
#  define FOR_PANEL	0	/* normal screen, also LYgetch default */
Packit f574b8
#  define FOR_CHOICE	1	/* mouse menu */
Packit f574b8
#  define FOR_INPUT	2	/* form input and textarea field */
Packit f574b8
#  define FOR_PROMPT	3	/* string prompt editing */
Packit f574b8
#  define FOR_SINGLEKEY	4	/* single key prompt, confirmation */
Packit f574b8
Packit f574b8
#ifdef USE_ALT_BINDINGS
Packit f574b8
/*  Enable code implementing additional, mostly emacs-like, line-editing
Packit f574b8
    functions. - kw */
Packit f574b8
#define ENHANCED_LINEEDIT
Packit f574b8
#endif
Packit f574b8
Packit f574b8
/* FieldEditor preserves state between calls to LYDoEdit
Packit f574b8
 */
Packit f574b8
    typedef struct {
Packit f574b8
Packit f574b8
	int efStartX;		/* Origin of edit-field                      */
Packit f574b8
	int efStartY;
Packit f574b8
	int efWidth;		/* Screen real estate for editing            */
Packit f574b8
Packit f574b8
	char *efBuffer;		/* the buffer which is being edited */
Packit f574b8
	size_t efBufInUse;	/* current size of string.                   */
Packit f574b8
	size_t efBufAlloc;	/* current buffer-size, excluding nul at end */
Packit f574b8
	size_t efBufLimit;	/* buffer size limit, zero if indefinite     */
Packit f574b8
Packit f574b8
	char efPadChar;		/* Right padding  typically ' ' or '_'       */
Packit f574b8
	BOOL efIsMasked;	/* Masked password entry flag                */
Packit f574b8
Packit f574b8
	BOOL efIsDirty;		/* accumulate refresh requests               */
Packit f574b8
	BOOL efIsPanned;	/* Need horizontal scroll indicator          */
Packit f574b8
	int efDpyStart;		/* Horizontal scroll offset                  */
Packit f574b8
	int efEditAt;		/* Insertion point in string                 */
Packit f574b8
	int efPanMargin;	/* Number of columns look-ahead/look-back    */
Packit f574b8
	int efInputMods;	/* Modifiers for next input lynxkeycode */
Packit f574b8
#ifdef ENHANCED_LINEEDIT
Packit f574b8
	int efEditMark;		/* position of emacs-like mark, or -1-pos to denote
Packit f574b8
				   unactive mark.  */
Packit f574b8
#endif
Packit f574b8
Packit f574b8
	int *efOffs2Col;	/* fixups for multibyte characters */
Packit f574b8
Packit f574b8
    } FieldEditor;
Packit f574b8
Packit f574b8
/* line-edit action encoding */
Packit f574b8
Packit f574b8
    typedef enum {
Packit f574b8
	LYE_UNKNOWN = -1	/* no binding            */
Packit f574b8
	,LYE_NOP = 0		/* Do Nothing            */
Packit f574b8
	,LYE_CHAR		/* Insert printable char */
Packit f574b8
	,LYE_ENTER		/* Input complete, return char/lynxkeycode */
Packit f574b8
	,LYE_TAB		/* Input complete, return TAB  */
Packit f574b8
	,LYE_STOP		/* Input complete, deactivate  */
Packit f574b8
	,LYE_ABORT		/* Input cancelled       */
Packit f574b8
Packit f574b8
	,LYE_FORM_PASS		/* In form fields: input complete,
Packit f574b8
				   return char / lynxkeycode;
Packit f574b8
				   Elsewhere: Do Nothing */
Packit f574b8
Packit f574b8
	,LYE_DELN		/* Delete next/curr char */
Packit f574b8
	,LYE_DELC		/* Obsolete (DELC case was equiv to DELN) */
Packit f574b8
	,LYE_DELP		/* Delete prev      char */
Packit f574b8
	,LYE_DELNW		/* Delete next word      */
Packit f574b8
	,LYE_DELPW		/* Delete prev word      */
Packit f574b8
Packit f574b8
	,LYE_ERASE		/* Erase the line        */
Packit f574b8
Packit f574b8
	,LYE_BOL		/* Go to begin of line   */
Packit f574b8
	,LYE_EOL		/* Go to end   of line   */
Packit f574b8
	,LYE_FORW		/* Cursor forwards       */
Packit f574b8
	,LYE_FORW_RL		/* Cursor forwards or right link */
Packit f574b8
	,LYE_BACK		/* Cursor backwards      */
Packit f574b8
	,LYE_BACK_LL		/* Cursor backwards or left link */
Packit f574b8
	,LYE_FORWW		/* Word forward          */
Packit f574b8
	,LYE_BACKW		/* Word back             */
Packit f574b8
Packit f574b8
	,LYE_LOWER		/* Lower case the line   */
Packit f574b8
	,LYE_UPPER		/* Upper case the line   */
Packit f574b8
Packit f574b8
	,LYE_LKCMD		/* Invoke command prompt */
Packit f574b8
Packit f574b8
	,LYE_AIX		/* Hex 97                */
Packit f574b8
Packit f574b8
	,LYE_DELBL		/* Delete back to BOL    */
Packit f574b8
	,LYE_DELEL		/* Delete thru EOL       */
Packit f574b8
Packit f574b8
	,LYE_SWMAP		/* Switch input keymap   */
Packit f574b8
Packit f574b8
	,LYE_TPOS		/* Transpose characters  */
Packit f574b8
Packit f574b8
	,LYE_SETM1		/* Set modifier 1 flag   */
Packit f574b8
	,LYE_SETM2		/* Set modifier 2 flag   */
Packit f574b8
	,LYE_UNMOD		/* Fall back to no-modifier command */
Packit f574b8
Packit f574b8
	,LYE_C1CHAR		/* Insert C1 char if printable */
Packit f574b8
Packit f574b8
	,LYE_SETMARK		/* emacs-like set-mark-command */
Packit f574b8
	,LYE_XPMARK		/* emacs-like exchange-point-and-mark */
Packit f574b8
	,LYE_KILLREG		/* emacs-like kill-region */
Packit f574b8
	,LYE_YANK		/* emacs-like yank */
Packit f574b8
#ifdef CAN_CUT_AND_PASTE
Packit f574b8
	,LYE_PASTE		/* ClipBoard to Lynx       */
Packit f574b8
#endif
Packit f574b8
    } LYEditCodes;
Packit f574b8
Packit f574b8
/* All preceding values must be within 0x00..0x7f - kw */
Packit f574b8
Packit f574b8
/*  The following are meant to be bitwise or-ed:  */
Packit f574b8
#define LYE_DF       0x80	/* Flag to set modifier 3 AND do other
Packit f574b8
				   action */
Packit f574b8
#define LYE_FORM_LAC 0x1000	/* Flag to pass lynxactioncode given by
Packit f574b8
				   lower bits.  Doesn't fit in a char! */
Packit f574b8
Packit f574b8
#if defined(USE_KEYMAPS)
Packit f574b8
    extern int lynx_initialize_keymaps(void);
Packit f574b8
    extern int map_string_to_keysym(const char *src, int *lec, int internal);
Packit f574b8
#endif
Packit f574b8
Packit f574b8
    extern BOOL LYRemapEditBinding(int xlkc, int lec, int select_edi);	/* in LYEditmap.c */
Packit f574b8
    extern BOOLEAN LYRemoveNewlines(char *buffer);
Packit f574b8
    extern BOOLEAN LYTrimStartfile(char *buffer);
Packit f574b8
    extern LYExtraKeys LYnameToExtraKeys(const char *name);
Packit f574b8
    extern char *LYElideString(char *str, int cut_pos);
Packit f574b8
    extern char *LYReduceBlanks(char *buffer);
Packit f574b8
    extern char *LYRemoveBlanks(char *buffer);
Packit f574b8
    extern char *LYSkipBlanks(char *buffer);
Packit f574b8
    extern char *LYSkipNonBlanks(char *buffer);
Packit f574b8
    extern char *LYTrimNewline(char *buffer);
Packit f574b8
    extern const char *LYSkipCBlanks(const char *buffer);
Packit f574b8
    extern const char *LYSkipCNonBlanks(const char *buffer);
Packit f574b8
    extern const char *LYextraKeysToName(LYExtraKeys code);
Packit f574b8
    extern int EditBinding(int ch);	/* in LYEditmap.c */
Packit f574b8
    extern int LYDoEdit(FieldEditor * edit, int ch, int action, int maxMessage);
Packit f574b8
    extern int LYEditKeyForAction(int lac, int *pmodkey);	/* LYEditmap.c */
Packit f574b8
    extern int LYKeyForEditAction(int lec);	/* in LYEditmap.c */
Packit f574b8
    extern int LYhandlePopupList(int cur_choice, int ly, int lx,
Packit f574b8
				 STRING2PTR choices,
Packit f574b8
				 int width,
Packit f574b8
				 int i_length,
Packit f574b8
				 int disabled,
Packit f574b8
				 int for_mouse);
Packit f574b8
    extern void LYCloseCloset(RecallType recall);
Packit f574b8
    extern void LYEscapeStartfile(char **buffer);
Packit f574b8
    extern void LYFinishEdit(FieldEditor * edit);
Packit f574b8
    extern void LYLowerCase(char *buffer);
Packit f574b8
    extern void LYRefreshEdit(FieldEditor * edit);
Packit f574b8
    extern void LYSetupEdit(FieldEditor * edit, char *old,
Packit f574b8
			    unsigned buffer_limit,
Packit f574b8
			    int display_limit);
Packit f574b8
    extern void LYTrimAllStartfile(char *buffer);
Packit f574b8
    extern void LYTrimLeading(char *buffer);
Packit f574b8
    extern void LYTrimTrailing(char *buffer);
Packit f574b8
    extern void LYUpperCase(char *buffer);
Packit f574b8
Packit f574b8
    typedef short LYEditCode;
Packit f574b8
Packit f574b8
    typedef struct {
Packit f574b8
	int code;
Packit f574b8
	LYEditCode edit;
Packit f574b8
    } LYEditInit;
Packit f574b8
Packit f574b8
    typedef struct {
Packit f574b8
	const char *name;
Packit f574b8
	const LYEditInit *init;
Packit f574b8
	LYEditCode *used;
Packit f574b8
    } LYEditConfig;
Packit f574b8
Packit f574b8
    extern int current_lineedit;
Packit f574b8
    extern const char *LYEditorNames[];
Packit f574b8
    extern LYEditConfig LYLineEditors[];
Packit f574b8
    extern const char *LYLineeditHelpURLs[];
Packit f574b8
Packit f574b8
#define CurrentLineEditor() LYLineEditors[current_lineedit].used
Packit f574b8
Packit f574b8
    extern void LYinitEditmap(void);
Packit f574b8
    extern void LYinitKeymap(void);
Packit f574b8
    extern const char *LYLineeditHelpURL(void);
Packit f574b8
Packit f574b8
    extern int escape_bound;
Packit f574b8
Packit f574b8
#define LYLineEdit(e,c,m) LYDoEdit(e, c, EditBinding(c) & ~LYE_DF, m)
Packit f574b8
Packit f574b8
    extern int LYEditInsert(FieldEditor * edit, unsigned const char *s,
Packit f574b8
			    int len, int map_active,
Packit f574b8
			    int maxMessage);
Packit f574b8
Packit f574b8
#ifdef __cplusplus
Packit f574b8
}
Packit f574b8
#endif
Packit f574b8
#endif				/* LYSTRINGS_H */