teacl/src/init.c

160 lines
4.8 KiB
C

/*****************************************************************************
Init.c
Initialization routines for Tecoc.
*****************************************************************************/
#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 */
#include <stdio.h>
#if USE_PROTOTYPES
static VVOID MemIni(void);
#endif
/*****************************************************************************
MemIni()
This function allocates memory for the edit buffer, command buffer,
filename buffer and search string buffer. System-independent global
variables are also initialized by this function.
*****************************************************************************/
static VVOID MemIni()
{
WORD i;
QRptr QRp;
charptr TmpMem;
DBGFEN(2,"MemIni",NULL);
/*
* allocate a chunk of memory to start with which is free'd as soon as
* MemIni exits. subsequent small memory allocations might be taken from
* this free'd chunk without fragmenting the end of the heap where the
* edit buffer resides.
*/
TmpMem = (charptr)ZAlloc((SIZE_T)(4*1024));
/*
* allocate memory for the digit buffer. It needs to be big enough to hold
* the decimal (signed), octal or hexadecimal representation of the largest
* number that can be stored in a LONG. Here, it's assumed that octal takes
* the most characters. The calculation is as follows:
*
* sizeof(LONG) * 8 to get bits per long
* +2 to round up so /3 doesn't truncate
* /3 since there is 3 bits per octal digit
* +2 in case ExeEqu() appends a <CR><LF> for display purposes
*/
DBfBeg = DBfPtr = (charptr)ZAlloc((((sizeof(LONG)*8)+2)/3)+2);
if (DBfBeg == NULL) {
ErrMsg(ERR_MEM); /* MEM = memory overflow */
#if DEBUGGING
sprintf(DbgSBf,"DBfBeg = ZAlloc(15) failed, calling TAbort()");
DbgFMs(2,DbgFNm,DbgSBf);
#endif
TAbort(EXIT_FAILURE);
}
/*
* allocate memory for the filename buffer
*/
FBfBeg = FBfPtr = (charptr)ZAlloc((SIZE_T)FILENAME_MAX);
if (FBfBeg == NULL) {
ErrMsg(ERR_MEM); /* MEM = memory overflow */
#if DEBUGGING
sprintf(DbgSBf,"FBfBeg = ZAlloc(%ld) failed, calling TAbort()",
(LONG)FILENAME_MAX);
DbgFMs(2,DbgFNm,DbgSBf);
#endif
TAbort(EXIT_FAILURE);
}
FBfEnd = FBfBeg + FILENAME_MAX - 1;
/*
* allocate memory for the command buffer
*/
CBfBeg = (charptr)ZAlloc((SIZE_T)CBFINIT);
if (CBfBeg == NULL) {
ErrMsg(ERR_MEM); /* MEM = memory overflow */
#if DEBUGGING
sprintf(DbgSBf,"CbfBeg =ZAlloc(%ld) failed, calling TAbort()",
(LONG)CBFINIT);
DbgFMs(2,DbgFNm,DbgSBf);
#endif
TAbort(EXIT_FAILURE);
}
CBfEnd = CBfBeg + CBFINIT - 1;
/*
* allocate memory for the search string buffer
*/
SBfBeg = SBfPtr = (charptr)ZAlloc((SIZE_T)SBFINIT);
if (SBfBeg == NULL) {
ErrMsg(ERR_MEM); /* MEM = memory overflow */
#if DEBUGGING
sprintf(DbgSBf,"SbfBeg = ZAlloc(%ld) failed, calling TAbort()",
(LONG)SBFINIT);
DbgFMs(2,DbgFNm,DbgSBf);
#endif
TAbort(EXIT_FAILURE);
}
SBfEnd = SBfBeg + SBFINIT - 1;
/*
* allocate memory for the edit buffer and input buffer
*/
EBfBeg = GapBeg = (charptr)ZAlloc((SIZE_T)EBFINIT + (SIZE_T)IBFINIT);
if (EBfBeg == NULL) {
ErrMsg(ERR_MEM); /* MEM = memory overflow */
#if DEBUGGING
sprintf(DbgSBf,"EbfBeg = ZAlloc(%ld) failed, calling TAbort()",
(LONG)(EBFINIT + IBFINIT));
DbgFMs(2,DbgFNm,DbgSBf);
#endif
TAbort(EXIT_FAILURE);
}
EBfEnd = GapEnd = EBfBeg + EBFINIT - 1;
IBfEnd = EBfEnd + IBFINIT;
/*
* clear the global [0-35] and main-level local [36-71] Q-registers
*/
for (QRp = QRgstr, i = 0; i < 72; ++i, ++QRp) {
QRp->Start = QRp->End_P1 = NULL;
QRp->Number = 0;
}
/*
* Clear the Q-register stack
*/
for (QRp = QStack, i = 0; i < QRS_SIZE; ++i, ++QRp) {
QRp->Start = QRp->End_P1 = NULL;
QRp->Number = 0;
}
/*
* Initialize the file-open and end-of-file indicators.
*/
for (i = 0; i < NIFDBS; i++) {
IsOpnI[i] = IsEofI[i] = FALSE;
}
for (i = 0; i < NOFDBS; i++) {
IsOpnO[i] = FALSE;
}
/*
* Free our small allocation memory pool.
*/
if (TmpMem) {
ZFree (TmpMem);
}
DBGFEX(2,DbgFNm,NULL);
}
/*****************************************************************************
Init()
This function initializes TECO-C.
If an error is detected in any of the functions called by this
function, a message is displayed and the program terminates.
*****************************************************************************/
VVOID Init(argc, argv) /* initialize TECO-C */
int argc;
char **argv;
{
DBGFEN(2,"Init",NULL);
ZTrmnl(); /* open terminal for input and output */
MemIni(); /* allocate memory and initialize variables */
#if CONSISTENCY_CHECKING
init_consistency_check();
check_consistency();
#endif
ZPrsCL(argc, argv); /* parse the command line */
DBGFEX(2,DbgFNm,NULL);
}