home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Club Amiga de Montreal - CAM
/
CAM_CD_1.iso
/
files
/
171.lha
/
DME_v1.30
/
Sources
/
cmd2.c
< prev
next >
Wrap
C/C++ Source or Header
|
1988-04-28
|
23KB
|
1,138 lines
/*
* CMD2.C (was TEXT2.C)
*
* (C)Copyright 1987 by Matthew Dillon, All Rights Reserved
*/
#include "defs.h"
#include <stdio.h>
#define nomemory() {memoryfail = 1;}
#if AREXX
#include "rexx.h"
extern int foundcmd; /* control for implicit ARexx macro invocation */
extern int cmderr; /* global command error flag for do_rexx()'s use */
#endif
extern char MForceTitle;
extern void do_bmove();
ED *
uninit_init(ep)
register ED *ep;
{
short iwinx, iwiny;
char tabstop, margin, insertmode, wordwrap;
FONT *font;
iwinx = ep->IWinx;
iwiny = ep->IWiny;
tabstop= ep->Tabstop;
margin = ep->Margin;
insertmode = ep->Insertmode;
wordwrap = ep->Wordwrap;
font = ep->Font;
ep->Font = NULL;
text_uninit();
text_init();
ep = Ep;
if (ep->Font)
CloseFont(ep->Font);
ep->Font = font;
ep->IWiny = iwiny;
ep->IWinx = iwinx;
ep->Tabstop = tabstop;
ep->Margin = margin;
ep->Insertmode = insertmode;
ep->Wordwrap = wordwrap;
ep->Modified = 0;
ep->Line = ep->Topline = 0;
return(ep);
}
do_remeol()
{
Current[Clen = Ep->Column] = 0;
text_sync();
text_redisplaycurrline();
}
do_wleft()
{
register ED *ep = Ep;
register ubyte *ptr;
register int i;
for (;;) {
i = ep->Column;
if (i == 0)
goto prevline;
--i;
while (i && Current[i] == ' ')
--i;
if (i == 0 && Current[0] == ' ') {
prevline:
if (Comlinemode || ep->Line == 0) {
i = ep->Column;
break;
}
text_sync();
--ep->Line;
text_load();
ep->Column = Clen;
continue;
}
while (i && Current[i] != ' ')
--i;
if (Current[i] == ' ')
++i;
break;
}
ep->Column = i;
text_sync();
}
do_wright()
{
register ubyte *ptr;
register ED *ep = Ep;
register int i;
for (;;) {
i = ep->Column;
if (i == Clen)
goto nextline;
while (i != Clen && Current[i] != ' ') /* skip past current word */
++i;
while (i != Clen && Current[i] == ' ') /* to beg. of next word */
++i;
if (i == Clen) {
nextline:
if (Comlinemode || ep->Line == ep->Lines - 1) {
i = ep->Column;
break;
}
text_sync();
++ep->Line;
text_load();
ep->Column = i = 0;
if (Current[0] != ' ')
break;
continue;
}
break;
}
ep->Column = i;
text_sync();
}
do_split() /* split line in two at cursor pos */
{
ubyte buf[256];
register ED *ep = Ep;
strcpy(buf, Current+ep->Column);
Current[Clen = ep->Column] = '\0';
text_sync();
SetAPen(Rp, 0);
if (Nsu == 0)
RectFill(Rp, COL(0), ROW(ep->Line-ep->Topline), Xbase+Xpixs, ROW(ep->Line-ep->Topline+1)-1);
SetAPen(Rp, 1);
text_displayseg(ep->Line - ep->Topline, 1);
do_downadd();
do_insline();
strcpy(Current, buf);
Clen = strlen(Current);
text_sync();
text_displayseg(ep->Line - ep->Topline, 1);
do_up();
}
do_join()
{
register int i = Clen, j;
register ED *ep = Ep;
if (ep->Line + 1 < ep->Lines && strlen(ep->List[ep->Line+1])+i <= 253) {
if (i && Current[i-1] != ' ')
Current[i++] = ' ';
strcpy(Current+i, ep->List[ep->Line+1]);
for (j = i; Current[j] == ' '; ++j);
for (; i >= 0 && Current[i] == ' '; --i);
if (j > i+2)
bmov(Current+j, Current+i+2, strlen(Current+j)+1);
Clen = strlen(Current);
text_sync();
text_displayseg(ep->Line - ep->Topline, 1);
do_down();
do_deline();
do_up();
return(1);
}
return(0);
}
do_margin()
{
Ep->Margin = atoi(av[1]);
}
do_wordwrap()
{
register ED *ep = Ep;
if (av[1][1] == 'n')
ep->Wordwrap = 1;
if (av[1][1] == 'f')
ep->Wordwrap = 0;
if (av[1][0] == 't')
ep->Wordwrap = 1 - ep->Wordwrap;
if (ep->Wordwrap)
title("Wordwrap ON");
else
title("Wordwrap OFF");
}
/*
* n == -1 : force reformat entire paragraph
* n == 0 : only until line equalizes (from text_write())
*
* What is a paragraph? A paragraph ends whenever the left justification
* gets larger, or on a blank line.
*/
do_reformat(n)
{
register char *str;
register ED *ep = Ep;
int nlok, lnsc, fnst, fnsc;
int column = ep->Column;
int srow = ep->Line;
int crow = srow;
int erow = srow;
short dins = 0; /* relative insert lines/delete lines */
char moded = 0; /* any modifications done at all? */
char checked = 0; /* for cursor positioning. */
if (ep->Margin == 0)
ep->Margin = 75;
++Nsu;
for (;;) {
str = (char *)ep->List[ep->Line+1];
fnst = 0;
fnsc = firstns(Current);
nlok = (ep->Line + 1 < ep->Lines && fnsc >= (fnst=firstns(str)));
if (nlok && str[0] == 0)
nlok = 0;
lnsc = lastns(Current);
if (lnsc < ep->Margin) { /* space at end of line for marg-lnsc-2 letter word */
if (nlok == 0) /* but no more data to joinup */
break; /* done */
if (ep->Margin - lnsc - 2 >= wordlen(str+fnst)) {
ep->Column = 0;
Clen = lastns(Current);
if (Current[Clen])
++Clen;
moded = 1;
--dins;
if (do_join())
continue;
++dins;
title("Error, Margin > 124");
break;
}
if (n == 0) /* if couldn't mod line, and text_write, don't update any more */
break;
do_down();
erow = ep->Line;
continue;
}
/* no space, need to split */
/* find start of prev word */
for (;;) {
register int i = lnsc;
while (i && Current[i] != ' ')
--i;
lnsc = i;
if (i >= ep->Margin) {
while (i && Current[i] == ' ')
--i;
if (i < ep->Margin)
break;
lnsc = i;
continue;
}
break;
}
if (lnsc) { /* ok to split at word */
++lnsc;
++dins;
ep->Column = lnsc;
do_split(); /* Split at point LNSC */
do_down(); /* must insert proper amount? */
{
int indent = (nlok == 0) ? fnsc : fnst;
if (!checked) {
checked = 1;
if (lnsc <= column) { /* if split before cursor */
column = column - ep->Column + indent;
++crow;
}
}
if (Clen + indent < 253) {
bmov(Current, Current + indent, strlen(Current)+1);
bset(Current, indent, ' ');
Clen += indent;
}
}
erow = ep->Line;
continue;
}
if (n == 0)
break;
do_down();
}
if (column < 0 || column > 200)
column = 0;
if (srow >= ep->Lines) {
srow = ep->Lines - 1;
goto ra;
}
if (dins || srow < ep->Topline || srow >= ep->Topline + Rows) {
ra:
text_sync();
--Nsu;
ep->Line = crow;
ep->Column = column;
text_load();
if (!text_sync())
text_redisplay();
} else {
text_sync();
--Nsu;
ep->Line = crow;
ep->Column = column;
text_load();
if (erow != srow) {
if (!text_sync()) {
++erow;
if (erow - ep->Topline > Rows)
erow = ep->Topline + Rows;
SetAPen(Rp, 0);
RectFill(Rp, COL(0), ROW(srow - ep->Topline), Xbase+Xpixs, ROW(erow - ep->Topline)-1);
SetAPen(Rp, 1);
text_displayseg(srow - ep->Topline, erow - srow);
}
} else {
text_sync();
if (moded)
text_redisplaycurrline();
}
}
if (column > Clen) {
bset(Current+Clen, column - Clen, ' ');
Current[column] = 0;
}
ep->Column = column;
}
do_tabstop()
{
Ep->Tabstop = atoi(av[1]);
}
do_insertmode()
{
register ED *ep = Ep;
if (av[1][0]) {
switch(av[1][1] & 0x1F) {
case 'n'&0x1F:
ep->Insertmode = 1;
break;
case 'f'&0x1F:
ep->Insertmode = 0;
break;
case 'o'&0x1F:
ep->Insertmode = 1 - ep->Insertmode;
break;
}
if (ep->Insertmode)
title("Insert mode on");
else
title("Insert mode off");
}
}
do_insline()
{
register ubyte *ptr;
register ED *ep = Ep;
ep->Modified = 1;
text_sync();
if (makeroom(32) && (ptr = allocb(1))) {
bmovl(ep->List+ep->Line, ep->List+ep->Line+1,ep->Lines-ep->Line);
ep->List[ep->Line] = ptr;
*ptr = 0;
++ep->Lines;
if (BEp == ep) {
if (ep->Line < BSline)
++BSline;
if (ep->Line <= BEline)
++BEline;
}
} else {
nomemory();
}
text_load();
if (Nsu == 0)
ScrollRaster(Rp,0,-Ysize, COL(0), ROW(ep->Line-ep->Topline), COL(Columns)-1, ROW(Rows)-1);
text_displayseg(ep->Line - ep->Topline, 1);
}
do_deline()
{
register int delline;
register ED *ep = Ep;
if (ep->Lines > 1) {
ep->Modified = 1;
text_sync();
FreeMem(ep->List[ep->Line], strlen(ep->List[ep->Line])+1);
bmovl(ep->List+ep->Line+1, ep->List+ep->Line,ep->Lines-ep->Line-1);
if (BEp == ep) {
if (ep->Line < BSline)
--BSline;
if (ep->Line <= BEline)
--BEline;
}
delline = ep->Line;
if (ep->Line >= --ep->Lines) {
--ep->Line;
text_load();
if (ep->Line < ep->Topline) {
if (Nsu == 0) {
ep->Topline = ep->Line - (Rows>>1);
if (ep->Topline < 0)
ep->Topline = 0;
text_redisplay();
}
return(0);
}
}
text_load();
if (Nsu == 0)
ScrollRaster(Rp,0,Ysize, COL(0), ROW(delline-ep->Topline), COL(Columns)-1, ROW(Rows)-1);
text_displayseg(Rows-1, 1);
} else {
do_firstcolumn();
do_remeol();
ep->Modified = 0;
}
}
do_chfilename()
{
text_sync();
strncpy(Ep->Name, av[1], 63);
MForceTitle = 1;
}
do_edit()
{
long xfi;
long oldlock;
long lines;
ubyte buf[256];
ubyte *ptr;
char failed = 1;
register ED *ep = Ep;
text_sync();
if (*av[0] == 'n') { /* newfile or insfile */
if (ep->Modified && getyn("Delete modified Image?") == 0)
return(0);
ep = uninit_init(ep);
strncpy(ep->Name, av[1], 63);
} else {
ep->Modified = 1;
}
lines = ep->Lines;
if (Wbs && Wdisable == 0)
oldlock = CurrentDir(ep->dirlock);
if (xfi = xfopen(av[1], "r", 4096)) {
register int len;
char oktitle = 1;
title("Loading...");
while ((len = xefgets(xfi, buf, 255)) >= 0) {
failed = 0;
if (makeroom(256) && (ptr = allocb(len+1))) {
ep->List[ep->Lines++] = ptr;
bmov(buf, ptr, len+1);
} else {
set_window_params();
nomemory();
oktitle = 0;
break;
}
}
set_window_params();
if (oktitle)
title("OK");
} else {
title("File Not Found");
#if AREXX
cmderr = CMD_FAILED;
#endif
}
xfclose(xfi);
if (Wbs && Wdisable == 0)
CurrentDir(oldlock);
if (ep->Lines != 1 && lines == 1 && ep->List[0][0] == 0) {
ep->Modified = 0;
ep->Line = 0;
FreeMem(ep->List[0], strlen(ep->List[0])+1);
bmovl(ep->List+1, ep->List,--ep->Lines);
} else {
if (!failed && lines <= ep->Lines - 1) {
BEp = ep;
BSline = lines;
BEline = ep->Lines - 1;
do_bmove();
}
}
set_window_params();
text_load();
text_redisplay();
}
static char blockmode;
do_bsave()
{
blockmode = 1;
do_saveas();
}
do_save()
{
av[1] = Ep->Name;
do_saveas();
}
do_savetabs()
{
Savetabs = (av[1][0] && av[1][1] == 'n') ? 1 : 0;
}
do_saveas()
{
long oldlock;
long xfi;
register long i;
register short j, k;
register ubyte *ptr, *bp;
long xs, xe;
ubyte buf[256];
char bm;
ED *ep;
bm = blockmode;
if (blockmode && blockok()) {
xs = BSline;
xe = BEline + 1;
ep = BEp;
} else {
xs = 0;
xe = Ep->Lines;
ep = Ep;
}
blockmode = 0;
text_sync();
if (Wbs && Wdisable == 0) { /* Write out .info file */
DISKOBJ sdo, *d;
bzero(&sdo, sizeof(sdo));
oldlock = CurrentDir(Ep->dirlock);
if ((d = GetDiskObject(av[1])) == NULL) {
if (getpath(Wbs->sm_ArgList[0].wa_Name, buf)) {
sdo.do_Magic = WB_DISKMAGIC;
sdo.do_Version = WB_DISKVERSION;
makemygadget(&sdo.do_Gadget);
sdo.do_Type = WBPROJECT;
sdo.do_DefaultTool = (char *)buf;
sdo.do_ToolTypes = NULL;
sdo.do_CurrentX = NO_ICON_POSITION;
sdo.do_CurrentY = NO_ICON_POSITION;
sdo.do_DrawerData = NULL;
sdo.do_ToolWindow = NULL;
sdo.do_StackSize = 8192;
PutDiskObject(av[1], &sdo);
}
} else {
FreeDiskObject(d);
}
}
if (xfi = xfopen(av[1], "w", 4096)) {
title("Saving...");
for (i = xs; i < xe; ++i) {
ptr = ep->List[i];
if (Savetabs) {
for (bp = buf, j = 0; *ptr; ++ptr, ++bp, j = (j+1)&7) {
*bp = *ptr;
if (j == 7 && *bp == ' ' && *(bp-1) == ' ') {
k = j;
while (k-- >= 0 && *bp == ' ')
--bp;
*++bp = 9;
} else {
if (*bp == '\"' || *bp == '\'' || *bp == '\`' || *bp == '(')
break;
}
}
strcpy(bp, ptr);
ptr = buf;
}
xfwrite(xfi, ptr, strlen(ptr));
if (xfwrite(xfi, "\n", 1)) {
xfclose(xfi);
goto err;
}
}
if (xfclose(xfi)) {
err: Abortcommand = 1;
title("WRITE FAILED!");
} else {
ep->Modified &= bm;
title("OK");
}
if (Wbs && Wdisable == 0)
CurrentDir(oldlock);
} else {
title("Unable to open write file");
Abortcommand = 1;
}
}
do_block() /* block, unblock */
{
text_sync();
switch(av[0][0]) {
case 'b':
if (BSline < 0) {
bstart:
BEp = Ep;
BSline = Ep->Line;
title("Block Begin");
} else {
if (BEline > -1) {
title("Block Already Marked");
break;
}
if (BEp != Ep)
goto bstart;
title("Block End");
BEline = Ep->Line;
if (BSline > BEline) {
BEline = BSline;
BSline = Ep->Line;
}
text_redrawblock(1);
}
break;
case 'u':
text_redrawblock(0);
title ("Block Unmarked");
break;
}
}
blockok()
{
if (BEp && BSline >= 0 && BSline <= BEline && BEline < BEp->Lines)
return(1);
BEp = NULL;
BSline = BEline = -1;
title("Block Not Specified");
return(0);
}
do_bdelete()
{
register long i, n;
register ED *bep = BEp;
register WIN *savewin = Ep->Win;
if (blockok()) {
text_switch(bep->Win);
n = BEline - BSline + 1;
if (bep->Line >= BSline && bep->Line <= BEline)
bep->Line = BSline;
if (bep->Line > BEline)
bep->Line -= n;
freelist(bep->List + BSline, BEline - BSline + 1);
bmovl(bep->List+BEline+1,bep->List+BSline,(bep->Lines-BEline-1));
bep->Lines -= n;
bep->Modified = 1;
if (bep->Line >= bep->Lines)
bep->Line = bep->Lines - 1;
if (bep->Line < 0)
bep->Line = 0;
if (bep->Lines == 0)
bep = uninit_init(bep);
text_load();
BEp = NULL;
BSline = BEline = -1;
if (!text_sync())
text_redisplay();
text_switch(savewin);
}
}
void
do_bcopy()
{
register ubyte **list;
register long lines, i;
register ED *ep = Ep;
text_sync();
if (!blockok())
return;
if (ep == BEp && ep->Line > BSline && ep->Line <= BEline) {
title("Cannot Move into self");
return;
}
lines = BEline - BSline + 1;
if (extend(ep, lines)) {
if (list = (ubyte **)allocl(lines)) {
bmovl(BEp->List+BSline,list,lines);
bmovl(ep->List+ep->Line, ep->List+ep->Line+lines, ep->Lines-ep->Line);
for (i = 0; i < lines; ++i) {
ubyte *str = allocb(strlen(list[i])+1);
if (!str) {
nomemory();
FreeMem(list, lines * sizeof(char *));
freelist(ep->List + Ep->Line, i);
bmovl(ep->List+ep->Line+lines, ep->List+ep->Line, ep->Lines-ep->Line);
return;
}
strcpy(str, list[i]);
ep->List[ep->Line+i] = str;
}
FreeMem(list, lines * sizeof(char *));
}
}
if (ep == BEp && ep->Line <= BSline) {
BSline += lines;
BEline += lines;
}
ep->Modified = 1;
ep->Lines += lines;
text_load();
if (!text_sync())
text_redisplay();
}
void
do_bmove()
{
register long lines;
register ubyte **list;
register ED *ep = Ep;
text_sync();
if (!blockok())
return;
if (BEp == ep && ep->Line >= BSline && ep->Line <= BEline) {
title("Cannot Move into self");
return;
}
lines = BEline - BSline + 1;
if (!(list = (ubyte **)allocl(lines))) {
nomemory();
return;
}
BEp->Modified = ep->Modified = 1;
bmovl(BEp->List + BSline, list, lines);
if (ep == BEp) {
if (ep->Line > BSline) {
bmovl(ep->List+BEline+1, ep->List+BSline, ep->Line-BEline-1);
bmovl(list, ep->List + ep->Line - lines, lines);
} else {
bmovl(ep->List+ep->Line, ep->List+ep->Line+lines, BSline-ep->Line);
bmovl(list, ep->List + ep->Line, lines);
}
} else {
WIN *savewin = ep->Win;
if (extend(ep, lines)) {
bmovl(BEp->List+BEline+1, BEp->List+BSline, BEp->Lines-BEline-1);
bmovl(ep->List+ep->Line, ep->List+ep->Line+lines, ep->Lines-ep->Line);
bmovl(list, ep->List+ep->Line, lines);
ep->Lines += lines;
BEp->Lines -= lines;
if (BEp->Line >= BSline && BEp->Line <= BEline)
BEp->Line = BSline - 1;
if (BEp->Line > BEline)
BEp->Line -= lines;
if (BEp->Line < 0)
BEp->Line = 0;
BSline = BEline = -1;
text_load();
text_switch(BEp->Win);
BEp = NULL;
ep = Ep;
if (!ep->iconmode) {
if (!text_sync())
text_redisplay();
}
text_switch(savewin);
ep = Ep;
}
}
BSline = BEline = -1;
BEp = NULL;
FreeMem(list, lines * sizeof(char *));
ep->Modified = 1;
text_load();
if (!text_sync())
text_redisplay();
}
/*
* IF condition trueaction, IFELSE condition trueaction falseaction
*
* condition: !condition NOT the specified condition.
* # toggle number is SET
* top top of file (on first line)
* bot end of file (on last line)
* left start of line (leftmost column)
* right end of line (nothing but spaces under and to the right)
* modified text has been modified
* insert currently in insert mode
* y[<=>]# cursor is (any OR combo of <,>,=) row # (line numbers start at 1)
* x[<=>]# cursor is (<,>,<=,>=,<>) column # (columns start at 1)
* <> means 'not equal'
*
* cl char under cursor is lower case
* cu char under cursor is upper case
* ca char under cursor is alpha
* cn char under cursor is numeric
* cb char within selected block
* c[<=>]# char under cursor is (combo of <,>,and =) #
*/
do_if()
{
char haselse = (av[0][2] == 'e');
char iswhile = (av[0][0] == 'w');
char istrue, notop = 0;
char c, cx, cc;
ubyte *buf1, *buf2;
register ubyte *ptr;
register ED *ep = Ep;
int i, cxn, cn;
buf1 = (ubyte *)malloc(256);
buf2 = (ubyte *)malloc(256);
if (buf1 == NULL || buf2 == NULL) {
if (buf1) free(buf1);
if (buf2) free(buf2);
title("No Memory!");
return(0);
}
breakreset();
ptr = av[1];
if (*ptr == '!') {
notop = 1;
++ptr;
}
c = ptr[0];
cn= atoi(ptr);
cx= ptr[1];
cxn=atoi(ptr+1);
strcpy(buf1, av[2]);
loop:
istrue = 0;
i = 0;
switch(c) {
case 'x':
i = ep->Column + 1;
case 'y':
if (!i)
i = ep->Line + 1;
conditional:
{
register int j, n;
char any = 0;
for (j = 1; ptr[j] && (ptr[j]<'0'||ptr[j]>'9'); ++j);
n = atoi(ptr+j);
for (j = 1; ptr[j]; ++j) {
switch(ptr[j]) {
case '<':
any = 1;
if (i < n)
istrue = 1;
break;
case '=':
any = 1;
if (i == n)
istrue = 1;
break;
case '>':
any = 1;
if (i > n)
istrue = 1;
break;
}
}
if (!any && i == n) /* default is equivalence */
istrue = 1;
}
break;
case 't':
istrue = ep->Line == 0;
break;
case 'b':
istrue = ep->Line == ep->Lines-1;
break;
case 'l':
istrue = ep->Column == 0;
break;
case 'r':
istrue = ep->Column == Clen;
break;
case 'm':
text_sync();
istrue = ep->Modified != 0;
break;
case 'i':
istrue = ep->Insertmode != 0;
break;
case 'c':
cc = Current[ep->Column];
switch(cx) {
case 'b':
istrue = BEp == ep && ep->Line >= BSline && ep->Line <= BEline;
break;
case 'l':
istrue = cc >= 'a' && cc <= 'z';
break;
case 'u':
istrue = cc >= 'A' && cc <= 'Z';
break;
case 'a':
istrue = (cc>='a'&&cc<='z')||(cc>='A'&&cc<='Z')||(cc>='0'&&cc<='9');
break;
case 'n':
istrue = (cc >= '0' && cc <= '9');
break;
default: /* c[<=>]# */
i = Current[ep->Column];
goto conditional;
break;
}
break;
default:
if (c >= '0' && c <= '9')
istrue = do_toggle(cn) != 0;
else
title("bad conditional");
break;
}
istrue ^= notop;
if (istrue) {
strcpy(buf2, buf1); /* could be executed multiple times */
if (do_command(buf2) == 0)
goto done;
if (iswhile) {
if (breakcheck())
Abortcommand = 1;
else
goto loop;
}
} else {
if (haselse) { /* only executed once */
strcpy(buf2, av[3]);
do_command(buf2);
}
}
done:
free(buf1);
free(buf2);
}
/*
* TOGGLE #, SETTOGGLE #, RESETTOGGLE #
*/
do_toggle(n)
{
static char tg[MAXTOGGLE];
register int i;
if (n >= 0) {
if (n >= MAXTOGGLE)
return(0);
return(tg[n]);
}
i = atoi(av[1]);
if (i >= 0 && i < MAXTOGGLE) {
switch(av[0][0]) {
case 't':
tg[i] = !tg[i];
break;
case 's':
tg[i] = 1;
break;
case 'r':
tg[i] = 0;
break;
}
}
}
do_tlate()
{
register ubyte *ptr = av[1];
register ED *ep = Ep;
register char c = Current[ep->Column];
if (c == 0)
c = ' ';
if (ptr[0] == '+')
c += atoi(ptr+1);
else
if (ptr[0] == '-')
c -= atoi(ptr+1);
else
c = atoi(ptr);
if (c) {
if (Current[ep->Column] == 0) {
Clen = ep->Column + 1;
Current[Clen] = 0;
}
Current[ep->Column] = c;
if (Nsu == 0) {
movetocursor();
setpen(ep->Line);
Text(Rp, Current+ep->Column, 1);
}
}
}
/*
* BSOURCE
*
* note that since the start and end lines are loaded immediately and the
* block unblock'd before execution starts, you can theoretically have
* another BSOURCE as part of this BSOURCE (but be carefull!).
*/
do_bsource()
{
ubyte buf[256];
register int i, sl, se;
if (blockok()) {
sl = BSline;
se = BEline + 1;
for (i = sl; BEp && i < se && i < BEp->Lines; ++i) {
text_sync(); /* make sure we are using latest text */
strcpy(buf, BEp->List[i]);
if (do_command(buf) == 0)
break;
}
text_redrawblock(0);
}
}
/*
* SCANF controlstring
*
* The C scanf routine. Only one variable, a string, is allowed in the
* control string.
*/
void
do_scanf()
{
char buf[256];
buf[0] = 0;
sscanf(Current+Ep->Column,av[1],buf,buf,buf,buf,buf,buf,buf);
if (String)
free(String);
String = (char *)malloc(strlen(buf)+1);
strcpy(String,buf);
title(String);
}
movetocursor()
{
register ED *ep = Ep;
Move(Rp, XTbase+(ep->Column-ep->Topcolumn)*Xsize, YTbase+(ep->Line-ep->Topline)*Ysize);
}
extend(ep, lines)
register ED *ep;
{
register long extra = ep->Maxlines - ep->Lines;
register ubyte **list;
if (lines > extra) {
lines += ep->Lines;
if (list = (ubyte **)allocl(lines)) {
bmovl(ep->List, list, ep->Lines);
FreeMem(ep->List, sizeof(char *) * ep->Maxlines);
ep->Maxlines = lines;
ep->List = list;
return(1);
}
nomemory();
return(0);
}
return(1);
}
makeroom(n)
{
register ED *ep = Ep;
if (ep->Lines >= ep->Maxlines)
return(extend(ep, n));
return(1);
}
freelist(list, n)
register char **list;
{
while (n) {
FreeMem(list[0], strlen(list[0])+1);
++list;
--n;
}
}