* String allocation routines.
* Strings handed out here are reclaimed at the top of the command
* loop each time, so they need not be freed.
static char *SccsId
= "@(#)strings.c 2.1 %G%";
* Allocate size more bytes of space and return the address of the
* first byte to the caller. An even number of bytes are always
* allocated so that the space will always be on a word boundary.
* The string spaces are of exponentially increasing size, to satisfy
* the occasional user with enormous string size requests.
register struct strings
*sp
;
for (sp
= &stringdope
[0]; sp
< &stringdope
[NSPACE
]; sp
++) {
if (sp
->s_topFree
== NOSTR
&& (STRINGSIZE
<< index
) >= s
)
if (sp
>= &stringdope
[NSPACE
])
panic("String too large");
if (sp
->s_topFree
== NOSTR
) {
index
= sp
- &stringdope
[0];
sp
->s_topFree
= (char *) calloc(STRINGSIZE
<< index
,
if (sp
->s_topFree
== NOSTR
) {
fprintf(stderr
, "No room for space %d\n", index
);
sp
->s_nextFree
= sp
->s_topFree
;
sp
->s_nleft
= STRINGSIZE
<< index
;
* Reset the string area to be empty.
* Called to free all strings allocated
register struct strings
*sp
;
for (sp
= &stringdope
[0]; sp
< &stringdope
[NSPACE
]; sp
++) {
if (sp
->s_topFree
== NOSTR
)
sp
->s_nextFree
= sp
->s_topFree
;
sp
->s_nleft
= STRINGSIZE
<< index
;