104 lines
3.7 KiB
C
104 lines
3.7 KiB
C
/*****************************************************************************
|
|
WrPage()
|
|
This function handles all TECOC's file output, except for the E%q
|
|
command. The commands that can cause output are:
|
|
P write out edit buffer, with a form feed depending on AddFF
|
|
PW write out edit buffer, with a form feed
|
|
m,nPW write out characters between m and n, without form feed
|
|
HPW write out edit buffer, without a form feed
|
|
This function is passed the index of the file's data block in array
|
|
OFiles, the beginning and ending addresses in the edit buffer of the text
|
|
to be output, and a form feed flag indicating whether a form feed is to be
|
|
appended to the output or not.
|
|
The addresses of the text in the edit buffer might specify an area
|
|
that spans the edit buffer gap. In order to avoid writing the edit buffer
|
|
gap to the file, this function temporarily "shuffles" the second half of
|
|
the edit buffer, appending it to the first half to produce a contiguous
|
|
buffer for output. After the text is output, the text is shuffled back.
|
|
If a form feed is to be appended to the text, then the character
|
|
following the last character of the text area is temporarily overwritten
|
|
with a form feed character. After the text is output, the character that
|
|
was overwritten is restored.
|
|
*****************************************************************************/
|
|
#include "zport.h" /* define portability identifiers */
|
|
#include "tecoc.h" /* define general identifiers */
|
|
#include "defext.h" /* define external global variables */
|
|
#include "dchars.h" /* define identifiers for characters */
|
|
#include "deferr.h" /* define identifiers for error messages */
|
|
DEFAULT WrPage(OfIndx, OBfBeg, OBfEnd, AddFF)
|
|
DEFAULT OfIndx; /* index into OFiles array */
|
|
charptr OBfBeg; /* address of output buffer beginning */
|
|
charptr OBfEnd; /* address of output buffer end */
|
|
LONG AddFF; /* add form feed: -1 is TRUE, 0 is FALSE */
|
|
{
|
|
unsigned char SavChr; /* saved char overwritten with form feed */
|
|
ptrdiff_t Shuffl; /* size of shuffled area */
|
|
DEFAULT status;
|
|
#if DEBUGGING
|
|
static char *DbgFNm = "WrPage";
|
|
sprintf(DbgSBf,"OBfBeg = %ld, OBfEnd = %ld, AddFF = %ld",
|
|
Zcp2ul(OBfBeg), Zcp2ul(OBfEnd), AddFF);
|
|
DbgFEn(2,DbgFNm,DbgSBf);
|
|
sprintf(DbgSBf,"line 2: GapBeg = %ld, GapEnd = %ld",
|
|
Zcp2ul(GapBeg), Zcp2ul(GapEnd));
|
|
DbgFMs(2,DbgFNm,DbgSBf);
|
|
#endif
|
|
if (!IsOpnO[OfIndx]) { /* if no output file */
|
|
ErrMsg(ERR_NFO); /* no file for output */
|
|
DBGFEX(2,DbgFNm,"FAILURE");
|
|
return FAILURE;
|
|
}
|
|
/*
|
|
* If the text area spans the edit buffer gap, then "shuffle", which
|
|
* means temporarily copying the second half of the edit buffer to the
|
|
* first half. Later, the reverse opertion will be done.
|
|
*/
|
|
if ((OBfBeg < GapBeg) && (OBfEnd > GapEnd)) { /* shuffle? */
|
|
Shuffl = OBfEnd - GapEnd;
|
|
MEMMOVE(GapBeg, GapEnd+1, (SIZE_T)Shuffl);
|
|
OBfEnd = (GapBeg + Shuffl) - 1;
|
|
} else {
|
|
Shuffl = 0; /* 0 indicates no shuffle */
|
|
if (OBfBeg == GapBeg) { /* if there's no first half */
|
|
OBfBeg = GapEnd + 1;
|
|
}
|
|
if (OBfEnd == GapEnd) { /* if no second half */
|
|
OBfEnd = GapBeg - 1;
|
|
}
|
|
if (OBfBeg > OBfEnd) { /* if both halves are empty */
|
|
OBfBeg = OBfEnd + 1; /* make it a 0 length area */
|
|
}
|
|
}
|
|
/*
|
|
* If we need to append a form feed, then save the character being
|
|
* overwritten and overwrite it with a form feed.
|
|
*/
|
|
if (AddFF) {
|
|
++OBfEnd;
|
|
SavChr = *OBfEnd;
|
|
*OBfEnd = FORMFD;
|
|
}
|
|
/*
|
|
* Write the buffer.
|
|
*/
|
|
if (OBfBeg <= OBfEnd) {
|
|
status = ZWrBfr(OfIndx, OBfBeg, OBfEnd);
|
|
} else {
|
|
status = SUCCESS;
|
|
}
|
|
/*
|
|
* If we overwrote with a form feed, restore the overwritten character.
|
|
*/
|
|
if (AddFF) {
|
|
*OBfEnd = SavChr;
|
|
}
|
|
/*
|
|
* If we previously shuffled the edit buffer, then shuffle it back.
|
|
*/
|
|
if (Shuffl) {
|
|
MEMMOVE(GapEnd+1, GapBeg, (SIZE_T)Shuffl);
|
|
}
|
|
DBGFEX(2,DbgFNm,NULL);
|
|
return status;
|
|
}
|