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