|
|
1.1 ! root 1: /* ! 2: * Copyright (c) 1980 Regents of the University of California. ! 3: * All rights reserved. ! 4: * ! 5: * Redistribution and use in source and binary forms are permitted ! 6: * provided that this notice is preserved and that due credit is given ! 7: * to the University of California at Berkeley. The name of the University ! 8: * may not be used to endorse or promote products derived from this ! 9: * software without specific prior written permission. This software ! 10: * is provided ``as is'' without express or implied warranty. ! 11: */ ! 12: ! 13: #ifdef notdef ! 14: static char sccsid[] = "@(#)strings.c 5.5 (Berkeley) 2/18/88"; ! 15: #endif /* notdef */ ! 16: ! 17: /* ! 18: * Mail -- a mail program ! 19: * ! 20: * String allocation routines. ! 21: * Strings handed out here are reclaimed at the top of the command ! 22: * loop each time, so they need not be freed. ! 23: */ ! 24: ! 25: #include "rcv.h" ! 26: ! 27: /* ! 28: * Allocate size more bytes of space and return the address of the ! 29: * first byte to the caller. An even number of bytes are always ! 30: * allocated so that the space will always be on a word boundary. ! 31: * The string spaces are of exponentially increasing size, to satisfy ! 32: * the occasional user with enormous string size requests. ! 33: */ ! 34: ! 35: char * ! 36: salloc(size) ! 37: { ! 38: register char *t; ! 39: register int s; ! 40: register struct strings *sp; ! 41: int index; ! 42: ! 43: s = size; ! 44: s += 3; ! 45: s &= ~03; ! 46: index = 0; ! 47: for (sp = &stringdope[0]; sp < &stringdope[NSPACE]; sp++) { ! 48: if (sp->s_topFree == NOSTR && (STRINGSIZE << index) >= s) ! 49: break; ! 50: if (sp->s_nleft >= s) ! 51: break; ! 52: index++; ! 53: } ! 54: if (sp >= &stringdope[NSPACE]) ! 55: panic("String too large"); ! 56: if (sp->s_topFree == NOSTR) { ! 57: index = sp - &stringdope[0]; ! 58: sp->s_topFree = (char *) calloc(STRINGSIZE << index, ! 59: (unsigned) 1); ! 60: if (sp->s_topFree == NOSTR) { ! 61: fprintf(stderr, "No room for space %d\n", index); ! 62: panic("Internal error"); ! 63: } ! 64: sp->s_nextFree = sp->s_topFree; ! 65: sp->s_nleft = STRINGSIZE << index; ! 66: } ! 67: sp->s_nleft -= s; ! 68: t = sp->s_nextFree; ! 69: sp->s_nextFree += s; ! 70: return(t); ! 71: } ! 72: ! 73: /* ! 74: * Reset the string area to be empty. ! 75: * Called to free all strings allocated ! 76: * since last reset. ! 77: */ ! 78: ! 79: sreset() ! 80: { ! 81: register struct strings *sp; ! 82: register int index; ! 83: ! 84: if (noreset) ! 85: return; ! 86: minit(); ! 87: index = 0; ! 88: for (sp = &stringdope[0]; sp < &stringdope[NSPACE]; sp++) { ! 89: if (sp->s_topFree == NOSTR) ! 90: continue; ! 91: sp->s_nextFree = sp->s_topFree; ! 92: sp->s_nleft = STRINGSIZE << index; ! 93: index++; ! 94: } ! 95: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.