P8000/WEGA/contrib/lcc/lib/libc/port/gen/mon.c

51 lines
1.5 KiB
C

#include <mon.h>
extern int creat(), write(), close();
extern void profil(), perror();
static int ssiz;
static struct hdr *sbuf;
void
monitor(lowpc, highpc, buffer, bufsize, nfunc)
char *lowpc, *highpc; /* boundaries of text to be monitored */
WORD *buffer; /* ptr to space for monitor data (WORDs) */
int bufsize; /* size of above space (in WORDs) */
int nfunc; /* max no. of functions whose calls are counted
(default nfunc is 300) */
{
int scale;
long text, lsize;
if (lowpc == NULL) { /* true only at the end */
if (sbuf != NULL) {
int fd;
profil((char *)NULL, 0, 0, 0);
if ((fd = creat(MON_OUT, 0666)) < 0 ||
write(fd, (char *)sbuf, (unsigned)ssiz) != ssiz)
perror(MON_OUT);
if (fd >= 0)
(void) close(fd);
}
return;
}
sbuf = NULL;
ssiz = (sizeof(struct hdr) + nfunc * sizeof(struct cnt))/sizeof(WORD);
if (ssiz >= bufsize || lowpc >= highpc)
return;
sbuf = (struct hdr *)buffer; /* for writing buffer at the wrapup */
sbuf->lpc = lowpc; /* initialize the first */
sbuf->hpc = highpc; /* region of the buffer */
sbuf->nfns = nfunc;
buffer += ssiz; /* move ptr past 2'nd region */
bufsize -= ssiz; /* no. WORDs in third region */
/* no. WORDs of text */
text = (highpc - lowpc + sizeof(WORD) - 1)/sizeof(WORD);
lsize = (bufsize > text) ? text : bufsize; /* minimum */
scale = (int)(((lsize << 16) - 1) / text);
bufsize *= sizeof(WORD); /* bufsize into no. bytes */
ssiz = ssiz * sizeof(WORD) + bufsize; /* size into no. bytes */
profil((char *)buffer, bufsize, (int)lowpc, scale);
}