teacl/src/exex.c

95 lines
2.9 KiB
C

/*****************************************************************************
ExeX()
This function executes an X command.
nXq Put n lines into Q-register q
m,nXq Put characters m to n into Q-register q
n:Xq Append n lines to Q-register q
m,n:Xq Append characters m to n into Q-register q
*****************************************************************************/
#include "zport.h" /* define portability identifiers */
#include "tecoc.h" /* define general identifiers */
#include "defext.h" /* define external global variables */
#include "deferr.h" /* define identifiers for error messages */
DEFAULT ExeX() /* execute an X command */
{
ptrdiff_t TmpSiz;
DBGFEN(1,"ExeX",NULL);
if (EStTop == EStBot) { /* if no numeric argument */
NArgmt = 1; /* default is 1X */
} else {
UMinus(); /* if it's -X, make it -1X */
if (GetNmA() == FAILURE) { /* get numeric argument */
DBGFEX(1,DbgFNm,"FAILURE, GetNmA() failed");
return FAILURE;
}
}
if (IncCBP() == FAILURE) { /* move to char after X */
DBGFEX(1,DbgFNm,"FAILURE, IncCBP() failed");
return FAILURE;
}
if (FindQR() == FAILURE) { /* find q-register values */
DBGFEX(1,DbgFNm,"FAILURE, FindQR() failed");
return FAILURE;
}
if (!(CmdMod & COLON)) { /* if no colon modifier */
if (QR->Start != NULL) { /* if text area not empty */
ZFree((voidptr)QR->Start);/* free allocated memory */
QR->Start = QR->End_P1 = NULL;
}
}
if ((CmdMod & MARGIS) == '\0') { /* if it's nXq (not m,nXq) */
NArgmt = Ln2Chr(NArgmt);
if (NArgmt > 0) {
if (MakRom((SIZE_T)NArgmt) == FAILURE) {
DBGFEX(1,DbgFNm,"FAILURE, MakRom() failed");
return FAILURE;
}
MEMMOVE(QR->End_P1, GapEnd+1, (SIZE_T)NArgmt);
QR->End_P1 += NArgmt;
} else if (NArgmt < 0) {
if (MakRom((SIZE_T)-NArgmt) == FAILURE) {
DBGFEX(1,DbgFNm,"FAILURE, MakRom() failed");
return FAILURE;
}
MEMMOVE(QR->End_P1, GapBeg+NArgmt, (SIZE_T)-NArgmt);
QR->End_P1 -= NArgmt;
}
} else if (NArgmt != MArgmt) { /* else (it's m,nXq) */
MEMMOVE(ErrTxt, "m,nX", 5);
if (GetAra() == FAILURE) {
DBGFEX(1,DbgFNm,"FAILURE, GetAra() failed");
return FAILURE;
}
if ((AraBeg < GapBeg) && (AraEnd > GapEnd)) {
TmpSiz = (GapBeg-AraBeg) + (AraEnd-GapEnd);
if (TmpSiz > 0) {
if (MakRom((SIZE_T)TmpSiz) == FAILURE) {
DBGFEX(1,DbgFNm,"FAILURE, MakRom() failed");
return FAILURE;
}
MEMMOVE(QR->End_P1,
AraBeg,
(SIZE_T)(GapBeg - AraBeg));
QR->End_P1 += GapBeg-AraBeg;
MEMMOVE(QR->End_P1,
GapEnd+1,
(SIZE_T)(AraEnd - GapEnd));
QR->End_P1 += AraEnd-GapEnd;
}
} else { /* else area is contiguous */
TmpSiz = (AraEnd - AraBeg) + 1;
if (TmpSiz > 0) {
if (MakRom((SIZE_T)TmpSiz) == FAILURE) {
DBGFEX(1,DbgFNm,"FAILURE, MakRom() failed");
return FAILURE;
}
MEMMOVE(QR->End_P1, AraBeg, (SIZE_T)TmpSiz);
QR->End_P1 += TmpSiz;
}
}
}
CmdMod = '\0'; /* clear modifiers flags */
DBGFEX(1,DbgFNm,"SUCCESS");
return SUCCESS;
}