X-Git-Url: https://git.distorted.org.uk/~mdw/become/blobdiff_plain/c4f2d992e4a0fc068281376d89ec38de56dc2f58..a61daab4ef77d39e901973e3ce06a419d26eb949:/src/utils.c diff --git a/src/utils.c b/src/utils.c index a46a310..7867411 100644 --- a/src/utils.c +++ b/src/utils.c @@ -1,13 +1,13 @@ /* -*-c-*- * - * $Id: utils.c,v 1.1 1997/07/21 13:47:42 mdw Exp $ + * $Id: utils.c,v 1.2 1997/08/04 10:24:26 mdw Exp $ * * Miscellaneous useful bits of code. * * (c) 1997 Mark Wooding */ -/*----- Licencing notice --------------------------------------------------* +/*----- Licensing notice --------------------------------------------------* * * This file is part of `become' * @@ -22,14 +22,17 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with `become'; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + * along with `become'; if not, write to the Free Software Foundation, + * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ /*----- Revision history --------------------------------------------------* * * $Log: utils.c,v $ - * Revision 1.1 1997/07/21 13:47:42 mdw + * Revision 1.2 1997/08/04 10:24:26 mdw + * Sources placed under CVS control. + * + * Revision 1.1 1997/07/21 13:47:42 mdw * Initial revision * */ @@ -38,20 +41,22 @@ /* --- ANSI headers --- */ +#include #include #include #include +#include /* --- Local headers --- */ #include "config.h" #include "utils.h" -/*----- Static data -------------------------------------------------------*/ +/*----- Program name handling ---------------------------------------------*/ -static const char *myname = 0; /* What's my name? */ +/* --- Static data --- */ -/*----- Program name handling ---------------------------------------------*/ +static const char *myname = 0; /* What's my name? */ /* --- @quis@ --- * * @@ -140,6 +145,129 @@ void die(const char *f, ...) exit(EXIT_FAILURE); } +/*----- Trace messages ----------------------------------------------------*/ + +#if defined(TRACING) || !defined(NDEBUG) + +/* --- Static data --- */ + +static FILE *tracefp = 0; /* Where does debugging go? */ +static unsigned int tracelvl = 0; /* How much tracing gets done? */ + +/* --- @trace@ --- * + * + * Arguments: @unsigned int lvl@ = trace level for output + * @const char *f@ = a @printf@-style format string + * @...@ = other arguments + * + * Returns: --- + * + * Use: Reports a message to the trace output. + */ + +void trace(unsigned int lvl, const char *f, ...) +{ + va_list ap; + if ((lvl & tracing()) == 0) + return; + va_start(ap, f); + fprintf(tracefp, "*** %s: ", myname); + vfprintf(tracefp, f, ap); + va_end(ap); + putc('\n', tracefp); +} + +/* --- @traceblk@ --- * + * + * Arguments: @unsigned int lvl@ = trace level for output + * @const char *hdr@ = some header string to write + * @const void *blk@ = pointer to a block of memory to dump + * @size_t sz@ = size of the block of memory + * + * Returns: --- + * + * Use: Dumps the contents of a block to the trace output. + */ + +void traceblk(unsigned int lvl, const char *hdr, const void *blk, size_t sz) +{ + const unsigned char *p = blk; + size_t i; + unsigned long o = 0; + size_t c; + + /* --- Skip if the trace level is too high --- */ + + if ((lvl & tracing()) == 0) + return; + + /* --- Now start work --- */ + + fprintf(tracefp, "*** %s: %s\n", myname, hdr); + + while (sz) { + fprintf(tracefp, "*** %s: %08lu : ", myname, o); + for (i = 0; i < 8; i++) { + if (i < sz) + fprintf(tracefp, "%02x ", p[i]); + else + fputs("** ", tracefp); + } + fputs(": ", tracefp); + for (i = 0; i < 8; i++) { + if (i < sz) + fputc(isprint(p[i]) ? p[i] : '.', tracefp); + else + fputc('*', tracefp); + } + fputc('\n', tracefp); + c = (sz >= 8) ? 8 : sz; + sz -= c, p += c, o += c; + } +} + + +/* --- @traceon@ --- * + * + * Arguments: @FILE *fp@ = a file to trace on + * @unsigned int lvl@ = trace level to set + * + * Returns: --- + * + * Use: Enables tracing to a file. + */ + +void traceon(FILE *fp, unsigned int lvl) +{ + tracefp = fp; + if (!tracelvl) + tracelvl = lvl; +} + +/* --- @tracesetlvl@ --- * + * + * Arguments: @unsigned int lvl@ = trace level to set + * + * Returns: --- + * + * Use: Sets the tracing level. + */ + +void tracesetlvl(unsigned int lvl) { tracelvl = lvl; } + +/* --- @tracing@ --- * + * + * Arguments: --- + * + * Returns: Zero if not tracing, tracing level if tracing. + * + * Use: Informs the caller whether tracing is enabled. + */ + +unsigned int tracing(void) { return (tracefp ? tracelvl : 0u); } + +#endif + /*----- Memory management functions ---------------------------------------*/ /* --- @xmalloc@ --- *