242 lines
		
	
	
	
		
			4.9 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			242 lines
		
	
	
	
		
			4.9 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /* $Header$ */
 | |
| /*
 | |
|  * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands.
 | |
|  * See the copyright notice in the ACK home directory, in the file "Copyright".
 | |
|  */
 | |
| /*  S H A R E D   F I L E
 | |
|  *
 | |
|  *  A L L O C . C
 | |
|  */
 | |
| 
 | |
| 
 | |
| 
 | |
| #include <stdio.h>
 | |
| #include "types.h"
 | |
| #include "debug.h"
 | |
| #include "alloc.h"
 | |
| 
 | |
| 
 | |
| short * myalloc();
 | |
| short * malloc();
 | |
| 
 | |
| #ifdef DEBUG
 | |
| 
 | |
| STATIC unsigned maxuse, curruse;
 | |
| 
 | |
| short *newcore(size)
 | |
| 	int size;
 | |
| {
 | |
| 	if ((curruse += (unsigned)  (size+2)) > maxuse) maxuse = curruse;
 | |
| 	return myalloc(size);
 | |
| }
 | |
| 
 | |
| oldcore(p,size)
 | |
| 	short *p;
 | |
| 	int size;
 | |
| {
 | |
| 	curruse -= (size+2);
 | |
| 	free(p);
 | |
| }
 | |
| 
 | |
| coreusage()
 | |
| {
 | |
| 	fprintf(stderr,"Maximal core usage (excl. buffers):%u\n",maxuse);
 | |
| }
 | |
| 
 | |
| #endif
 | |
| 
 | |
| 
 | |
| /*
 | |
|  * The following two sizetables contain the sizes of the various kinds
 | |
|  * of line and argument structures.
 | |
|  * The assumption when making the tables was that every non-byte object
 | |
|  * had to be aligned on an even boundary. On machines where alignment
 | |
|  * is worse ( for example a long has to be aligned on a longword bound )
 | |
|  * these tables should be revised.
 | |
|  * A wasteful but safe approach is to replace every line of them by
 | |
|  *  sizeof(line_t)
 | |
|  * and
 | |
|  *  sizeof(arg_t)
 | |
|  * respectively.
 | |
|  */
 | |
| 
 | |
| #ifndef NOTCOMPACT
 | |
| int lsizetab[] = {
 | |
| 	2*sizeof(line_p)+2*sizeof(byte),
 | |
| 	2*sizeof(line_p)+2*sizeof(byte)+sizeof(short),
 | |
| 	2*sizeof(line_p)+2*sizeof(byte)+sizeof(offset),
 | |
| 	2*sizeof(line_p)+2*sizeof(byte)+sizeof(lab_id),
 | |
| 	2*sizeof(line_p)+2*sizeof(byte)+sizeof(obj_p),
 | |
| 	2*sizeof(line_p)+2*sizeof(byte)+sizeof(proc_p),
 | |
| 	2*sizeof(line_p)+2*sizeof(byte)+sizeof(arg_p),
 | |
| };
 | |
| 
 | |
| int asizetab[] = {
 | |
| 	sizeof(arg_p)+sizeof(short)+sizeof(offset),
 | |
| 	sizeof(arg_p)+sizeof(short)+sizeof(lab_id),
 | |
| 	sizeof(arg_p)+sizeof(short)+sizeof(obj_p),
 | |
| 	sizeof(arg_p)+sizeof(short)+sizeof(proc_p),
 | |
| 	sizeof(arg_p)+sizeof(short)+sizeof(argb_t),
 | |
| 	sizeof(arg_p)+sizeof(short)+sizeof(short)+sizeof(argb_t),
 | |
| 	sizeof(arg_p)+sizeof(short)+sizeof(short)+sizeof(argb_t),
 | |
| 	sizeof(arg_p)+sizeof(short)+sizeof(short)+sizeof(argb_t)
 | |
| };
 | |
| #else
 | |
| int lsizetab[] = {
 | |
| 	sizeof(struct line),
 | |
| 	sizeof(struct line),
 | |
| 	sizeof(struct line),
 | |
| 	sizeof(struct line),
 | |
| 	sizeof(struct line),
 | |
| 	sizeof(struct line),
 | |
| 	sizeof(struct line)
 | |
| };
 | |
| 
 | |
| int asizetab[] = {
 | |
| 	sizeof (struct arg),
 | |
| 	sizeof (struct arg),
 | |
| 	sizeof (struct arg),
 | |
| 	sizeof (struct arg),
 | |
| 	sizeof (struct arg),
 | |
| 	sizeof (struct arg),
 | |
| 	sizeof (struct arg),
 | |
| 	sizeof (struct arg)
 | |
| };
 | |
| #endif
 | |
| 
 | |
| /*
 | |
|  * alloc routines:
 | |
|  * Two parts:
 | |
|  *   1)	typed alloc and free routines
 | |
|  *   2) untyped raw core allocation
 | |
|  */
 | |
| 
 | |
| /*
 | |
|  * PART 1
 | |
|  */
 | |
| 
 | |
