home *** CD-ROM | disk | FTP | other *** search
-
- /*
- * MEMORY.C
- *
- * (c)Copyright 1987 Matthew Dillon, All Rights Reserved.
- *
- */
-
- #include "files.h"
-
- #define BLKSIZE 256 /* # of records to allocate at once */
- #define STRBLKSIZE 4096
- #define MAXSTRLEN 64 /* maximum string len for cached strings */
-
- static RECORD *Freelist;
- static RECORD *Blk;
- static short Bi;
- static char *Strs[MAXSTRLEN];
- static char *Sbuf;
- static short Si;
-
- RECORD *
- allocrecord()
- {
- register RECORD *rec;
- if (rec = Freelist) {
- Freelist = Freelist->next;
- return(rec);
- }
- if (!Bi) {
- Blk = (RECORD *)malloc(sizeof(RECORD) * BLKSIZE);
- if (!Blk)
- return(NULL);
- Bi = 256;
- }
- --Bi;
- return(Blk++);
- }
-
- void
- freerecord(rec)
- RECORD *rec;
- {
- rec->next = Freelist;
- Freelist = rec;
- }
-
- char *
- allocstr(str)
- char *str;
- {
- register short bytes = strlen(str) + 1;
- register char *ptr;
-
- if (bytes >= 4 && bytes < MAXSTRLEN) {
- if (Strs[bytes]) {
- ptr = Strs[bytes];
- Strs[bytes] = *(char **)ptr;
- } else {
- bytes = (bytes + 1) & ~1;
- if (Si < bytes) {
- Sbuf = malloc(STRBLKSIZE);
- if (!Sbuf)
- return(NULL);
- Si = STRBLKSIZE;
- }
- ptr = Sbuf;
- Sbuf += bytes;
- Si -= bytes;
- }
- } else {
- ptr = malloc(bytes);
- if (!ptr)
- return(NULL);
- }
- strcpy(ptr, str);
- return(ptr);
- }
-
- void
- freestr(ptr)
- char *ptr;
- {
- register short len;
-
- if (ptr) {
- len = strlen(ptr) + 1;
- if (len >= 4 && len < MAXSTRLEN) {
- *(char **)ptr = Strs[len];
- Strs[len] = ptr;
- } else {
- free(ptr);
- }
- }
- }
-
-