textfiles/computers/anderson.lst

247 lines
5.5 KiB
Plaintext
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

_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 */
}