| line_p	newline(optyp) int optyp; {
 | |
| 	register line_p lnp;
 | |
| 	register kind=optyp;
 | |
| 
 | |
| 	lnp = (line_p) newcore(lsizetab[kind]);
 | |
| 	TYPE(lnp) = optyp;
 | |
| 	return(lnp);
 | |
| }
 | |
| 
 | |
| oldline(lnp) register line_p lnp; {
 | |
| 	register kind=TYPE(lnp)&BMASK;
 | |
| 
 | |
| 	if (kind == OPLIST)
 | |
| 		oldargs(ARG(lnp));
 | |
| 	oldcore((short *) lnp,lsizetab[kind]);
 | |
| }
 | |
| 
 | |
| arg_p newarg(kind) int kind; {
 | |
| 	register arg_p ap;
 | |
| 
 | |
| 	ap = (arg_p) newcore(asizetab[kind]);
 | |
| 	ap->a_type = kind;
 | |
| 	return(ap);
 | |
| }
 | |
| 
 | |
| oldargs(ap) register arg_p ap; {
 | |
| 	register arg_p	next;
 | |
| 
 | |
| 	while (ap != (arg_p) 0) {
 | |
| 		next = ap->a_next;
 | |
| 		switch(ap->a_type) {
 | |
| 		case ARGSTRING:
 | |
| 			oldargb(ap->a_a.a_string.ab_next);
 | |
| 			break;
 | |
| 		case ARGICN:
 | |
| 		case ARGUCN:
 | |
| 		case ARGFCN:
 | |
| 			oldargb(ap->a_a.a_con.ac_con.ab_next);
 | |
| 			break;
 | |
| 		}
 | |
| 		oldcore((short *) ap,asizetab[ap->a_type]);
 | |
| 		ap = next;
 | |
| 	}
 | |
| }
 | |
| 
 | |
| oldargb(abp) register argb_p abp; {
 | |
| 	register argb_p next;
 | |
| 
 | |
| 	while (abp != (argb_p) 0) {
 | |
| 		next = abp->ab_next;
 | |
| 		oldcore((short *) abp,sizeof (argb_t));
 | |
| 		abp = next;
 | |
| 	}
 | |
| }
 | |
| 
 | |
| oldobjects(op) register obj_p op; {
 | |
| 	register obj_p next;
 | |
| 
 | |
| 	while (op != (obj_p) 0) {
 | |
| 		next = op->o_next;
 | |
| 		oldcore((short *) op, sizeof(struct obj));
 | |
| 		op = next;
 | |
| 	}
 | |
| }
 | |
| 
 | |
| olddblock(dbl) dblock_p dbl; {
 | |
| 	oldobjects(dbl->d_objlist);
 | |
| 	oldargs(dbl->d_values);
 | |
| 	oldcore((short *) dbl, sizeof(struct dblock));
 | |
| }
 | |
| 
 | |
| 
 | |
| short **newmap(length) short length; {
 | |
| 	return((short **) newcore((length+1) * sizeof(short *)));
 | |
| }
 | |
| 
 | |
| oldmap(mp,length) short **mp, length; {
 | |
| 	oldcore((short *) mp, (length+1) * sizeof(short *));
 | |
| }
 | |
| 
 | |
| 
 | |
| cset newbitvect(n) short n; {
 | |
| 	return((cset) newcore((n-1)*sizeof(int) + sizeof(struct bitvector)));
 | |
| 	/* sizeof(struct bitvector) equals to the size of a struct with
 | |
| 	 * one short, followed by one ALLIGNED int. So the above statement
 | |
| 	 * also works e.g. on a VAX.
 | |
| 	 */
 | |
| }
 | |
| 
 | |
| oldbitvect(s,n) cset s; short n; {
 | |
| 	oldcore((short *) s, (n-1)*sizeof(int) + sizeof(struct bitvector));
 | |
| }
 | |
| 
 | |
| 
 | |
| short *newtable(length) short length; {
 | |
| 	return((short *) newcore((length+1) * sizeof(short)));
 | |
| }
 | |
| 
 | |
| oldtable(mp,length) short **mp, length; {
 | |
| 	oldcore((short *) mp, (length+1) * sizeof(short));
 | |
| }
 | |
| 
 | |
| cond_p newcondtab(l) int l;
 | |
| {
 | |
| 	return (cond_p) newcore(l * (sizeof (struct cond_tab)));
 | |
| }
 | |
| 
 | |
| oldcondtab(tab) cond_p tab;
 | |
| {
 | |
| 	int i;
 | |
| 	for (i = 0; tab[i].mc_cond != DEFAULT; i++);
 | |
| 	oldcore((short *) tab,((i+1) * sizeof (struct cond_tab)));
 | |
| }
 | |
| 
 | |
| 
 | |
| short *myalloc(size) register size; {
 | |
| 	register short *p,*q;
 | |
| 
 | |
| 	p = malloc(size);
 | |
| 	if (p == 0)
 | |
| 		error("out of memory");
 | |
| 	for(q=p;size>0;size -= sizeof(short))
 | |
| 		*q++ = 0;
 | |
| 	return(p);
 | |
| }
 |