87 lines
3.2 KiB
C
87 lines
3.2 KiB
C
/*****************************************************************************
|
|
ExeBSl()
|
|
This function executes a \ (backslash) command.
|
|
\ Value of digit string in buffer
|
|
n\ Convert n to digits in buffer
|
|
The backslash command allows the user to convert binary numbers
|
|
to/from their ASCII representations. If a numeric argument precedes the
|
|
backslash command, then the ASCII representation for the number is inserted
|
|
into the edit buffer at the current point. If there is no preceding numeric
|
|
argument, then the number in it's ASCII representation in the edit buffer is
|
|
converted to binary, and is returned by the backslash command. In either
|
|
case, TECO's current radix controls how the numbers are represented. If
|
|
the current radix is decimal, then a plus or minus sign can precede an
|
|
ASCII number being read, and a minus sign will be generated if necessary
|
|
for a number being generated. When converting a string that's in the edit
|
|
buffer, the character pointer is left at the end of the string in the buffer.
|
|
*****************************************************************************/
|
|
#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 */
|
|
DEFAULT ExeBSl() /* execute a \ (backslash) command */
|
|
{
|
|
DBGFEN(1,"ExeBSl",NULL);
|
|
/*
|
|
* Handle the case where there's no numeric argument: convert the digit
|
|
* string in the edit buffer into a binary value and push it onto the
|
|
* expression stack.
|
|
*/
|
|
if ((EStTop == EStBot) || /* if no numeric arg or */
|
|
(EStack[EStTop].ElType != OPERAND)) { /* partial expression */
|
|
LONG StrVal = 0;
|
|
RefLen=0;
|
|
if (GapEnd != EBfEnd) { /* if not at end of buffer */
|
|
BOOLEAN negative = FALSE;
|
|
char NxtChr;
|
|
if (*(GapEnd+1) == '-') { /* minus sign? */
|
|
RefLen--;
|
|
GapEnd++; /* move forward... */
|
|
*GapBeg++ = *GapEnd; /* ... one character */
|
|
negative = TRUE;
|
|
} else if (*(GapEnd+1) == '+') { /* plus sign? */
|
|
RefLen--;
|
|
GapEnd++; /* move forward... */
|
|
*GapBeg++ = *GapEnd; /* ... one character */
|
|
}
|
|
while ((GapEnd != EBfEnd) && (IsRadx(*(GapEnd+1)))) {
|
|
RefLen--;
|
|
GapEnd++; /* move forward... */
|
|
*GapBeg++ = *GapEnd; /* ... one character */
|
|
NxtChr = *GapEnd;
|
|
if (Is_Digit(NxtChr))
|
|
NxtChr -= '0';
|
|
else if (Is_Upper(NxtChr))
|
|
NxtChr -= '\67';
|
|
else
|
|
NxtChr -= '\127';
|
|
StrVal = (StrVal * Radix) + NxtChr;
|
|
}
|
|
if (negative)
|
|
StrVal = -StrVal;
|
|
}
|
|
CmdMod = '\0'; /* clear modifiers flags */
|
|
#if DEBUGGING
|
|
sprintf(DbgSBf,"PushEx(%ld)", StrVal);
|
|
DbgFEx(1,DbgFNm,DbgSBf);
|
|
#endif
|
|
return PushEx(StrVal,OPERAND);
|
|
}
|
|
/*
|
|
* If we made it to here, then there is a numeric argument
|
|
*/
|
|
if (GetNmA() == FAILURE) { /* get numeric argument */
|
|
DBGFEX(1,DbgFNm,"FAILURE");
|
|
return FAILURE;
|
|
}
|
|
MakDBf(NArgmt, Radix); /* convert it to ASCII */
|
|
if (InsStr(DBfBeg, DBfPtr-DBfBeg) == FAILURE) {
|
|
DBGFEX(1,DbgFNm,"FAILURE");
|
|
return FAILURE;
|
|
}
|
|
CmdMod = '\0'; /* clear modifiers flags */
|
|
EStTop = EStBot; /* clear expression stack */
|
|
DBGFEX(1,DbgFNm,"SUCCESS");
|
|
return SUCCESS;
|
|
}
|