/*
 * STEVIE - Simply Try this Editor for VI Enthusiasts
 *
 * Code Contributions By : Tim Thompson           twitch!tjt
 *                         Tony Andrews           onecom!wldrdg!tony 
 *                         G. R. (Fred) Walter    watmath!watcgl!grwalter 
 */

#include "stevie.h"

/*
 * nextline(curr) 
 *
 * Return a pointer to the beginning of the next line after the one referenced
 * by 'curr'. Return NULL if there is no next line (at EOF). 
 */

LPtr           *
nextline(curr)
    LPtr           *curr;
{
    static LPtr     next;

    if (curr != NULL) {
	if (curr->linep->next != Fileend->linep) {
	    next.index = 0;
	    next.linep = curr->linep->next;
	    return &next;
	}
    }
    return (LPtr *) NULL;
}

/*
 * prevline(curr) 
 *
 * Return a pointer to the beginning of the line before the one referenced by
 * 'curr'. Return NULL if there is no prior line. 
 */

LPtr           *
prevline(curr)
    LPtr           *curr;
{
    static LPtr     prev;

    if (curr != NULL) {
	if (curr->linep->prev != Filetop->linep) {
	    prev.index = 0;
	    prev.linep = curr->linep->prev;
	    return &prev;
	}
    }
    return (LPtr *) NULL;
}

/*
 * coladvance(p,col) 
 *
 * Try to advance to the specified column, starting at p. 
 */

LPtr           *
coladvance(p, col)
    LPtr           *p;
    int             col;
{
    static LPtr     lp;
    int             c, in;

    lp.linep = p->linep;
    lp.index = p->index;

    /* If we're on a blank ('\n' only) line, we can't do anything */
    if (lp.linep->s[lp.index] == '\0')
	return &lp;
    /* try to advance to the specified column */
    for (c = 0; col-- > 0; c++) {
	/* Count a tab for what it's worth (if list mode not on) */
	if (gchar(&lp) == TAB && !P(P_LS)) {
	    in = ((P(P_TS) - 1) - c % P(P_TS));
	    col -= in;
	    c += in;
	}
	/* Don't go past the end of */
	/* the file or the line. */
	if (inc(&lp)) {
	    dec(&lp);
	    break;
	}
    }
    return &lp;
}
