#include <stdio.h>

#define FALSE	0
#define TRUE	1
#define NL		'\n'
#define DEBUG(l, f, s)	if (Debug >= l) fprintf(stderr, f, s)

extern char *gap_end, *gap_start, *buffer_end, *the_bp;
extern int Debug;

/***
 *	find_line (index, ali, ale)
 *	int index, *ali, *ale;
 *
 *	find_line - return start and ending line indexes for
 *	given index (anywhere on line).
 *
 */
find_line(index,ali,ale)
int index,*ali,*ale;
{
    find_bol (ali, &index);
    find_eol (&index, ale);
}

/***
 *	find_bol (ali, ale)
 *	int *ali, *ale;
 *
 *	find_bol - find previous NL, taking account of gap.
 *
 */
find_bol(ali,ale)
int *ali,*ale;
{
    char *bp;
    register char *cp;

    DEBUG(7,"find_bol: li=%d", *ali);
    DEBUG(7,"   le=%d", *ale);
    bp = the_bp;
    cp = bp + *ale;
    if (cp >= gap_start) {
	cp = cp + (gap_end - gap_start);
	while (cp > gap_end)
	    if (*--cp == NL) goto FOUND_BOL;
	cp = gap_start;
    }
    while (cp > bp)
	if (*--cp == NL) goto FOUND_BOL;
    cp = bp - 1;

FOUND_BOL:
    cp++;
    if (cp >= gap_end)
	cp -= gap_end - gap_start;

    *ali = cp - bp;
    DEBUG(7, "   result - %d\n", *ali);

    return;
}

/***
 *	find_eol (ali, ale)
 *	int *ali, *ale
 *
 *	find_eol - find eol on given line, taking care of gap.
 *
 */
find_eol(ali,ale)
int *ali,*ale;
{
    char *bp;
    register char *cp;
    register i;

    DEBUG(7, "find_eol - li=%d", *ali);
    DEBUG(7, "  le=%d", *ale);
    i = *ali;
    if (i < 0) i = 0;
    bp = the_bp;
    if (i > (buffer_end - bp) - (gap_end - gap_start)) {
	*ali = (buffer_end - bp) - (gap_end - gap_start) + 1;
	*ale = *ali - 1;
	return;
    }

    cp = bp + *ali;
    if (cp < gap_start) {
	while (cp < gap_start)
	    if (*(cp++) == NL) goto FOUND_EOL;
    }
    cp = cp + (gap_end - gap_start);
    while (cp < buffer_end) {
	if (*(cp++) == NL) goto FOUND_EOL;
    }

FOUND_EOL:
    cp--;
    if (cp >= gap_start)
	cp -= gap_end - gap_start;
    *ale = cp - bp;
    DEBUG(7, "  result=%d\n",*ale);

    return;
}
