xref: /csrg-svn/usr.bin/f77/libU77/malloc_.c (revision 18537)
1*18537Sralph /*
2*18537Sralph char id_malloc[] = "@(#)malloc_.c	1.1";
3*18537Sralph  *
4*18537Sralph  *	allows f77 programs to dynamicly allocate space
5*18537Sralph  *	three routines:
6*18537Sralph  *		call malloc(need, addr)
7*18537Sralph  *		integer need, addr
8*18537Sralph  *
9*18537Sralph  *		call free(addr)
10*18537Sralph  *		integer addr
11*18537Sralph  *
12*18537Sralph  *		call falloc( nelem, elsize, clean, basevec, addr, offset )
13*18537Sralph  *		integer nelem, elsize, clean, addr, offset
14*18537Sralph  *		dimension basevec(1)
15*18537Sralph  *
16*18537Sralph  *	malloc() & falloc() alloc space and put address in 'addr', 0 if can't
17*18537Sralph  *	do it.  free() frees a block.  malloc() gets a block of at least
18*18537Sralph  *	'need' bytes; falloc() gets at least nelem*elsize bytes, zeros
19*18537Sralph  *	the block if clean=1, and returns an offset so that the block
20*18537Sralph  *	can be referenced as basevec(offset+1)...basevec(offset+nelem)
21*18537Sralph  *	in the calling program.  falloc() gets an extra element so that
22*18537Sralph  *	all the elements will be in the block even if address arithmetic
23*18537Sralph  *	involves truncation.
24*18537Sralph  */
25*18537Sralph 
26*18537Sralph char *calloc(), *malloc();
27*18537Sralph 
28*18537Sralph malloc_( need, addr )
29*18537Sralph int *need; char **addr;
30*18537Sralph {
31*18537Sralph 	*addr = malloc( *need );
32*18537Sralph }
33*18537Sralph 
34*18537Sralph free_( addr )
35*18537Sralph char **addr;
36*18537Sralph {
37*18537Sralph 	free( *addr );
38*18537Sralph }
39*18537Sralph 
40*18537Sralph falloc_( nelem, elsize, clean, basevec, addr, offset )
41*18537Sralph int *nelem, *elsize, *clean, *offset;
42*18537Sralph char **addr, *basevec;
43*18537Sralph {
44*18537Sralph 	if( *clean == 1 )
45*18537Sralph 		*addr = calloc( *nelem + 1, *elsize );
46*18537Sralph 	else
47*18537Sralph 		*addr = malloc( (*nelem + 1) * *elsize );
48*18537Sralph 
49*18537Sralph 	if( *addr != 0 )
50*18537Sralph 		*offset = ((*addr - basevec) / *elsize) + 1;
51*18537Sralph 	else
52*18537Sralph 		*offset = 0;
53*18537Sralph 
54*18537Sralph }
55