home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Spezial / SPEZIAL2_97.zip / SPEZIAL2_97.iso / ANWEND / EDITOR / NVI179B / NVI179B.ZIP / ex / ex.h < prev    next >
C/C++ Source or Header  |  1996-08-12  |  9KB  |  229 lines

  1. /*-
  2.  * Copyright (c) 1992, 1993, 1994
  3.  *    The Regents of the University of California.  All rights reserved.
  4.  * Copyright (c) 1992, 1993, 1994, 1995, 1996
  5.  *    Keith Bostic.  All rights reserved.
  6.  *
  7.  * See the LICENSE file for redistribution information.
  8.  *
  9.  *    @(#)ex.h    10.24 (Berkeley) 8/12/96
  10.  */
  11.  
  12. #define    PROMPTCHAR    ':'        /* Prompt using a colon. */
  13.  
  14. typedef struct _excmdlist {        /* Ex command table structure. */
  15.     char *name;            /* Command name, underlying function. */
  16.     int (*fn) __P((SCR *, EXCMD *));
  17.  
  18. #define    E_ADDR1        0x00000001    /* One address. */
  19. #define    E_ADDR2        0x00000002    /* Two addresses. */
  20. #define    E_ADDR2_ALL    0x00000004    /* Zero/two addresses; zero == all. */
  21. #define    E_ADDR2_NONE    0x00000008    /* Zero/two addresses; zero == none. */
  22. #define    E_ADDR_ZERO    0x00000010    /* 0 is a legal addr1. */
  23. #define    E_ADDR_ZERODEF    0x00000020    /* 0 is default addr1 of empty files. */
  24. #define    E_AUTOPRINT    0x00000040    /* Command always sets autoprint. */
  25. #define    E_CLRFLAG    0x00000080    /* Clear the print (#, l, p) flags. */
  26. #define    E_NEWSCREEN    0x00000100    /* Create a new screen. */
  27. #define    E_SECURE    0x00000200    /* Permission denied if O_SECURE set. */
  28. #define    E_VIONLY    0x00000400    /* Meaningful only in vi. */
  29. #define    __INUSE1    0xfffff800    /* Same name space as EX_PRIVATE. */
  30.     u_int16_t flags;
  31.  
  32.     char *syntax;            /* Syntax script. */
  33.     char *usage;            /* Usage line. */
  34.     char *help;            /* Help line. */
  35. } EXCMDLIST;
  36.  
  37. #define    MAXCMDNAMELEN    12        /* Longest command name. */
  38. extern EXCMDLIST const cmds[];        /* Table of ex commands. */
  39.  
  40. /*
  41.  * !!!
  42.  * QUOTING NOTE:
  43.  *
  44.  * Historically, .exrc files and EXINIT variables could only use ^V as an
  45.  * escape character, neither ^Q or a user specified character worked.  We
  46.  * enforce that here, just in case someone depends on it.
  47.  */
  48. #define    IS_ESCAPE(sp, cmdp, ch)                        \
  49.     (F_ISSET(cmdp, E_VLITONLY) ?                    \
  50.         (ch) == CH_LITERAL : KEY_VAL(sp, ch) == K_VLNEXT)
  51.  
  52. /*
  53.  * File state must be checked for each command -- any ex command may be entered
  54.  * at any time, and most of them won't work well if a file hasn't yet been read
  55.  * in.  Historic vi generally took the easy way out and dropped core.
  56.  */
  57. #define    NEEDFILE(sp, cmdp) {                        \
  58.     if ((sp)->ep == NULL) {                        \
  59.         ex_emsg(sp, (cmdp)->cmd->name, EXM_NOFILEYET);        \
  60.         return (1);                        \
  61.     }                                \
  62. }
  63.  
  64. /* Range structures for global and @ commands. */
  65. typedef struct _range RANGE;
  66. struct _range {                /* Global command range. */
  67.     CIRCLEQ_ENTRY(_range) q;    /* Linked list of ranges. */
  68.     recno_t start, stop;        /* Start/stop of the range. */
  69. };
  70.  
  71. /* Ex command structure. */
  72. struct _excmd {
  73.     LIST_ENTRY(_excmd) q;        /* Linked list of commands. */
  74.  
  75.     char     *if_name;        /* Associated file. */
  76.     recno_t      if_lno;        /* Associated line number. */
  77.  
  78.     /* Clear the structure for the ex parser. */
  79. #define    CLEAR_EX_PARSER(cmdp)                        \
  80.     memset(&((cmdp)->cp), 0, ((char *)&(cmdp)->flags -        \
  81.         (char *)&((cmdp)->cp)) + sizeof((cmdp)->flags))
  82.  
  83.     char     *cp;            /* Current command text. */
  84.     size_t      clen;            /* Current command length. */
  85.  
  86.     char     *save_cmd;        /* Remaining command. */
  87.     size_t      save_cmdlen;        /* Remaining command length. */
  88.  
  89.     EXCMDLIST const *cmd;        /* Command: entry in command table. */
  90.     EXCMDLIST rcmd;            /* Command: table entry/replacement. */
  91.  
  92.     CIRCLEQ_HEAD(_rh, _range) rq;    /* @/global range: linked list. */
  93.     recno_t   range_lno;        /* @/global range: set line number. */
  94.     char     *o_cp;            /* Original @/global command. */
  95.     size_t      o_clen;        /* Original @/global command length. */
  96. #define    AGV_AT        0x01        /* @ buffer execution. */
  97. #define    AGV_AT_NORANGE    0x02        /* @ buffer execution without range. */
  98. #define    AGV_GLOBAL    0x04        /* global command. */
  99. #define    AGV_V        0x08        /* v command. */
  100. #define    AGV_ALL        (AGV_AT | AGV_AT_NORANGE | AGV_GLOBAL | AGV_V)
  101.     u_int8_t  agv_flags;
  102.  
  103.     /* Clear the structure before each ex command. */
  104. #define    CLEAR_EX_CMD(cmdp) {                        \
  105.     u_int32_t L__f = F_ISSET(cmdp, E_PRESERVE);            \
  106.     memset(&((cmdp)->buffer), 0, ((char *)&(cmdp)->flags -        \
  107.         (char *)&((cmdp)->buffer)) + sizeof((cmdp)->flags));    \
  108.     F_SET(cmdp, L__f);                        \
  109. }
  110.  
  111.     CHAR_T      buffer;        /* Command: named buffer. */
  112.     recno_t      lineno;        /* Command: line number. */
  113.     long      count;        /* Command: signed count. */
  114.     long      flagoff;        /* Command: signed flag offset. */
  115.     int      addrcnt;        /* Command: addresses (0, 1 or 2). */
  116.     MARK      addr1;        /* Command: 1st address. */
  117.     MARK      addr2;        /* Command: 2nd address. */
  118.     ARGS    **argv;            /* Command: array of arguments. */
  119.     int      argc;            /* Command: count of arguments. */
  120.  
  121. #define    E_C_BUFFER    0x00001        /* Buffer name specified. */
  122. #define    E_C_CARAT    0x00002        /*  ^ flag. */
  123. #define    E_C_COUNT    0x00004        /* Count specified. */
  124. #define    E_C_COUNT_NEG    0x00008        /* Count was signed negative. */
  125. #define    E_C_COUNT_POS    0x00010        /* Count was signed positive. */
  126. #define    E_C_DASH    0x00020        /*  - flag. */
  127. #define    E_C_DOT        0x00040        /*  . flag. */
  128. #define    E_C_EQUAL    0x00080        /*  = flag. */
  129. #define    E_C_FORCE    0x00100        /*  ! flag. */
  130. #define    E_C_HASH    0x00200        /*  # flag. */
  131. #define    E_C_LIST    0x00400        /*  l flag. */
  132. #define    E_C_PLUS    0x00800        /*  + flag. */
  133. #define    E_C_PRINT    0x01000        /*  p flag. */
  134.     u_int16_t iflags;        /* User input information. */
  135.  
  136. #define    __INUSE2    0x000004ff    /* Same name space as EXCMDLIST. */
  137. #define    E_BLIGNORE    0x00000800    /* Ignore blank lines. */
  138. #define    E_NAMEDISCARD    0x00001000    /* Free/discard the name. */
  139. #define    E_NOAUTO    0x00002000    /* Don't do autoprint output. */
  140. #define    E_NOPRDEF    0x00004000    /* Don't print as default. */
  141. #define    E_NRSEP        0x00008000    /* Need to line adjust ex output. */
  142. #define    E_OPTNUM    0x00010000    /* Number edit option affected. */
  143. #define    E_VLITONLY    0x00020000    /* Use ^V quoting only. */
  144. #define    E_PRESERVE    0x0003f800    /* Bits to preserve across commands. */
  145.  
  146. #define    E_ABSMARK    0x00040000    /* Set the absolute mark. */
  147. #define    E_ADDR_DEF    0x00080000    /* Default addresses used. */
  148. #define    E_DELTA        0x00100000    /* Search address with delta. */
  149. #define    E_MODIFY    0x00200000    /* File name expansion modified arg. */
  150. #define    E_MOVETOEND    0x00400000    /* Move to the end of the file first. */
  151. #define    E_NEWLINE    0x00800000    /* Found ending <newline>. */
  152. #define    E_SEARCH_WMSG    0x01000000    /* Display search-wrapped message. */
  153. #define    E_USELASTCMD    0x02000000    /* Use the last command. */
  154. #define    E_VISEARCH    0x04000000    /* It's really a vi search command. */
  155.     u_int32_t flags;        /* Current flags. */
  156. };
  157.  
  158. /* Ex private, per-screen memory. */
  159. typedef struct _ex_private {
  160.     CIRCLEQ_HEAD(_tqh, _tagq) tq;    /* Tag queue. */
  161.     TAILQ_HEAD(_tagfh, _tagf) tagfq;/* Tag file list. */
  162.     LIST_HEAD(_csch, _csc) cscq;    /* Cscope connection list. */
  163.     char    *tag_last;        /* Saved last tag string. */
  164.  
  165.     CHAR_T    *lastbcomm;        /* Last bang command. */
  166.  
  167.     ARGS   **args;            /* Command: argument list. */
  168.     int     argscnt;        /* Command: argument list count. */
  169.     int     argsoff;        /* Command: offset into arguments. */
  170.  
  171.     u_int32_t fdef;            /* Saved E_C_* default command flags. */
  172.  
  173.     char    *ibp;            /* File line input buffer. */
  174.     size_t     ibp_len;        /* File line input buffer length. */
  175.  
  176.     /*
  177.      * Buffers for the ex output.  The screen/vi support doesn't do any
  178.      * character buffering of any kind.  We do it here so that we're not
  179.      * calling the screen output routines on every character.
  180.      *
  181.      * XXX
  182.      * Change to grow dynamically.
  183.      */
  184.     char     obp[1024];        /* Ex output buffer. */
  185.     size_t     obp_len;        /* Ex output buffer length. */
  186.  
  187. #define    EXP_CSCINIT    0x01        /* Cscope initialized. */
  188.     u_int8_t flags;
  189. } EX_PRIVATE;
  190. #define    EXP(sp)    ((EX_PRIVATE *)((sp)->ex_private))
  191.  
  192. /*
  193.  * Filter actions:
  194.  *
  195.  *    FILTER_BANG    !:    filter text through the utility.
  196.  *    FILTER_RBANG    !:    read from the utility (without stdin).
  197.  *    FILTER_READ    read:    read from the utility (with stdin).
  198.  *    FILTER_WRITE    write:    write to the utility, display its output.
  199.  */
  200. enum filtertype { FILTER_BANG, FILTER_RBANG, FILTER_READ, FILTER_WRITE };
  201.  
  202. /* Ex common error messages. */
  203. typedef enum {
  204.     EXM_EMPTYBUF,            /* Empty buffer. */
  205.     EXM_FILECOUNT,            /* Too many file names. */
  206.     EXM_NOCANON,            /* No terminal interface. */
  207.     EXM_NOCANON_F,            /* EXM_NOCANO: filter version. */
  208.     EXM_NOFILEYET,            /* Illegal until a file read in. */
  209.     EXM_NOPREVBUF,            /* No previous buffer specified. */
  210.     EXM_NOPREVRE,            /* No previous RE specified. */
  211.     EXM_NOSUSPEND,            /* No suspension. */
  212.     EXM_SECURE,            /* Illegal if secure edit option set. */
  213.     EXM_SECURE_F,            /* EXM_SECURE: filter version */
  214.     EXM_USAGE            /* Standard usage message. */
  215. } exm_t;
  216.  
  217. /* Ex address error types. */
  218. enum badaddr { A_COMBO, A_EMPTY, A_EOF, A_NOTSET, A_ZERO };
  219.  
  220. /* Ex common tag error messages. */                                         
  221. typedef enum {
  222.     TAG_BADLNO,        /* Tag line doesn't exist. */
  223.     TAG_EMPTY,        /* Tags stack is empty. */
  224.     TAG_SEARCH        /* Tags search pattern wasn't found. */
  225. } tagmsg_t;
  226.  
  227. #include "ex_def.h"
  228. #include "ex_extern.h"
  229.