STEVIE文本文件编缉器的C 语言源程序

源代码在线查看: mark.c

软件大小: 114 K
上传用户: SLing2008
关键词: STEVIE 语言 源程序
下载地址: 免注册下载 普通下载 VIP

相关代码

				/* $Header: /nw2/tony/src/stevie/src/RCS/mark.c,v 1.3 89/03/11 22:42:39 tony Exp $
				 *
				 * Routines to save and retrieve marks.
				 */
				
				#include "stevie.h"
				
				#define	NMARKS	10		/* max. # of marks that can be saved */
				
				struct	mark {
					char	name;
					LPTR	pos;
				};
				
				static	struct	mark	mlist[NMARKS];
				static	struct	mark	pcmark;		/* previous context mark */
				static	bool_t	pcvalid = FALSE;	/* true if pcmark is valid */
				
				/*
				 * setmark(c) - set mark 'c' at current cursor position
				 *
				 * Returns TRUE on success, FALSE if no room for mark or bad name given.
				 */
				bool_t
				setmark(c)
				register char	c;
				{
					register int	i;
				
					if (!isalpha(c))
						return FALSE;
				
					/*
					 * If there is already a mark of this name, then just use the
					 * existing mark entry.
					 */
					for (i=0; i < NMARKS ;i++) {
						if (mlist[i].name == c) {
							mlist[i].pos = *Curschar;
							return TRUE;
						}
					}
				
					/*
					 * There wasn't a mark of the given name, so find a free slot
					 */
					for (i=0; i < NMARKS ;i++) {
						if (mlist[i].name == NUL) {	/* got a free one */
							mlist[i].name = c;
							mlist[i].pos = *Curschar;
							return TRUE;
						}
					}
					return FALSE;
				}
				
				/*
				 * setpcmark() - set the previous context mark to the current position
				 */
				void
				setpcmark()
				{
					pcmark.pos = *Curschar;
					pcvalid = TRUE;
				}
				
				/*
				 * getmark(c) - find mark for char 'c'
				 *
				 * Return pointer to LPTR or NULL if no such mark.
				 */
				LPTR *
				getmark(c)
				register char	c;
				{
					register int	i;
				
					if (c == '\'' || c == '`')	/* previous context mark */
						return pcvalid ? &(pcmark.pos) : (LPTR *) NULL;
				
					for (i=0; i < NMARKS ;i++) {
						if (mlist[i].name == c)
							return &(mlist[i].pos);
					}
					return (LPTR *) NULL;
				}
				
				/*
				 * clrall() - clear all marks
				 *
				 * Used mainly when trashing the entire buffer during ":e" type commands
				 */
				void
				clrall()
				{
					register int	i;
				
					for (i=0; i < NMARKS ;i++)
						mlist[i].name = NUL;
					pcvalid = FALSE;
				}
				
				/*
				 * clrmark(line) - clear any marks for 'line'
				 *
				 * Used any time a line is deleted so we don't have marks pointing to
				 * non-existent lines.
				 */
				void
				clrmark(line)
				register LINE	*line;
				{
					register int	i;
				
					for (i=0; i < NMARKS ;i++) {
						if (mlist[i].pos.linep == line)
							mlist[i].name = NUL;
					}
					if (pcvalid && (pcmark.pos.linep == line))
						pcvalid = FALSE;
				}
							

相关资源