xref: /freebsd-src/contrib/nvi/common/cut.h (revision 755cc40c21ca63388c6a67ba848a908b429e9391)
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