BBN-Vax-TCP/src/libstr/sinit.c

#include "string.h"
extern struct sctrl _ScB;
/*
 * sinit(addr, len, bsize);
 * Initializing call for storage allocation. addr (must be even) and len
 * (number of bytes, must be at least sizeof sbase) describe the initial
 * memory to be used for string allocation; when that runs out, the alloc
 * (III) library routine will be called for additional blocks of at least
 * bsize bytes. If bsize is 0, alloc will never be called.
 */
sinit(asbp, len, bsize)
    struct sbase *asbp;
    int len;
    int bsize;
{
    register struct sbase *sbp;

    sbp = asbp;
    if (len < sizeof(*sbp))
	_serror("sinit: area size too small.\n");
    if (bsize == 0 || bsize > sizeof(*sbp))
	_ScB.c_bsize = bsize;
    else
	_serror("sinit: bad allocation blocksize.\n");
    sbp->b_marker = NULL;
    sbp->b_sp = NULL;
    sbp->b_sfp = NULL;
    sbp->b_top = NULL;
    _ScB.c_sfp = (char *)&sbp->b_marker;
    _ScB.c_sp = (char *)(sbp + 1);	/* Point at first avail byte */
    len -= sizeof(*sbp);
    _ScB.c_top = _ScB.c_sp + len;  /* Point at first unavail byte */
    _ScB.c_top = (char *)aligndown((int)_ScB.c_top);
}