This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
(was Re: [PATCH perl@13462]] VMS-only File::Spec->canonpath fix)
[perl5.git] / deb.c
diff --git a/deb.c b/deb.c
index 2f5124c..eaa5082 100644 (file)
--- a/deb.c
+++ b/deb.c
-/* $RCSfile: op.c,v $$Revision: 4.1 $$Date: 92/08/07 17:19:16 $
+/*    deb.c
  *
- *    Copyright (c) 1991, Larry Wall
+ *    Copyright (c) 1991-2001, Larry Wall
  *
  *    You may distribute under the terms of either the GNU General Public
  *    License or the Artistic License, as specified in the README file.
  *
- * $Log:       op.c,v $
- * Revision 4.1  92/08/07  17:19:16  lwall
- * Stage 6 Snapshot
- * 
- * Revision 4.0.1.5  92/06/08  12:00:39  lwall
- * patch20: the switch optimizer didn't do anything in subroutines
- * patch20: removed implicit int declarations on funcions
- * 
- * Revision 4.0.1.4  91/11/11  16:29:33  lwall
- * patch19: do {$foo ne "bar";} returned wrong value
- * patch19: some earlier patches weren't propagated to alternate 286 code
- * 
- * Revision 4.0.1.3  91/11/05  16:07:43  lwall
- * patch11: random cleanup
- * patch11: "foo\0" eq "foo" was sometimes optimized to true
- * patch11: foreach on null list could spring memory leak
- * 
- * Revision 4.0.1.2  91/06/07  10:26:45  lwall
- * patch4: new copyright notice
- * patch4: made some allowances for "semi-standard" C
- * 
- * Revision 4.0.1.1  91/04/11  17:36:16  lwall
- * patch1: you may now use "die" and "caller" in a signal handler
- * 
- * Revision 4.0  91/03/20  01:04:18  lwall
- * 4.0 baseline.
- * 
+ */
+
+/*
+ * "Didst thou think that the eyes of the White Tower were blind?  Nay, I
+ * have seen more than thou knowest, Gray Fool."  --Denethor
  */
 
 #include "EXTERN.h"
+#define PERL_IN_DEB_C
 #include "perl.h"
 
-#ifdef I_VARARGS
-#  include <varargs.h>
-#endif
-
-void deb_growlevel();
-
-#  ifndef I_VARARGS
-/*VARARGS1*/
-void deb(pat,a1,a2,a3,a4,a5,a6,a7,a8)
-char *pat;
+#if defined(PERL_IMPLICIT_CONTEXT)
+void
+Perl_deb_nocontext(const char *pat, ...)
 {
-    register I32 i;
-
-    fprintf(stderr,"%-4ld",(long)curop->cop_line);
-    for (i=0; i<dlevel; i++)
-       fprintf(stderr,"%c%c ",debname[i],debdelim[i]);
-    fprintf(stderr,pat,a1,a2,a3,a4,a5,a6,a7,a8);
+#ifdef DEBUGGING
+    dTHX;
+    va_list args;
+    va_start(args, pat);
+    vdeb(pat, &args);
+    va_end(args);
+#endif /* DEBUGGING */
 }
-#  else
-/*VARARGS1*/
-void deb(va_alist)
-va_dcl
+#endif
+
+void
+Perl_deb(pTHX_ const char *pat, ...)
 {
+#ifdef DEBUGGING
     va_list args;
-    char *pat;
-    register I32 i;
-
-    va_start(args);
-    fprintf(stderr,"%-4ld",(long)curcop->cop_line);
-    for (i=0; i<dlevel; i++)
-       fprintf(stderr,"%c%c ",debname[i],debdelim[i]);
-
-    pat = va_arg(args, char *);
-    (void) vfprintf(stderr,pat,args);
-    va_end( args );
+    va_start(args, pat);
+    vdeb(pat, &args);
+    va_end(args);
+#endif /* DEBUGGING */
 }
-#  endif
 
 void
