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