|
|
1.1 root 1: #include <stdio.h>
2: #include "def.h"
3: int routbeg;
4:
5: extern int debug;
6: struct coreblk {struct coreblk *nxtblk;
7: int blksize;
8: int nxtfree;
9: int *blk;
10: };
11:
12: long space;
13: challoc(n)
14: int 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:
26: chfree(p,n)
27: int *p,n;
28: {
29: ASSERT(p,chfree);
30: space -= n;
31: free(p);
32: }
33:
34:
35: struct coreblk *tcore, *gcore;
36: int tblksize=12, gblksize=300;
37:
38:
39: balloc(n,p,size) /* allocate n bytes from coreblk *p */
40: int n,size; /* use specifies where called */
41: struct 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:
60: talloc(n) /* allocate from line-by-line storage area */
61: int n;
62: {return(balloc(n,&tcore,tblksize)); }
63:
64: galloc(n) /* allocate from graph storage area */
65: int n;
66: {
67: return(balloc(n,&gcore,gblksize));
68: }
69:
70: reuse(p) /* set nxtfree so coreblk can be reused */
71: struct coreblk *p;
72: {
73: for (; p; p=p->nxtblk) p->nxtfree = 0;
74: }
75:
76: bfree(p) /* free coreblk p */
77: struct coreblk *p;
78: {
79: if (!p) return;
80: bfree(p->nxtblk);
81: p->nxtblk = 0;
82: free(p);
83: }
84:
85:
86: morespace(n,p,size) /* get at least n more wds for coreblk *p */
87: int n,size;
88: struct 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:
112: freegraf()
113: {
114: bfree(gcore);
115: gcore = 0;
116:
117:
118: }
119:
120:
121:
122:
123:
124:
125:
126:
127:
128: error(mess1, mess2, mess3)
129: char *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:
141: faterr(mess1, mess2, mess3)
142: char *mess1, *mess2, *mess3;
143: {
144: error(mess1, mess2, mess3);
145: exit(1);
146: }
147:
148:
149: strerr(mess1, mess2, mess3)
150: char *mess1, *mess2, *mess3;
151: {
152: error("struct error: ",mess1, mess2);
153: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.