104 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			C
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			104 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			C
		
	
	
		
			Executable File
		
	
	
	
	
/* misc.c */
 | 
						|
 | 
						|
/* Author:
 | 
						|
 *	Steve Kirkendall
 | 
						|
 *	14407 SW Teal Blvd. #C
 | 
						|
 *	Beaverton, OR 97005
 | 
						|
 *	kirkenda@cs.pdx.edu
 | 
						|
 */
 | 
						|
 | 
						|
 | 
						|
/* This file contains functions which didn't seem happy anywhere else */
 | 
						|
 | 
						|
#include "config.h"
 | 
						|
#include "vi.h"
 | 
						|
 | 
						|
 | 
						|
/* find a particular line & return a pointer to a copy of its text */
 | 
						|
char *fetchline(line)
 | 
						|
	long	line;	/* line number of the line to fetch */
 | 
						|
{
 | 
						|
	int		i;
 | 
						|
	REG char	*scan;	/* used to search for the line in a BLK */
 | 
						|
	long		l;	/* line number counter */
 | 
						|
	static BLK	buf;	/* holds ONLY the selected line (as string) */
 | 
						|
	REG char	*cpy;	/* used while copying the line */
 | 
						|
	static long	nextline;	/* }  These four variables are used */
 | 
						|
	static long	chglevel;	/*  } to implement a shortcut when  */
 | 
						|
	static char	*nextscan;	/*  } consecutive lines are fetched */
 | 
						|
	static long	nextlnum;	/* }                                */
 | 
						|
 | 
						|
	/* can we do a shortcut? */
 | 
						|
	if (changes == chglevel && line == nextline)
 | 
						|
	{
 | 
						|
		scan = nextscan;
 | 
						|
	}
 | 
						|
	else
 | 
						|
	{
 | 
						|
		/* scan lnum[] to determine which block its in */
 | 
						|
		for (i = 1; line > lnum[i]; i++)
 | 
						|
		{
 | 
						|
		}
 | 
						|
		nextlnum = lnum[i];
 | 
						|
 | 
						|
		/* fetch text of the block containing that line */
 | 
						|
		scan = blkget(i)->c;
 | 
						|
 | 
						|
		/* find the line in the block */
 | 
						|
		for (l = lnum[i - 1]; ++l < line; )
 | 
						|
		{
 | 
						|
			while (*scan++ != '\n')
 | 
						|
			{
 | 
						|
			}
 | 
						|
		}
 | 
						|
	}
 | 
						|
 | 
						|
	/* copy it into a block by itself, with no newline */
 | 
						|
	for (cpy = buf.c; *scan != '\n'; )
 | 
						|
	{
 | 
						|
		*cpy++ = *scan++;
 | 
						|
	}
 | 
						|
	*cpy = '\0';
 | 
						|
 | 
						|
	/* maybe speed up the next call to fetchline() ? */
 | 
						|
	if (line < nextlnum)
 | 
						|
	{
 | 
						|
		nextline = line + 1;
 | 
						|
		chglevel = changes;
 | 
						|
		nextscan = scan + 1;
 | 
						|
	}
 | 
						|
	else
 | 
						|
	{
 | 
						|
		nextline = 0;
 | 
						|
	}
 | 
						|
 | 
						|
	/* Calls to fetchline() interfere with calls to pfetch().  Make sure
 | 
						|
	 * that pfetch() resets itself on its next invocation.
 | 
						|
	 */
 | 
						|
	pchgs = 0L;
 | 
						|
 | 
						|
	/* Return a pointer to the line's text */
 | 
						|
	return buf.c;
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
/* error message from the regexp code */
 | 
						|
void regerror(txt)
 | 
						|
	char	*txt;	/* an error message */
 | 
						|
{
 | 
						|
	msg("RE error: %s", txt);
 | 
						|
}
 | 
						|
 | 
						|
/* This function is equivelent to the pfetch() macro */
 | 
						|
void	pfetch(l)
 | 
						|
	long	l;	/* line number of line to fetch */
 | 
						|
{
 | 
						|
	if(l != pline || changes != pchgs)
 | 
						|
	{
 | 
						|
		pline = (l);
 | 
						|
		ptext = fetchline(pline);
 | 
						|
		plen = strlen(ptext);
 | 
						|
		pchgs = changes;
 | 
						|
	}
 | 
						|
}
 |