# define error(msg) fprintf(stderr, msg);
#if defined(BSD42) || defined(BSD43)
#define memcpy(dest, source, len) bcopy(source, dest, (unsigned int)len);
#define memset(dest, zero, len) bzero((dest), (unsigned int)(len));
* check to see if *rowp && *colp are currently allocated, if not expand the
* current size if we can.
else if (*rowp
>= maxrows
)
{ if (!growtbl(GROWBOTH
, *rowp
, *colp
))
{ if (!growtbl(GROWROW
, *rowp
, 0))
else if (*colp
>= maxcols
)
{ if (!growtbl(GROWCOL
, 0, *colp
));
#define GROWALLOC(newptr, oldptr, nelem, type, msg) \
if (oldptr == (type *)NULL) \
newptr = (type *)malloc((unsigned)(nelem*sizeof(type))); \
newptr = (type *)realloc((char *)oldptr, \
(unsigned)(nelem*sizeof(type))); \
if (newptr == (type *)NULL) \
oldptr = newptr /* wait incase we can't alloc */
static char nolonger
[] = "The table can't be any longer";
static char nowider
[] = "The table can't be any wider";
* grow the main && auxiliary tables (reset maxrows/maxcols as needed)
* toprow &&/|| topcol tell us a better guess of how big to become.
* we return TRUE if we could grow, FALSE if not....
growtbl(rowcol
, toprow
, topcol
)
/* when we first start up, fill the screen w/ cells */
startval
= LINES
- RESROW
;
newrows
= startval
> MINROWS
? startval
: MINROWS
;
startval
= ((COLS
) - RESCOL
) / DEFWIDTH
;
newcols
= startval
> MINCOLS
? startval
: MINCOLS
;
/* set how much to grow */
if ((rowcol
== GROWROW
) || (rowcol
== GROWBOTH
))
newrows
= GROWAMT
+ toprow
;
if ((rowcol
== GROWCOL
) || (rowcol
== GROWBOTH
))
{ if ((rowcol
== GROWCOL
) && ((maxcols
== ABSMAXCOLS
) ||
newcols
= GROWAMT
+ topcol
;
if (newcols
> ABSMAXCOLS
)
if ((rowcol
== GROWROW
) || (rowcol
== GROWBOTH
) || (rowcol
== GROWNEW
))
GROWALLOC(row_hidden2
, row_hidden
, newrows
, char, nolonger
);
memset(row_hidden
+maxrows
, 0, (newrows
-maxrows
)*sizeof(char));
/* alloc tbl row pointers */
GROWALLOC(tbl2
, tbl
, newrows
, struct ent
**, nolonger
);
memset(tbl
+maxrows
, 0, (newrows
-maxrows
)*(sizeof(struct ent
**)));
if ((rowcol
== GROWCOL
) || (rowcol
== GROWBOTH
) || (rowcol
== GROWNEW
))
GROWALLOC(fwidth2
, fwidth
, newcols
, int, nowider
);
GROWALLOC(precision2
, precision
, newcols
, int, nowider
);
memset(fwidth
+maxcols
, 0, (newcols
-maxcols
)*sizeof(int));
memset(precision
+maxcols
, 0, (newcols
-maxcols
)*sizeof(int));
GROWALLOC(col_hidden2
, col_hidden
, newcols
, char, nowider
);
memset(col_hidden
+maxcols
, 0, (newcols
-maxcols
)*sizeof(char));
for (i
= maxcols
; i
< newcols
; i
++) {
/* [re]alloc the space for each row */
for (i
= 0; i
< maxrows
; i
++)
if ((tbl
[i
] = (struct ent
**)realloc((char *)tbl
[i
],
(unsigned)(newcols
* sizeof(struct ent
**)))) == (struct ent
**)0)
memset((char *)ATBL(tbl
,i
, maxcols
), 0,
(newcols
-maxcols
)*sizeof(struct ent
**));
/* fill in the bottom of the table */
{ if ((tbl
[i
] = (struct ent
**)malloc((unsigned)(newcols
*
sizeof(struct ent
**)))) == (struct ent
**)0)
memset((char *)tbl
[i
], 0, newcols
*sizeof(struct ent
**));