BSD 3 development
[unix-history] / usr / src / cmd / struct / 0.alloc.c
CommitLineData
42d6e430
BJ
1#include <stdio.h>
2#include "def.h"
3int routbeg;
4
5extern int debug;
6struct coreblk {struct coreblk *nxtblk;
7 int blksize;
8 int nxtfree;
9 int *blk;
10 };
11
12long space;
13challoc(n)
14int n;
15 {
16 int i;
17 i = malloc(n);
18 if(i) { space += n; return(i); }
19 fprintf(stderr,"alloc out of space\n");
20 fprintf(stderr,"total space alloc'ed = %D\n",space);
21 fprintf(stderr,"%d more bytes requested\n",n);
22 exit(1);
23 }
24
25
26chfree(p,n)
27int *p,n;
28 {
29 ASSERT(p,chfree);
30 space -= n;
31 free(p);
32 }
33
34
35struct coreblk *tcore, *gcore;
36int tblksize=12, gblksize=300;
37
38
39balloc(n,p,size) /* allocate n bytes from coreblk *p */
40int n,size; /* use specifies where called */
41struct coreblk **p;
42 {
43 int i;
44 struct coreblk *q;
45 n = (n+sizeof(i)-1)/sizeof(i); /* convert bytes to wds to ensure ints always at wd boundaries */
46 for (q = *p; ; q = q->nxtblk)
47 {
48 if (!q)
49 {
50 q = morespace(n,p,size);
51 break;
52 }
53 if (q-> blksize - q->nxtfree >= n) break;
54 }
55 i = q->nxtfree;
56 q ->nxtfree += n;
57 return( &(q->blk)[i]);
58 }
59
60talloc(n) /* allocate from line-by-line storage area */
61int n;
62 {return(balloc(n,&tcore,tblksize)); }
63
64galloc(n) /* allocate from graph storage area */
65int n;
66 {
67 return(balloc(n,&gcore,gblksize));
68 }
69
70reuse(p) /* set nxtfree so coreblk can be reused */
71struct coreblk *p;
72 {
73 for (; p; p=p->nxtblk) p->nxtfree = 0;
74 }
75
76bfree(p) /* free coreblk p */
77struct coreblk *p;
78 {
79 if (!p) return;
80 bfree(p->nxtblk);
81 p->nxtblk = 0;
82 free(p);
83 }
84
85
86morespace(n,p,size) /* get at least n more wds for coreblk *p */
87int n,size;
88struct coreblk **p;
89 {struct coreblk *q;
90 int t,i;
91
92 t = n<size?size:n;
93 q = malloc(i=t*sizeof(*(q->blk))+sizeof(*q));
94 if(!q){
95 error(": alloc out of space","","");
96 fprintf(stderr,"space = %D\n",space);
97 fprintf(stderr,"%d more bytes requested\n",n);
98 exit(1);
99 }
100 space += i;
101 q->nxtblk = *p;
102 *p = q;
103 q -> blksize = t;
104 q-> nxtfree = 0;
105 q->blk = q + 1;
106 return(q);
107 }
108
109
110
111
112freegraf()
113 {
114 bfree(gcore);
115 gcore = 0;
116
117
118 }
119
120
121
122
123
124
125
126
127
128error(mess1, mess2, mess3)
129char *mess1, *mess2, *mess3;
130 {
131 static lastbeg;
132 if (lastbeg != routbeg)
133 {
134 fprintf(stderr,"routine beginning on line %d:\n",routbeg);
135 lastbeg = routbeg;
136 }
137 fprintf(stderr,"error %s %s %s\n",mess1, mess2, mess3);
138 }
139
140
141faterr(mess1, mess2, mess3)
142char *mess1, *mess2, *mess3;
143 {
144 error(mess1, mess2, mess3);
145 exit(1);
146 }
147
148
149strerr(mess1, mess2, mess3)
150char *mess1, *mess2, *mess3;
151 {
152 error("struct error: ",mess1, mess2);
153 }