blob: b227e750511349d5c46d7c9741d0af6ca74e18a9 [file] [log] [blame]
/* Copyright (c) 1988 Bellcore
** All Rights Reserved
** Permission is granted to copy or use this program, EXCEPT that it
** may not be sold for profit, the copyright notice must be reproduced
** on copies, and credit should be given to Bellcore where it is due.
** BELLCORE MAKES NO WARRANTY AND ACCEPTS NO LIABILITY FOR THIS PROGRAM.
*/
#ifndef lint
static char rcsid[]= "$Header$";
#endif
#ifdef MGR
#include "misc.h"
#include "line.h"
#include "token.h"
#include "/usr/public/pkg/mgr/include/term.h"
#include "/usr/public/pkg/mgr/include/restart.h"
#define OTHER 0
#define ON_DEBUG 1
#define OFF_DEBUG 2
#define DO_QUIT 3
#define DO_PAGE 4
#define NEW_PREC 5
#define NROW 60
#define NCOL 80
int isdiff[MAXTOKENS]; /* flag showing if a token pair was shown different*/
int comwin,wina, winb; /* location to store window numbers */
int fontx,fonty; /* size of the font in pixels */
int debug =0;
int firsttoken = 0; /* index of first token pair being displayed */
int tokencnt; /* count of the number of token pairs being displayed */
int
V_visual(flags)
int flags;
{
int moretodo = 1; /* flag to clear when we're finished */
messup();
m_selectwin(comwin);
m_setmode(W_ACTIVATE);
showpages(comroutine,flags);
do
{
switch(getinput())
{
case ON_DEBUG:
debug = 0;
break;
case OFF_DEBUG:
debug = 1;
break;
case DO_QUIT:
moretodo = 0;
break;
case DO_PAGE:
if((firsttoken+tokencnt>= K_gettmax(0))||
(firsttoken+tokencnt>= K_gettmax(1)))
{
m_selectwin(comwin);
m_printstr("\007this is the last page\n");
break;
}
firsttoken += tokencnt;
showpages(comroutine,flags);
break;
case NEW_PREC:
updatepages(comroutine,flags);
break;
case OTHER:
break;
default :
Z_fatal("bad value in main switch");
}
} while (moretodo);
V_cleanup();
return(0);
}
getinput()
{
char ibuf[Z_LINELEN]; /* input buffer */
char *ptr;
m_selectwin(comwin);
m_setmode(W_ACTIVATE);
switch (m_getchar())
{
case 't':
m_gets(ibuf);
/*
** skip the 'tol'
*/
ptr = ibuf;
S_nextword(&ptr);
T_setdef(ptr);
return(NEW_PREC);
case 'q':
return(DO_QUIT);
case 'd':
return(OFF_DEBUG);
case 'D':
return(ON_DEBUG);
case 'm':
return(DO_PAGE);
default:
return(OTHER);
}
}
showpages(comroutine,flags)
int (*comroutine)();
int flags;
{
int i;
m_selectwin(wina);
m_clear();
m_selectwin(winb);
m_clear();
showlines();
for(i=firsttoken;i<tokencnt+firsttoken; i++)
{
isdiff[i] = 0;
}
updatepages(comroutine,flags);
}
updatepages(comroutine,flags)
int (*comroutine)();
int flags;
{
int i;
for(i=firsttoken;i<tokencnt+firsttoken; i++)
{
if (isdiff[i])
{
if (0 == X_com(i,i,flags))
{
m_selectwin(wina);
un_highlight(0,K_gettoken(0,i),K_getline(K_gettoken(0,firsttoken)));
m_selectwin(winb);
un_highlight(1,K_gettoken(1,i),K_getline(K_gettoken(1,firsttoken)));
isdiff[i] = 0;
}
}
else
{
if (0 != X_com(i,i,flags))
{
m_selectwin(wina);
highlight(0,K_gettoken(0,i),K_getline(K_gettoken(0,firsttoken)));
m_selectwin(winb);
highlight(1,K_gettoken(1,i),K_getline(K_gettoken(1,firsttoken)));
isdiff[i] = 1;
}
}
}
}
un_highlight(file,ptr,firstline)
int file;
K_token ptr;
int firstline;
{
highlight(file,ptr,firstline);
}
/*
** argument expressed in terms of token lines
*/
highlight(file,ptr,firstline)
int file;
K_token ptr;
int firstline;
{
int startx = K_getpos(ptr)*fontx;
int starty = (L_tl2cl(file,K_getline(ptr))-L_tl2cl(file,firstline))*fonty;
int sizex = fontx*strlen(K_gettext(ptr));
int sizey = fonty;
m_bitwrite(startx,starty,sizex,sizey);
}
showlines()
{
int Alinecnt = 0;
int Blinecnt = 0;
int Atfirstline = K_getline(K_gettoken(0,firsttoken));
int Btfirstline = K_getline(K_gettoken(1,firsttoken));
int Afirstline = L_tl2cl(0,K_getline(K_gettoken(0,firsttoken)));
int Bfirstline = L_tl2cl(1,K_getline(K_gettoken(1,firsttoken)));
int Anexttoken = L_getindex(0,Atfirstline);
int Bnexttoken = L_getindex(1,Btfirstline);
int i;
/*
** first print the lines on the screen
*/
for(i=0;i < NROW;i++)
{
if(Afirstline+i < L_getclmax(0))
{
m_selectwin(wina);
showline(0,Afirstline+i,i);
Alinecnt++;
}
if(Bfirstline+i < L_getclmax(1))
{
m_selectwin(winb);
showline(1,Bfirstline+i,i);
Blinecnt++;
}
}
/*
** now figure out how many tokens we actually printed
*/
for(i=Atfirstline;Anexttoken<K_gettmax(0) && L_tl2cl(0,i) < Afirstline+Alinecnt;i++)
{
Anexttoken += L_getcount(0,i);
}
for(i=Btfirstline;Bnexttoken<K_gettmax(1) && L_tl2cl(1,i) < Bfirstline+Blinecnt;i++)
{
Bnexttoken += L_getcount(1,i);
}
tokencnt = MIN(Anexttoken,Bnexttoken) - firsttoken;
/*
** draw a line through any tokens that come before the first
** token that is being compared
*/
if (L_getindex(0,Atfirstline) != firsttoken)
{
m_selectwin(wina);
for(i=L_getindex(0,Atfirstline);i<firsttoken;i++)
{
drawline(K_gettoken(0,i),0);
}
}
if (L_getindex(1,Btfirstline) != firsttoken)
{
m_selectwin(winb);
for(i=L_getindex(1,Btfirstline);i<firsttoken;i++)
{
drawline(K_gettoken(1,i),0);
}
/*
m_line(Bt[Bindex[Bfirstline]]->pos*fontx,fonty/2,(Bt[firsttoken]->pos*fontx)-2,fonty/2);
*/
}
if (Anexttoken > Bnexttoken)
{
m_selectwin(wina);
for(i=Bnexttoken;i<Anexttoken;i++)
{
drawline(K_gettoken(0,i),L_tl2cl(0,K_getline(K_gettoken(0,i)))-Afirstline);
}
}
if (Anexttoken < Bnexttoken)
{
m_selectwin(winb);
for(i=Anexttoken;i<Bnexttoken;i++)
{
drawline(K_gettoken(1,i),L_tl2cl(1,K_getline(K_gettoken(1,i)))-Bfirstline);
}
}
}
/*
** line is given in conten line
*/
drawline(ptr,line)
K_token ptr;
int line;
{
m_line(K_getpos(ptr)*fontx,
(line*fonty)+fonty/2,
(K_getpos(ptr)+strlen(K_gettext(ptr)))*fontx,
(line*fonty)+fonty/2);
}
/*
** takes arguments in terms of content lines
*/
showline(file,index,row)
int file;
int index;
int row;
{
static char tmp[Z_LINELEN];
m_move(0,row);
stripnl(tmp,L_getcline(file,index));
m_printstr(tmp);
}
stripnl(to,from)
char *to,*from;
{
while ((*from != '\n') && (*from != '\0'))
{
*to++ = *from++;
}
*to = '\0';
}
static int didscr = 0;
messup()
{
int col, row;
int dum1,dum2,dum3,border;
m_setup(W_FLUSH|W_DEBUG);
m_push(P_EVENT|P_FLAGS|P_POSITION);
get_param(&dum1,&dum2,&dum3,&border);
didscr = 1;
comwin = m_makewindow(192,50,732,116);
wina = m_makewindow(0,218,570,670);
m_selectwin(wina);
m_font(2);
get_font(&fontx,&fonty);
m_shapewindow(0,218,NCOL*fontx+(2*border),NROW*fonty+(2*border));
get_colrow(&col,&row);
if ((col != NCOL) || (row != NROW))
{
Z_fatal("bad window size");
}
m_func(B_INVERT);
m_setmode(W_ABS);
winb = m_makewindow(580,218,570,670);
m_selectwin(winb);
m_font(2);
get_font(&fontx,&fonty);
m_shapewindow(580,218,NCOL*fontx+(2*border),NROW*fonty+(2*border));
get_colrow(&col,&row);
if ((col != NCOL) || (row != NROW))
{
Z_fatal("bad window size");
}
m_func(B_INVERT);
m_setmode(W_ABS);
m_selectwin(comwin);
m_clear();
m_setmode(W_ABS);
m_setmode(W_ACTIVATE);
}
V_cleanup()
{
if (didscr)
{
m_destroywin(wina);
m_destroywin(winb);
m_destroywin(comwin);
m_popall();
m_setecho();
(void) fclose(m_termin);
(void) fclose(m_termout);
}
}
#else
#include "misc.h"
/*
** dummy code for systems that don't have
** the mgr window manager installed
*/
int
V_visual(d)
int d;
{
Z_fatal("visual mode is not available on this machine\n");
return(-d); /* boiler plate */
}
void
V_cleanup()
{
}
#endif