예제 #1
0
파일: skpcmd.c 프로젝트: blakemcbride/TECOC
/*****************************************************************************
	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'])();
}
예제 #2
0
파일: skpcmd.c 프로젝트: blakemcbride/TECOC
/*****************************************************************************
	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;
	}
}
예제 #3
0
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;
}
예제 #4
0
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;
}
예제 #5
0
파일: exef.c 프로젝트: rmblair/tecoc
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;
	}
}
예제 #6
0
파일: findqr.c 프로젝트: rmblair/tecoc
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;
}
예제 #7
0
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;
}