💾 Archived View for spam.works › mirrors › textfiles › computers › anderson.lst captured on 2024-02-05 at 11:22:54.

View Raw

More Information

⬅️ Previous capture (2023-06-14)

-=-=-=-=-=-=-

_C CUSTOMIZED MEMORY ALLOCATORS_
by Paul Anderson

[LISTING ONE]


/* sym1.c - symbol table data types */

#include <stdio.h>
#include "xalloc.h"
#include "defs.h"

main()
{
   Symbol *p1, *p2;
   char *ps = "test string";
   int *p5;

   p1 = (Symbol *) xmalloc(sizeof(struct Symbol));
   p1->dtype = STRING;
   p1->val.pstring = xmalloc(strlen(ps) + 1);
   strcpy(p1->val.pstring, ps);

   p2 = (Symbol *) xmalloc(sizeof(struct Symbol));
   p2->dtype = DOUBLE;
   p2->val.pdouble = (double *) xmalloc(sizeof(double));
   *p2->val.pdouble = 6.7e-13;

   printf("%s\n", p1->val.pstring);
   printf("%g\n", *p2->val.pdouble);

   p5 = (int *) xmalloc(30000 * sizeof(int));
}

$ sym1
test string
6.7e-13
file sym1.c - line 26:  malloc error for 60000 bytes


[LISTING TWO]

#include <stdio.h>
#include <malloc.h>

#define MAXBUF 256                /* size of debug buffer */
static char *dbuf[MAXBUF];        /* debug buffer */

/* ymalloc2.c - front end for malloc()
                Version 2


char *ymalloc(file, lineno, nbytes)
char *file;
int lineno;
unsigned int nbytes;
{
   char *pheap;
   void install();

   pheap = malloc(nbytes);
   if (pheap == (char *) NULL) {
     fprintf(stderr,"file %s - line %d:  malloc error for %u bytes\n",
                     file, lineno, nbytes);
     exit(1);
   }
   install(pheap);                  /* place in debug buffer */
   return pheap;
}

void install(pheap)               /* store heap pointer in debug buffer */
char *pheap;
{
   register char **pbuf;

   for (pbuf = dbuf; pbuf < dbuf + MAXBUF; pbuf++)
       if (*pbuf == (char *) NULL) {
          *pbuf = pheap;
          return;
       }
   fprintf(stderr, "No room left in debug buffer\n");
   exit(1);
}

char *yrealloc(file, lineno, oldp, nbytes)
char *file, *oldp;
int lineno;
unsigned int nbytes;
{
   char *newp;
   register char **pbuf;
   short found = 0;

   if (oldp != (char *) NULL)
      for (pbuf = dbuf; pbuf < dbuf + MAXBUF; pbuf++)
          if (*pbuf == oldp) {      /* find oldp's slot */
             found = 1;
             break;
          }
   if (!found) {
      fprintf(stderr,"file %s - line %d:  realloc error for address %x\n",
                     file, lineno, oldp);
      exit(1);
   }
   newp = realloc(oldp, nbytes);
   if (newp == (char *) NULL) {
      fprintf(stderr,"file %s - line %d:  realloc error for %u bytes\n",
                     file, lineno, nbytes);
      exit(1);
   }
   *pbuf = newp;         /* replace in debug buffer's old slot */
   return newp;
}

void yfree(file, lineno, pheap)
char *file, *pheap;
int lineno;
{
   register char **pbuf;

   if (pheap != (char *) NULL)
      for (pbuf = dbuf; pbuf < dbuf + MAXBUF; pbuf++)
          if (*pbuf == pheap) {
             *pbuf = NULL;
             free(pheap);
             return;
          }
   fprintf(stderr,"file %s - line %d:  free error for address %x\n",
                     file, lineno, pheap);
   exit(1);
}


[LISTING THREE]


/* sym2.c - more symbol table data types */

#include <stdio.h>
#include "xalloc.h"
#include "defs.h"

main()
{
   Symbol *p1, *p2;
   char *ps = "test string";
   char *ps2 = "much longer test string";

   p1 = (Symbol *) xmalloc(sizeof(struct Symbol));
   p1->dtype = STRING;
   p1->val.pstring = xmalloc(strlen(ps) + 1);
   strcpy(p1->val.pstring, ps);

   p2 = (Symbol *) xmalloc(sizeof(struct Symbol));
   p2->dtype = DOUBLE;
   p2->val.pdouble = (double *) xmalloc(sizeof(double));
   *p2->val.pdouble = 6.7e-13;

   printf("%s\n", p1->val.pstring);
   printf("%g\n", *p2->val.pdouble);

   p1->val.pstring = xrealloc(p1->val.pstring, strlen(ps2) + 1);
   strcpy(p1->val.pstring, ps2);
   printf("%s\n", p1->val.pstring);

   xfree((char *) p2->val.pdouble);
   xfree(ps2);                      /* free a bad pointer */
}

$ sym2
test string
6.7e-13
much longer test string
file sym2.c - line 31:  free error for address 2634



Example 1: Out of bounds references

/* twzone.c - array out of bounds */

main()
{
    int buf[10];

    buf[-4] = 1;             /* negative subscript */
    buf[10] = 2;             /* one step beyond */

    printf("%d %d\n", *(buf - 4), *(buf + 10));
}


Example 2: Program that demonstartes xcalloc()


/* neg.c - negative subscripts with xcalloc */

#include <stdio.h>

main()
{
   char *xcalloc();
   int *p, *q;

   p = (int *) xcalloc(10, sizeof(int));
   q = (int *) xcalloc(15, sizeof(int));

   fill(p);                            /* fill with 10 numbers */
   display(p);                         /* print 10 numbers */

   fill(q);                            /* fill with 15 numbers */
   display(q);                         /* print 15 numbers */
}

$ neg
  1  2  3  4  5  6  7  8  9 10
  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15


 Example 3: xcalloc() routine



#include <stdio.h>
#include <malloc.h>
#include <memory.h>

char *xcalloc(nitems, size)            /* custom calloc() */
unsigned nitems, size;
{
   char *pheap;
   unsigned blksize;

   blksize = nitems * size;                    /* size of chunk */

   if ((pheap = malloc(blksize + sizeof(int))) == NULL) {
      fprintf(stderr, "Can't malloc on heap\n");
      exit(1);
   }
   *(int *)pheap = nitems;                     /* store no. of items in heap */

   memset(pheap + sizeof(int), 0, blksize);    /* zero the area */

   return pheap + sizeof(int);                 /* pointer to data */
}