|
|
1.1 ! root 1: static char ID[] = "@(#) allot.c: 1.1 3/16/82"; ! 2: #include <stdio.h> ! 3: #include "sdp.h" ! 4: #include "define3.h" ! 5: ! 6: #ifdef SHORT ! 7: #define AL01 "AL01 " ! 8: #define AL02 "AL02 " ! 9: #define AL03 "AL03 " ! 10: #define AL04 "AL04 " ! 11: #define AL05 "AL05 " ! 12: #define AL06 "AL06 " ! 13: #define ALAU "ALAU " ! 14: #else ! 15: #define AL01 "AL01 -- space not connected\n%o\n",sp ! 16: #define AL02 "AL02 -- no permissions to allot\n" ! 17: #define AL03 "AL03 -- fail to pop stack\n%o\n",sp ! 18: #define AL04 "AL04 -- address space overflow\n%o\n",sp ! 19: #define AL05 "AL05 -- fail to redeem fragment from multipage item\n%o\n",sp ! 20: #define AL06 "AL06 -- fail to redeem fragment from old current page\n%o\n",sp ! 21: #define ALAU "%s","ALAU -- audit failed in sdp_allot\n" ! 22: #endif ! 23: ! 24: #ifdef SWEET ! 25: #define PROLOG ! 26: #define EPILOG ! 27: #else ! 28: #define PROLOG if( (aud_flag == AUDITON) && (aud_check() == ERROR) )\ ! 29: ERR_RET(ALAU,IDERROR)\ ! 30: if(hist_fp != NULL)\ ! 31: fprintf(hist_fp,"AL\t%o\t%u\t",sp,howmuch) ; ! 32: #define EPILOG if(aud_flag == AUDITON)\ ! 33: aud_set() ;\ ! 34: if(hist_fp != NULL)\ ! 35: fprintf(hist_fp,"%ld\n",id) ; ! 36: #endif ! 37: ! 38: extern int aud_flag ; ! 39: extern struct LIBFILE *Glib_file ; ! 40: extern FILE *hist_fp ; ! 41: extern struct LIBFILE lib_file ; ! 42: ! 43: extern aud_set() ; ! 44: extern int aud_check() ; ! 45: extern FATAL() ; ! 46: extern ITEMID pop_id() ; ! 47: extern push_id() ; ! 48: extern spsearch() ; ! 49: ! 50: ITEMID /* itemid, IDNULL, IDERROR */ ! 51: sdp_allot(sp,howmuch) ! 52: register struct SPACE *sp ; ! 53: register unsigned howmuch ; ! 54: { ! 55: register unsigned page_size ; ! 56: register ITEMID id ; ! 57: ITEMID increase ; ! 58: ITEMID redeem_id ; ! 59: int rationalize() ; ! 60: ! 61: PROLOG ! 62: if(spsearch(sp) == NOTFOUND) ! 63: ERR_RET(AL01,IDERROR) ! 64: ! 65: Glib_file = sp->lib_file ; ! 66: ! 67: if(sp->perms != WRTN) ! 68: ERR_RET(AL02,IDERROR) ! 69: ! 70: howmuch = (unsigned)ALIGNID((ITEMID)howmuch) ; ! 71: ! 72: page_size = sp->page_size ; ! 73: ! 74: id = IDNULL ; ! 75: if ( howmuch > 0 ) ! 76: id = pop_id(sp,howmuch) ; /* fetch from stack */ ! 77: switch( rationalize(id) ) /* cannot switch on long: see NOTES */ ! 78: { ! 79: case ERROR: ! 80: ERR_RET(AL03,IDERROR) ! 81: break ; ! 82: ! 83: case NOTFOUND: ! 84: ! 85: if(howmuch == 0) ! 86: id = IDNULL ; ! 87: else if(howmuch >= page_size) /* more than a page */ ! 88: { ! 89: id = sp->maxpage ; ! 90: increase = ((long)howmuch+page_size-1)/page_size * page_size ; ! 91: sp->maxpage += increase ; ! 92: if(sp->maxpage <= id) ! 93: ERR_RET(AL04,IDERROR) ! 94: if(push_id(sp,id+howmuch,increase-howmuch) == ERROR) ! 95: ERR_RET(AL05,IDERROR) ! 96: } ! 97: else ! 98: if(howmuch <= sp->curleft) /* fits in current page */ ! 99: { ! 100: id = (sp->curpage) + (page_size - sp->curleft) ; ! 101: sp->curleft -= howmuch ; ! 102: } ! 103: else /* need new current page */ ! 104: { ! 105: redeem_id = (sp->curpage) + (page_size - sp->curleft) ; ! 106: if(push_id(sp,redeem_id,sp->curleft) == ERROR) ! 107: ERR_RET(AL06,IDERROR) ! 108: id = sp->curpage = sp->maxpage ; ! 109: sp->maxpage += page_size ; ! 110: sp->curleft = page_size - howmuch ; ! 111: } ! 112: break ; ! 113: ! 114: default: ! 115: break ; ! 116: } ! 117: ! 118: ! 119: EPILOG ! 120: return(id) ; ! 121: } ! 122: ! 123: int /* SUCCESS, ERROR, NOTFOUND */ ! 124: rationalize(id) ! 125: ITEMID id ; ! 126: { ! 127: ! 128: if(id == IDERROR) ! 129: return(ERROR) ; ! 130: else if(id == IDNOTFOUND) ! 131: return(NOTFOUND) ; ! 132: else ! 133: return(SUCCESS) ; ! 134: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.