1 /*****************************************************************************
2 
3 	MakRom()
4 
5 	This function "makes room" in a q-register text area for new text.
6 If the text area was empty,  this function simply calls ZAlloc to allocate
7 new memory.  If the text area was not empty,  this function calls ZRaloc to
8 add more memory to the text area.  In either case, the Amount argument
9 specifies how much memory to add to the existing text area.
10 
11 	On entry,  QR->Start points to the start of the text area (or NULL if
12 the text area was empty) and QR->End_P1 points to the end of the text area.
13 On return,  QR->Start points to the start of the text area and QR->End_P1
14 points to the BEGINNING of the newly allocated memory.  This is because the
15 caller knows where the end is and is expected to reset QR->End_P1 after it
16 is used as the destination of the new text.
17 
18 	Note:  the Amount argument is assumed to be greater than 0.
19 
20 *****************************************************************************/
21 
22 #include "zport.h"		/* define portability identifiers */
23 #include "tecoc.h"		/* define general identifiers */
24 #include "defext.h"		/* define external global variables */
25 #include "deferr.h"		/* define identifiers for error messages */
26 
MakRom(Amount)27 DEFAULT MakRom(Amount)		/* make room in q-register */
28 SIZE_T Amount;			/* how much additional room to make */
29 {
30 	ptrdiff_t	OldSiz;		/* old size of text area */
31 	charptr		NewBlk;		/* new text area */
32 
33 #if DEBUGGING
34 	static char *DbgFNm = "MakRom";
35 	sprintf(DbgSBf,"Amount = %ld bytes", (LONG)Amount);
36 	DbgFEn(2,DbgFNm,DbgSBf);
37 #endif
38 	if (QR->Start == NULL) {		/* if it was empty */
39 		OldSiz = 0;
40 		NewBlk = (charptr)ZAlloc(Amount);
41 	} else {
42 		OldSiz = QR->End_P1 - QR->Start;
43 		NewBlk = (charptr)ZRaloc(QR->Start, OldSiz + Amount);
44 	}
45 
46 	if (NewBlk == NULL) {			/* if ZAlloc/ZRaloc failed */
47 		ErrMsg(ERR_MEM);		/* ERR = memory overflow */
48 		DBGFEX(2,DbgFNm,"FAILURE");
49 		return FAILURE;
50 	}
51 
52 	QR->Start  = NewBlk;
53 	QR->End_P1 = NewBlk + OldSiz;
54 
55 	DBGFEX(2,DbgFNm,"SUCCESS");
56 
57 	return SUCCESS;
58 }
59