diff options
Diffstat (limited to 'debug.c')
-rw-r--r-- | debug.c | 212 |
1 files changed, 212 insertions, 0 deletions
@@ -0,0 +1,212 @@ +/* + + viDOOM - level editor for DOOM + + Copyright (C) 2000 Ian Cowburn (ianc@noddybox.demon.co.uk) + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + ------------------------------------------------------------------------- + + Debug output + +*/ +static const char rcs_id[]="$Id$"; + +#include "config.h" + +#include <stdio.h> +#include <stdarg.h> +#include <ctype.h> + +#include "debug.h" + +static FILE *trace_fp=NULL; + +void _Debug(char *fmt,...) +{ + static char last[512]=""; + static char this[512]=""; + static int rep=0; + int f; + va_list va; + + if (!trace_fp) + { + trace_fp=fopen("trace.out","w"); + setbuf(trace_fp,NULL); + } + + if (trace_fp) + { + va_start(va,fmt); + vsprintf(this,fmt,va); + va_end(va); + + if (strcmp(last,this)==0) + { + rep++; + if (rep==3) + fprintf(trace_fp,"DEBUG: *** Repeating...\n"); + } + else + { + if (rep) + { + if (rep>2) + fprintf(trace_fp,"DEBUG: *** Repeated %d times\n",rep); + else + for(f=0;f<rep;f++) + fprintf(trace_fp,"DEBUG: %s",last); + rep=0; + } + + fprintf(trace_fp,"DEBUG: %s",this); + strcpy(last,this); + } + } +} + + +void _Trace(char *fmt,...) +{ +#ifdef DEBUG + static int ok=TRUE; + static int check=FALSE; + static char last[512]=""; + static char this[512]=""; + static int rep=0; + int f; + va_list va; + + if (!ok) + return; + + if (!check) + { + check=TRUE; + + if ((getenv("VIDOOM_TRACE"))&&(!strcmp(getenv("VIDOOM_TRACE"),"Y"))) + ok=TRUE; + else + { + ok=FALSE; + return; + } + } + + if (!trace_fp) + { + trace_fp=fopen("trace.out","w"); + setbuf(trace_fp,NULL); + } + + if (trace_fp) + { + va_start(va,fmt); + vsprintf(this,fmt,va); + va_end(va); + + if (strcmp(last,this)==0) + { + rep++; + if (rep==3) + fprintf(trace_fp,"*** Repeating...\n"); + else if ((rep%10)==0) + fprintf(trace_fp,"*** Still repeating - %d times\n",rep); + } + else + { + if (rep) + { + if (rep>2) + fprintf(trace_fp,"*** Repeated %d times\n",rep); + else + for(f=0;f<rep;f++) + fprintf(trace_fp,"%s",last); + rep=0; + } + + fprintf(trace_fp,"%s",this); + strcpy(last,this); + } + } +#endif +} + + +char *Binstr(int val, int width) +{ + static char s[48]; + char *p; + + p=s; + width--; + while(width>=0) + { + if (val&(1<<width)) + *p++='1'; + else + *p++='0'; + + width--; + } + + *p=0; + + return(s); +} + + +char *MemStr(char *addr,int size) +{ + static char s[1024]; + int i; + + i=0; + + while(size) + { + if (isprint(*addr)) + s[i++]=*addr; + else if (*addr=='\0') + s[i++]='@'; + else if (*addr=='\n') + { + strcpy(s+i,"\\n"); + i+=2; + } + else + { + sprintf(s+i,"\\%3.3o",(unsigned int)*addr); + i+=4; + } + + if (i>(sizeof(s)-10)) + { + sprintf(s+i,"<...>"); + return(s); + } + + size--; + addr++; + } + + s[i]=0; + return(s); +} + + +/* END OF FILE */ |