-deb_growlevel()
+Perl_vdeb(pTHX_ const char *pat, va_list *args)
 {
-    dlmax += 128;
-    Renew(debname, dlmax, char);
-    Renew(debdelim, dlmax, char);
+#ifdef DEBUGGING
+    char* file = CopFILE(PL_curcop);
+
+#ifdef USE_5005THREADS
+    PerlIO_printf(Perl_debug_log, "0x%"UVxf" (%s:%ld)\t",
+                 PTR2UV(thr),
+                 (file ? file : "<free>"),
+                 (long)CopLINE(PL_curcop));
+#else
+    PerlIO_printf(Perl_debug_log, "(%s:%ld)\t", (file ? file : "<free>"),
+                 (long)CopLINE(PL_curcop));
+#endif /* USE_5005THREADS */
+    (void) PerlIO_vprintf(Perl_debug_log, pat, *args);
+#endif /* DEBUGGING */
 }
 
 I32
-debstackptrs()
+Perl_debstackptrs(pTHX)
 {
-    fprintf(stderr, "%8lx %8lx %8ld %8ld %8ld\n",
-       stack, stack_base, *markstack_ptr, stack_sp-stack_base, stack_max-stack_base);
-    fprintf(stderr, "%8lx %8lx %8ld %l8d %8ld\n",
-       mainstack, AvARRAY(stack), mainstack, AvFILL(stack), AvMAX(stack));
+#ifdef DEBUGGING
+    PerlIO_printf(Perl_debug_log,
+                 "%8"UVxf" %8"UVxf" %8"IVdf" %8"IVdf" %8"IVdf"\n",
+                 PTR2UV(PL_curstack), PTR2UV(PL_stack_base),
+                 (IV)*PL_markstack_ptr, (IV)(PL_stack_sp-PL_stack_base),
+                 (IV)(PL_stack_max-PL_stack_base));
+    PerlIO_printf(Perl_debug_log,
+                 "%8"UVxf" %8"UVxf" %8"UVuf" %8"UVuf" %8"UVuf"\n",
+                 PTR2UV(PL_mainstack), PTR2UV(AvARRAY(PL_curstack)),
+                 PTR2UV(PL_mainstack), PTR2UV(AvFILLp(PL_curstack)),
+                 PTR2UV(AvMAX(PL_curstack)));
+#endif /* DEBUGGING */
     return 0;
 }
 
 I32
-debstack()
+Perl_debstack(pTHX)
 {
-    register I32 i;
-    I32 markoff = markstack_ptr > markstack ? *markstack_ptr : -1;
+#ifdef DEBUGGING
+    I32 top = PL_stack_sp - PL_stack_base;
+    register I32 i = top - 30;
+    I32 *markscan = PL_markstack + PL_curstackinfo->si_markoff;
+
+    if (i < 0)
+       i = 0;
+    
+    while (++markscan <= PL_markstack_ptr)
+       if (*markscan >= i)
+           break;
 
-    fprintf(stderr, "     =>");
-    if (stack_base[0] || stack_sp < stack_base)
-       fprintf(stderr, " [STACK UNDERFLOW!!!]\n");
-    for (i = 1; i <= 30; i++) {
-       if (stack_sp >= &stack_base[i])
-       {
-           fprintf(stderr, "\t%-4s%s%s", SvPEEK(stack_base[i]),
-               markoff == i ? " [" : "",
-               stack_sp == &stack_base[i] ?
-                       (markoff == i ? "]" : " ]") : "");
+#ifdef USE_5005THREADS
+    PerlIO_printf(Perl_debug_log,
+                 i ? "0x%"UVxf"    =>  ...  " : "0x%lx    =>  ",
+                 PTR2UV(thr));
+#else
+    PerlIO_printf(Perl_debug_log, i ? "    =>  ...  " : "    =>  ");
+#endif /* USE_5005THREADS */
+    if (PL_stack_base[0] != &PL_sv_undef || PL_stack_sp < PL_stack_base)
+       PerlIO_printf(Perl_debug_log, " [STACK UNDERFLOW!!!]\n");
+    do {
+       ++i;
+       if (markscan <= PL_markstack_ptr && *markscan < i) {
+           do {
+               ++markscan;
+               PerlIO_putc(Perl_debug_log, '*');
+           }
+           while (markscan <= PL_markstack_ptr && *markscan < i);
+           PerlIO_printf(Perl_debug_log, "  ");
        }
+       if (i > top)
+           break;
+       PerlIO_printf(Perl_debug_log, "%-4s  ", SvPEEK(PL_stack_base[i]));
     }
-    fprintf(stderr, "\n");
+    while (1);
+    PerlIO_printf(Perl_debug_log, "\n");
+#endif /* DEBUGGING */
     return 0;
 }