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