koreth@ssyx.ucsc.edu (Steven Grimm) (03/03/89)
Submitted-by: sun.com!laidbak!katzung (Brian Katzung)
Posting-number: Volume 2, Issue 23
Archive-name: uw/part05
#!/bin/sh
# this is part 5 of a multipart archive
# do not concatenate these parts, unpack them in order with /bin/sh
# file WINSUBR.C continued
#
CurArch=5
if test ! -r s2_seq_.tmp
then echo "Please unpack part 1 first!"
exit 1; fi
( read Scheck
if test "$Scheck" != $CurArch
then echo "Please unpack part $Scheck next!"
exit 1;
else exit 0; fi
) < s2_seq_.tmp || exit 1
sed 's/^X//' << 'SHAR_EOF' >> WINSUBR.C
X ++ scrolled;
X }
X break;
X
X case '\036': /* Home */
X cur_x = X0;
X cur_y = wp->top_y;
X break;
X
X case '\013': /* Cursor Up */
X if (cur_y!=wp->top_y) {
X cur_y -= inc_y;
X }
X break;
X
X case '\014': /* Cursor Right */
X if (cur_x < (xsiz - 1) * inc_x) cur_x += inc_x;
X break;
X
X case '\032': /* Clear Screen */
X wp->inverse = wp->insmode = 0;
X cur_x = X0;
X cur_y = Y0;
X wp->top_y = Y0;
X lineerase(wp, 0, ysiz - 1 + MAXSCROLLED);
X ++ scrolled;
X break;
X
X case '\t': /* Tab */
X cur_x = ((cur_x/inc_x/8+1))*inc_x*8+X0;
X break;
X
X case '\033': /* ESC */
X state = S_ESC;
X count = 0; /* count is used for insert or delete line */
X break;
X }
X f_x = cur_x;
X f_y = cur_y;
X }
X break;
X
X case S_ESC:
X if (ch >= '0' && ch <= '9') {
X count = count * 10 + ch - '0';
X break;
X }
X switch (ch)
X {
X case '*': /* Clear Screen */
X f_x = cur_x = X0;
X wp->top_y = f_y = cur_y = Y0;
X wp->inverse = wp->insmode = 0;
X lineerase(wp, 0, ysiz - 1 + MAXSCROLLED);
X ++ scrolled;
X state = S_NORMAL;
X break;
X
X case 'Y': /* Clear to End of Screen */
X lineerase(wp, cur_y / inc_y + 1, ysiz - 1 + wp->top_y / inc_y);
X if (! scrolled)
X w_update(wdes, FM_COPY, X0, cur_y + inc_y, xsiz*inc_x, ysiz*inc_y);
X /* fall through */
X case 'T': /* Clear to End of Line */
X#ifdef KOPY
X x = cur_x + wp->m_off;
X cnt = wp->wi_mf.wwords >> 1;
X tfbmr((short *) 0, 0, 0, 0, wp->wi_mf.ptr, x, cur_y, cnt,
X X0 + xsiz * inc_x + wp->m_off - x, inc_y, 0);
X#else
X t[0] = t[4] = cur_x + wp->m_off;
X t[1] = t[5] = cur_y;
X t[2] = t[6] = X0-1 + xsiz*inc_x +wp->m_off;
X t[3] = t[7] = cur_y+inc_y-1;
X vro_cpyfm(handle, 0, t, &wp->wi_mf, &wp->wi_mf);
X#endif
X if (! scrolled)
X w_update(wdes, FM_COPY, cur_x, cur_y, xsiz * inc_x - cur_x, inc_y);
X state = S_NORMAL;
X break;
X
X case 'E': /* Add Line */
X case 'R': /* Delete Line */
X if (count == 0) {
X count = 1;
X /* Look ahead for contiguous insert/delete line operations */
X while (*ptr == '\033' && ptr[1] == ch) {
X ptr +=2;
X count ++;
X }
X }
X if (ch == 'E')
X scrolldn(wp, cur_y/inc_y, ysiz-(cur_y-wp->top_y+Y0)/inc_y-count, count);
X else
X scrollup(wp, cur_y / inc_y,
X ysiz - (cur_y - wp->top_y + Y0)/inc_y - count, count);
X if (! scrolled)
X w_update(wdes, FM_COPY, X0, cur_y, xsiz * inc_x,
X ysiz * inc_y - cur_y + wp->top_y - Y0);
X state = S_NORMAL;
X break;
X
X case 'q': /* Insert Mode */
X wp->insmode = 1;
X state = S_NORMAL;
X break;
X
X case 'r': /* End Insert */
X wp->insmode = 0;
X state = S_NORMAL;
X break;
X
X case 'W': /* Delete Character */
X#ifdef KOPY
X x = cur_x + wp->m_off;
X w = X0 + xsiz * inc_x + wp->m_off - x;
X cnt = wp->wi_mf.wwords >> 1;
X cpbmr(wp->wi_mf.ptr, x + inc_x, cur_y, cnt,
X wp->wi_mf.ptr, x, cur_y, cnt, w, inc_y);
X tfbmr((short *) 0, 0, 0, 0,
X wp->wi_mf.ptr, X0 + (xsiz - 1) * inc_x + wp->m_off, cur_y, cnt,
X inc_x, inc_y, 0);
X#else
X t[0] = cur_x + inc_x + wp->m_off;
X t[1] = t[5] = cur_y;
X t[2] = X0 - 1 + xsiz * inc_x + wp->m_off;
X t[3] = t[7] = cur_y+inc_y - 1;
X t[4] = t[0] - inc_x;
X t[6] = t[2] - inc_x;
X vro_cpyfm(handle, 3, t, &wp->wi_mf, &wp->wi_mf);
X t[0] = t[4] = X0 + (xsiz - 1) * inc_x + wp->m_off;
X t[2] = t[6] = t[0] + inc_x - 1;
X vro_cpyfm(handle, 0, t, &wp->wi_mf, &wp->wi_mf);
X#endif
X if (! scrolled)
X w_update(wdes, FM_COPY, cur_x, cur_y, xsiz * inc_x - (cur_x - X0),
X inc_y);
X state = S_NORMAL;
X break;
X
X case '=': /* Cursor Movement */
X state = S_ESC1;
X break;
X
X case 'G': /* Switch Inverse/Normal */
X state = S_ESC2;
X break;
X
X case 'S': /* Change Status Line */
X state = S_STATUS;
X wp->nuptr = 0;
X break;
X
X case '[': /* ascii escape */
X state = S_ESCA;
X wp->nuptr = 0;
X break;
X
X default: /* Unknown escape sequence */
X state = S_NORMAL;
X }
X break;
X
X case S_ESC1: /* get line number */
X if (ch < ' ' || ch >= ' ' + ysiz) ch = ' ';
X f_y = cur_y = (ch-' ')*inc_y + wp->top_y;
X state = S_ESC3;
X break;
X
X case S_ESC3: /* get column number */
X if (ch < ' ' || ch >= ' ' + xsiz) ch = ' ';
X f_x = cur_x = (ch-' ')*inc_x +X0;
X state = S_NORMAL;
X break;
X
X case S_ESC2: /* get normal/inverse state */
X wp->inverse = ch&1;
X state = S_NORMAL;
X break;
X
X case S_STATUS:
X if (ch == '\r')
X {
X wp->nuname[wp->nuptr] = '\0';
X w_rename(wdes, wp->nuname);
X state = S_NORMAL;
X } else if (wp->nuptr < 72)
X {
X wp->nuname[wp->nuptr++] = ch;
X }
X break;
X case S_ESCA:
X if (ch >= '0' && ch <= '9')
X wp->nuptr = ch - '0' + 10 * wp->nuptr;
X else if (ch == 't')
X {
X if (wp-> nuptr == 18)
X {
X char posstr[20];
X
X sprintf(posstr, "\033[8;%d;%dt", ysiz, xsiz);
X proto_out(find_port(wdes), posstr, strlen(posstr));
X }
X state = S_NORMAL;
X }
X else state = S_NORMAL;
X break;
X } /* end switch on state */
X
X if (scrolled >= MAXSCROLLED)
X {
X if (wp->top_y != Y0) {
X scrollup(wp, 0, ysiz, wp->top_y/inc_y);
X wp->top_y = Y0;
X f_y = cur_y = Y0 + (ysiz - 1) * inc_y;
X }
X w_redraw(wdes, FM_COPY, wp->x, wp->y, wp->w, wp->h);
X scrolled = 0;
X }
X } /* end while loop for each character */
X
X if (wp->ptr_status & LOG_BOTOM) {
X ptr = savptr;
X while ((ch = *ptr++) && (wp->ptr_status & LOG_BOTOM))
X if (Cprnout(ch) == 0) wp->ptr_status = LOG_NONE;
X }
X
X if (wp->wi_lfd) {
X while (ch = *savptr++)
X putc(ch, wp->wi_lfd);
X }
X
X if (scrolled) {
X if (scrolled >= MAXSCROLLED) {
X if (wp->top_y != Y0) {
X scrollup(wp, 0, ysiz, wp->top_y/inc_y);
X wp->top_y = Y0;
X cur_y = Y0 + (ysiz - 1) * inc_y;
X }
X }
X w_redraw(wdes, FM_COPY, wp->x, wp->y, wp->w, wp->h);
X }
X else
X if (f_mod)
X {
X if (!wp->insmode)
X w_update(wdes, FM_COPY, f_x, f_y, cur_x - f_x, inc_y);
X else
X w_update(wdes, FM_COPY, f_x, f_y, xsiz * inc_x-f_x, inc_y);
X }
X wp->cur_x = cur_x;
X wp->cur_y = cur_y;
X wp->state = state;
X#ifdef DEBUG
X printf ("calling w_flash\n");
X#endif
X w_flash(wdes, 1);
X}
X
Xlineerase(wp, first, last)
Xregister struct wi_str *wp;
X{
X register int *p;
X long count;
X long linespace = wp->wi_mf.wwords*wp->font->inc_y;
X
X p = wp->wi_mf.ptr + first*linespace + Y0*wp->wi_mf.wwords - 1;
X count = (last-first+1)*linespace;
X while (count > 7)
X {
X *(((long *)p)++) = 0;
X *(((long *)p)++) = 0;
X *(((long *)p)++) = 0;
X *(((long *)p)++) = 0;
X count -= 8;
X }
X while (--count >= 0)
X *++p = 0;
X}
X
Xscrollup(wp, first, nlines, amount)
Xregister struct wi_str *wp;
X{
X register int *p1, *p2;
X register long count;
X int linespace = wp->wi_mf.wwords*wp->font->inc_y;
X
X p1 = wp->wi_mf.ptr + first*linespace + Y0*wp->wi_mf.wwords;
X p2 = p1 + linespace * amount;
X count = (long)(nlines)*linespace;
X while (count > 15)
X {
X *(((long *)p1)++) = *(((long *)p2)++);
X *(((long *)p1)++) = *(((long *)p2)++);
X *(((long *)p1)++) = *(((long *)p2)++);
X *(((long *)p1)++) = *(((long *)p2)++);
X *(((long *)p1)++) = *(((long *)p2)++);
X *(((long *)p1)++) = *(((long *)p2)++);
X *(((long *)p1)++) = *(((long *)p2)++);
X *(((long *)p1)++) = *(((long *)p2)++);
X count -= 16;
X }
X while (--count >= 0)
X *(p1++) = *(p2++);
X count = linespace * amount;
X while (count > 7)
X {
X *(((long *)p1)++) = 0;
X *(((long *)p1)++) = 0;
X *(((long *)p1)++) = 0;
X *(((long *)p1)++) = 0;
X count -= 8;
X }
X while (--count >= 0)
X *(p1++) = 0;
X}
X
Xscrolldn(wp, first, nlines, amount)
Xregister struct wi_str *wp;
X{
X register int *p1, *p2;
X register long count;
X long linespace = wp->wi_mf.wwords*wp->font->inc_y;
X
X p1 = wp->wi_mf.ptr + (nlines+first+amount)*linespace + Y0*wp->wi_mf.wwords;
X
X p2 = p1 - linespace * amount;
X count = (long)(nlines)*linespace;
X while (count > 15)
X {
X *--(long *)p1 = *--(long *)p2;
X *--(long *)p1 = *--(long *)p2;
X *--(long *)p1 = *--(long *)p2;
X *--(long *)p1 = *--(long *)p2;
X *--(long *)p1 = *--(long *)p2;
X *--(long *)p1 = *--(long *)p2;
X *--(long *)p1 = *--(long *)p2;
X *--(long *)p1 = *--(long *)p2;
X count -= 16;
X }
X while (--count >= 0)
X *--p1 = *--p2;
X count = linespace * amount;
X while (count > 7)
X {
X *--(long *)p1 = 0L;
X *--(long *)p1 = 0L;
X *--(long *)p1 = 0L;
X *--(long *)p1 = 0L;
X count -= 8;
X }
X while (--count >= 0)
X *--p1 = 0;
X}
SHAR_EOF
chmod 0600 WINSUBR.C || echo "restore of WINSUBR.C fails"
rm -f s2_seq_.tmp
echo "You have unpacked the last part"
exit 0