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