DataMuseum.dk

Presents historical artifacts from the history of:

Commodore CBM-900

This is an automatic "excavation" of a thematic subset of
artifacts from Datamuseum.dk's BitArchive.

See our Wiki for more about Commodore CBM-900

Excavated with: AutoArchaeologist - Free & Open Source Software.


top - download

⟦67084916a⟧ TextFile

    Length: 2788 (0xae4)
    Types: TextFile
    Notes: UNIX file
    Names: »alloc.c«

Derivation

└─⟦f27320a65⟧ Bits:30001972 Commodore 900 hard disk image with partial source code
    └─⟦f4b8d8c84⟧ UNIX V7 Filesystem
        └─ ⟦this⟧ »cmd/rsh/alloc.c« 
        └─ ⟦this⟧ »cmd/sh/alloc.c« 

TextFile

#include "sh.h"

/*
 * Externals.
 */
BUF	*bufap = NULL;			/* Head of allocation list */
BUF	*buffp = NULL;			/* Tail of free list */
BUF	**bufapp = &bufap;		/* Tail of allocation list */

char	*malloc();

/*
 * Given a string, return a pointer to a copy of it.  If `f'
 * is set, don't add it onto the free list.
 */
char *
duplstr(cp0, f)
register char *cp0;
{
	register char *cp1, *cp2;

	cp1 = cp0;
	while (*cp1++)
		;
	cp2 = (char *) f ? salloc(cp1-cp0) : balloc(cp1-cp0);
	cp1 = cp2;
	while (*cp1++=*cp0++)
		;
	return (cp2);
}

/*
 * Create an argument list.
 */
char **
makargl()
{
	register char **app;

	app = (char **)balloc((1+IALSIZE)*sizeof(char *));
	app++;
	app[-1] = (char *)IALSIZE;
	app[0] = NULL;
	return (app);
}

/*
 * Add an element to an argument list.
 */
char **
addargl(app, sp)
char **app;
char *sp;
{
	char **napp;
	register char **rapp;
	register unsigned n, i;

	rapp = app;
	n = (int)rapp[-1];
	while (*rapp++ != NULL)
		;
	if (rapp-app >= n) {
		napp = (char **)balloc((1+n*2)*sizeof(char *));
		napp++;
		napp[-1] = (char *)(n*2);
		for (i=0; i<n; i++)
			napp[i] = app[i];
		napp[n-1] = sp;
		napp[n] = NULL;
		return (napp);
	}
	*rapp = NULL;
	*--rapp = sp;
	return (app);
}

/*
 * Save allocation position.
 */
BUF **
savebuf()
{
	return (bufapp);
}

/*
 * Free everything allocated since passed allocation position
 * was saved.
 */
freebuf(bpp)
register char **bpp;
{
	*bufapp = buffp;
	buffp = *bpp;
	*bpp = NULL;
	bufapp = bpp;
}

/*
 * Allocate a buffer `n' bytes long.  Add it onto the
 * allocated buffer list.
 */
char *
balloc(n)
{
	register BUF *bp, **bpp;

	bpp = &buffp;
	for (;;) {
		if ((bp=*bpp) == NULL) {
			bp = (BUF *) salloc(sizeof (BUF) + n);
			bp->b_size = n;
			break;
		}
		if (bp->b_size == n) {
			*bpp = bp->b_next;
			break;
		}
		bpp = &bp->b_next;
	}
	*bufapp = bp;
	bufapp = &bp->b_next;
	*bufapp = NULL;
	return ((char *) bp + sizeof (BUF));
}

/*
 * Allocate `n' bytes.
 */
char *
salloc(n)
{
	register char *cp;
	char	*malloc();

	if ((cp=malloc(n)) == NULL) {
		prints("Out of memory\n");
		reset(RNOSBRK);
		NOTREACHED;
	}
	return (cp);
}

/*
 * Free something possibly allocated by `salloc'.
 *	notmem is part of our customised malloc package which
 *	prevents freeing of static strings and automatic variables.
 */
sfree(cp)
char *cp;
{
	if (notmem(cp))
		return;
	free(cp);
}

/*
 * Deallocate a vector.
 */
vfree(vecp)
char **vecp;
{
	register char **vpp;

	if (notmem(vecp))
		return;
	for (vpp = vecp; *vpp!=NULL; vpp += 1)
		sfree(*vpp);
	sfree(vecp);
}

char **
vdupl(vecp)
char **vecp;
{
	register char **vp, **nvp, **tvp;

	for (vp=vecp; *vp++ != NULL; );
	tvp = nvp = (char **)salloc((vp - vecp) * sizeof *vp);
	for (vp=vecp; *vp != NULL; )
		*tvp++ = duplstr(*vp++, 1);
	*tvp = NULL;
	return (nvp);
}