/* $Header: /nw/tony/src/stevie/src/RCS/ptrfunc.c,v 1.5 89/03/11 22:43:12 tony Exp $ * * The routines in this file attempt to imitate many of the operations * that used to be performed on simple character pointers and are now * performed on LNPTR's. This makes it easier to modify other sections * of the code. Think of an LNPTR as representing a position in the file. * Positions can be incremented, decremented, compared, etc. through * the functions implemented here. */ #include "stevie.h" /* * inc(p) * * Increment the line pointer 'p' crossing line boundaries as necessary. * Return 1 when crossing a line, -1 when at end of file, 0 otherwise. */ int inc(lp) register LNPTR *lp; { register char *p; if (lp && lp->linep) p = &(lp->linep->s[lp->index]); else return -1; if (*p != NUL) { /* still within line */ lp->index++; return ((p[1] != NUL) ? 0 : 1); } if (lp->linep->next != Fileend->linep) { /* there is a next line */ lp->index = 0; lp->linep = lp->linep->next; return 1; } return -1; } /* * dec(p) * * Decrement the line pointer 'p' crossing line boundaries as necessary. * Return 1 when crossing a line, -1 when at start of file, 0 otherwise. */ int dec(lp) register LNPTR *lp; { if (lp->index > 0) { /* still within line */ lp->index--; return 0; } if (lp->linep && lp->linep->prev != Filetop->linep) { /* there is a prior line */ lp->linep = lp->linep->prev; lp->index = strlen(lp->linep->s); return 1; } lp->index = 0; /* stick at first char */ return -1; /* at start of file */ } /* * gchar(lp) - get the character at position "lp" */ int gchar(lp) register LNPTR *lp; { if (lp && lp->linep) return (lp->linep->s[lp->index]); else return 0; } /* * pchar(lp, c) - put character 'c' at position 'lp' */ void pchar(lp, c) register LNPTR *lp; char c; { lp->linep->s[lp->index] = c; } /* * pswap(a, b) - swap two position pointers */ void pswap(a, b) register LNPTR *a, *b; { LNPTR tmp; tmp = *a; *a = *b; *b = tmp; } /* * Position comparisons */ bool_t lt(a, b) register LNPTR *a, *b; { register int an, bn; an = LINEOF(a); bn = LINEOF(b); if (an != bn) return (an < bn); else return (a->index < b->index); } #if 0 bool_t gt(a, b) LNPTR *a, *b; { register int an, bn; an = LINEOF(a); bn = LINEOF(b); if (an != bn) return (an > bn); else return (a->index > b->index); } #endif bool_t equal(a, b) register LNPTR *a, *b; { return (a->linep == b->linep && a->index == b->index); } bool_t ltoreq(a, b) register LNPTR *a, *b; { return (lt(a, b) || equal(a, b)); } #if 0 bool_t gtoreq(a, b) LNPTR *a, *b; { return (gt(a, b) || equal(a, b)); } #endif