void zeq(int cnt) { znoclear = 0; zop2(cnt, '='); putNFL(); }
void zop(char hadpr) { register int c, lines, op; zhadpr = hadpr; notempty(); znoclear = 0; zweight = 0; switch(c = op = ex_getchar()) { case '^': zweight = 1; case '-': case '+': while (peekchar() == op) { ex_getchar(); zweight++; } case '=': case '.': c = ex_getchar(); break; case EOF: znoclear++; break; default: op = 0; break; } if (digit(c)) { lines = c - '0'; for(;;) { c = ex_getchar(); if (!digit(c)) break; lines *= 10; lines += c - '0'; } if (lines < value(WINDOW)) znoclear++; if (op == '=') lines += 2; } else lines = op == EOF ? value(SCROLL) : value(WINDOW); if (c != EOF) { ungetchar(c); ex_newline(); } addr1 = addr2; setdot(); zop2(lines, op); }
/* * Do a z operation. * Code here is rather long, and very uninteresting. */ void vzop(int hadcnt, int cnt, register int c) { register line *addr; if (state != VISUAL) { /* * Z from open; always like a z=. * This code is a mess and should be cleaned up. */ vmoveitup(1, 1); vgoto(outline, 0); ostop(normf); setoutt(); addr2 = dot; vclear(); destline = WECHO; zop2(Xhadcnt ? Xcnt : value(WINDOW) - 1, '='); if (state == CRTOPEN) putnl(); putNFL(); termreset(); Outchar = vputchar; ignore(ostart()); vcnt = 0; outline = destline = 0; vjumpto(dot, cursor, 0); return; } if (hadcnt) { addr = zero + cnt; if (addr < one) addr = one; if (addr > dol) addr = dol; markit(addr); } else switch (c) { case '+': addr = dot + vcnt - vcline; break; case '^': addr = dot - vcline - 1; forbid (addr < one); c = '-'; break; default: addr = dot; break; } switch (c) { case '.': case '-': break; case '^': forbid (addr <= one); break; case '+': forbid (addr >= dol); /* fall into ... */ case CR: case NL: c = CR; break; default: beep(); return; } vmoving = 0; vjumpto(addr, NOSTR, c); }