aboutsummaryrefslogtreecommitdiff
path: root/sys/symtab/stalloc.x
diff options
context:
space:
mode:
Diffstat (limited to 'sys/symtab/stalloc.x')
-rw-r--r--sys/symtab/stalloc.x33
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