home *** CD-ROM | disk | FTP | other *** search
/ rtsi.com / 2014.01.www.rtsi.com.tar / www.rtsi.com / OS9 / OSK / APPS / elvis_1.4.tar.Z / elvis_1.4.tar / vi.h < prev    next >
C/C++ Source or Header  |  1990-12-06  |  18KB  |  518 lines

  1. /* vi.h */
  2.  
  3. /* Author:
  4.  *    Steve Kirkendall
  5.  *    14407 SW Teal Blvd. #C
  6.  *    Beaverton, OR 97005
  7.  *    kirkenda@cs.pdx.edu
  8.  */
  9.  
  10.  
  11. /* This is the header file for my version of vi. */
  12.  
  13. #define VERSION "ELVIS 1.4, by Steve Kirkendall"
  14. #define COPYING    "This version of ELVIS is freely redistributable."
  15.  
  16. #include <errno.h>
  17. extern int errno;
  18. #if TOS
  19. #define ENOENT (-AEFILNF)
  20. #endif
  21.  
  22. #if TOS
  23. # include <types.h>
  24. # define O_RDONLY    0
  25. # define O_WRONLY    1
  26. # define O_RDWR        2
  27. #else
  28. # if OSK
  29. #  include <modes.h>
  30. #  define O_RDONLY    S_IREAD
  31. #  define O_WRONLY    S_IWRITE
  32. #  define O_RDWR    (S_IREAD | S_IWRITE)
  33. #  define ENOENT    E_PNNF
  34. # else
  35. #  include <sys/types.h>
  36. #  if COHERENT
  37. #   include <sys/fcntl.h>
  38. #  else
  39. #   include <fcntl.h>
  40. #  endif
  41. # endif
  42. #endif
  43.  
  44. #ifndef O_BINARY
  45. # define O_BINARY    0
  46. #endif
  47.  
  48. #include "curses.h"
  49.  
  50. /*------------------------------------------------------------------------*/
  51. /* Miscellaneous constants.                          */
  52.  
  53. #define INFINITY    2000000001L    /* a very large integer */
  54. #define LONGKEY        10        /* longest possible raw :map key */
  55. #ifndef MAXRCLEN
  56. # define MAXRCLEN    1000        /* longest possible .exrc file */
  57. #endif
  58.  
  59. /*------------------------------------------------------------------------*/
  60. /* These describe how temporary files are divided into blocks             */
  61.  
  62. #define BLKSIZE    1024        /* size of blocks */
  63. #define MAXBLKS    (BLKSIZE / sizeof(unsigned short))
  64. typedef union
  65. {
  66.     char        c[BLKSIZE];    /* for text blocks */
  67.     unsigned short    n[MAXBLKS];    /* for the header block */
  68. }
  69.     BLK;
  70.  
  71. /*------------------------------------------------------------------------*/
  72. /* These are used manipulate BLK buffers.                                 */
  73.  
  74. extern BLK    hdr;        /* buffer for the header block */
  75. extern BLK    *blkget();    /* given index into hdr.c[], reads block */
  76. extern BLK    *blkadd();    /* inserts a new block into hdr.c[] */
  77.  
  78. /*------------------------------------------------------------------------*/
  79. /* These are used to keep track of various flags                          */
  80. extern struct _viflags
  81. {
  82.     short    file;        /* file flags */
  83. }
  84.     viflags;
  85.  
  86. /* file flags */
  87. #define NEWFILE        0x0001    /* the file was just created */
  88. #define READONLY    0x0002    /* the file is read-only */
  89. #define HADNUL        0x0004    /* the file contained NUL characters */
  90. #define MODIFIED    0x0008    /* the file has been modified */
  91. #define NOFILE        0x0010    /* no name is known for the current text */
  92. #define ADDEDNL        0x0020    /* newlines were added to the file */
  93.  
  94. /* macros used to set/clear/test flags */
  95. #define setflag(x,y)    viflags.x |= y
  96. #define clrflag(x,y)    viflags.x &= ~y
  97. #define tstflag(x,y)    (viflags.x & y)
  98. #define initflags()    viflags.file = 0;
  99.  
  100. /* The options */
  101. extern char    o_autoindent[1];
  102. extern char    o_autoprint[1];
  103. extern char    o_autowrite[1];
  104. #ifndef NO_ERRLIST
  105. extern char    o_cc[30];
  106. #endif
  107. #ifndef NO_CHARATTR
  108. extern char    o_charattr[1];
  109. #endif
  110. extern char    o_columns[3];
  111. extern char    o_digraph[1];
  112. extern char    o_directory[30];
  113. extern char    o_edcompatible[1];
  114. extern char    o_errorbells[1];
  115. extern char    o_exrefresh[1];
  116. #ifndef NO_DIGRAPH
  117. extern char    o_flipcase[80];
  118. #endif
  119. #ifndef NO_SENTENCE
  120. extern char    o_hideformat[1];
  121. #endif
  122. extern char    o_ignorecase[1];
  123. #ifndef NO_EXTENSIONS
  124. extern char    o_inputmode[1];
  125. #endif
  126. extern char    o_keytime[3];
  127. extern char    o_keywordprg[80];
  128. extern char    o_lines[3];
  129. extern char    o_list[1];
  130. #ifndef NO_MAGIC
  131. extern char    o_magic[1];
  132. #endif
  133. #ifndef NO_ERRLIST
  134. extern char    o_make[30];
  135. #endif
  136. #ifndef NO_MODELINE
  137. extern char    o_modeline[1];
  138. #endif
  139. #ifndef NO_SENTENCE
  140. extern char    o_paragraphs[30];
  141. #endif
  142. #if MSDOS
  143. extern char    o_pcbios[1];
  144. #endif
  145. extern char    o_readonly[1];
  146. extern char    o_report[3];
  147. extern char    o_scroll[3];
  148. #ifndef NO_SENTENCE
  149. extern char    o_sections[30];
  150. #endif
  151. extern char    o_shell[60];
  152. #ifndef NO_SHOWMATCH
  153. extern char    o_showmatch[1];
  154. #endif
  155. #ifndef NO_SHOWMODE
  156. extern char    o_smd[1];
  157. #endif
  158. extern char    o_shiftwidth[3];
  159. extern char    o_sidescroll[3];
  160. extern char    o_sync[1];
  161. extern char    o_tabstop[3];
  162. extern char    o_term[30];
  163. extern char    o_vbell[1];
  164. extern char    o_warn[1];
  165. extern char    o_wrapmargin[3];
  166. extern char    o_wrapscan[1];
  167.  
  168. /*------------------------------------------------------------------------*/
  169. /* These help support the single-line multi-change "undo" -- shift-U      */
  170.  
  171. extern char    U_text[BLKSIZE];
  172. extern long    U_line;
  173.  
  174. /*------------------------------------------------------------------------*/
  175. /* These are used to refer to places in the text               */
  176.  
  177. typedef long    MARK;
  178. #define markline(x)    (long)((x) / BLKSIZE)
  179. #define markidx(x)    (int)((x) & (BLKSIZE - 1))
  180. #define MARK_UNSET    ((MARK)0)
  181. #define MARK_FIRST    ((MARK)BLKSIZE)
  182. #define MARK_LAST    ((MARK)(nlines * BLKSIZE))
  183. #define MARK_AT_LINE(x)    ((MARK)((x) * BLKSIZE))
  184.  
  185. #define NMARKS    29
  186. extern MARK    mark[NMARKS];    /* marks a-z, plus mark ' and two temps */
  187. extern MARK    cursor;        /* mark where line is */
  188.  
  189. /*------------------------------------------------------------------------*/
  190. /* These are used to keep track of the current & previous files.      */
  191.  
  192. extern long    origtime;    /* modification date&time of the current file */
  193. extern char    origname[256];    /* name of the current file */
  194. extern char    prevorig[256];    /* name of the preceding file */
  195. extern long    prevline;    /* line number from preceding file */
  196.  
  197. /*------------------------------------------------------------------------*/
  198. /* misc housekeeping variables & functions                  */
  199.  
  200. extern int    tmpfd;        /* fd used to access the tmp file */
  201. extern long    lnum[MAXBLKS];    /* last line# of each block */
  202. extern long    nlines;        /* number of lines in the file */
  203. extern char    args[BLKSIZE];    /* file names given on the command line */
  204. extern int    argno;        /* the current element of args[] */
  205. extern int    nargs;        /* number of filenames in args */
  206. extern long    changes;    /* counts changes, to prohibit short-cuts */
  207. extern int    significant;    /* boolean: was a *REAL* change made? */
  208. extern int    mustredraw;    /* boolean: force total redraw of screen? */
  209. extern BLK    tmpblk;        /* a block used to accumulate changes */
  210. extern long    topline;    /* file line number of top line */
  211. extern int    leftcol;    /* column number of left col */
  212. #define        botline     (topline + LINES - 2)
  213. #define        rightcol (leftcol + COLS - 1)
  214. extern int    physcol;    /* physical column number that cursor is on */
  215. extern int    physrow;    /* physical row number that cursor is on */
  216. extern int    exwrote;    /* used to detect verbose ex commands */
  217. extern int    doingdot;    /* boolean: are we doing the "." command? */
  218. extern int    doingglobal;    /* boolean: are doing a ":g" command? */
  219. extern long    rptlines;    /* number of lines affected by a command */
  220. extern char    *rptlabel;    /* description of how lines were affected */
  221. extern char    *fetchline();    /* read a given line from tmp file */
  222. extern char    *parseptrn();    /* isolate a regexp in a line */
  223. extern MARK    paste();    /* paste from cut buffer to a given point */
  224. extern char    *wildcard();    /* expand wildcards in filenames */
  225. extern MARK    input();    /* inserts characters from keyboard */
  226. extern char    *linespec();    /* finds the end of a /regexp/ string */
  227. #define        ctrl(ch) ((ch)&037)
  228. #ifndef NO_RECYCLE
  229. extern long    allocate();    /* allocate a free block of the tmp file */
  230. #endif
  231. extern int    trapint();    /* trap handler for SIGINT */
  232. extern void    blkdirty();    /* marks a block as being "dirty" */
  233. extern void    blkflush();    /* writes a single dirty block to the disk */
  234. extern void    blksync();    /* forces all "dirty" blocks to disk */
  235. extern void    blkinit();    /* resets the block cache to "empty" state */
  236. extern void    beep();        /* rings the terminal's bell */
  237. extern void    exrefresh();    /* writes text to the screen */
  238. extern void    msg();        /* writes a printf-style message to the screen */
  239. extern void    reset_msg();    /* resets the "manymsgs" flag */
  240. extern void    endmsgs();    /* if "manymsgs" is set, then scroll up 1 line */
  241. extern void    garbage();    /* reclaims any garbage blocks */
  242. extern void    redraw();    /* updates the screen after a change */
  243. extern void    resume_curses();/* puts the terminal in "cbreak" mode */
  244. extern void    beforedo();    /* saves current revision before a new change */
  245. extern void    afterdo();    /* marks end of a beforedo() change */
  246. extern void    abortdo();    /* like "afterdo()" followed by "undo()" */
  247. extern int    undo();        /* restores file to previous undo() */
  248. extern void    dumpkey();    /* lists key mappings to the screen */
  249. extern void    mapkey();    /* defines a new key mapping */
  250. extern void    savekeys();    /* lists key mappings to a file */
  251. extern void    redrawrange();    /* records clues from modify.c */
  252. extern void    cut();        /* saves text in a cut buffer */
  253. extern void    delete();    /* deletes text */
  254. extern void    add();        /* adds text */
  255. extern void    change();    /* deletes text, and then adds other text */
  256. extern void    cutswitch();    /* updates cut buffers when we switch files */
  257. extern void    do_abbr();    /* defines or lists abbreviations */
  258. extern void    do_digraph();    /* defines or lists digraphs */
  259. extern void    exstring();    /* execute a string as EX commands */
  260. extern void    dumpopts();
  261. extern void    setopts();
  262. extern void    saveopts();
  263. #ifndef NO_DIGRAPH
  264. extern void    savedigs();
  265. #endif
  266. #ifndef NO_ABBR
  267. extern void    saveabbr();
  268. #endif
  269. extern void    cutname();
  270. extern void    cutname();
  271. extern void    initopts();
  272. extern void    cutend();
  273.  
  274. /*------------------------------------------------------------------------*/
  275. /* macros that are used as control structures                             */
  276.  
  277. #define BeforeAfter(before, after) for((before),bavar=1;bavar;(after),bavar=0)
  278. #define ChangeText    BeforeAfter(beforedo(FALSE),afterdo())
  279.  
  280. extern int    bavar;        /* used only in BeforeAfter macros */
  281.  
  282. /*------------------------------------------------------------------------*/
  283. /* These are the movement commands.  Each accepts a mark for the starting */
  284. /* location & number and returns a mark for the destination.          */
  285.  
  286. extern MARK    m_updnto();        /* k j G */
  287. extern MARK    m_right();        /* h */
  288. extern MARK    m_left();        /* l */
  289. extern MARK    m_tocol();        /* | */
  290. extern MARK    m_front();        /* ^ */
  291. extern MARK    m_rear();        /* $ */
  292. extern MARK    m_fword();        /* w */
  293. extern MARK    m_bword();        /* b */
  294. extern MARK    m_eword();        /* e */
  295. extern MARK    m_fWord();        /* W */
  296. extern MARK    m_bWord();        /* B */
  297. extern MARK    m_eWord();        /* E */
  298. extern MARK    m_fparagraph();        /* } */
  299. extern MARK    m_bparagraph();        /* { */
  300. extern MARK    m_fsection();        /* ]] */
  301. extern MARK    m_bsection();        /* [[ */
  302. extern MARK    m_match();        /* % */
  303. #ifndef NO_SENTENCE
  304.  extern MARK    m_fsentence();        /* ) */
  305.  extern MARK    m_bsentence();        /* ( */
  306. #endif
  307. extern MARK    m_tomark();        /* 'm */
  308. extern MARK    m_nsrch();        /* n */
  309. extern MARK    m_Nsrch();        /* N */
  310. extern MARK    m_fsrch();        /* /regexp */
  311. extern MARK    m_bsrch();        /* ?regexp */
  312. #ifndef NO_CHARSEARCH
  313.  extern MARK    m__ch();        /* ; , */
  314.  extern MARK    m_fch();        /* f */
  315.  extern MARK    m_tch();        /* t */
  316.  extern MARK    m_Fch();        /* F */
  317.  extern MARK    m_Tch();        /* T */
  318. #endif
  319. extern MARK    m_row();        /* H L M */
  320. extern MARK    m_z();            /* z */
  321. extern MARK    m_scroll();        /* ^B ^F ^E ^Y ^U ^D */
  322.  
  323. /* Some stuff that is used by movement functions... */
  324.  
  325. extern MARK    adjmove();        /* a helper fn, used by move fns */
  326.  
  327. /* This macro is used to set the default value of cnt */
  328. #define DEFAULT(val)    if (cnt < 1) cnt = (val)
  329.  
  330. /* These are used to minimize calls to fetchline() */
  331. extern int    plen;    /* length of the line */
  332. extern long    pline;    /* line number that len refers to */
  333. extern long    pchgs;    /* "changes" level that len refers to */
  334. extern char    *ptext;    /* text of previous line, if valid */
  335. extern void    pfetch();
  336. extern char    digraph();
  337.  
  338. /* This is used to build a MARK that corresponds to a specific point in the
  339.  * line that was most recently pfetch'ed.
  340.  */
  341. #define buildmark(text)    (MARK)(BLKSIZE * pline + (int)((text) - ptext))
  342.  
  343.  
  344. /*------------------------------------------------------------------------*/
  345. /* These are used to handle EX commands.                  */
  346.  
  347. #define  CMD_NULL    0    /* NOT A VALID COMMAND */
  348. #define  CMD_ABBR    1    /* "define an abbreviation" */
  349. #define  CMD_ARGS    2    /* "show me the args" */
  350. #define  CMD_APPEND    3    /* "insert lines after this line" */
  351. #define  CMD_AT        4    /* "execute a cut buffer's contents via EX" */
  352. #define  CMD_BANG    5    /* "run a single shell command" */
  353. #define  CMD_CC        6    /* "run `cc` and then do CMD_ERRLIST" */
  354. #define  CMD_CD        7    /* "change directories" */
  355. #define  CMD_CHANGE    8    /* "change some lines" */
  356. #define  CMD_COPY    9    /* "copy the selected text to a given place" */
  357. #define  CMD_DELETE    10    /* "delete the selected text" */
  358. #define  CMD_DIGRAPH    11    /* "add a digraph, or display them all" */
  359. #define  CMD_EDIT    12    /* "switch to a different file" */
  360. #define  CMD_EQUAL    13    /* "display a line number" */
  361. #define  CMD_ERRLIST    14    /* "locate the next error in a list" */
  362. #define  CMD_FILE    15    /* "show the file's status" */
  363. #define  CMD_GLOBAL    16    /* "globally search & do a command" */
  364. #define  CMD_INSERT    17    /* "insert lines before the current line" */
  365. #define  CMD_JOIN    18    /* "join the selected line & the one after" */
  366. #define  CMD_LIST    19    /* "print lines, making control chars visible" */
  367. #define  CMD_MAKE    20    /* "run `make` and then do CMD_ERRLIST" */
  368. #define  CMD_MAP    21    /* "adjust the keyboard map" */
  369. #define  CMD_MARK    22    /* "mark this line" */
  370. #define  CMD_MKEXRC    23    /* "make a .exrc file" */
  371. #define  CMD_MOVE    24    /* "move the selected text to a given place" */
  372. #define  CMD_NEXT    25    /* "switch to next file in args" */
  373. #define  CMD_NUMBER    26    /* "print lines from the file w/ line numbers" */
  374. #define  CMD_PRESERVE    27    /* "act as though vi crashed" */
  375. #define  CMD_PREVIOUS    28    /* "switch to the previous file in args" */
  376. #define  CMD_PRINT    29    /* "print the selected text" */
  377. #define  CMD_PUT    30    /* "insert any cut lines before this line" */
  378. #define  CMD_QUIT    31    /* "quit without writing the file" */
  379. #define  CMD_READ    32    /* "append the given file after this line */
  380. #define  CMD_RECOVER    33    /* "recover file after vi crashes" - USE -r FLAG */
  381. #define  CMD_REWIND    34    /* "rewind to first file" */
  382. #define  CMD_SET    35    /* "set a variable's value" */
  383. #define  CMD_SHELL    36    /* "run some lines through a command" */
  384. #define  CMD_SHIFTL    37    /* "shift lines left" */
  385. #define  CMD_SHIFTR    38    /* "shift lines right" */
  386. #define  CMD_SOURCE    39    /* "interpret a file's contents as ex commands" */
  387. #define  CMD_STOP    40    /* same as CMD_SUSPEND */
  388. #define  CMD_SUBAGAIN    41    /* "repeat the previous substitution" */
  389. #define  CMD_SUBSTITUTE    42    /* "substitute text in this line" */
  390. #define  CMD_SUSPEND    43    /* "suspend the vi session" */
  391. #define  CMD_TR        44    /* "transliterate chars in the selected lines" */
  392. #define  CMD_TAG    45    /* "go to a particular tag" */
  393. #define  CMD_UNABBR    46    /* "remove an abbreviation definition" */
  394. #define  CMD_UNDO    47    /* "undo the previous command" */
  395. #define  CMD_UNMAP    48    /* "remove a key sequence map */
  396. #define  CMD_VERSION    49    /* "describe which version this is" */
  397. #define  CMD_VGLOBAL    50    /* "apply a cmd to lines NOT containing an RE" */
  398. #define  CMD_VISUAL    51    /* "go into visual mode" */
  399. #define  CMD_WQUIT    52    /* "write this file out (any case) & quit" */
  400. #define  CMD_WRITE    53    /* "write the selected(?) text to a given file" */
  401. #define  CMD_XIT    54    /* "write this file out (if modified) & quit" */
  402. #define  CMD_YANK    55    /* "copy the selected text into the cut buffer" */
  403. #ifdef DEBUG
  404. # define CMD_DEBUG    56    /* access to internal data structures */
  405. # define CMD_VALIDATE    57    /* check for internal consistency */
  406. #endif
  407. typedef int CMD;
  408.  
  409. extern void    ex();
  410. extern void    vi();
  411. extern void    doexcmd();
  412.  
  413. #ifndef NO_ABBR
  414. extern void    cmd_abbr();
  415. #endif
  416. extern void    cmd_append();
  417. extern void    cmd_args();
  418. #ifndef NO_AT
  419. extern void    cmd_at();
  420. #endif
  421. extern void    cmd_cd();
  422. extern void    cmd_delete();
  423. #ifndef NO_DIGRAPH
  424. extern void    cmd_digraph();
  425. #endif
  426. extern void    cmd_edit();
  427. #ifndef NO_ERRLIST
  428. extern void    cmd_errlist();
  429. #endif
  430. extern void    cmd_file();
  431. extern void    cmd_global();
  432. extern void    cmd_join();
  433. extern void    cmd_mark();
  434. #ifndef NO_ERRLIST
  435. extern void    cmd_make();
  436. #endif
  437. extern void    cmd_map();
  438. #ifndef NO_MKEXRC
  439. extern void    cmd_mkexrc();
  440. #endif
  441. extern void    cmd_next();
  442. extern void    cmd_print();
  443. extern void    cmd_put();
  444. extern void    cmd_read();
  445. extern void    cmd_set();
  446. extern void    cmd_shell();
  447. extern void    cmd_shift();
  448. extern void    cmd_source();
  449. extern void    cmd_substitute();
  450. extern void    cmd_tag();
  451. extern void    cmd_undo();
  452. extern void    cmd_version();
  453. extern void    cmd_visual();
  454. extern void    cmd_write();
  455. extern void    cmd_xit();
  456. extern void    cmd_move();
  457. #ifdef DEBUG
  458. extern void    cmd_debug();
  459. extern void    cmd_validate();
  460. #endif
  461.  
  462. /*----------------------------------------------------------------------*/
  463. /* These are used to handle VI commands                 */
  464.  
  465. extern MARK    v_1ex();    /* : */
  466. extern MARK    v_mark();    /* m */
  467. extern MARK    v_quit();    /* Q */
  468. extern MARK    v_redraw();    /* ^L ^R */
  469. extern MARK    v_ulcase();    /* ~ */
  470. extern MARK    v_undo();    /* u */
  471. extern MARK    v_xchar();    /* x */
  472. extern MARK    v_Xchar();    /* X */
  473. extern MARK    v_replace();    /* r */
  474. extern MARK    v_overtype();    /* R */
  475. extern MARK    v_selcut();    /* " */
  476. extern MARK    v_paste();    /* p P */
  477. extern MARK    v_yank();    /* y Y */
  478. extern MARK    v_delete();    /* d D */
  479. extern MARK    v_join();    /* J */
  480. extern MARK    v_insert();    /* a A i I o O */
  481. extern MARK    v_change();    /* c C */
  482. extern MARK    v_subst();    /* s */
  483. extern MARK    v_lshift();    /* < */
  484. extern MARK    v_rshift();    /* > */
  485. extern MARK    v_filter();    /* ! */
  486. extern MARK    v_status();    /* ^G */
  487. extern MARK    v_switch();    /* ^^ */
  488. extern MARK    v_tag();    /* ^] */
  489. extern MARK    v_xit();    /* ZZ */
  490. extern MARK    v_undoline();    /* U */
  491. extern MARK    v_again();    /* & */
  492. #ifndef NO_EXTENSIONS
  493.  extern MARK    v_keyword();    /* ^K */
  494.  extern MARK    v_increment();    /* * */
  495. #endif
  496. #ifndef NO_ERRLIST
  497.  extern MARK    v_errlist();    /* * */
  498. #endif
  499. #ifndef NO_AT
  500.  extern MARK    v_at();        /* @ */
  501. #endif
  502.  
  503. /*----------------------------------------------------------------------*/
  504. /* These describe what mode we're in */
  505.  
  506. #define MODE_EX        1    /* executing ex commands */
  507. #define    MODE_VI        2    /* executing vi commands */
  508. #define    MODE_COLON    3    /* executing an ex command from vi mode */
  509. #define    MODE_QUIT    4
  510. extern int    mode;
  511.  
  512. #define WHEN_VICMD    1    /* getkey: we're reading a VI command */
  513. #define WHEN_VIINP    2    /* getkey: we're in VI's INPUT mode */
  514. #define WHEN_VIREP    4    /* getkey: we're in VI's REPLACE mode */
  515. #define WHEN_EX        8    /* getkey: we're in EX mode */
  516. #define WHEN_MSG    16    /* getkey: we're at a "more" prompt */
  517. #define WHEN_INMV    256    /* in input mode, interpret the key in VICMD mode */
  518.