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 = (struct coreblk *)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( (int)&(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 = (struct coreblk *)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 = (int *) q + 1; 110: return((int)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: }