|
|
DataMuseum.dkPresents historical artifacts from the history of: Commodore CBM-900 |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about Commodore CBM-900 Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - download
Length: 2788 (0xae4)
Types: TextFile
Notes: UNIX file
Names: »alloc.c«
└─⟦f27320a65⟧ Bits:30001972 Commodore 900 hard disk image with partial source code
└─⟦f4b8d8c84⟧ UNIX Filesystem
└─⟦this⟧ »cmd/rsh/alloc.c«
└─⟦this⟧ »cmd/sh/alloc.c«
#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);
}