diff options
Diffstat (limited to 'sys/symtab/stalloc.x')
-rw-r--r-- | sys/symtab/stalloc.x | 33 |
1 files changed, 33 insertions, 0 deletions
diff --git a/sys/symtab/stalloc.x b/sys/symtab/stalloc.x new file mode 100644 index 00000000..1300953b --- /dev/null +++ b/sys/symtab/stalloc.x @@ -0,0 +1,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 |