/* COMM5.C Accumulated random Mince commands Contributed to AUG by Mark of the Unicorn 07/20/81 Copyrignt (C) 1981 Mark of the Unicorn This file contains the source for assorted commands that for one reason or another (usually lack of code space) didn't make it into the official Mince version. Note to potential users: some of this code belongs in places other than in a COMMx.C file. (i.e. InsCmnd() belongs in Mince.) This means that you will have to move them there with CLIB, and move the one that is already there to another place. Alternately, put them at the end of the CBIND.C file and put it on the link line first, but only if you have added the extra globals to MINCE.GBL (as per Jason's instructions). Be careful about little things like this, it may mean the difference between code that works and code that does not. Also be especially wary of the use of tmp, cnt, tmark, spare and other 'trashable' globals. If you call other functions that use these you can get into trouble. It is probably always safer to redeclare these at the beginning (and lose a little stack) than to risk trashing at the hands of subsequent functions. Now that we can add globals, I would reccommend NOT using spare anymore. -[BAD, 09/22/81] */ #include "mince.gbl" /* M-O */ MDropLine() /* drop rest of this line vertically */ { if (BIsEnd() || IsNL()){ BInsert(NL); BMove(-1); return; } tmp=BGetCol(); BInsert(NL); TIndent(tmp); RNLSrch(); } /* M-C-O */ MCloseWhite() /* replace following greyspace with a blank */ { MDelWhite(); while (!BisEnd() && IsNL()){ BDelete(1); MDelWhite(); } Binsert(' '); arg=0; } /* The following are from Scott's Mince (MSCOTT.C) */ /* this M-T always swaps the previous two characters */ MSwapChar() { BMove(-1); tmp=Buff(); BDelete(1); BMove(-1); BInsert(tmp); BMove(1); } /* this doesn't split the line; I keep it on C-J */ MIndNL() /* Indent new line same as current */ { ToEndLine(); MIndRest(); } /* This splits the line and indents; i keep it on M-C-J */ MIndRest() /* move rest of line to indented new line */ { tmark=BCreMrk(); cnt = GetInd(); BPntToMrk(tmark); Binsert (NL); TIndent (cnt); BKillMrk(tmark); } /*for convenience */ GetInd() /* Get this line's indentation */ { int IsWhite(); ToBegLine(); MovePast(&IsWhite,FORWARD); return (BGetCol()); } /* This opens a new line before the current one, and gives it the same indentation; I keep it on M-O */ MOpenIndLin() /* open line at current indentation */ { tmp = GetInd(); ToBegLin(); BInsert (NL); BMove(-1); TIndent (tmp); } /* C-X > */ MIndntRgn() /* indent the region */ { IndRgn (indentcol); } /* C-X < */ MUndntRgn() /* undent the region */ { IndRgn (-indentcol); } /* Internal to the above */ IndRgn(amt) /* add amt to the region's indentation */ { if (tmp = BIsAfterMrk (mark)) BSwapPnt (mark); tmark = BCreMrk(); while (BIsBeforeMrk (mark)) { cnt = GetInd(); MDelWhite(); TIndent (cnt + amt); NLSrch(); } BPntToMrk (tmark); if (tmp) BSwapPnt (mark); BKillMrk (tmark); } /* experimental: if you're at the beginning of a word, it moves to the end of the previous word; else it moves to the beginning of the next word. Currently on M-Z. */ MOthrTokn() /* move to other non-token boundry */ { if (!BIsEnd() && !IsToken()) MoveTo (&IsToken, FORWARD); else MoveTo (&IsToken, BACKWARD); } /* This special cases the end of the buffer, to always display "100%" there */ ModeFlags() /* Display the mode flags */ { int tloc, tlen; if (TKbRdy()) return; TDisStr(TMaxRow()-2,stat_col," -"); tloc=BLocation(buffs[cbuff].bbuff); tlen=BLength(buffs[cbuff].bbuff); if (tloc==tlen) itot(100); else if (tloc<325) itot((tloc*100)/tlen); else if (tloc<3250) itot((tloc*10)/(tlen/10+1)); else itot (tloc/(tlen/100+1)); TPrntStr("%- "); TPrntChar(BModp(buffs[cbuff].bbuff) ? '*' : ' '); TPrntChar(DelCmnd(lfunct) ? '+' : ' '); TCLEOL(); } /* if you want M- to work for arguments, put this on M-0 through M-9, ... */ MArgDgt() /* meta-digit arguments */ { arg=(cmnd&0x7f)-'0'; NumArg(arg); } /* ... and put this on C-U. */ MArg() /* set up arguments */ { arg *= 4; NumArg(0); } /* internal to the above. */ NumArg(tmp) /* collect numeric arguments */ int tmp; { int tchar, eflag, cflag; cflag = FALSE; eflag = ArgEcho(arg); while ((tchar=(cmnd=TGetKb())&0x7F)>='0' && tchar<='9') { tmp=tmp*10+tchar-'0'; cflag=TRUE; eflag |= ArgEcho(tmp); } if (cflag) arg=tmp; if (eflag) ClrEcho(); argp=TRUE; (*functs[cmnd])(); } /* auto-fill with the following properties: it never just inserts a NL (if you type spaces past the fill column it will just keep inserting them), so that it never wraps unless there is actually a word to wrap, and it only deletes one space before inserting the CR. Used with Fill Para below, it insures that sentences will ALWAYS end with two spaces if you typed them that way (at the price of an occasional trailing space on a line). */ MFillChk() /* check to see if we are beyond fillwidth and do something about it */ { tmark=BCreMrk(); tmp=FALSE; while (TRUE) { ToNotWhite(BACKWARD); if (BGetCol() <= fillwidth) break; tmp=TRUE; ToWhite(BACKWARD); } if(tmp) { ToNotWhite(FORWARD); BMove(-1); BDelete(1); BInsert(NL); SIndent(indentcol); } BPntToMrk(tmark); BInsert((cmnd==CR) ? NL : cmnd); BKillMrk(tmark); } /* Fill paragraph to go with the above. When it breaks a line, it only deletes one space before inserting the Nl. */ MFillPara() /* fill paragraph*/ { int IsWhite(); if (argp) fillwidth=arg; arg=0; tmark=BCreMrk(); BMove(-1); MFPara(); BMove(-1); if (BIsEnd() || IsGray()) { BPntToMrk(tmark); BKillMrk(tmark); return; } BMove(1); tmp=BCreMrk(); MBPara(); While (BIsBefore(tmp)) { ToWhite(FORWARD); if (BGetCol() > fillwidth) { ToWhite(BACKWARD); BMove(-1); BDelete(1); BInsert(NL); SIndent(indentcol); ToWhite(FORWARD); } MovePast(&IsWhite,FORWARD); if (IsNL() && BIsBefore(tmp)) { BMove(1); MDelWhite(); BMove(-1); BDelete(1); BInsert(' '); } } BPntToMrk(tmark); BKillMrk(tmark); BKillMrk(tmp); } /* End of stuff from MSCOTT.C */ /* Electric shift lock functions These consider ';' to begin a comment, and NL to end one (i.e. are designed for assembler or most Lisps). They uppercase everything as it is typed, unless it's in a comment. */ #define NORMAL 0 #define COMMENT 1 int context; /* this goes in mince */ InsCmnd(lfunct) /* tell if previous command was self-insert */ int(*lfunct)(); { int MInsert(); return (lfunct == &MInsert); } /* This goes in comm1 */ MInsert() /* self inserting commands */ { int pmark; if (!InsCmnd(lfunct)) { context = NORMAL; pmark = BCreMrk(); if (RNLSrch()) BMove(1); while (BIsBeforeMrk(pmark)) { if (Buff() == ';') { context = COMMENT; break; } BMove(1); } BPntToMrk(pmark); BKillMrk(pmark); } if (cmnd == ';') context = COMMENT; else if (cmnd == CR) context = NORMAL; if (context == NORMAL) BInsert(toupper(cmnd)); else BInsert(cmnd); } /* End of electric shift lock stuff */ /* END OF COMM5.C */