1 #ifndef lint 2 static char sccsid[] = "@(#)0.alloc.c 4.1 (Berkeley) 02/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 } 158