119304Speter/*-
219304Speter * Copyright (c) 1991, 1993, 1994
319304Speter *	The Regents of the University of California.  All rights reserved.
419304Speter * Copyright (c) 1991, 1993, 1994, 1995, 1996
519304Speter *	Keith Bostic.  All rights reserved.
619304Speter *
719304Speter * See the LICENSE file for redistribution information.
819304Speter *
9254225Speter *	$Id: cut.h,v 10.10 2012/02/11 15:52:33 zy Exp $
1019304Speter */
1119304Speter
1219304Spetertypedef struct _texth TEXTH;		/* TEXT list head structure. */
13254225SpeterTAILQ_HEAD(_texth, _text);
1419304Speter
1519304Speter/* Cut buffers. */
1619304Speterstruct _cb {
17254225Speter	SLIST_ENTRY(_cb) q;		/* Linked list of cut buffers. */
18254225Speter	TEXTH	 textq[1];		/* Linked list of TEXT structures. */
19254225Speter	/* XXXX Needed ? Can non ascii-chars be cut buffer names ? */
2019304Speter	CHAR_T	 name;			/* Cut buffer name. */
2119304Speter	size_t	 len;			/* Total length of cut text. */
2219304Speter
2319304Speter#define	CB_LMODE	0x01		/* Cut was in line mode. */
2419304Speter	u_int8_t flags;
2519304Speter};
2619304Speter
2719304Speter/* Lines/blocks of text. */
2819304Speterstruct _text {				/* Text: a linked list of lines. */
29254225Speter	TAILQ_ENTRY(_text) q;		/* Linked list of text structures. */
30254225Speter	CHAR_T	*lb;			/* Line buffer. */
3119304Speter	size_t	 lb_len;		/* Line buffer length. */
3219304Speter	size_t	 len;			/* Line length. */
3319304Speter
3419304Speter	/* These fields are used by the vi text input routine. */
3519304Speter	recno_t	 lno;			/* 1-N: file line. */
36254225Speter
37254225Speter#define	ENTIRE_LINE	((size_t)-1)	/* cno: end of the line. */
3819304Speter	size_t	 cno;			/* 0-N: file character in line. */
3919304Speter	size_t	 ai;			/* 0-N: autoindent bytes. */
4019304Speter	size_t	 insert;		/* 0-N: bytes to insert (push). */
4119304Speter	size_t	 offset;		/* 0-N: initial, unerasable chars. */
4219304Speter	size_t	 owrite;		/* 0-N: chars to overwrite. */
4319304Speter	size_t	 R_erase;		/* 0-N: 'R' erase count. */
4419304Speter	size_t	 sv_cno;		/* 0-N: Saved line cursor. */
4519304Speter	size_t	 sv_len;		/* 0-N: Saved line length. */
4619304Speter
4719304Speter	/*
4819304Speter	 * These fields returns information from the vi text input routine.
4919304Speter	 *
5019304Speter	 * The termination condition.  Note, this field is only valid if the
5119304Speter	 * text input routine returns success.
5219304Speter	 *	TERM_BS:	User backspaced over the prompt.
5319304Speter	 *	TERM_CEDIT:	User entered <edit-char>.
5419304Speter	 *	TERM_CR:	User entered <carriage-return>; no data.
5519304Speter	 *	TERM_ESC:	User entered <escape>; no data.
5619304Speter	 *	TERM_OK:	Data available.
5719304Speter	 *	TERM_SEARCH:	Incremental search.
5819304Speter	 */
5919304Speter	enum {
6019304Speter	    TERM_BS, TERM_CEDIT, TERM_CR, TERM_ESC, TERM_OK, TERM_SEARCH
6119304Speter	} term;
6219304Speter};
6319304Speter
6419304Speter/*
6519304Speter * Get named buffer 'name'.
6619304Speter * Translate upper-case buffer names to lower-case buffer names.
6719304Speter */
6819304Speter#define	CBNAME(sp, cbp, nch) {						\
6919304Speter	CHAR_T L__name;							\
7019304Speter	L__name = isupper(nch) ? tolower(nch) : (nch);			\
71254225Speter	SLIST_FOREACH(cbp, sp->gp->cutq, q)				\
7219304Speter		if (cbp->name == L__name)				\
7319304Speter			break;						\
7419304Speter}
7519304Speter
7619304Speter/* Flags to the cut() routine. */
7719304Speter#define	CUT_LINEMODE	0x01		/* Cut in line mode. */
7819304Speter#define	CUT_NUMOPT	0x02		/* Numeric buffer: optional. */
7919304Speter#define	CUT_NUMREQ	0x04		/* Numeric buffer: required. */
80