home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Spezial / SPEZIAL2_97.zip / SPEZIAL2_97.iso / ANWEND / EDITOR / NVI179B / NVI179B.ZIP / common / key.h < prev    next >
C/C++ Source or Header  |  1996-06-30  |  8KB  |  223 lines

  1. /*-
  2.  * Copyright (c) 1991, 1993, 1994
  3.  *    The Regents of the University of California.  All rights reserved.
  4.  * Copyright (c) 1991, 1993, 1994, 1995, 1996
  5.  *    Keith Bostic.  All rights reserved.
  6.  *
  7.  * See the LICENSE file for redistribution information.
  8.  *
  9.  *    @(#)key.h    10.18 (Berkeley) 6/30/96
  10.  */
  11.  
  12. /*
  13.  * Fundamental character types.
  14.  *
  15.  * CHAR_T    An integral type that can hold any character.
  16.  * ARG_CHAR_T    The type of a CHAR_T when passed as an argument using
  17.  *        traditional promotion rules.  It should also be able
  18.  *        to be compared against any CHAR_T for equality without
  19.  *        problems.
  20.  * MAX_CHAR_T    The maximum value of any character.
  21.  *
  22.  * If no integral type can hold a character, don't even try the port.
  23.  */
  24. typedef    u_char        CHAR_T;
  25. typedef    u_int        ARG_CHAR_T;
  26. #define    MAX_CHAR_T    0xff
  27.  
  28. /* The maximum number of columns any character can take up on a screen. */
  29. #define    MAX_CHARACTER_COLUMNS    4
  30.  
  31. /*
  32.  * Event types.
  33.  *
  34.  * The program structure depends on the event loop being able to return
  35.  * E_EOF/E_ERR multiple times -- eventually enough things will end due
  36.  * to the events that vi will reach the command level for the screen, at
  37.  * which point the exit flags will be set and vi will exit.
  38.  */
  39. typedef enum {
  40.     E_NOTUSED = 0,            /* Not set. */
  41.     E_CHARACTER,            /* Input character: e_c set. */
  42.     E_EOF,                /* End of input (NOT ^D). */
  43.     E_ERR,                /* Input error. */
  44.     E_INTERRUPT,            /* Interrupt. */
  45.     E_QUIT,                /* Quit. */
  46.     E_REPAINT,            /* Repaint: e_flno, e_tlno set. */
  47.     E_SIGHUP,            /* SIGHUP. */
  48.     E_SIGTERM,            /* SIGTERM. */
  49.     E_STRING,            /* Input string: e_csp, e_len set. */
  50.     E_TIMEOUT,            /* Timeout. */
  51.     E_WRESIZE,            /* Window resize. */
  52.     E_WRITE                /* Write. */
  53. } e_event_t;
  54.  
  55. /*
  56.  * Character values.
  57.  */
  58. typedef enum {
  59.     K_NOTUSED = 0,            /* Not set. */
  60.     K_BACKSLASH,            /*  \ */
  61.     K_CARAT,            /*  ^ */
  62.     K_CNTRLD,            /* ^D */
  63.     K_CNTRLR,            /* ^R */
  64.     K_CNTRLT,            /* ^T */
  65.     K_CNTRLZ,            /* ^Z */
  66.     K_COLON,            /*  : */
  67.     K_CR,                /* \r */
  68.     K_ESCAPE,            /* ^[ */
  69.     K_FORMFEED,            /* \f */
  70.     K_HEXCHAR,            /* ^X */
  71.     K_NL,                /* \n */
  72.     K_RIGHTBRACE,            /*  } */
  73.     K_RIGHTPAREN,            /*  ) */
  74.     K_TAB,                /* \t */
  75.     K_VERASE,            /* set from tty: default ^H */
  76.     K_VKILL,            /* set from tty: default ^U */
  77.     K_VLNEXT,            /* set from tty: default ^V */
  78.     K_VWERASE,            /* set from tty: default ^W */
  79.     K_ZERO                /*  0 */
  80. } e_key_t;
  81.  
  82. struct _event {
  83.     TAILQ_ENTRY(_event) q;        /* Linked list of events. */
  84.     e_event_t e_event;        /* Event type. */
  85.     union {
  86.         struct {        /* Input character. */
  87.             CHAR_T c;    /* Character. */
  88.             e_key_t value;    /* Key type. */
  89.  
  90. #define    CH_ABBREVIATED    0x01        /* Character is from an abbreviation. */
  91. #define    CH_MAPPED    0x02        /* Character is from a map. */
  92. #define    CH_NOMAP    0x04        /* Do not map the character. */
  93. #define    CH_QUOTED    0x08        /* Character is already quoted. */
  94.             u_int8_t flags;
  95.         } _e_ch;
  96. #define    e_ch    _u_event._e_ch        /* !!! The structure, not the char. */
  97. #define    e_c    _u_event._e_ch.c
  98. #define    e_value    _u_event._e_ch.value
  99. #define    e_flags    _u_event._e_ch.flags
  100.  
  101.         struct {        /* Screen position, size. */
  102.             size_t lno1;    /* Line number. */
  103.             size_t cno1;    /* Column number. */
  104.             size_t lno2;    /* Line number. */
  105.             size_t cno2;    /* Column number. */
  106.         } _e_mark;
  107. #define    e_lno    _u_event._e_mark.lno1    /* Single location. */
  108. #define    e_cno    _u_event._e_mark.cno1
  109. #define    e_flno    _u_event._e_mark.lno1    /* Text region. */
  110. #define    e_fcno    _u_event._e_mark.cno1
  111. #define    e_tlno    _u_event._e_mark.lno2
  112. #define    e_tcno    _u_event._e_mark.cno2
  113.  
  114.         struct {        /* Input string. */
  115.             CHAR_T    *asp;    /* Allocated string. */
  116.             CHAR_T    *csp;    /* String. */
  117.             size_t     len;    /* String length. */
  118.         } _e_str;
  119. #define    e_asp    _u_event._e_str.asp
  120. #define    e_csp    _u_event._e_str.csp
  121. #define    e_len    _u_event._e_str.len
  122.     } _u_event;
  123. };
  124.  
  125. typedef struct _keylist {
  126.     e_key_t value;            /* Special value. */
  127.     CHAR_T ch;            /* Key. */
  128. } KEYLIST;
  129. extern KEYLIST keylist[];
  130.  
  131.                     /* Return if more keys in queue. */
  132. #define    KEYS_WAITING(sp)    ((sp)->gp->i_cnt != 0)
  133. #define    MAPPED_KEYS_WAITING(sp)                        \
  134.     (KEYS_WAITING(sp) &&                        \
  135.         F_ISSET(&sp->gp->i_event[sp->gp->i_next].e_ch, CH_MAPPED))
  136.  
  137. /*
  138.  * Ex/vi commands are generally separated by whitespace characters.  We
  139.  * can't use the standard isspace(3) macro because it returns true for
  140.  * characters like ^K in the ASCII character set.  The 4.4BSD isblank(3)
  141.  * macro does exactly what we want, but it's not portable yet.
  142.  *
  143.  * XXX
  144.  * Note side effect, ch is evaluated multiple times.
  145.  */
  146. #ifndef isblank
  147. #define    isblank(ch)    ((ch) == ' ' || (ch) == '\t')
  148. #endif
  149.  
  150. /* The "standard" tab width, for displaying things to users. */
  151. #define    STANDARD_TAB    6
  152.  
  153. /* Various special characters, messages. */
  154. #define    CH_BSEARCH    '?'        /* Backward search prompt. */
  155. #define    CH_CURSOR    ' '        /* Cursor character. */
  156. #define    CH_ENDMARK    '$'        /* End of a range. */
  157. #define    CH_EXPROMPT    ':'        /* Ex prompt. */
  158. #define    CH_FSEARCH    '/'        /* Forward search prompt. */
  159. #define    CH_HEX        '\030'        /* Leading hex character. */
  160. #define    CH_LITERAL    '\026'        /* ASCII ^V. */
  161. #define    CH_NO        'n'        /* No. */
  162. #define    CH_NOT_DIGIT    'a'        /* A non-isdigit() character. */
  163. #define    CH_QUIT        'q'        /* Quit. */
  164. #define    CH_YES        'y'        /* Yes. */
  165.  
  166. /*
  167.  * Checking for interrupts means that we look at the bit that gets set if the
  168.  * screen code supports asynchronous events, and call back into the event code
  169.  * so that non-asynchronous screens get a chance to post the interrupt.
  170.  *
  171.  * INTERRUPT_CHECK is the number of lines "operated" on before checking for
  172.  * interrupts.
  173.  */
  174. #define    INTERRUPT_CHECK    100
  175. #define    INTERRUPTED(sp)                            \
  176.     (F_ISSET((sp)->gp, G_INTERRUPTED) ||                \
  177.     (!v_event_get(sp, NULL, 0, EC_INTERRUPT) &&            \
  178.     F_ISSET((sp)->gp, G_INTERRUPTED)))
  179. #define    CLR_INTERRUPT(sp)                        \
  180.     F_CLR((sp)->gp, G_INTERRUPTED)
  181.  
  182. /* Flags describing types of characters being requested. */
  183. #define    EC_INTERRUPT    0x001        /* Checking for interrupts. */
  184. #define    EC_MAPCOMMAND    0x002        /* Apply the command map. */
  185. #define    EC_MAPINPUT    0x004        /* Apply the input map. */
  186. #define    EC_MAPNODIGIT    0x008        /* Return to a digit. */
  187. #define    EC_QUOTED    0x010        /* Try to quote next character */
  188. #define    EC_RAW        0x020        /* Any next character. XXX: not used. */
  189. #define    EC_TIMEOUT    0x040        /* Timeout to next character. */
  190.  
  191. /* Flags describing text input special cases. */
  192. #define    TXT_ADDNEWLINE    0x00000001    /* Replay starts on a new line. */
  193. #define    TXT_AICHARS    0x00000002    /* Leading autoindent chars. */
  194. #define    TXT_ALTWERASE    0x00000004    /* Option: altwerase. */
  195. #define    TXT_APPENDEOL    0x00000008    /* Appending after EOL. */
  196. #define    TXT_AUTOINDENT    0x00000010    /* Autoindent set this line. */
  197. #define    TXT_BACKSLASH    0x00000020    /* Backslashes escape characters. */
  198. #define    TXT_BEAUTIFY    0x00000040    /* Only printable characters. */
  199. #define    TXT_BS        0x00000080    /* Backspace returns the buffer. */
  200. #define    TXT_CEDIT    0x00000100    /* Can return TERM_CEDIT. */
  201. #define    TXT_CNTRLD    0x00000200    /* Control-D is a command. */
  202. #define    TXT_CNTRLT    0x00000400    /* Control-T is an indent special. */
  203. #define    TXT_CR        0x00000800    /* CR returns the buffer. */
  204. #define    TXT_DOTTERM    0x00001000    /* Leading '.' terminates the input. */
  205. #define    TXT_EMARK    0x00002000    /* End of replacement mark. */
  206. #define    TXT_EOFCHAR    0x00004000    /* ICANON set, return EOF character. */
  207. #define    TXT_ESCAPE    0x00008000    /* Escape returns the buffer. */
  208. #define    TXT_FILEC    0x00010000    /* Option: filec. */
  209. #define    TXT_INFOLINE    0x00020000    /* Editing the info line. */
  210. #define    TXT_MAPINPUT    0x00040000    /* Apply the input map. */
  211. #define    TXT_NLECHO    0x00080000    /* Echo the newline. */
  212. #define    TXT_NUMBER    0x00100000    /* Number the line. */
  213. #define    TXT_OVERWRITE    0x00200000    /* Overwrite characters. */
  214. #define    TXT_PROMPT    0x00400000    /* Display a prompt. */
  215. #define    TXT_RECORD    0x00800000    /* Record for replay. */
  216. #define    TXT_REPLACE    0x01000000    /* Replace; don't delete overwrite. */
  217. #define    TXT_REPLAY    0x02000000    /* Replay the last input. */
  218. #define    TXT_RESOLVE    0x04000000    /* Resolve the text into the file. */
  219. #define    TXT_SEARCHINCR    0x08000000    /* Incremental search. */
  220. #define    TXT_SHOWMATCH    0x10000000    /* Option: showmatch. */
  221. #define    TXT_TTYWERASE    0x20000000    /* Option: ttywerase. */
  222. #define    TXT_WRAPMARGIN    0x40000000    /* Option: wrapmargin. */
  223.