|
|
1.1 ! root 1: #ident "@(#)stralloc.c 1.3 'attmail mail(1) command'" ! 2: #ident "@(#)mailx:stralloc.c 1.3.1.1" ! 3: /* Copyright (c) 1984 AT&T */ ! 4: /* All Rights Reserved */ ! 5: ! 6: /* THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF AT&T */ ! 7: /* The copyright notice above does not evidence any */ ! 8: /* actual or intended publication of such source code. */ ! 9: ! 10: #ident "@(#)mailx:stralloc.c 1.3" ! 11: ! 12: /* ! 13: * mailx -- a modified version of a University of California at Berkeley ! 14: * mail program ! 15: * ! 16: * Memory allocation routines. ! 17: * Memory handed out here are reclaimed at the top of the command ! 18: * loop each time, so they need not be freed. ! 19: */ ! 20: ! 21: #include "rcv.h" ! 22: ! 23: /* ! 24: * Allocate size more bytes of space and return the address of the ! 25: * first byte to the caller. An even number of bytes are always ! 26: * allocated so that the space will always be on a word boundary. ! 27: * The string spaces are of exponentially increasing size, to satisfy ! 28: * the occasional user with enormous string size requests. ! 29: */ ! 30: ! 31: VOID * ! 32: salloc(size) ! 33: unsigned size; ! 34: { ! 35: register char *t; ! 36: register unsigned s; ! 37: register struct strings *sp; ! 38: int index; ! 39: ! 40: s = size; ! 41: s += 3; /* 3b's need alignment on quad boundary */ ! 42: s &= ~03; ! 43: index = 0; ! 44: for (sp = &stringdope[0]; sp < &stringdope[NSPACE]; sp++) { ! 45: if (sp->s_topFree == NOSTR && (STRINGSIZE << index) >= s) ! 46: break; ! 47: if (sp->s_nleft >= s) ! 48: break; ! 49: index++; ! 50: } ! 51: if (sp >= &stringdope[NSPACE]) ! 52: panic("String too large"); ! 53: if (sp->s_topFree == NOSTR) { ! 54: index = sp - &stringdope[0]; ! 55: sp->s_topFree = (char *) calloc(STRINGSIZE << index, ! 56: (unsigned) 1); ! 57: if (sp->s_topFree == NOSTR) { ! 58: fprintf(stderr, "No room for space %d\n", index); ! 59: panic("Internal error"); ! 60: } ! 61: sp->s_nextFree = sp->s_topFree; ! 62: sp->s_nleft = STRINGSIZE << index; ! 63: } ! 64: sp->s_nleft -= s; ! 65: t = sp->s_nextFree; ! 66: sp->s_nextFree += s; ! 67: return(t); ! 68: } ! 69: ! 70: /* ! 71: * Reallocate size bytes of space and return the address of the ! 72: * first byte to the caller. The old data is copied into the new area. ! 73: */ ! 74: ! 75: VOID * ! 76: srealloc(optr, size) ! 77: VOID *optr; ! 78: unsigned size; ! 79: { ! 80: VOID *nptr = salloc(size); ! 81: if (nptr) ! 82: memcpy(nptr, optr, size); ! 83: return nptr; ! 84: } ! 85: ! 86: /* ! 87: * Reset the string area to be empty. ! 88: * Called to free all strings allocated ! 89: * since last reset. ! 90: */ ! 91: void ! 92: sreset() ! 93: { ! 94: register struct strings *sp; ! 95: register int index; ! 96: ! 97: if (noreset) ! 98: return; ! 99: minit(); ! 100: index = 0; ! 101: for (sp = &stringdope[0]; sp < &stringdope[NSPACE]; sp++) { ! 102: if (sp->s_topFree == NOSTR) ! 103: continue; ! 104: sp->s_nextFree = sp->s_topFree; ! 105: sp->s_nleft = STRINGSIZE << index; ! 106: index++; ! 107: } ! 108: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.