windows-nt/Source/XPSP1/NT/sdktools/vi/ptrfunc.c
2020-09-26 16:20:57 +08:00

166 lines
2.7 KiB
C

/* $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