/***************************************************************************** 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'])(); }
/***************************************************************************** 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; } }
integer DoCJR(long HowFar) /* do C, J or R stuff */ /* long HowFar; positive or negative displacement */ { long InRange; bool ColonMod; #if DEBUGGING static char *DbgFNm = "DoCJR"; sprintf(DbgSBf,"HowFar = %ld", HowFar); DbgFEn(2,DbgFNm,DbgSBf); #endif ColonMod = (CmdMod & COLON); /* is it :C, :J, or :R? */ CmdMod &= ~COLON; /* clear : flag */ InRange = -1; /* -1 means SUCCESS in TECO */ if (HowFar > 0) { if ((GapEnd + HowFar) > EBfEnd) InRange = 0; /* 0 means FAILURE in TECO */ else { MEMMOVE(GapBeg, GapEnd + 1, HowFar); GapBeg += HowFar; GapEnd += HowFar; } } else { if ((GapBeg + HowFar) < EBfBeg) InRange = 0; /* 0 means FAILURE in TECO */ else { GapBeg += HowFar; GapEnd += HowFar; MEMMOVE(GapEnd+1, GapBeg, -(HowFar)); } } if (ColonMod) /* if colon modifier */ { DBGFEX(2,DbgFNm,"PushEx"); return PushEx(InRange, OPERAND); } else if (InRange == 0) /* if out-of-bounds */ { ErrChr(ERR_POP, *CBfPtr); DBGFEX(2, DbgFNm, "FAILURE"); return FAILURE; } CmdMod = '\0'; /* clear modifiers flags */ EStTop = EStBot; /* clear expression stack */ DBGFEX(2,DbgFNm,"SUCCESS"); return SUCCESS; }
static int DoCtVW(charptr EndArg, unsigned char TmpChr) /* do a control-V or control-W */ /* charptr EndArg; ptr to end of string argument */ /* unsigned char TmpChr; temporary character */ { unsigned char WVFlag = TmpChr; /* ^W or ^V flag */ DBGFEN(3, "DoCtVW", NULL); if (++CBfPtr == EndArg) /* move past ^W or ^V, too far? */ { ErrMsg(ERR_ISS); /* yes, illegal search string */ DBGFEX(2, DbgFNm, "FAILURE"); return FAILURE; } if ((*CBfPtr == '^') && ((EdFlag & ED_CARET_OK) == 0)) { if (++CBfPtr == EndArg) { ErrMsg(ERR_ISS); DBGFEX(2, DbgFNm, "FAILURE"); return FAILURE; } TmpChr = To_Upper(*CBfPtr); if ((TmpChr < '@') || (TmpChr > '_')) { ErrChr(ERR_IUC, *CBfPtr); DBGFEX(2, DbgFNm, "FAILURE"); return FAILURE; } TmpChr &= '\077'; } else TmpChr = *CBfPtr; if (WVFlag == CTRL_V) if (TmpChr == CTRL_V) CaseCv = LOWER; else *BBfPtr++ = To_Lower(TmpChr); else if (TmpChr == CTRL_W) CaseCv = UPPER; else *BBfPtr++ = To_Upper(TmpChr); DBGFEX(2, DbgFNm, "SUCCESS"); return SUCCESS; }
DEFAULT ExeF() /* execute one of the F commands */ { if (IncCBP() == FAILURE) { return FAILURE; } switch (To_Upper(*CBfPtr)) { case 'S': return ExeFS(); case 'N': return ExeFN(); case 'D': return ExeFD(); case 'R': return ExeFR(); case 'B': return ExeFB(); case 'C': return ExeFC(); case 'K': return ExeFK(); case '_': return ExeFUn(); case '>': return ExeFGt(); case '<': return ExeFLs(); case '\'': return ExeFSQ(); case '|': return ExeFBr(); default: ErrChr(ERR_IFC, *CBfPtr); return FAILURE; } }
DEFAULT FindQR() /* find q-register index */ { WORD i; BOOLEAN LocalQ; WORD QIndex; unsigned char QName; /* * If it's a local q-register name (starts with a dot), remember and move on. */ DBGFEN(3,"FindQR",NULL); LocalQ = (*CBfPtr == '.'); /* if local q-register */ if (LocalQ) { /* if local q-register name */ if (IncCBP() == FAILURE) { /* move to next character */ DBGFEX(3,DbgFNm,"FAILURE, IncCBP() failed"); return FAILURE; } } /* * Get the index into the QRgstr array into i. */ QName = *CBfPtr; if (Is_Upper(QName)) { i = 'A' - 10; /* QRgStr[10..35] */ } else if (Is_Lower(QName)) { i = 'a' - 10; /* QRgstr[10..35] */ } else if (Is_Digit(QName)) { i = '0'; /* QRgstr[0..9] */ } else { ErrChr(ERR_IQN, QName); DBGFEX(3,DbgFNm,"FAILURE, illegal Q-register name"); return FAILURE; } /* * Get a pointer to the structure into QR. */ QIndex = QName - i; /* index into QRgstr[] */ if (LocalQ) { /* if local q-register */ if (MStTop < 0) { /* if not in a macro */ QR = &QRgstr[QIndex+36]; /* use QRgstr[36..71] */ } else { /* else (we're in a macro) */ WORD TMIndx; QRptr QRp; for (TMIndx=MStTop; TMIndx>0; TMIndx--) { if (MStack[TMIndx].QRgstr != NULL) { QRp = MStack[TMIndx].QRgstr; break; } } QR = (TMIndx != 0) ? /* if we found one */ &QRp[QIndex]: /* use the one we found */ (QRptr) &QRgstr[QIndex+36]; /* else use main level ones */ } } else { QR = &QRgstr[QIndex]; } #if DEBUGGING sprintf(DbgSBf,"SUCCESS, %sQIndex = %d (QName = '%c')", (LocalQ) ? "local " : "", QIndex, QName); DBGFEX(3,DbgFNm,DbgSBf); #endif return SUCCESS; }
int BldStr(charptr XBfBeg, charptr XBfEnd, charptr* XBfPtr) /* build a string */ /* charptr XBfBeg; beginning of build-string buffer */ /* charptr XBfEnd; end of build-string buffer */ /* charptr (*XBfPtr); pointer into build-string buffer */ { charptr EndArg; /* end of input string, plus 1 */ unsigned char TmpChr; /* temporary character */ DBGFEN(2,"BldStr",NULL); if (FindES(ESCAPE) == FAILURE) /* move CBfPtr to end of argument */ { DBGFEX(2,DbgFNm,"FAILURE, FindES(ESCAPE) failed"); return FAILURE; } CaseCv = IniSrM; /* initialize internal search mode */ BBfPtr = XBfBeg; /* initialize ptr into build-string buffer */ EndArg = CBfPtr; /* save pointer to end of argument */ CBfPtr = ArgPtr; /* reset to beginning of argument */ while (CBfPtr < EndArg) { if ((*CBfPtr == '^') && ((EdFlag & ED_CARET_OK) == 0)) { if (++CBfPtr == EndArg) { ErrMsg(ERR_ISS); DBGFEX(2,DbgFNm,"FAILURE, no char after ^"); return FAILURE; } TmpChr = To_Upper(*CBfPtr); if ((TmpChr < '@') || (TmpChr > '_')) { ErrChr(ERR_IUC, *CBfPtr); DBGFEX(2,DbgFNm,"FAILURE, bad char after ^"); return FAILURE; } TmpChr &= '\077'; } else TmpChr = *CBfPtr; switch (TmpChr) { case CTRL_R: case CTRL_Q: if (++CBfPtr == EndArg) { ErrMsg(ERR_ISS); DBGFEX(2, DbgFNm, "FAILURE"); return FAILURE; } *BBfPtr++ = *CBfPtr; break; case CTRL_V: case CTRL_W: if (DoCtVW(EndArg, TmpChr) == FAILURE) { DBGFEX(2, DbgFNm, "FAILURE, DoCtVW failed"); return FAILURE; } break; case CTRL_E: if (DoCtE(EndArg, XBfEnd) == FAILURE) { DBGFEX(2, DbgFNm, "FAILURE, DoCtE failed"); return FAILURE; } break; default: if (CaseCv == LOWER) TmpChr = To_Lower(TmpChr); else if (CaseCv == UPPER) TmpChr = To_Upper(TmpChr); *BBfPtr++ = TmpChr; } /* switch(TmpChr) */ if (BBfPtr > XBfEnd) { ErrMsg(ERR_STL); /* string too long */ DBGFEX(2, DbgFNm, "FAILURE, string too long"); return FAILURE; } ++CBfPtr; } *XBfPtr = BBfPtr; #if DEBUGGING sprintf(DbgSBf, "string = \"%.*s\"", (int)(BBfPtr-XBfBeg), XBfBeg); DbgFEx(2, DbgFNm, DbgSBf); #endif return SUCCESS; }