399 lines
15 KiB
C
399 lines
15 KiB
C
/*****************************************************************************
|
|
SkpCmd.c
|
|
*****************************************************************************/
|
|
#include "zport.h" /* define portability identifiers */
|
|
#include "tecoc.h" /* define general identifiers */
|
|
#include "defext.h" /* define external global variables */
|
|
#include "chmacs.h" /* define character processing macros */
|
|
#include "dchars.h" /* define identifiers for characters */
|
|
#include "deferr.h" /* define identifiers for error messages */
|
|
#if USE_PROTOTYPES
|
|
static DEFAULT SkpArg(void); /* skip command with text argument */
|
|
static DEFAULT SkpCrt(void); /* skip a ^ (caret) command */
|
|
static DEFAULT SkpCtA(void); /* skip control-A command */
|
|
static DEFAULT SkpCtU(void); /* skip control-U command */
|
|
static DEFAULT SkpDAr(void); /* skip "double text argument" command */
|
|
static DEFAULT SkpDqu(void); /* skip a " (double quote) command */
|
|
static DEFAULT SkpE(void); /* skip one of the E commands */
|
|
static DEFAULT SkpExc(void); /* skip command with text argument */
|
|
static DEFAULT SkpF(void); /* skip one of the F commands */
|
|
static DEFAULT SkpOne(void); /* skip one command character */
|
|
static DEFAULT SkpSkp(void); /* */
|
|
#endif
|
|
/*****************************************************************************
|
|
SkpArg()
|
|
*****************************************************************************/
|
|
static DEFAULT SkpArg() /* skip command with text argument */
|
|
{
|
|
BOOLEAN TTrace; /* temp: holds trace flag */
|
|
TTrace = TraceM; /* save trace mode flag */
|
|
TraceM = FALSE; /* keep FindES from tracing */
|
|
if (FindES(ESCAPE) == FAILURE) /* find end of string */
|
|
{
|
|
TraceM = TTrace; /* restore trace mode flag */
|
|
return FAILURE;
|
|
}
|
|
TraceM = TTrace; /* restore trace mode flag */
|
|
CmdMod = '\0'; /* clear modifiers flags */
|
|
return SUCCESS;
|
|
}
|
|
/*****************************************************************************
|
|
SkpCtA()
|
|
*****************************************************************************/
|
|
static DEFAULT SkpCtA() /* skip control-A command */
|
|
{
|
|
BOOLEAN TTrace; /* temp: holds trace flag */
|
|
TTrace = TraceM; /* save trace mode flag */
|
|
TraceM = FALSE; /* keep FindES from tracing */
|
|
if (FindES(CTRL_A) == FAILURE) /* find end of string */
|
|
{
|
|
TraceM = TTrace; /* restore trace mode flag */
|
|
return FAILURE;
|
|
}
|
|
TraceM = TTrace; /* restore trace mode flag */
|
|
CmdMod = '\0'; /* clear modifiers flags */
|
|
return SUCCESS;
|
|
}
|
|
/*****************************************************************************
|
|
SkpCtU()
|
|
*****************************************************************************/
|
|
static DEFAULT SkpCtU() /* skip control-U command */
|
|
{
|
|
BOOLEAN TTrace; /* temp: holds trace flag */
|
|
if (CBfPtr == CStEnd)
|
|
if (MStTop < 0) /* if not in a macro */
|
|
{
|
|
ErrUTC(); /* unterminated command */
|
|
return FAILURE;
|
|
}
|
|
else
|
|
return SUCCESS;
|
|
++CBfPtr;
|
|
TTrace = TraceM; /* save trace mode flag */
|
|
TraceM = FALSE; /* keep FindES from tracing */
|
|
if (FindES(ESCAPE) == FAILURE) /* find end of string */
|
|
{
|
|
TraceM = TTrace; /* restore trace mode flag */
|
|
return FAILURE;
|
|
}
|
|
TraceM = TTrace; /* restore trace mode flag */
|
|
CmdMod = '\0'; /* clear modifiers flags */
|
|
return SUCCESS;
|
|
}
|
|
/*****************************************************************************
|
|
SkpDAr()
|
|
*****************************************************************************/
|
|
static DEFAULT SkpDAr() /* skip "double text argument" command */
|
|
{
|
|
BOOLEAN TTrace; /* saves TraceM temporarily */
|
|
TTrace = TraceM; /* save trace mode flag */
|
|
TraceM = FALSE; /* keep FindES from tracing */
|
|
if (FindES(ESCAPE) == FAILURE)
|
|
{
|
|
TraceM = TTrace; /* restore trace mode flag */
|
|
return FAILURE;
|
|
}
|
|
if (CmdMod & ATSIGN) /* if at-sign modified */
|
|
--CBfPtr;
|
|
if (FindES(ESCAPE) == FAILURE)
|
|
{
|
|
TraceM = TTrace; /* restore trace mode flag */
|
|
return FAILURE;
|
|
}
|
|
TraceM = TTrace; /* restore trace mode flag */
|
|
return SUCCESS;
|
|
}
|
|
/*****************************************************************************
|
|
SkpDqu()
|
|
*****************************************************************************/
|
|
static DEFAULT SkpDqu() /* skip a " (double quote) command */
|
|
{
|
|
DBGFEN(3,"SkpDqu",NULL);
|
|
if (CBfPtr == CStEnd) /* if end of command string */
|
|
if (MStTop < 0) /* if not in a macro */
|
|
{
|
|
ErrUTC(); /* unterminated command */
|
|
return FAILURE;
|
|
}
|
|
else
|
|
return SUCCESS;
|
|
++CBfPtr;
|
|
switch (To_Upper(*CBfPtr)) {
|
|
case 'A':
|
|
case 'C':
|
|
case 'D':
|
|
case 'E':
|
|
case 'F':
|
|
case 'U':
|
|
case '=':
|
|
case 'G':
|
|
case '>':
|
|
case 'L':
|
|
case 'S':
|
|
case 'T':
|
|
case '<':
|
|
case 'N':
|
|
case 'R':
|
|
case 'V':
|
|
case 'W':
|
|
break;
|
|
default:
|
|
ErrMsg(ERR_IQC); /* ill. char. after " */
|
|
DBGFEX(3,DbgFNm,"FAILURE");
|
|
return FAILURE;
|
|
}
|
|
CmdMod = '\0'; /* clear modifiers flags */
|
|
DBGFEX(3,DbgFNm,"SUCCESS");
|
|
return SUCCESS;
|
|
}
|
|
/*****************************************************************************
|
|
SkpExc()
|
|
*****************************************************************************/
|
|
static DEFAULT SkpExc() /* skip command with text argument */
|
|
{
|
|
BOOLEAN TTrace; /* temp: holds trace flag */
|
|
TTrace = TraceM; /* save trace mode flag */
|
|
TraceM = FALSE; /* keep FindES from tracing */
|
|
if (FindES('!') == FAILURE) /* find end of string */
|
|
{
|
|
TraceM = TTrace; /* restore trace mode flag */
|
|
return FAILURE;
|
|
}
|
|
TraceM = TTrace; /* restore trace mode flag */
|
|
CmdMod = '\0'; /* clear modifiers flags */
|
|
return SUCCESS;
|
|
}
|
|
/*****************************************************************************
|
|
SkpSkp()
|
|
*****************************************************************************/
|
|
static DEFAULT SkpSkp() /* */
|
|
{
|
|
CmdMod = '\0'; /* clear ATSIGN modifier */
|
|
return SUCCESS;
|
|
}
|
|
/*****************************************************************************
|
|
SkpF()
|
|
*****************************************************************************/
|
|
static DEFAULT SkpF() /* skip one of the F commands */
|
|
{
|
|
if (CBfPtr == CStEnd)
|
|
if (MStTop < 0) /* if not in a macro */
|
|
{
|
|
ErrUTC(); /* unterminated command */
|
|
return FAILURE;
|
|
}
|
|
else
|
|
return SUCCESS;
|
|
++CBfPtr;
|
|
switch (To_Upper(*CBfPtr)) {
|
|
case 'S':
|
|
case 'N':
|
|
case 'C':
|
|
case '_': return SkpDAr();
|
|
case 'D':
|
|
case 'R':
|
|
case 'B':
|
|
case 'K': return SkpArg();
|
|
case '>':
|
|
case '<':
|
|
case '\'':
|
|
case '|': return SkpSkp();
|
|
default:
|
|
ErrChr(ERR_IFC, *CBfPtr);
|
|
return FAILURE;
|
|
}
|
|
}
|
|
/*****************************************************************************
|
|
SkpOne()
|
|
*****************************************************************************/
|
|
static DEFAULT SkpOne() /* skip one command character */
|
|
{
|
|
#if DEBUGGING
|
|
static char *DbgFNm = "SkpOne";
|
|
sprintf(DbgSBf,"*CBfPtr = '%c'", *CBfPtr);
|
|
DbgFEn(3,DbgFNm,DbgSBf);
|
|
#endif
|
|
if (CBfPtr == CStEnd) {
|
|
if (MStTop < 0) { /* if not in a macro */
|
|
ErrUTC(); /* unterminated command */
|
|
DBGFEX(3,DbgFNm,"FAILURE");
|
|
return FAILURE;
|
|
} else {
|
|
DBGFEX(3,DbgFNm,"SUCCESS");
|
|
return SUCCESS;
|
|
}
|
|
}
|
|
++CBfPtr;
|
|
#if DEBUGGING
|
|
sprintf(DbgSBf,"*CBfPtr = '%c'", *CBfPtr);
|
|
DbgFEx(3,DbgFNm,DbgSBf);
|
|
#endif
|
|
return SUCCESS;
|
|
}
|
|
/*****************************************************************************
|
|
SkpCrt()
|
|
*****************************************************************************/
|
|
static DEFAULT SkpCrt() /* skip a ^ (caret) command */
|
|
{
|
|
static DEFAULT (*FCAray[])(VVOID) = {
|
|
/* ^A*/ SkpCtA, /* ^B*/ SkpSkp, /* ^C*/ SkpSkp, /* ^D*/ SkpSkp,
|
|
/* ^E*/ SkpSkp, /* ^F*/ SkpSkp, /* ^G*/ SkpSkp, /* ^H*/ SkpSkp,
|
|
/*TAB*/ SkpArg, /* LF*/ ExeNul, /* VT*/ SkpSkp, /* FF*/ SkpSkp,
|
|
/* CR*/ ExeNul, /* ^N*/ SkpSkp, /* ^O*/ SkpSkp, /* ^P*/ SkpSkp,
|
|
/* ^Q*/ SkpSkp, /* ^R*/ SkpSkp, /* ^S*/ SkpSkp, /* ^T*/ SkpSkp,
|
|
/* ^U*/ SkpCtU, /* ^V*/ SkpSkp, /* ^W*/ SkpSkp, /* ^X*/ SkpSkp,
|
|
/* ^Y*/ SkpSkp, /* ^Z*/ SkpSkp, /* ^[*/ SkpSkp, /* ^\*/ SkpSkp,
|
|
/* ^]*/ SkpSkp, /* ^^*/ SkpOne, /* ^_*/ SkpSkp
|
|
};
|
|
WORD CDummy;
|
|
if (CBfPtr == CStEnd) /* if end of command string */
|
|
if (MStTop < 0) /* if macro stack empty */
|
|
{
|
|
ErrUTC(); /* unterminated command */
|
|
return FAILURE;
|
|
}
|
|
else
|
|
return SUCCESS;
|
|
++CBfPtr;
|
|
if ((*CBfPtr >= 'A') && (*CBfPtr <= '_'))
|
|
CDummy = *CBfPtr - 'A';
|
|
else if (Is_Lower(*CBfPtr))
|
|
CDummy = *CBfPtr - 'a'; /* convert to upper case */
|
|
else {
|
|
ErrMsg(ERR_IUC); /* illegal char after ^ */
|
|
return FAILURE;
|
|
}
|
|
return (*FCAray[CDummy])();
|
|
}
|
|
/*****************************************************************************
|
|
SkpE()
|
|
*****************************************************************************/
|
|
static DEFAULT SkpE() /* skip one of the E commands */
|
|
{
|
|
unsigned char TmpChr;
|
|
static DEFAULT (*FEAray[])(VVOID) = {
|
|
/* A */ SkpSkp, /* B */ SkpArg, /* C */ SkpSkp, /* D */ SkpSkp,
|
|
/* E */ 0, /* F */ SkpSkp, /* G */ SkpArg, /* H */ SkpSkp,
|
|
/* I */ SkpArg, /* J */ SkpSkp, /* K */ SkpSkp, /* L */ SkpArg,
|
|
/* M */ SkpSkp, /* N */ SkpSkp, /* O */ SkpSkp, /* P */ SkpSkp,
|
|
/* Q */ SkpOne, /* R */ SkpArg, /* S */ SkpSkp, /* T */ SkpSkp,
|
|
/* U */ SkpSkp, /* V */ SkpSkp, /* W */ SkpArg, /* X */ SkpSkp,
|
|
/* Y */ SkpSkp, /* Z */ SkpSkp
|
|
};
|
|
if (CBfPtr == CStEnd)
|
|
if (MStTop < 0) /* if not in a macro */
|
|
{
|
|
ErrUTC(); /* unterminated command */
|
|
return FAILURE;
|
|
}
|
|
else
|
|
return SUCCESS;
|
|
++CBfPtr;
|
|
TmpChr = To_Upper(*CBfPtr);
|
|
if (TmpChr == '%')
|
|
return SkpOne();
|
|
else if (TmpChr == '_')
|
|
return SkpArg();
|
|
else if (!Is_Upper(TmpChr) || (TmpChr=='E'))
|
|
{
|
|
ErrChr(ERR_IEC, *CBfPtr);
|
|
return FAILURE;
|
|
}
|
|
return (*FEAray[TmpChr-'A'])();
|
|
}
|
|
/*****************************************************************************
|
|
SkpCmd()
|
|
This function "skips" TECO commands. It is used when TECO needs to
|
|
skip forward under one of these conditions:
|
|
1. flow to the end of a conditional
|
|
2. flow to the else clause of a conditional
|
|
3. flow to the end of a loop
|
|
4. flow while searching for a tag
|
|
When this function is called, CBfPtr points to a command. When this
|
|
function returns, CBfPtr is left pointing to the last character of the
|
|
command. In the case of a command like T, CBfPtr is not changed. In the
|
|
case of a command like Stext<ESC>, CBfPtr is left pointing to the <ESC>.
|
|
*****************************************************************************/
|
|
DEFAULT SkpCmd() /* skip a "command" */
|
|
{
|
|
static DEFAULT (*FSAray[])(VVOID) = {
|
|
/*NUL*/ ExeNul, /* ^A*/ SkpCtA, /* ^B*/ SkpSkp, /* ^C*/ SkpSkp,
|
|
/* ^D*/ SkpSkp, /* ^E*/ SkpSkp, /* ^F*/ SkpSkp, /* ^G*/ SkpSkp,
|
|
/* BS*/ SkpSkp, /*TAB*/ SkpArg, /* LF*/ ExeNul, /* VT*/ SkpSkp,
|
|
/* FF*/ SkpSkp, /* CR*/ ExeNul, /* ^N*/ SkpSkp, /* ^O*/ SkpSkp,
|
|
/* ^P*/ SkpSkp, /* ^Q*/ SkpSkp, /* ^R*/ SkpSkp, /* ^S*/ SkpSkp,
|
|
/* ^T*/ SkpSkp, /* ^U*/ SkpCtU, /* ^V*/ SkpSkp, /* ^W*/ SkpSkp,
|
|
/* ^X*/ SkpSkp, /* ^Y*/ SkpSkp, /* ^Z*/ SkpSkp, /*ESC*/ SkpSkp,
|
|
/* ^\*/ SkpSkp, /* ^]*/ SkpSkp, /* ^^*/ SkpOne, /* ^_*/ SkpSkp,
|
|
/* SP*/ ExeNul, /* ! */ SkpExc, /* " */ SkpDqu, /* # */ SkpSkp,
|
|
/* $ */ SkpSkp, /* % */ SkpOne, /* & */ SkpSkp, /* ' */ SkpSkp,
|
|
/* ( */ SkpSkp, /* ) */ SkpSkp, /* * */ SkpSkp, /* + */ SkpSkp,
|
|
/* , */ SkpSkp, /* - */ SkpSkp, /* . */ SkpSkp, /* / */ SkpSkp,
|
|
/* 0 */ SkpSkp, /* 1 */ SkpSkp, /* 2 */ SkpSkp, /* 3 */ SkpSkp,
|
|
/* 4 */ SkpSkp, /* 5 */ SkpSkp, /* 6 */ SkpSkp, /* 7 */ SkpSkp,
|
|
/* 8 */ SkpSkp, /* 9 */ SkpSkp, /* : */ SkpSkp, /* ; */ SkpSkp,
|
|
/* < */ SkpSkp, /* = */ SkpSkp, /* > */ SkpSkp, /* ? */ SkpSkp,
|
|
/* @ */ ExeAtS, /* A */ SkpSkp, /* B */ SkpSkp, /* C */ SkpSkp,
|
|
/* D */ SkpSkp, /* E */ SkpE, /* F */ SkpF, /* G */ SkpOne,
|
|
/* H */ SkpSkp, /* I */ SkpArg, /* J */ SkpSkp, /* K */ SkpSkp,
|
|
/* L */ SkpSkp, /* M */ SkpOne, /* N */ SkpArg, /* O */ SkpArg,
|
|
/* P */ SkpSkp, /* Q */ SkpOne, /* R */ SkpSkp, /* S */ SkpArg,
|
|
/* T */ SkpSkp, /* U */ SkpOne, /* V */ SkpSkp, /* W */ SkpSkp,
|
|
/* X */ SkpOne, /* Y */ SkpSkp, /* Z */ SkpSkp, /* [ */ SkpOne,
|
|
/* \ */ SkpSkp, /* ] */ SkpOne, /* ^ */ SkpCrt, /* _ */ SkpArg,
|
|
/* ` */ SkpSkp, /* a */ SkpSkp, /* b */ SkpSkp, /* c */ SkpSkp,
|
|
/* d */ SkpSkp, /* e */ SkpE, /* f */ SkpF, /* g */ SkpOne,
|
|
/* h */ SkpSkp, /* i */ SkpArg, /* j */ SkpSkp, /* k */ SkpSkp,
|
|
/* l */ SkpSkp, /* m */ SkpOne, /* n */ SkpArg, /* o */ SkpArg,
|
|
/* p */ SkpSkp, /* q */ SkpOne, /* r */ SkpSkp, /* s */ SkpArg,
|
|
/* t */ SkpSkp, /* u */ SkpOne, /* v */ SkpSkp, /* w */ SkpSkp,
|
|
/* x */ SkpOne, /* y */ SkpSkp, /* z */ SkpSkp, /* { */ SkpSkp,
|
|
/* | */ SkpSkp, /* } */ SkpSkp, /* ~ */ SkpSkp, /*DEL*/ SkpSkp,
|
|
/*129*/ SkpSkp, /*130*/ SkpSkp, /*131*/ SkpSkp, /*132*/ SkpSkp,
|
|
/*133*/ SkpSkp, /*134*/ SkpSkp, /*135*/ SkpSkp, /*136*/ SkpSkp,
|
|
/*137*/ SkpSkp, /*138*/ SkpSkp, /*139*/ SkpSkp, /*140*/ SkpSkp,
|
|
/*141*/ SkpSkp, /*142*/ SkpSkp, /*143*/ SkpSkp, /*144*/ SkpSkp,
|
|
/*145*/ SkpSkp, /*146*/ SkpSkp, /*147*/ SkpSkp, /*148*/ SkpSkp,
|
|
/*149*/ SkpSkp, /*150*/ SkpSkp, /*151*/ SkpSkp, /*152*/ SkpSkp,
|
|
/*153*/ SkpSkp, /*154*/ SkpSkp, /*155*/ SkpSkp, /*156*/ SkpSkp,
|
|
/*157*/ SkpSkp, /*158*/ SkpSkp, /*159*/ SkpSkp, /*160*/ SkpSkp,
|
|
/*161*/ SkpSkp, /*162*/ SkpSkp, /*163*/ SkpSkp, /*164*/ SkpSkp,
|
|
/*165*/ SkpSkp, /*166*/ SkpSkp, /*167*/ SkpSkp, /*168*/ SkpSkp,
|
|
/*169*/ SkpSkp, /*170*/ SkpSkp, /*171*/ SkpSkp, /*172*/ SkpSkp,
|
|
/*173*/ SkpSkp, /*174*/ SkpSkp, /*175*/ SkpSkp, /*176*/ SkpSkp,
|
|
/*177*/ SkpSkp, /*178*/ SkpSkp, /*179*/ SkpSkp, /*180*/ SkpSkp,
|
|
/*181*/ SkpSkp, /*182*/ SkpSkp, /*183*/ SkpSkp, /*184*/ SkpSkp,
|
|
/*185*/ SkpSkp, /*186*/ SkpSkp, /*187*/ SkpSkp, /*188*/ SkpSkp,
|
|
/*189*/ SkpSkp, /*190*/ SkpSkp, /*191*/ SkpSkp, /*192*/ SkpSkp,
|
|
/*193*/ SkpSkp, /*194*/ SkpSkp, /*195*/ SkpSkp, /*196*/ SkpSkp,
|
|
/*197*/ SkpSkp, /*198*/ SkpSkp, /*199*/ SkpSkp, /*200*/ SkpSkp,
|
|
/*201*/ SkpSkp, /*202*/ SkpSkp, /*203*/ SkpSkp, /*204*/ SkpSkp,
|
|
/*205*/ SkpSkp, /*206*/ SkpSkp, /*207*/ SkpSkp, /*208*/ SkpSkp,
|
|
/*209*/ SkpSkp, /*210*/ SkpSkp, /*211*/ SkpSkp, /*212*/ SkpSkp,
|
|
/*213*/ SkpSkp, /*214*/ SkpSkp, /*215*/ SkpSkp, /*216*/ SkpSkp,
|
|
/*217*/ SkpSkp, /*218*/ SkpSkp, /*219*/ SkpSkp, /*220*/ SkpSkp,
|
|
/*221*/ SkpSkp, /*222*/ SkpSkp, /*223*/ SkpSkp, /*224*/ SkpSkp,
|
|
/*225*/ SkpSkp, /*226*/ SkpSkp, /*227*/ SkpSkp, /*228*/ SkpSkp,
|
|
/*229*/ SkpSkp, /*230*/ SkpSkp, /*231*/ SkpSkp, /*232*/ SkpSkp,
|
|
/*233*/ SkpSkp, /*234*/ SkpSkp, /*235*/ SkpSkp, /*236*/ SkpSkp,
|
|
/*237*/ SkpSkp, /*238*/ SkpSkp, /*239*/ SkpSkp, /*240*/ SkpSkp,
|
|
/*241*/ SkpSkp, /*242*/ SkpSkp, /*243*/ SkpSkp, /*244*/ SkpSkp,
|
|
/*245*/ SkpSkp, /*246*/ SkpSkp, /*247*/ SkpSkp, /*248*/ SkpSkp,
|
|
/*249*/ SkpSkp, /*250*/ SkpSkp, /*251*/ SkpSkp, /*252*/ SkpSkp,
|
|
/*253*/ SkpSkp, /*254*/ SkpSkp, /*255*/ SkpSkp, /*256*/ SkpSkp
|
|
};
|
|
DEFAULT Status;
|
|
#if DEBUGGING
|
|
static char *DbgFNm = "SkpCmd";
|
|
sprintf(DbgSBf,"*CBfPtr = '%c', at_sign is %s",
|
|
*CBfPtr, (CmdMod & ATSIGN) ? "TRUE" : "FALSE");
|
|
DbgFEn(3,DbgFNm,DbgSBf);
|
|
#endif
|
|
Status = (*FSAray[*CBfPtr])();
|
|
#if DEBUGGING
|
|
sprintf(DbgSBf,"*CBfPtr = '%c'", *CBfPtr);
|
|
DbgFEx(3,DbgFNm,DbgSBf);
|
|
#endif
|
|
return Status;
|
|
}
|