⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mark.c

📁 早期freebsd实现
💻 C
字号:
#include "less.h"#include "position.h"extern IFILE curr_ifile;extern int sc_height;extern int jump_sline;/* * A mark is an ifile (input file) plus a position within the file. */struct mark {	IFILE m_ifile;	struct scrpos m_scrpos;};/* * The table of marks. * Each mark is identified by a lowercase or uppercase letter. */#define	NMARKS		(2*26)		/* a-z, A-Z */static struct mark marks[NMARKS];/* * Special mark for the "last mark"; addressed by the apostrophe. */static struct mark lmark;/* * Initialize the mark table to show no marks are set. */	public voidinit_mark(){	int i;	for (i = 0;  i < NMARKS;  i++)		marks[i].m_scrpos.pos = NULL_POSITION;	lmark.m_scrpos.pos = NULL_POSITION;}/* * See if a mark letter is valid (between a and z). */	static struct mark *getumark(c)	int c;{	if (c >= 'a' && c <= 'z')		return (&marks[c-'a']);	if (c >= 'A' && c <= 'Z')		return (&marks[c-'A'+26]);	error("Invalid mark letter", NULL_PARG);	return (NULL);}/* * Get the mark structure identified by a character. * The mark struct may come either from the mark table * or may be constructed on the fly for certain characters like ^, $. */	static struct mark *getmark(c)	int c;{	register struct mark *m;	static struct mark sm;	switch (c)	{	case '^':		/*		 * Beginning of the current file.		 */		m = &sm;		m->m_scrpos.pos = ch_zero();		m->m_scrpos.ln = 0;		m->m_ifile = curr_ifile;		break;	case '$':		/*		 * End of the current file.		 */		if (ch_end_seek())		{			error("Cannot seek to end of file", NULL_PARG);			return (NULL);		}		m = &sm;		m->m_scrpos.pos = ch_tell();		m->m_scrpos.ln = sc_height-1;		m->m_ifile = curr_ifile;		break;	case '.':		/*		 * Current position in the current file.		 */		m = &sm;		m->m_scrpos.pos = ch_tell();		m->m_scrpos.ln = 0;		m->m_ifile = curr_ifile;		break;	case '\'':		/*		 * The "last mark".		 */		m = &lmark;		break;	default:		/*		 * Must be a user-defined mark.		 */		m = getumark(c);		if (m == NULL)			break;		if (m->m_scrpos.pos == NULL_POSITION)		{			error("Mark not set", NULL_PARG);			return (NULL);		}		break;	}	return (m);}/* * Is a mark letter is invalid? */	public intbadmark(c)	int c;{	return (getmark(c) == NULL);}/* * Set a user-defined mark. */	public voidsetmark(c)	int c;{	register struct mark *m;	struct scrpos scrpos;	m = getumark(c);	if (m == NULL)		return;	get_scrpos(&scrpos);	m->m_scrpos = scrpos;	m->m_ifile = curr_ifile;}/* * Set lmark (the mark named by the apostrophe). */	public voidlastmark(){	struct scrpos scrpos;	get_scrpos(&scrpos);	if (scrpos.pos == NULL_POSITION)		return;	lmark.m_scrpos = scrpos;	lmark.m_ifile = curr_ifile;}/* * Go to a mark. */	public voidgomark(c)	int c;{	register struct mark *m;	struct scrpos scrpos;	m = getmark(c);	if (m == NULL)		return;	/*	 * If we're trying to go to the lastmark and 	 * it has not been set to anything yet,	 * set it to the beginning of the current file.	 */	if (m == &lmark && m->m_scrpos.pos == NULL_POSITION)	{		m->m_ifile = curr_ifile;		m->m_scrpos.pos = ch_zero();		m->m_scrpos.ln = jump_sline;	}	/*	 * If we're using lmark, we must save the screen position now,	 * because if we call edit() below, lmark will change.	 * (We save the screen position even if we're not using lmark.)	 */	scrpos = m->m_scrpos;	if (m->m_ifile != curr_ifile)	{		/*		 * Not in the current file; edit the correct file.		 */		if (edit(get_filename(m->m_ifile), 0))			return;	}	jump_loc(scrpos.pos, scrpos.ln);}/* * Return the position associated with a given mark letter. * * We don't return which screen line the position  * is associated with, but this doesn't matter much, * because it's always the first non-blank line on the screen. */	public POSITIONmarkpos(c)	int c;{	register struct mark *m;	m = getmark(c);	if (m == NULL)		return (NULL_POSITION);	if (m->m_ifile != curr_ifile)	{		error("Mark not in current file", NULL_PARG);		return (NULL_POSITION);	}	return (m->m_scrpos.pos);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -