put tabs back; change address modifier since i/o buffer
[unix-history] / usr / src / usr.bin / mail / strings.c
CommitLineData
761330fe
DF
1/*
2 * Copyright (c) 1980 Regents of the University of California.
3 * All rights reserved. The Berkeley software License Agreement
4 * specifies the terms and conditions for redistribution.
5 */
6
2ae9f53f 7#ifndef lint
2fd8b883 8static char *sccsid = "@(#)strings.c 5.2 (Berkeley) %G%";
761330fe 9#endif not lint
563238c6
KS
10
11/*
12 * Mail -- a mail program
13 *
14 * String allocation routines.
15 * Strings handed out here are reclaimed at the top of the command
16 * loop each time, so they need not be freed.
17 */
18
19#include "rcv.h"
20
563238c6
KS
21/*
22 * Allocate size more bytes of space and return the address of the
23 * first byte to the caller. An even number of bytes are always
24 * allocated so that the space will always be on a word boundary.
25 * The string spaces are of exponentially increasing size, to satisfy
26 * the occasional user with enormous string size requests.
27 */
28
29char *
30salloc(size)
31{
32 register char *t;
33 register int s;
34 register struct strings *sp;
35 int index;
36
37 s = size;
38 s++;
39 s &= ~01;
40 index = 0;
41 for (sp = &stringdope[0]; sp < &stringdope[NSPACE]; sp++) {
42 if (sp->s_topFree == NOSTR && (STRINGSIZE << index) >= s)
43 break;
44 if (sp->s_nleft >= s)
45 break;
46 index++;
47 }
48 if (sp >= &stringdope[NSPACE])
49 panic("String too large");
50 if (sp->s_topFree == NOSTR) {
51 index = sp - &stringdope[0];
52 sp->s_topFree = (char *) calloc(STRINGSIZE << index,
53 (unsigned) 1);
54 if (sp->s_topFree == NOSTR) {
55 fprintf(stderr, "No room for space %d\n", index);
56 panic("Internal error");
57 }
58 sp->s_nextFree = sp->s_topFree;
59 sp->s_nleft = STRINGSIZE << index;
60 }
61 sp->s_nleft -= s;
62 t = sp->s_nextFree;
63 sp->s_nextFree += s;
64 return(t);
65}
66
67/*
68 * Reset the string area to be empty.
69 * Called to free all strings allocated
70 * since last reset.
71 */
72
73sreset()
74{
75 register struct strings *sp;
76 register int index;
77
78 if (noreset)
79 return;
80 minit();
81 index = 0;
82 for (sp = &stringdope[0]; sp < &stringdope[NSPACE]; sp++) {
83 if (sp->s_topFree == NOSTR)
84 continue;
85 sp->s_nextFree = sp->s_topFree;
86 sp->s_nleft = STRINGSIZE << index;
87 index++;
88 }
89}