diff options
Diffstat (limited to 'sys/symtab/stpstr.x')
-rw-r--r-- | sys/symtab/stpstr.x | 45 |
1 files changed, 45 insertions, 0 deletions
diff --git a/sys/symtab/stpstr.x b/sys/symtab/stpstr.x new file mode 100644 index 00000000..2de04a60 --- /dev/null +++ b/sys/symtab/stpstr.x @@ -0,0 +1,45 @@ +# Copyright(c) 1986 Association of Universities for Research in Astronomy Inc. + +include "symtab.h" + +# STPSTR -- Append a string to the string buffer. The offset of the string +# in the string buffer is returned as the function value. More storage is +# allocated if we run out of room in the buffer. The number of chars of +# storage allocated (excluding space for the EOS) is strlen(str) or MINCHARS, +# whichever is larger. To allocate but not initialize space STR may be passed +# as the null string. To allocate precisely the amount of space required to +# store a string constant MINCHARS should be set to zero. + +int procedure stpstr (stp, str, minchars) + +pointer stp # symtab descriptor +char str[ARB] # string to be moved into storage +int minchars # minimum number of chars to reserve + +int offset, buflen, blklen +int strlen() +errchk realloc + +begin + offset = ST_SBUFOP(stp) + buflen = ST_SBUFLEN(stp) + blklen = max (strlen(str), minchars) + 1 + + 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_SBUFINC(stp)) + ST_SBUFINC(stp) = min (MAX_INCREMENT, ST_SBUFINC(stp) * INC_GROW) + ST_SBUFLEN(stp) = buflen + ST_SBUFNGROW(stp) = ST_SBUFNGROW(stp) + 1 + + call realloc (ST_SBUFP(stp), buflen, TY_CHAR) + } + + ST_SBUFOP(stp) = ST_SBUFOP(stp) + blklen + call strcpy (str, Memc[ST_SBUFP(stp)+offset], blklen) + + return (offset) +end |