164 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			C
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			164 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			C
		
	
	
		
			Executable File
		
	
	
	
	
/* move3.c */
 | 
						|
 | 
						|
/* Author:
 | 
						|
 *	Steve Kirkendall
 | 
						|
 *	14407 SW Teal Blvd. #C
 | 
						|
 *	Beaverton, OR 97005
 | 
						|
 *	kirkenda@cs.pdx.edu
 | 
						|
 */
 | 
						|
 | 
						|
 | 
						|
/* This file contains movement functions that perform character searches */
 | 
						|
 | 
						|
#include "config.h"
 | 
						|
#include "vi.h"
 | 
						|
 | 
						|
#ifndef NO_CHARSEARCH
 | 
						|
static MARK	(*prevfwdfn)();	/* function to search in same direction */
 | 
						|
static MARK	(*prevrevfn)();	/* function to search in opposite direction */
 | 
						|
static char	prev_key;	/* sought cvhar from previous [fFtT] */
 | 
						|
 | 
						|
MARK	m__ch(m, cnt, cmd)
 | 
						|
	MARK	m;	/* current position */
 | 
						|
	long	cnt;
 | 
						|
	char	cmd;	/* command: either ',' or ';' */
 | 
						|
{
 | 
						|
	MARK	(*tmp)();
 | 
						|
 | 
						|
	if (!prevfwdfn)
 | 
						|
	{
 | 
						|
		msg("No previous f, F, t, or T command");
 | 
						|
		return MARK_UNSET;
 | 
						|
	}
 | 
						|
 | 
						|
	if (cmd == ',')
 | 
						|
	{
 | 
						|
		m =  (*prevrevfn)(m, cnt, prev_key);
 | 
						|
 | 
						|
		/* Oops! we didn't want to change the prev*fn vars! */
 | 
						|
		tmp = prevfwdfn;
 | 
						|
		prevfwdfn = prevrevfn;
 | 
						|
		prevrevfn = tmp;
 | 
						|
 | 
						|
		return m;
 | 
						|
	}
 | 
						|
	else
 | 
						|
	{
 | 
						|
		return (*prevfwdfn)(m, cnt, prev_key);
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
/* move forward within this line to next occurrence of key */
 | 
						|
MARK	m_fch(m, cnt, key)
 | 
						|
	MARK	m;	/* where to search from */
 | 
						|
	long	cnt;
 | 
						|
	char	key;	/* what to search for */
 | 
						|
{
 | 
						|
	REG char	*text;
 | 
						|
 | 
						|
	DEFAULT(1);
 | 
						|
 | 
						|
	prevfwdfn = m_fch;
 | 
						|
	prevrevfn = m_Fch;
 | 
						|
	prev_key = key;
 | 
						|
 | 
						|
	pfetch(markline(m));
 | 
						|
	text = ptext + markidx(m);
 | 
						|
	while (cnt-- > 0)
 | 
						|
	{
 | 
						|
		do
 | 
						|
		{
 | 
						|
			m++;
 | 
						|
			text++;
 | 
						|
		} while (*text && *text != key);
 | 
						|
	}
 | 
						|
	if (!*text)
 | 
						|
	{
 | 
						|
		return MARK_UNSET;
 | 
						|
	}
 | 
						|
	return m;
 | 
						|
}
 | 
						|
 | 
						|
/* move backward within this line to previous occurrence of key */
 | 
						|
MARK	m_Fch(m, cnt, key)
 | 
						|
	MARK	m;	/* where to search from */
 | 
						|
	long	cnt;
 | 
						|
	char	key;	/* what to search for */
 | 
						|
{
 | 
						|
	REG char	*text;
 | 
						|
 | 
						|
	DEFAULT(1);
 | 
						|
 | 
						|
	prevfwdfn = m_Fch;
 | 
						|
	prevrevfn = m_fch;
 | 
						|
	prev_key = key;
 | 
						|
 | 
						|
	pfetch(markline(m));
 | 
						|
	text = ptext + markidx(m);
 | 
						|
	while (cnt-- > 0)
 | 
						|
	{
 | 
						|
		do
 | 
						|
		{
 | 
						|
			m--;
 | 
						|
			text--;
 | 
						|
		} while (text >= ptext && *text != key);
 | 
						|
	}
 | 
						|
	if (text < ptext)
 | 
						|
	{
 | 
						|
		return MARK_UNSET;
 | 
						|
	}
 | 
						|
	return m;
 | 
						|
}
 | 
						|
 | 
						|
/* move forward within this line almost to next occurrence of key */
 | 
						|
MARK	m_tch(m, cnt, key)
 | 
						|
	MARK	m;	/* where to search from */
 | 
						|
	long	cnt;
 | 
						|
	char	key;	/* what to search for */
 | 
						|
{
 | 
						|
	/* skip the adjacent char */
 | 
						|
	pfetch(markline(m));
 | 
						|
	if (plen <= markidx(m))
 | 
						|
	{
 | 
						|
		return MARK_UNSET;
 | 
						|
	}
 | 
						|
	m++;
 | 
						|
 | 
						|
	m = m_fch(m, cnt, key);
 | 
						|
	if (m == MARK_UNSET)
 | 
						|
	{
 | 
						|
		return MARK_UNSET;
 | 
						|
	}
 | 
						|
 | 
						|
	prevfwdfn = m_tch;
 | 
						|
	prevrevfn = m_Tch;
 | 
						|
 | 
						|
	return m - 1;
 | 
						|
}
 | 
						|
 | 
						|
/* move backward within this line almost to previous occurrence of key */
 | 
						|
MARK	m_Tch(m, cnt, key)
 | 
						|
	MARK	m;	/* where to search from */
 | 
						|
	long	cnt;
 | 
						|
	char	key;	/* what to search for */
 | 
						|
{
 | 
						|
	/* skip the adjacent char */
 | 
						|
	if (markidx(m) == 0)
 | 
						|
	{
 | 
						|
		return MARK_UNSET;
 | 
						|
	}
 | 
						|
	m--;
 | 
						|
 | 
						|
	m = m_Fch(m, cnt, key);
 | 
						|
	if (m == MARK_UNSET)
 | 
						|
	{
 | 
						|
		return MARK_UNSET;
 | 
						|
	}
 | 
						|
 | 
						|
	prevfwdfn = m_Tch;
 | 
						|
	prevrevfn = m_tch;
 | 
						|
 | 
						|
	return m + 1;
 | 
						|
}
 | 
						|
#endif
 |