1b8ba871bSPeter Wemm /*- 2b8ba871bSPeter Wemm * Copyright (c) 1991, 1993, 1994 3b8ba871bSPeter Wemm * The Regents of the University of California. All rights reserved. 4b8ba871bSPeter Wemm * Copyright (c) 1991, 1993, 1994, 1995, 1996 5b8ba871bSPeter Wemm * Keith Bostic. All rights reserved. 6b8ba871bSPeter Wemm * 7b8ba871bSPeter Wemm * See the LICENSE file for redistribution information. 8b8ba871bSPeter Wemm */ 9b8ba871bSPeter Wemm 10b8ba871bSPeter Wemm typedef struct _texth TEXTH; /* TEXT list head structure. */ 11f0957ccaSPeter Wemm TAILQ_HEAD(_texth, _text); 12b8ba871bSPeter Wemm 13b8ba871bSPeter Wemm /* Cut buffers. */ 14b8ba871bSPeter Wemm struct _cb { 15f0957ccaSPeter Wemm SLIST_ENTRY(_cb) q; /* Linked list of cut buffers. */ 16f0957ccaSPeter Wemm TEXTH textq[1]; /* Linked list of TEXT structures. */ 17f0957ccaSPeter Wemm /* XXXX Needed ? Can non ascii-chars be cut buffer names ? */ 18b8ba871bSPeter Wemm CHAR_T name; /* Cut buffer name. */ 19b8ba871bSPeter Wemm size_t len; /* Total length of cut text. */ 20b8ba871bSPeter Wemm 21b8ba871bSPeter Wemm #define CB_LMODE 0x01 /* Cut was in line mode. */ 22b8ba871bSPeter Wemm u_int8_t flags; 23b8ba871bSPeter Wemm }; 24b8ba871bSPeter Wemm 25b8ba871bSPeter Wemm /* Lines/blocks of text. */ 26b8ba871bSPeter Wemm struct _text { /* Text: a linked list of lines. */ 27f0957ccaSPeter Wemm TAILQ_ENTRY(_text) q; /* Linked list of text structures. */ 28f0957ccaSPeter Wemm CHAR_T *lb; /* Line buffer. */ 29b8ba871bSPeter Wemm size_t lb_len; /* Line buffer length. */ 30b8ba871bSPeter Wemm size_t len; /* Line length. */ 31b8ba871bSPeter Wemm 32b8ba871bSPeter Wemm /* These fields are used by the vi text input routine. */ 33b8ba871bSPeter Wemm recno_t lno; /* 1-N: file line. */ 34f0957ccaSPeter Wemm 35f0957ccaSPeter Wemm #define ENTIRE_LINE ((size_t)-1) /* cno: end of the line. */ 36b8ba871bSPeter Wemm size_t cno; /* 0-N: file character in line. */ 37b8ba871bSPeter Wemm size_t ai; /* 0-N: autoindent bytes. */ 38b8ba871bSPeter Wemm size_t insert; /* 0-N: bytes to insert (push). */ 39b8ba871bSPeter Wemm size_t offset; /* 0-N: initial, unerasable chars. */ 40b8ba871bSPeter Wemm size_t owrite; /* 0-N: chars to overwrite. */ 41b8ba871bSPeter Wemm size_t R_erase; /* 0-N: 'R' erase count. */ 42b8ba871bSPeter Wemm size_t sv_cno; /* 0-N: Saved line cursor. */ 43b8ba871bSPeter Wemm size_t sv_len; /* 0-N: Saved line length. */ 44b8ba871bSPeter Wemm 45b8ba871bSPeter Wemm /* 46b8ba871bSPeter Wemm * These fields returns information from the vi text input routine. 47b8ba871bSPeter Wemm * 48b8ba871bSPeter Wemm * The termination condition. Note, this field is only valid if the 49b8ba871bSPeter Wemm * text input routine returns success. 50b8ba871bSPeter Wemm * TERM_BS: User backspaced over the prompt. 51b8ba871bSPeter Wemm * TERM_CEDIT: User entered <edit-char>. 52b8ba871bSPeter Wemm * TERM_CR: User entered <carriage-return>; no data. 53b8ba871bSPeter Wemm * TERM_ESC: User entered <escape>; no data. 54b8ba871bSPeter Wemm * TERM_OK: Data available. 55b8ba871bSPeter Wemm * TERM_SEARCH: Incremental search. 56b8ba871bSPeter Wemm */ 57b8ba871bSPeter Wemm enum { 58b8ba871bSPeter Wemm TERM_BS, TERM_CEDIT, TERM_CR, TERM_ESC, TERM_OK, TERM_SEARCH 59b8ba871bSPeter Wemm } term; 60b8ba871bSPeter Wemm }; 61b8ba871bSPeter Wemm 62b8ba871bSPeter Wemm /* 63b8ba871bSPeter Wemm * Get named buffer 'name'. 64b8ba871bSPeter Wemm * Translate upper-case buffer names to lower-case buffer names. 65b8ba871bSPeter Wemm */ 66*755cc40cSBaptiste Daroussin #define CBNAME(sp, cbp, nch) do { \ 67b8ba871bSPeter Wemm CHAR_T L__name; \ 68b8ba871bSPeter Wemm L__name = isupper(nch) ? tolower(nch) : (nch); \ 69f0957ccaSPeter Wemm SLIST_FOREACH(cbp, sp->gp->cutq, q) \ 70b8ba871bSPeter Wemm if (cbp->name == L__name) \ 71b8ba871bSPeter Wemm break; \ 72*755cc40cSBaptiste Daroussin } while (0) 73b8ba871bSPeter Wemm 74b8ba871bSPeter Wemm /* Flags to the cut() routine. */ 75b8ba871bSPeter Wemm #define CUT_LINEMODE 0x01 /* Cut in line mode. */ 76b8ba871bSPeter Wemm #define CUT_NUMOPT 0x02 /* Numeric buffer: optional. */ 77b8ba871bSPeter Wemm #define CUT_NUMREQ 0x04 /* Numeric buffer: required. */ 78