home *** CD-ROM | disk | FTP | other *** search
-
- /*
- * KTS.C
- *
- * Additional DME commands written by Kevin T. Seghetti fixed up and
- * incorporated by Matt Dillon 17 April 1988.
- */
-
- #include "defs.h"
-
- #define BLOCKDEPTH 5
- #define PINGDEPTH 10
-
- static long BSstack[BLOCKDEPTH];
- static long BEstack[BLOCKDEPTH];
- static ED *Bp[BLOCKDEPTH];
- static int CurrDepth = 0;
-
- static long PingLine[PINGDEPTH];
- static long PingCol[PINGDEPTH];
- static ED *PingWin[PINGDEPTH];
-
- void
- PMAdd()
- {
- }
-
- void
- PMRem()
- {
- }
-
- void
- PMKill(ep)
- ED *ep;
- {
- register short i, j;
-
- for (i = 0; i < PINGDEPTH; ++i) { /* remove ping-pong marks */
- if (PingWin[i] == ep)
- PingWin[i] = NULL;
- }
- for (i = j = 0; i < CurrDepth; ++i) { /* remove block marks */
- Bp[j] = Bp[i];
- if (Bp[i] != ep)
- ++j;
- }
- CurrDepth = j;
- }
-
-
- do_pushmark()
- {
- text_sync();
- if (blockok()) {
- if (CurrDepth == BLOCKDEPTH) {
- title("pushmark: stack limit reached");
- return(-1);
- }
- BSstack[CurrDepth] = BSline;
- BEstack[CurrDepth] = BEline;
- Bp[CurrDepth] = BEp;
-
- ++CurrDepth;
- text_redrawblock(0);
- }
- return(0);
- }
-
- void
- do_popmark()
- {
- text_sync();
-
- if (!CurrDepth) { /* no error message on purpose */
- text_redrawblock(0); /* remove any existing block */
- return;
- }
- text_redrawblock(0);
- --CurrDepth;
- BSline = BSstack[CurrDepth];
- BEline = BEstack[CurrDepth];
- BEp = Bp[CurrDepth];
- if (BEp == NULL || BEline >= BEp->Lines) {
- BEp = NULL;
- BSline = BEline = -1;
- } else
- text_redrawblock(1);
- }
-
- void
- do_swapmark()
- {
- register short i;
- register long *ptmp;
- register long tmp;
-
- if (do_pushmark() < 0)
- return;
- i = CurrDepth - 2;
- if (i >= 0) {
- ptmp = PingLine + i;
- tmp = ptmp[0]; ptmp[0] = ptmp[1]; ptmp[1] = tmp;
- ptmp = PingCol + i;
- tmp = ptmp[0]; ptmp[0] = ptmp[1]; ptmp[1] = tmp;
- ptmp = (long *)PingWin + i;
- tmp = ptmp[0]; ptmp[0] = ptmp[1]; ptmp[1] = tmp;
- }
- do_popmark();
- }
-
- do_purgemark()
- {
- CurrDepth = 0;
- }
-
- void
- do_ping()
- {
- register uword num = atoi(av[1]);
-
- if (num >= PINGDEPTH) {
- title("ping: out of range");
- return;
- }
- PingLine[num]= Ep->Line;
- PingCol[num] = Ep->Column;
- PingWin[num] = Ep;
- title("Line marked");
- }
-
- void
- do_pong()
- {
- register uword num = atoi(av[1]);
- extern IBASE *IntuitionBase;
-
- text_sync();
- if (num < 0 || num >= PINGDEPTH || !PingWin[num]) {
- title("pong: range error or nothing marked");
- return;
- }
- text_cursor(1);
- text_switch(PingWin[num]->Win);
- text_cursor(0);
-
- if (IntuitionBase->ActiveWindow != Ep->Win) {
- WindowToFront(Ep->Win);
- ActivateWindow(Ep->Win);
- }
- if ((Ep->Line = PingLine[num]) >= Ep->Lines) {
- PingLine[num] = Ep->Line = Ep->Lines - 1;
- }
- Ep->Column = PingCol[num];
- text_load();
- text_sync();
- }
-
- void
- do_undo()
- {
- text_load();
- text_redisplaycurrline();
- }
-
-