teacl/src/exew.c

281 lines
6.2 KiB
C

/*****************************************************************************
ExeW()
This function executes a W command.
W Scope "WATCH"
n:W Return scope characteristics
m,n:W Set scope characteristics
TECO-C implements only the part of the W command relating to the
terminal type.
*****************************************************************************/
#if CURSES
#if ULTRIX
#include <cursesX.h> /* has to come before zport.h */
#else
#include <curses.h> /* has to come before zport.h */
#endif
#endif
#include "zport.h" /* define portability identifiers */
#include "tecoc.h" /* define general identifiers */
#include "deferr.h" /* identifiers for error messages */
#include "defext.h" /* define external global variables */
#if VIDEO
#if CURSES
extern int scope_start;
extern unsigned char *p_scope_start;
extern int skiprefresh;
#endif
#if USE_PROTOTYPES
static DEFAULT VGetW(void);
static DEFAULT VSetW(void);
static DEFAULT VDoW(void);
#endif
#include "dscren.h" /* define screen identifiers */
#include <string.h> /* prototype for strlen() */
static DEFAULT VGetW() /* execute an n:W command */
{
DBGFEN(1,"VGetW",NULL);
DBGFEX(1,DbgFNm,"PushEx()");
return PushEx( NArgmt==0 ? CrType :
NArgmt==1 ? HtSize :
NArgmt==2 ? VtSize :
NArgmt==3 ? SeeAll :
NArgmt==4 ? MrkFlg :
NArgmt==5 ? HldFlg :
NArgmt==6 ? TopDot :
NArgmt==7 ? ScroLn :
#if CURSES
NArgmt==8 ? SpcMrk :
NArgmt==9 ? KeyPad :
#endif
0 , OPERAND);
}
static DEFAULT VSetW() /* execute an m,n:W command */
{
DBGFEN(1,"VSetW",NULL);
/*
* Use an if here instead of a "default" case because doing a switch will
* cast the variable to an "int", causing Turbo-C to warn about types.
*/
if ((NArgmt < 0) || (NArgmt > 9)) {
return ExeNYI();
}
switch ((int)NArgmt) {
case 0:
if ((MArgmt < 0) || (MArgmt > 13) || (MArgmt == 3) ||
(MArgmt == 5) ||
(MArgmt == 7) ||
(MArgmt == 9)) {
ZDspBf("Illegal terminal type.", 22);
ZDspBf(" Terminal types are:\r\n", 23);
ZDspBf("\t0\t= VT52\r\n", 11);
ZDspBf("\t1\t= VT61\r\n", 11);
ZDspBf("\t2\t= VT100 in VT52 mode\r\n", 25);
ZDspBf("\t4\t= VT100 in VT100 mode\r\n", 26);
ZDspBf("\t6\t= VT05\r\n", 11);
ZDspBf("\t8\t= VT102\r\n", 12);
ZDspBf("\t10\t= VK100\r\n", 13);
ZDspBf("\t11\t= VT200 in VT200 mode\r\n", 27);
ZDspBf("\t12\t= VT200 in ANSI (VT100) mode\r\n", 34);
ZDspBf("\t13\t= VT200 in VT52 mode\r\n", 26);
CrType = (DEFAULT)MArgmt;
return FAILURE;
}
CrType = (DEFAULT)MArgmt;
break;
case 1:
if (MArgmt < 1) {
ErrMsg(ERR_ARG);
return FAILURE;
}
if (ZSetTT(TTWIDTH, (DEFAULT)MArgmt) == FAILURE)
return FAILURE;
HtSize = (DEFAULT)MArgmt;
break;
case 2:
if (MArgmt < 1) {
ErrMsg(ERR_ARG);
return FAILURE;
}
if (ZSetTT(TTHEIGHT, (DEFAULT)MArgmt) == FAILURE)
return FAILURE;
VtSize = (DEFAULT)MArgmt;
break;
case 3:
SeeAll = (DEFAULT)MArgmt;
break;
case 4:
MrkFlg = (DEFAULT)MArgmt;
break;
case 5:
HldFlg = (DEFAULT)MArgmt;
break;
case 6:
#if CURSES
scope_start = (int)MArgmt;
p_scope_start = (scope_start > GapBeg - EBfBeg)
? (scope_start - (GapBeg - EBfBeg)) + GapEnd
: EBfBeg + scope_start;
#else
TopDot = (DEFAULT)MArgmt;
#endif
break;
case 7:
ScroLn = (DEFAULT)MArgmt;
#if CURSES
Scope(ScroLn);
#endif
break;
#if CURSES
case 8:
SpcMrk = (DEFAULT)MArgmt;
break;
case 9:
KeyPad = (DEFAULT)MArgmt;
break;
#endif
} /* end of switch */
DBGFEX(1,DbgFNm,"SUCCESS");
return (PushEx(MArgmt, OPERAND));
}
static DEFAULT VDoW() /* execute an nW command */
{
DBGFEN(1,"VDoW",NULL);
#if CURSES
if (NArgmt== (-4)) {
redraw();
wrefresh(curscr);
return SUCCESS;
} else if (NArgmt==0 || NArgmt == 16) {
redraw();
refresh();
return SUCCESS;
} else if (NArgmt == -1) {
skiprefresh = 1;
return SUCCESS;
} else if (NArgmt == 1) {
skiprefresh = 0;
return SUCCESS;
} else if (NArgmt == 2) { /* put line containing dot at top */
p_scope_start=GapBeg;
scope_start=GapBeg - EBfBeg;
redraw();
refresh();
return SUCCESS;
} else
return SUCCESS;
#else /* if CURSES */
#if DEBUGGING
if (NArgmt == -1) {
printf("VDoW: -1W refreshing the screen\r\n");
} else if (NArgmt == 0) {
printf("VDoW: 0W Placing default cursor line at 16. Forgetting.\r\n");
} else if (NArgmt == -1000) {
printf("VDoW: -1000W Forgetting output was done.\r\n");
} else if (NArgmt < 0) {
printf("VDoW: %ldW telling refresher top %ld lines are altered.\r\n",
NArgmt, -NArgmt-1);
} else {
printf("VDoW: %ldW Placing def. cursor at line %ld. Forgetting.\r\n",
NArgmt, NArgmt);
}
DBGFEX(1,DbgFNm,"SUCCESS");
return SUCCESS;
#else
return ExeNYI();
#endif /* DEBUGGING */
#endif /* CURSES */
}
#endif /* VIDEO */
DEFAULT ExeW() /* execute an W command */
{
DBGFEN(1,"ExeW",NULL);
/*
* If the terminal is not a scope, don't do anything. Don't return
* FAILURE, because that'll terminate the current macro.
*/
if (!(EtFlag & ET_WAT_SCOPE)) { /* if scope not available */
CmdMod = '\0';
DBGFEX(1,DbgFNm,"SUCCESS");
return SUCCESS;
}
#if VIDEO
if (EStTop == EStBot) { /* if no numeric argument */
NArgmt = (CmdMod & COLON) ? 0 : 16;
} else {
if (GetNmA() == FAILURE) { /* get the numeric argument */
DBGFEX(1,DbgFNm,"FAILURE");
return FAILURE;
}
}
if (CmdMod & COLON) { /* if it's :W */
if (NArgmt < 0) { /* insert processing? */
CmdMod = '\0';
return ExeNYI();
} else {
if (CmdMod & MARGIS) { /* if it's m,n:W */
CmdMod = '\0';
if (VSetW() == FAILURE) {
DBGFEX(1,DbgFNm,"FAILURE");
return FAILURE;
}
} else { /* else (must be n:W) */
CmdMod = '\0';
if (VGetW() == FAILURE) {
DBGFEX(1,DbgFNm,"FAILURE");
return FAILURE;
}
}
}
} else { /* else there's no colon */
CmdMod = '\0';
if (VDoW() == FAILURE) {
DBGFEX(1,DbgFNm,"FAILURE");
return FAILURE;
}
EStTop = EStBot; /* clear expression stack */
CmdMod &= ~COLON; /* clear colon modifier */
}
DBGFEX(1,DbgFNm,"SUCCESS");
CmdMod = '\0';
return SUCCESS;
#else /* not VIDEO */
CmdMod = '\0';
DBGFEX(1,DbgFNm,"ExeNYI()");
return ExeNYI();
#endif /* VIDEO */
}