#include "config.h"
#include <sys/types.h>
#include <sys/queue.h>
#include <sys/time.h>
#include <bitstring.h>
#include <limits.h>
#include <stdio.h>
#include "../common/common.h"
#include "vi.h"
int
v_z(SCR *sp, VICMD *vp)
{
recno_t lno;
u_int value;
if (F_ISSET(vp, VC_C1SET)) {
lno = vp->count;
if (!db_exist(sp, lno) && db_last(sp, &lno))
return (1);
} else
lno = vp->m_start.lno;
vp->m_final.lno = lno;
vp->m_final.cno = vp->m_start.cno;
if (F_ISSET(vp, VC_C2SET) && vp->count2 != 0) {
if (vp->count2 > O_VAL(sp, O_WINDOW))
vp->count2 = O_VAL(sp, O_WINDOW);
if (vs_crel(sp, vp->count2))
return (1);
}
switch (vp->character) {
case '-':
if (vs_sm_fill(sp, lno, P_BOTTOM))
return (1);
break;
case '.':
if (vs_sm_fill(sp, lno, P_MIDDLE))
return (1);
break;
case '+':
if (F_ISSET(vp, VC_C1SET)) {
if (vs_sm_fill(sp, lno, P_TOP))
return (1);
if (vs_sm_position(sp, &vp->m_final, 0, P_TOP))
return (1);
} else
if (vs_sm_scroll(sp, &vp->m_final, sp->t_rows, Z_PLUS))
return (1);
break;
case '^':
if (F_ISSET(vp, VC_C1SET)) {
if (vs_sm_fill(sp, lno, P_BOTTOM))
return (1);
if (vs_sm_position(sp, &vp->m_final, 0, P_TOP))
return (1);
if (vs_sm_fill(sp, vp->m_final.lno, P_BOTTOM))
return (1);
} else
if (vs_sm_scroll(sp, &vp->m_final, sp->t_rows, Z_CARAT))
return (1);
break;
default:
value = KEY_VAL(sp, vp->character);
if (value != K_CR && value != K_NL) {
v_emsg(sp, vp->kp->usage, VIM_USAGE);
return (1);
}
if (vs_sm_fill(sp, lno, P_TOP))
return (1);
break;
}
return (0);
}
int
vs_crel(SCR *sp, long count)
{
sp->t_minrows = sp->t_rows = count;
if (sp->t_rows > sp->rows - 1)
sp->t_minrows = sp->t_rows = sp->rows - 1;
TMAP = HMAP + (sp->t_rows - 1);
F_SET(sp, SC_SCR_REDRAW);
return (0);
}