This is poshist.c in view mode; [Download] [Up]
/* Position history
Copyright (C) 1992 Joseph H. Allen
This file is part of JOE (Joe's Own Editor)
JOE is free software; you can redistribute it and/or modify it under the
terms of the GNU General Public License as published by the Free Software
Foundation; either version 1, or (at your option) any later version.
JOE is distributed in the hope that it will be useful, but WITHOUT ANY
WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
details.
You should have received a copy of the GNU General Public License along with
JOE; see the file COPYING. If not, write to the Free Software Foundation,
675 Mass Ave, Cambridge, MA 02139, USA. */
#include "poshist.h"
#include "queue.h"
#include "b.h"
#include "w.h"
#include "zstr.h"
#include "bw.h"
typedef struct pos POS;
struct pos
{
LINK(POS) link;
P *p;
W *w;
};
POS pos={{&pos,&pos}};
POS frpos={{&frpos,&frpos}};
POS *curpos= &pos;
int npos=0;
void markpos(w,p)
W *w;
P *p;
{
POS *new=alitem(&frpos,sizeof(POS));
new->p=0;
pdupown(p,&new->p);
poffline(new->p);
new->w=w;
enqueb(POS,link,&pos,new);
if(npos==20)
{
new=pos.link.next;
prm(new->p);
demote(POS,link,&frpos,new);
}
else ++npos;
}
void afterpos()
{
if(curpos!= &pos)
{
demote(POS,link,&pos,curpos);
curpos= &pos;
}
}
void aftermove(w,p)
W *w;
P *p;
{
if(pos.link.prev!=&pos &&
pos.link.prev->w==w &&
pos.link.prev->p &&
Labs(pos.link.prev->p->line-p->line)<3
)
poffline(pset(pos.link.prev->p,p));
else markpos(w,p);
}
void windie(w)
W *w;
{
POS *n;
for(n=pos.link.prev;n!=&pos;n=n->link.prev) if(n->w==w) n->w=0;
}
int unextpos(bw)
BW *bw;
{
W *w=bw->parent;
lp:
if(curpos->link.next!=&pos && curpos!=&pos)
{
curpos=curpos->link.next;
if(!curpos->p || !curpos->w) goto lp;
if(w->t->curwin==curpos->w &&
curpos->p->byte==((BW *)w->t->curwin->object)->cursor->byte) goto lp;
if(w->t->curwin!=curpos->w)
{
w->t->curwin=curpos->w;
if(w->t->curwin->y== -1) wfit(w->t);
}
w=w->t->curwin;
bw=(BW *)w->object;
if(bw->cursor->byte!=curpos->p->byte)
pset(bw->cursor,curpos->p);
return 0;
}
else return -1;
}
int uprevpos(bw)
BW *bw;
{
W *w=bw->parent;
lp:
if(curpos->link.prev!=&pos)
{
curpos=curpos->link.prev;
if(!curpos->p || !curpos->w) goto lp;
if(w->t->curwin==curpos->w &&
curpos->p->byte==((BW *)w->t->curwin->object)->cursor->byte) goto lp;
if(w->t->curwin!=curpos->w)
{
w->t->curwin=curpos->w;
if(w->t->curwin->y== -1) wfit(w->t);
}
w=w->t->curwin;
bw=(BW *)w->object;
if(bw->cursor->byte!=curpos->p->byte)
pset(bw->cursor,curpos->p);
return 0;
}
else return -1;
}
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.