aboutsummaryrefslogtreecommitdiff
path: root/sys/symtab/stalloc.x
blob: 1300953ba323ceef18b0cc34b951919cb3b86466 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
# Copyright(c) 1986 Association of Universities for Research in Astronomy Inc.

include	"symtab.h"

# STALLOC -- Allocate a block of double aligned storage in the symbol table.
# Increase the size of STAB if overflow occurs.

int procedure stalloc (stp, blklen)

pointer	stp			# symtab descriptor
int	blklen			# number of integer units of storage
int	offset, buflen

begin
	offset = (ST_STABOP(stp) + 1) / 2 * 2
	buflen = ST_STABLEN(stp)

	if (offset + blklen > buflen) {
	    # Overflow has occurred.  Allocate a larger buffer; if overflow
	    # continues to occur the increments grow successively larger to
	    # minimize reallocation.

	    buflen = buflen + max (blklen, ST_STABINC(stp))
	    ST_STABINC(stp) = min (MAX_INCREMENT, ST_STABINC(stp) * INC_GROW)
	    ST_STABLEN(stp) = buflen
	    ST_STABNGROW(stp) = ST_STABNGROW(stp) + 1

	    call realloc (ST_STABP(stp), buflen, TY_STRUCT)
	}

	ST_STABOP(stp) = offset + ((blklen + 1) / 2 * 2)
	return (offset)
end