[ Index ]

PHP Cross Reference of Unnamed Project

title

Body

[close]

/se3-unattended/var/se3/unattended/install/linuxaux/opt/perl/lib/5.10.0/ -> perl5db.pl (source)

   1  
   2  =head1 NAME 
   3  
   4  perl5db.pl - the perl debugger
   5  
   6  =head1 SYNOPSIS
   7  
   8      perl -d  your_Perl_script
   9  
  10  =head1 DESCRIPTION
  11  
  12  C<perl5db.pl> is the perl debugger. It is loaded automatically by Perl when
  13  you invoke a script with C<perl -d>. This documentation tries to outline the
  14  structure and services provided by C<perl5db.pl>, and to describe how you
  15  can use them.
  16  
  17  =head1 GENERAL NOTES
  18  
  19  The debugger can look pretty forbidding to many Perl programmers. There are
  20  a number of reasons for this, many stemming out of the debugger's history.
  21  
  22  When the debugger was first written, Perl didn't have a lot of its nicer
  23  features - no references, no lexical variables, no closures, no object-oriented
  24  programming. So a lot of the things one would normally have done using such
  25  features was done using global variables, globs and the C<local()> operator 
  26  in creative ways.
  27  
  28  Some of these have survived into the current debugger; a few of the more
  29  interesting and still-useful idioms are noted in this section, along with notes
  30  on the comments themselves.
  31  
  32  =head2 Why not use more lexicals?
  33  
  34  Experienced Perl programmers will note that the debugger code tends to use
  35  mostly package globals rather than lexically-scoped variables. This is done
  36  to allow a significant amount of control of the debugger from outside the
  37  debugger itself.       
  38  
  39  Unfortunately, though the variables are accessible, they're not well
  40  documented, so it's generally been a decision that hasn't made a lot of
  41  difference to most users. Where appropriate, comments have been added to
  42  make variables more accessible and usable, with the understanding that these
  43  I<are> debugger internals, and are therefore subject to change. Future
  44  development should probably attempt to replace the globals with a well-defined
  45  API, but for now, the variables are what we've got.
  46  
  47  =head2 Automated variable stacking via C<local()>
  48  
  49  As you may recall from reading C<perlfunc>, the C<local()> operator makes a 
  50  temporary copy of a variable in the current scope. When the scope ends, the
  51  old copy is restored. This is often used in the debugger to handle the 
  52  automatic stacking of variables during recursive calls:
  53  
  54       sub foo {
  55          local $some_global++;
  56  
  57          # Do some stuff, then ...
  58          return;
  59       }
  60  
  61  What happens is that on entry to the subroutine, C<$some_global> is localized,
  62  then altered. When the subroutine returns, Perl automatically undoes the 
  63  localization, restoring the previous value. Voila, automatic stack management.
  64  
  65  The debugger uses this trick a I<lot>. Of particular note is C<DB::eval>, 
  66  which lets the debugger get control inside of C<eval>'ed code. The debugger
  67  localizes a saved copy of C<$@> inside the subroutine, which allows it to
  68  keep C<$@> safe until it C<DB::eval> returns, at which point the previous
  69  value of C<$@> is restored. This makes it simple (well, I<simpler>) to keep 
  70  track of C<$@> inside C<eval>s which C<eval> other C<eval's>.
  71  
  72  In any case, watch for this pattern. It occurs fairly often.
  73  
  74  =head2 The C<^> trick
  75  
  76  This is used to cleverly reverse the sense of a logical test depending on 
  77  the value of an auxiliary variable. For instance, the debugger's C<S>
  78  (search for subroutines by pattern) allows you to negate the pattern 
  79  like this:
  80  
  81     # Find all non-'foo' subs:
  82     S !/foo/      
  83  
  84  Boolean algebra states that the truth table for XOR looks like this:
  85  
  86  =over 4
  87  
  88  =item * 0 ^ 0 = 0 
  89  
  90  (! not present and no match) --> false, don't print
  91  
  92  =item * 0 ^ 1 = 1 
  93  
  94  (! not present and matches) --> true, print
  95  
  96  =item * 1 ^ 0 = 1 
  97  
  98  (! present and no match) --> true, print
  99  
 100  =item * 1 ^ 1 = 0 
 101  
 102  (! present and matches) --> false, don't print
 103  
 104  =back
 105  
 106  As you can see, the first pair applies when C<!> isn't supplied, and
 107  the second pair applies when it is. The XOR simply allows us to
 108  compact a more complicated if-then-elseif-else into a more elegant 
 109  (but perhaps overly clever) single test. After all, it needed this
 110  explanation...
 111  
 112  =head2 FLAGS, FLAGS, FLAGS
 113  
 114  There is a certain C programming legacy in the debugger. Some variables,
 115  such as C<$single>, C<$trace>, and C<$frame>, have I<magical> values composed
 116  of 1, 2, 4, etc. (powers of 2) OR'ed together. This allows several pieces
 117  of state to be stored independently in a single scalar. 
 118  
 119  A test like
 120  
 121      if ($scalar & 4) ...
 122  
 123  is checking to see if the appropriate bit is on. Since each bit can be 
 124  "addressed" independently in this way, C<$scalar> is acting sort of like
 125  an array of bits. Obviously, since the contents of C<$scalar> are just a 
 126  bit-pattern, we can save and restore it easily (it will just look like
 127  a number).
 128  
 129  The problem, is of course, that this tends to leave magic numbers scattered
 130  all over your program whenever a bit is set, cleared, or checked. So why do 
 131  it?
 132  
 133  =over 4
 134  
 135  =item *
 136  
 137  First, doing an arithmetical or bitwise operation on a scalar is
 138  just about the fastest thing you can do in Perl: C<use constant> actually
 139  creates a subroutine call, and array and hash lookups are much slower. Is
 140  this over-optimization at the expense of readability? Possibly, but the 
 141  debugger accesses these  variables a I<lot>. Any rewrite of the code will
 142  probably have to benchmark alternate implementations and see which is the
 143  best balance of readability and speed, and then document how it actually 
 144  works.
 145  
 146  =item *
 147  
 148  Second, it's very easy to serialize a scalar number. This is done in 
 149  the restart code; the debugger state variables are saved in C<%ENV> and then
 150  restored when the debugger is restarted. Having them be just numbers makes
 151  this trivial. 
 152  
 153  =item *
 154  
 155  Third, some of these variables are being shared with the Perl core 
 156  smack in the middle of the interpreter's execution loop. It's much faster for 
 157  a C program (like the interpreter) to check a bit in a scalar than to access 
 158  several different variables (or a Perl array).
 159  
 160  =back
 161  
 162  =head2 What are those C<XXX> comments for?
 163  
 164  Any comment containing C<XXX> means that the comment is either somewhat
 165  speculative - it's not exactly clear what a given variable or chunk of 
 166  code is doing, or that it is incomplete - the basics may be clear, but the
 167  subtleties are not completely documented.
 168  
 169  Send in a patch if you can clear up, fill out, or clarify an C<XXX>.
 170  
 171  =head1 DATA STRUCTURES MAINTAINED BY CORE         
 172  
 173  There are a number of special data structures provided to the debugger by
 174  the Perl interpreter.
 175  
 176  The array C<@{$main::{'_<'.$filename}}> (aliased locally to C<@dbline> via glob
 177  assignment) contains the text from C<$filename>, with each element
 178  corresponding to a single line of C<$filename>.
 179  
 180  The hash C<%{'_<'.$filename}> (aliased locally to C<%dbline> via glob 
 181  assignment) contains breakpoints and actions.  The keys are line numbers; 
 182  you can set individual values, but not the whole hash. The Perl interpreter 
 183  uses this hash to determine where breakpoints have been set. Any true value is
 184  considered to be a breakpoint; C<perl5db.pl> uses C<$break_condition\0$action>.
 185  Values are magical in numeric context: 1 if the line is breakable, 0 if not.
 186  
 187  The scalar C<${"_<$filename"}> simply contains the string C<_<$filename>.
 188  This is also the case for evaluated strings that contain subroutines, or
 189  which are currently being executed.  The $filename for C<eval>ed strings looks
 190  like C<(eval 34)> or C<(re_eval 19)>.
 191  
 192  =head1 DEBUGGER STARTUP
 193  
 194  When C<perl5db.pl> starts, it reads an rcfile (C<perl5db.ini> for
 195  non-interactive sessions, C<.perldb> for interactive ones) that can set a number
 196  of options. In addition, this file may define a subroutine C<&afterinit>
 197  that will be executed (in the debugger's context) after the debugger has 
 198  initialized itself.
 199  
 200  Next, it checks the C<PERLDB_OPTS> environment variable and treats its 
 201  contents as the argument of a C<o> command in the debugger.
 202  
 203  =head2 STARTUP-ONLY OPTIONS
 204  
 205  The following options can only be specified at startup.
 206  To set them in your rcfile, add a call to
 207  C<&parse_options("optionName=new_value")>.
 208  
 209  =over 4
 210  
 211  =item * TTY 
 212  
 213  the TTY to use for debugging i/o.
 214  
 215  =item * noTTY 
 216  
 217  if set, goes in NonStop mode.  On interrupt, if TTY is not set,
 218  uses the value of noTTY or F<$HOME/.perldbtty$$> to find TTY using
 219  Term::Rendezvous.  Current variant is to have the name of TTY in this
 220  file.
 221  
 222  =item * ReadLine 
 223  
 224  if false, a dummy ReadLine is used, so you can debug
 225  ReadLine applications.
 226  
 227  =item * NonStop 
 228  
 229  if true, no i/o is performed until interrupt.
 230  
 231  =item * LineInfo 
 232  
 233  file or pipe to print line number info to.  If it is a
 234  pipe, a short "emacs like" message is used.
 235  
 236  =item * RemotePort 
 237  
 238  host:port to connect to on remote host for remote debugging.
 239  
 240  =item * HistFile
 241  
 242  file to store session history to. There is no default and so no
 243  history file is written unless this variable is explicitly set.
 244  
 245  =item * HistSize
 246  
 247  number of commands to store to the file specified in C<HistFile>.
 248  Default is 100.
 249  
 250  =back
 251  
 252  =head3 SAMPLE RCFILE
 253  
 254   &parse_options("NonStop=1 LineInfo=db.out");
 255    sub afterinit { $trace = 1; }
 256  
 257  The script will run without human intervention, putting trace
 258  information into C<db.out>.  (If you interrupt it, you had better
 259  reset C<LineInfo> to something I<interactive>!)
 260  
 261  =head1 INTERNALS DESCRIPTION
 262  
 263  =head2 DEBUGGER INTERFACE VARIABLES
 264  
 265  Perl supplies the values for C<%sub>.  It effectively inserts
 266  a C<&DB::DB();> in front of each place that can have a
 267  breakpoint. At each subroutine call, it calls C<&DB::sub> with
 268  C<$DB::sub> set to the called subroutine. It also inserts a C<BEGIN
 269  {require 'perl5db.pl'}> before the first line.
 270  
 271  After each C<require>d file is compiled, but before it is executed, a
 272  call to C<&DB::postponed($main::{'_<'.$filename})> is done. C<$filename>
 273  is the expanded name of the C<require>d file (as found via C<%INC>).
 274  
 275  =head3 IMPORTANT INTERNAL VARIABLES
 276  
 277  =head4 C<$CreateTTY>
 278  
 279  Used to control when the debugger will attempt to acquire another TTY to be
 280  used for input. 
 281  
 282  =over   
 283  
 284  =item * 1 -  on C<fork()>
 285  
 286  =item * 2 - debugger is started inside debugger
 287  
 288  =item * 4 -  on startup
 289  
 290  =back
 291  
 292  =head4 C<$doret>
 293  
 294  The value -2 indicates that no return value should be printed.
 295  Any other positive value causes C<DB::sub> to print return values.
 296  
 297  =head4 C<$evalarg>
 298  
 299  The item to be eval'ed by C<DB::eval>. Used to prevent messing with the current
 300  contents of C<@_> when C<DB::eval> is called.
 301  
 302  =head4 C<$frame>
 303  
 304  Determines what messages (if any) will get printed when a subroutine (or eval)
 305  is entered or exited. 
 306  
 307  =over 4
 308  
 309  =item * 0 -  No enter/exit messages
 310  
 311  =item * 1 - Print I<entering> messages on subroutine entry
 312  
 313  =item * 2 - Adds exit messages on subroutine exit. If no other flag is on, acts like 1+2.
 314  
 315  =item * 4 - Extended messages: C<< <in|out> I<context>=I<fully-qualified sub name> from I<file>:I<line> >>. If no other flag is on, acts like 1+4.
 316  
 317  =item * 8 - Adds parameter information to messages, and overloaded stringify and tied FETCH is enabled on the printed arguments. Ignored if C<4> is not on.
 318  
 319  =item * 16 - Adds C<I<context> return from I<subname>: I<value>> messages on subroutine/eval exit. Ignored if C<4> is is not on.
 320  
 321  =back
 322  
 323  To get everything, use C<$frame=30> (or C<o f=30> as a debugger command).
 324  The debugger internally juggles the value of C<$frame> during execution to
 325  protect external modules that the debugger uses from getting traced.
 326  
 327  =head4 C<$level>
 328  
 329  Tracks current debugger nesting level. Used to figure out how many 
 330  C<E<lt>E<gt>> pairs to surround the line number with when the debugger 
 331  outputs a prompt. Also used to help determine if the program has finished
 332  during command parsing.
 333  
 334  =head4 C<$onetimeDump>
 335  
 336  Controls what (if anything) C<DB::eval()> will print after evaluating an
 337  expression.
 338  
 339  =over 4
 340  
 341  =item * C<undef> - don't print anything
 342  
 343  =item * C<dump> - use C<dumpvar.pl> to display the value returned
 344  
 345  =item * C<methods> - print the methods callable on the first item returned
 346  
 347  =back
 348  
 349  =head4 C<$onetimeDumpDepth>
 350  
 351  Controls how far down C<dumpvar.pl> will go before printing C<...> while
 352  dumping a structure. Numeric. If C<undef>, print all levels.
 353  
 354  =head4 C<$signal>
 355  
 356  Used to track whether or not an C<INT> signal has been detected. C<DB::DB()>,
 357  which is called before every statement, checks this and puts the user into
 358  command mode if it finds C<$signal> set to a true value.
 359  
 360  =head4 C<$single>
 361  
 362  Controls behavior during single-stepping. Stacked in C<@stack> on entry to
 363  each subroutine; popped again at the end of each subroutine.
 364  
 365  =over 4 
 366  
 367  =item * 0 - run continuously.
 368  
 369  =item * 1 - single-step, go into subs. The C<s> command.
 370  
 371  =item * 2 - single-step, don't go into subs. The C<n> command.
 372  
 373  =item * 4 - print current sub depth (turned on to force this when C<too much
 374  recursion> occurs.
 375  
 376  =back
 377  
 378  =head4 C<$trace>
 379  
 380  Controls the output of trace information. 
 381  
 382  =over 4
 383  
 384  =item * 1 - The C<t> command was entered to turn on tracing (every line executed is printed)
 385  
 386  =item * 2 - watch expressions are active
 387  
 388  =item * 4 - user defined a C<watchfunction()> in C<afterinit()>
 389  
 390  =back
 391  
 392  =head4 C<$slave_editor>
 393  
 394  1 if C<LINEINFO> was directed to a pipe; 0 otherwise.
 395  
 396  =head4 C<@cmdfhs>
 397  
 398  Stack of filehandles that C<DB::readline()> will read commands from.
 399  Manipulated by the debugger's C<source> command and C<DB::readline()> itself.
 400  
 401  =head4 C<@dbline>
 402  
 403  Local alias to the magical line array, C<@{$main::{'_<'.$filename}}> , 
 404  supplied by the Perl interpreter to the debugger. Contains the source.
 405  
 406  =head4 C<@old_watch>
 407  
 408  Previous values of watch expressions. First set when the expression is
 409  entered; reset whenever the watch expression changes.
 410  
 411  =head4 C<@saved>
 412  
 413  Saves important globals (C<$@>, C<$!>, C<$^E>, C<$,>, C<$/>, C<$\>, C<$^W>)
 414  so that the debugger can substitute safe values while it's running, and
 415  restore them when it returns control.
 416  
 417  =head4 C<@stack>
 418  
 419  Saves the current value of C<$single> on entry to a subroutine.
 420  Manipulated by the C<c> command to turn off tracing in all subs above the
 421  current one.
 422  
 423  =head4 C<@to_watch>
 424  
 425  The 'watch' expressions: to be evaluated before each line is executed.
 426  
 427  =head4 C<@typeahead>
 428  
 429  The typeahead buffer, used by C<DB::readline>.
 430  
 431  =head4 C<%alias>
 432  
 433  Command aliases. Stored as character strings to be substituted for a command
 434  entered.
 435  
 436  =head4 C<%break_on_load>
 437  
 438  Keys are file names, values are 1 (break when this file is loaded) or undef
 439  (don't break when it is loaded).
 440  
 441  =head4 C<%dbline>
 442  
 443  Keys are line numbers, values are C<condition\0action>. If used in numeric
 444  context, values are 0 if not breakable, 1 if breakable, no matter what is
 445  in the actual hash entry.
 446  
 447  =head4 C<%had_breakpoints>
 448  
 449  Keys are file names; values are bitfields:
 450  
 451  =over 4 
 452  
 453  =item * 1 - file has a breakpoint in it.
 454  
 455  =item * 2 - file has an action in it.
 456  
 457  =back
 458  
 459  A zero or undefined value means this file has neither.
 460  
 461  =head4 C<%option>
 462  
 463  Stores the debugger options. These are character string values.
 464  
 465  =head4 C<%postponed>
 466  
 467  Saves breakpoints for code that hasn't been compiled yet.
 468  Keys are subroutine names, values are:
 469  
 470  =over 4
 471  
 472  =item * C<compile> - break when this sub is compiled
 473  
 474  =item * C<< break +0 if <condition> >> - break (conditionally) at the start of this routine. The condition will be '1' if no condition was specified.
 475  
 476  =back
 477  
 478  =head4 C<%postponed_file>
 479  
 480  This hash keeps track of breakpoints that need to be set for files that have
 481  not yet been compiled. Keys are filenames; values are references to hashes.
 482  Each of these hashes is keyed by line number, and its values are breakpoint
 483  definitions (C<condition\0action>).
 484  
 485  =head1 DEBUGGER INITIALIZATION
 486  
 487  The debugger's initialization actually jumps all over the place inside this
 488  package. This is because there are several BEGIN blocks (which of course 
 489  execute immediately) spread through the code. Why is that? 
 490  
 491  The debugger needs to be able to change some things and set some things up 
 492  before the debugger code is compiled; most notably, the C<$deep> variable that
 493  C<DB::sub> uses to tell when a program has recursed deeply. In addition, the
 494  debugger has to turn off warnings while the debugger code is compiled, but then
 495  restore them to their original setting before the program being debugged begins
 496  executing.
 497  
 498  The first C<BEGIN> block simply turns off warnings by saving the current
 499  setting of C<$^W> and then setting it to zero. The second one initializes
 500  the debugger variables that are needed before the debugger begins executing.
 501  The third one puts C<$^X> back to its former value. 
 502  
 503  We'll detail the second C<BEGIN> block later; just remember that if you need
 504  to initialize something before the debugger starts really executing, that's
 505  where it has to go.
 506  
 507  =cut
 508  
 509  package DB;
 510  
 511  BEGIN {eval 'use IO::Handle'};    # Needed for flush only? breaks under miniperl
 512  
 513  # Debugger for Perl 5.00x; perl5db.pl patch level:
 514  $VERSION = 1.30;
 515  
 516  $header = "perl5db.pl version $VERSION";
 517  
 518  =head1 DEBUGGER ROUTINES
 519  
 520  =head2 C<DB::eval()>
 521  
 522  This function replaces straight C<eval()> inside the debugger; it simplifies
 523  the process of evaluating code in the user's context.
 524  
 525  The code to be evaluated is passed via the package global variable 
 526  C<$DB::evalarg>; this is done to avoid fiddling with the contents of C<@_>.
 527  
 528  Before we do the C<eval()>, we preserve the current settings of C<$trace>,
 529  C<$single>, C<$^D> and C<$usercontext>.  The latter contains the
 530  preserved values of C<$@>, C<$!>, C<$^E>, C<$,>, C<$/>, C<$\>, C<$^W> and the
 531  user's current package, grabbed when C<DB::DB> got control.  This causes the
 532  proper context to be used when the eval is actually done.  Afterward, we
 533  restore C<$trace>, C<$single>, and C<$^D>.
 534  
 535  Next we need to handle C<$@> without getting confused. We save C<$@> in a
 536  local lexical, localize C<$saved[0]> (which is where C<save()> will put 
 537  C<$@>), and then call C<save()> to capture C<$@>, C<$!>, C<$^E>, C<$,>, 
 538  C<$/>, C<$\>, and C<$^W>) and set C<$,>, C<$/>, C<$\>, and C<$^W> to values
 539  considered sane by the debugger. If there was an C<eval()> error, we print 
 540  it on the debugger's output. If C<$onetimedump> is defined, we call 
 541  C<dumpit> if it's set to 'dump', or C<methods> if it's set to 
 542  'methods'. Setting it to something else causes the debugger to do the eval 
 543  but not print the result - handy if you want to do something else with it 
 544  (the "watch expressions" code does this to get the value of the watch
 545  expression but not show it unless it matters).
 546  
 547  In any case, we then return the list of output from C<eval> to the caller, 
 548  and unwinding restores the former version of C<$@> in C<@saved> as well 
 549  (the localization of C<$saved[0]> goes away at the end of this scope).
 550  
 551  =head3 Parameters and variables influencing execution of DB::eval()
 552  
 553  C<DB::eval> isn't parameterized in the standard way; this is to keep the
 554  debugger's calls to C<DB::eval()> from mucking with C<@_>, among other things.
 555  The variables listed below influence C<DB::eval()>'s execution directly. 
 556  
 557  =over 4
 558  
 559  =item C<$evalarg> - the thing to actually be eval'ed
 560  
 561  =item C<$trace> - Current state of execution tracing
 562  
 563  =item C<$single> - Current state of single-stepping
 564  
 565  =item C<$onetimeDump> - what is to be displayed after the evaluation 
 566  
 567  =item C<$onetimeDumpDepth> - how deep C<dumpit()> should go when dumping results
 568  
 569  =back
 570  
 571  The following variables are altered by C<DB::eval()> during its execution. They
 572  are "stacked" via C<local()>, enabling recursive calls to C<DB::eval()>. 
 573  
 574  =over 4
 575  
 576  =item C<@res> - used to capture output from actual C<eval>.
 577  
 578  =item C<$otrace> - saved value of C<$trace>.
 579  
 580  =item C<$osingle> - saved value of C<$single>.      
 581  
 582  =item C<$od> - saved value of C<$^D>.
 583  
 584  =item C<$saved[0]> - saved value of C<$@>.
 585  
 586  =item $\ - for output of C<$@> if there is an evaluation error.      
 587  
 588  =back
 589  
 590  =head3 The problem of lexicals
 591  
 592  The context of C<DB::eval()> presents us with some problems. Obviously,
 593  we want to be 'sandboxed' away from the debugger's internals when we do
 594  the eval, but we need some way to control how punctuation variables and
 595  debugger globals are used. 
 596  
 597  We can't use local, because the code inside C<DB::eval> can see localized
 598  variables; and we can't use C<my> either for the same reason. The code
 599  in this routine compromises and uses C<my>.
 600  
 601  After this routine is over, we don't have user code executing in the debugger's
 602  context, so we can use C<my> freely.
 603  
 604  =cut
 605  
 606  ############################################## Begin lexical danger zone
 607  
 608  # 'my' variables used here could leak into (that is, be visible in)
 609  # the context that the code being evaluated is executing in. This means that
 610  # the code could modify the debugger's variables.
 611  #
 612  # Fiddling with the debugger's context could be Bad. We insulate things as
 613  # much as we can.
 614  
 615  sub eval {
 616  
 617      # 'my' would make it visible from user code
 618      #    but so does local! --tchrist
 619      # Remember: this localizes @DB::res, not @main::res.
 620      local @res;
 621      {
 622  
 623          # Try to keep the user code from messing  with us. Save these so that
 624          # even if the eval'ed code changes them, we can put them back again.
 625          # Needed because the user could refer directly to the debugger's
 626          # package globals (and any 'my' variables in this containing scope)
 627          # inside the eval(), and we want to try to stay safe.
 628          local $otrace  = $trace;
 629          local $osingle = $single;
 630          local $od      = $^D;
 631  
 632          # Untaint the incoming eval() argument.
 633          { ($evalarg) = $evalarg =~ /(.*)/s; }
 634  
 635          # $usercontext built in DB::DB near the comment
 636          # "set up the context for DB::eval ..."
 637          # Evaluate and save any results.
 638          @res = eval "$usercontext $evalarg;\n";  # '\n' for nice recursive debug
 639  
 640          # Restore those old values.
 641          $trace  = $otrace;
 642          $single = $osingle;
 643          $^D     = $od;
 644      }
 645  
 646      # Save the current value of $@, and preserve it in the debugger's copy
 647      # of the saved precious globals.
 648      my $at = $@;
 649  
 650      # Since we're only saving $@, we only have to localize the array element
 651      # that it will be stored in.
 652      local $saved[0];    # Preserve the old value of $@
 653      eval { &DB::save };
 654  
 655      # Now see whether we need to report an error back to the user.
 656      if ($at) {
 657          local $\ = '';
 658          print $OUT $at;
 659      }
 660  
 661      # Display as required by the caller. $onetimeDump and $onetimedumpDepth
 662      # are package globals.
 663      elsif ($onetimeDump) {
 664          if ( $onetimeDump eq 'dump' ) {
 665              local $option{dumpDepth} = $onetimedumpDepth
 666                if defined $onetimedumpDepth;
 667              dumpit( $OUT, \@res );
 668          }
 669          elsif ( $onetimeDump eq 'methods' ) {
 670              methods( $res[0] );
 671          }
 672      } ## end elsif ($onetimeDump)
 673      @res;
 674  } ## end sub eval
 675  
 676  ############################################## End lexical danger zone
 677  
 678  # After this point it is safe to introduce lexicals.
 679  # The code being debugged will be executing in its own context, and
 680  # can't see the inside of the debugger.
 681  #
 682  # However, one should not overdo it: leave as much control from outside as
 683  # possible. If you make something a lexical, it's not going to be addressable
 684  # from outside the debugger even if you know its name.
 685  
 686  # This file is automatically included if you do perl -d.
 687  # It's probably not useful to include this yourself.
 688  #
 689  # Before venturing further into these twisty passages, it is
 690  # wise to read the perldebguts man page or risk the ire of dragons.
 691  #
 692  # (It should be noted that perldebguts will tell you a lot about
 693  # the underlying mechanics of how the debugger interfaces into the
 694  # Perl interpreter, but not a lot about the debugger itself. The new
 695  # comments in this code try to address this problem.)
 696  
 697  # Note that no subroutine call is possible until &DB::sub is defined
 698  # (for subroutines defined outside of the package DB). In fact the same is
 699  # true if $deep is not defined.
 700  
 701  # Enhanced by ilya@math.ohio-state.edu (Ilya Zakharevich)
 702  
 703  # modified Perl debugger, to be run from Emacs in perldb-mode
 704  # Ray Lischner (uunet!mntgfx!lisch) as of 5 Nov 1990
 705  # Johan Vromans -- upgrade to 4.0 pl 10
 706  # Ilya Zakharevich -- patches after 5.001 (and some before ;-)
 707  
 708  # (We have made efforts to  clarify the comments in the change log
 709  # in other places; some of them may seem somewhat obscure as they
 710  # were originally written, and explaining them away from the code
 711  # in question seems conterproductive.. -JM)
 712  
 713  ########################################################################
 714  # Changes: 0.94
 715  #   + A lot of things changed after 0.94. First of all, core now informs
 716  #     debugger about entry into XSUBs, overloaded operators, tied operations,
 717  #     BEGIN and END. Handy with `O f=2'.
 718  #   + This can make debugger a little bit too verbose, please be patient
 719  #     and report your problems promptly.
 720  #   + Now the option frame has 3 values: 0,1,2. XXX Document!
 721  #   + Note that if DESTROY returns a reference to the object (or object),
 722  #     the deletion of data may be postponed until the next function call,
 723  #     due to the need to examine the return value.
 724  #
 725  # Changes: 0.95
 726  #   + `v' command shows versions.
 727  #
 728  # Changes: 0.96
 729  #   + `v' command shows version of readline.
 730  #     primitive completion works (dynamic variables, subs for `b' and `l',
 731  #     options). Can `p %var'
 732  #   + Better help (`h <' now works). New commands <<, >>, {, {{.
 733  #     {dump|print}_trace() coded (to be able to do it from <<cmd).
 734  #   + `c sub' documented.
 735  #   + At last enough magic combined to stop after the end of debuggee.
 736  #   + !! should work now (thanks to Emacs bracket matching an extra
 737  #     `]' in a regexp is caught).
 738  #   + `L', `D' and `A' span files now (as documented).
 739  #   + Breakpoints in `require'd code are possible (used in `R').
 740  #   +  Some additional words on internal work of debugger.
 741  #   + `b load filename' implemented.
 742  #   + `b postpone subr' implemented.
 743  #   + now only `q' exits debugger (overwritable on $inhibit_exit).
 744  #   + When restarting debugger breakpoints/actions persist.
 745  #   + Buglet: When restarting debugger only one breakpoint/action per
 746  #             autoloaded function persists.
 747  #
 748  # Changes: 0.97: NonStop will not stop in at_exit().
 749  #   + Option AutoTrace implemented.
 750  #   + Trace printed differently if frames are printed too.
 751  #   + new `inhibitExit' option.
 752  #   + printing of a very long statement interruptible.
 753  # Changes: 0.98: New command `m' for printing possible methods
 754  #   + 'l -' is a synonym for `-'.
 755  #   + Cosmetic bugs in printing stack trace.
 756  #   +  `frame' & 8 to print "expanded args" in stack trace.
 757  #   + Can list/break in imported subs.
 758  #   + new `maxTraceLen' option.
 759  #   + frame & 4 and frame & 8 granted.
 760  #   + new command `m'
 761  #   + nonstoppable lines do not have `:' near the line number.
 762  #   + `b compile subname' implemented.
 763  #   + Will not use $` any more.
 764  #   + `-' behaves sane now.
 765  # Changes: 0.99: Completion for `f', `m'.
 766  #   +  `m' will remove duplicate names instead of duplicate functions.
 767  #   + `b load' strips trailing whitespace.
 768  #     completion ignores leading `|'; takes into account current package
 769  #     when completing a subroutine name (same for `l').
 770  # Changes: 1.07: Many fixed by tchrist 13-March-2000
 771  #   BUG FIXES:
 772  #   + Added bare minimal security checks on perldb rc files, plus
 773  #     comments on what else is needed.
 774  #   + Fixed the ornaments that made "|h" completely unusable.
 775  #     They are not used in print_help if they will hurt.  Strip pod
 776  #     if we're paging to less.
 777  #   + Fixed mis-formatting of help messages caused by ornaments
 778  #     to restore Larry's original formatting.
 779  #   + Fixed many other formatting errors.  The code is still suboptimal,
 780  #     and needs a lot of work at restructuring.  It's also misindented
 781  #     in many places.
 782  #   + Fixed bug where trying to look at an option like your pager
 783  #     shows "1".
 784  #   + Fixed some $? processing.  Note: if you use csh or tcsh, you will
 785  #     lose.  You should consider shell escapes not using their shell,
 786  #     or else not caring about detailed status.  This should really be
 787  #     unified into one place, too.
 788  #   + Fixed bug where invisible trailing whitespace on commands hoses you,
 789  #     tricking Perl into thinking you weren't calling a debugger command!
 790  #   + Fixed bug where leading whitespace on commands hoses you.  (One
 791  #     suggests a leading semicolon or any other irrelevant non-whitespace
 792  #     to indicate literal Perl code.)
 793  #   + Fixed bugs that ate warnings due to wrong selected handle.
 794  #   + Fixed a precedence bug on signal stuff.
 795  #   + Fixed some unseemly wording.
 796  #   + Fixed bug in help command trying to call perl method code.
 797  #   + Fixed to call dumpvar from exception handler.  SIGPIPE killed us.
 798  #   ENHANCEMENTS:
 799  #   + Added some comments.  This code is still nasty spaghetti.
 800  #   + Added message if you clear your pre/post command stacks which was
 801  #     very easy to do if you just typed a bare >, <, or {.  (A command
 802  #     without an argument should *never* be a destructive action; this
 803  #     API is fundamentally screwed up; likewise option setting, which
 804  #     is equally buggered.)
 805  #   + Added command stack dump on argument of "?" for >, <, or {.
 806  #   + Added a semi-built-in doc viewer command that calls man with the
 807  #     proper %Config::Config path (and thus gets caching, man -k, etc),
 808  #     or else perldoc on obstreperous platforms.
 809  #   + Added to and rearranged the help information.
 810  #   + Detected apparent misuse of { ... } to declare a block; this used
 811  #     to work but now is a command, and mysteriously gave no complaint.
 812  #
 813  # Changes: 1.08: Apr 25, 2001  Jon Eveland <jweveland@yahoo.com>
 814  #   BUG FIX:
 815  #   + This patch to perl5db.pl cleans up formatting issues on the help
 816  #     summary (h h) screen in the debugger.  Mostly columnar alignment
 817  #     issues, plus converted the printed text to use all spaces, since
 818  #     tabs don't seem to help much here.
 819  #
 820  # Changes: 1.09: May 19, 2001  Ilya Zakharevich <ilya@math.ohio-state.edu>
 821  #   Minor bugs corrected;
 822  #   + Support for auto-creation of new TTY window on startup, either
 823  #     unconditionally, or if started as a kid of another debugger session;
 824  #   + New `O'ption CreateTTY
 825  #       I<CreateTTY>      bits control attempts to create a new TTY on events:
 826  #                         1: on fork()
 827  #                         2: debugger is started inside debugger
 828  #                         4: on startup
 829  #   + Code to auto-create a new TTY window on OS/2 (currently one
 830  #     extra window per session - need named pipes to have more...);
 831  #   + Simplified interface for custom createTTY functions (with a backward
 832  #     compatibility hack); now returns the TTY name to use; return of ''
 833  #     means that the function reset the I/O handles itself;
 834  #   + Better message on the semantic of custom createTTY function;
 835  #   + Convert the existing code to create a TTY into a custom createTTY
 836  #     function;
 837  #   + Consistent support for TTY names of the form "TTYin,TTYout";
 838  #   + Switch line-tracing output too to the created TTY window;
 839  #   + make `b fork' DWIM with CORE::GLOBAL::fork;
 840  #   + High-level debugger API cmd_*():
 841  #      cmd_b_load($filenamepart)            # b load filenamepart
 842  #      cmd_b_line($lineno [, $cond])        # b lineno [cond]
 843  #      cmd_b_sub($sub [, $cond])            # b sub [cond]
 844  #      cmd_stop()                           # Control-C
 845  #      cmd_d($lineno)                       # d lineno (B)
 846  #      The cmd_*() API returns FALSE on failure; in this case it outputs
 847  #      the error message to the debugging output.
 848  #   + Low-level debugger API
 849  #      break_on_load($filename)             # b load filename
 850  #      @files = report_break_on_load()      # List files with load-breakpoints
 851  #      breakable_line_in_filename($name, $from [, $to])
 852  #                                           # First breakable line in the
 853  #                                           # range $from .. $to.  $to defaults
 854  #                                           # to $from, and may be less than
 855  #                                           # $to
 856  #      breakable_line($from [, $to])        # Same for the current file
 857  #      break_on_filename_line($name, $lineno [, $cond])
 858  #                                           # Set breakpoint,$cond defaults to
 859  #                                           # 1
 860  #      break_on_filename_line_range($name, $from, $to [, $cond])
 861  #                                           # As above, on the first
 862  #                                           # breakable line in range
 863  #      break_on_line($lineno [, $cond])     # As above, in the current file
 864  #      break_subroutine($sub [, $cond])     # break on the first breakable line
 865  #      ($name, $from, $to) = subroutine_filename_lines($sub)
 866  #                                           # The range of lines of the text
 867  #      The low-level API returns TRUE on success, and die()s on failure.
 868  #
 869  # Changes: 1.10: May 23, 2001  Daniel Lewart <d-lewart@uiuc.edu>
 870  #   BUG FIXES:
 871  #   + Fixed warnings generated by "perl -dWe 42"
 872  #   + Corrected spelling errors
 873  #   + Squeezed Help (h) output into 80 columns
 874  #
 875  # Changes: 1.11: May 24, 2001  David Dyck <dcd@tc.fluke.com>
 876  #   + Made "x @INC" work like it used to
 877  #
 878  # Changes: 1.12: May 24, 2001  Daniel Lewart <d-lewart@uiuc.edu>
 879  #   + Fixed warnings generated by "O" (Show debugger options)
 880  #   + Fixed warnings generated by "p 42" (Print expression)
 881  # Changes: 1.13: Jun 19, 2001 Scott.L.Miller@compaq.com
 882  #   + Added windowSize option
 883  # Changes: 1.14: Oct  9, 2001 multiple
 884  #   + Clean up after itself on VMS (Charles Lane in 12385)
 885  #   + Adding "@ file" syntax (Peter Scott in 12014)
 886  #   + Debug reloading selfloaded stuff (Ilya Zakharevich in 11457)
 887  #   + $^S and other debugger fixes (Ilya Zakharevich in 11120)
 888  #   + Forgot a my() declaration (Ilya Zakharevich in 11085)
 889  # Changes: 1.15: Nov  6, 2001 Michael G Schwern <schwern@pobox.com>
 890  #   + Updated 1.14 change log
 891  #   + Added *dbline explainatory comments
 892  #   + Mentioning perldebguts man page
 893  # Changes: 1.16: Feb 15, 2002 Mark-Jason Dominus <mjd@plover.com>
 894  #   + $onetimeDump improvements
 895  # Changes: 1.17: Feb 20, 2002 Richard Foley <richard.foley@rfi.net>
 896  #   Moved some code to cmd_[.]()'s for clarity and ease of handling,
 897  #   rationalised the following commands and added cmd_wrapper() to
 898  #   enable switching between old and frighteningly consistent new
 899  #   behaviours for diehards: 'o CommandSet=pre580' (sigh...)
 900  #     a(add),       A(del)            # action expr   (added del by line)
 901  #   + b(add),       B(del)            # break  [line] (was b,D)
 902  #   + w(add),       W(del)            # watch  expr   (was W,W)
 903  #                                     # added del by expr
 904  #   + h(summary), h h(long)           # help (hh)     (was h h,h)
 905  #   + m(methods),   M(modules)        # ...           (was m,v)
 906  #   + o(option)                       # lc            (was O)
 907  #   + v(view code), V(view Variables) # ...           (was w,V)
 908  # Changes: 1.18: Mar 17, 2002 Richard Foley <richard.foley@rfi.net>
 909  #   + fixed missing cmd_O bug
 910  # Changes: 1.19: Mar 29, 2002 Spider Boardman
 911  #   + Added missing local()s -- DB::DB is called recursively.
 912  # Changes: 1.20: Feb 17, 2003 Richard Foley <richard.foley@rfi.net>
 913  #   + pre'n'post commands no longer trashed with no args
 914  #   + watch val joined out of eval()
 915  # Changes: 1.21: Jun 04, 2003 Joe McMahon <mcmahon@ibiblio.org>
 916  #   + Added comments and reformatted source. No bug fixes/enhancements.
 917  #   + Includes cleanup by Robin Barker and Jarkko Hietaniemi.
 918  # Changes: 1.22  Jun 09, 2003 Alex Vandiver <alexmv@MIT.EDU>
 919  #   + Flush stdout/stderr before the debugger prompt is printed.
 920  # Changes: 1.23: Dec 21, 2003 Dominique Quatravaux
 921  #   + Fix a side-effect of bug #24674 in the perl debugger ("odd taint bug")
 922  # Changes: 1.24: Mar 03, 2004 Richard Foley <richard.foley@rfi.net>
 923  #   + Added command to save all debugger commands for sourcing later.
 924  #   + Added command to display parent inheritance tree of given class.
 925  #   + Fixed minor newline in history bug.
 926  # Changes: 1.25: Apr 17, 2004 Richard Foley <richard.foley@rfi.net>
 927  #   + Fixed option bug (setting invalid options + not recognising valid short forms)
 928  # Changes: 1.26: Apr 22, 2004 Richard Foley <richard.foley@rfi.net>
 929  #   + unfork the 5.8.x and 5.9.x debuggers.
 930  #   + whitespace and assertions call cleanup across versions 
 931  #   + H * deletes (resets) history
 932  #   + i now handles Class + blessed objects
 933  # Changes: 1.27: May 09, 2004 Richard Foley <richard.foley@rfi.net>
 934  #   + updated pod page references - clunky.
 935  #   + removed windowid restriction for forking into an xterm.
 936  #   + more whitespace again.
 937  #   + wrapped restart and enabled rerun [-n] (go back n steps) command.
 938  # Changes: 1.28: Oct 12, 2004 Richard Foley <richard.foley@rfi.net>
 939  #   + Added threads support (inc. e and E commands)
 940  # Changes: 1.29: Nov 28, 2006 Bo Lindbergh <blgl@hagernas.com> 
 941  #   + Added macosx_get_fork_TTY support 
 942  # Changes: 1.30: Mar 06, 2007 Andreas Koenig <andk@cpan.org>
 943  #   + Added HistFile, HistSize
 944  ########################################################################
 945  
 946  =head1 DEBUGGER INITIALIZATION
 947  
 948  The debugger starts up in phases.
 949  
 950  =head2 BASIC SETUP
 951  
 952  First, it initializes the environment it wants to run in: turning off
 953  warnings during its own compilation, defining variables which it will need
 954  to avoid warnings later, setting itself up to not exit when the program
 955  terminates, and defaulting to printing return values for the C<r> command.
 956  
 957  =cut
 958  
 959  # Needed for the statement after exec():
 960  #
 961  # This BEGIN block is simply used to switch off warnings during debugger
 962  # compiliation. Probably it would be better practice to fix the warnings,
 963  # but this is how it's done at the moment.
 964  
 965  BEGIN {
 966      $ini_warn = $^W;
 967      $^W       = 0;
 968  }    # Switch compilation warnings off until another BEGIN.
 969  
 970  local ($^W) = 0;    # Switch run-time warnings off during init.
 971  
 972  =head2 THREADS SUPPORT
 973  
 974  If we are running under a threaded Perl, we require threads and threads::shared
 975  if the environment variable C<PERL5DB_THREADED> is set, to enable proper
 976  threaded debugger control.  C<-dt> can also be used to set this.
 977  
 978  Each new thread will be announced and the debugger prompt will always inform
 979  you of each new thread created.  It will also indicate the thread id in which
 980  we are currently running within the prompt like this:
 981  
 982      [tid] DB<$i>
 983  
 984  Where C<[tid]> is an integer thread id and C<$i> is the familiar debugger
 985  command prompt.  The prompt will show: C<[0]> when running under threads, but
 986  not actually in a thread.  C<[tid]> is consistent with C<gdb> usage.
 987  
 988  While running under threads, when you set or delete a breakpoint (etc.), this
 989  will apply to all threads, not just the currently running one.  When you are 
 990  in a currently executing thread, you will stay there until it completes.  With
 991  the current implementation it is not currently possible to hop from one thread
 992  to another.
 993  
 994  The C<e> and C<E> commands are currently fairly minimal - see C<h e> and C<h E>.
 995  
 996  Note that threading support was built into the debugger as of Perl version
 997  C<5.8.6> and debugger version C<1.2.8>.
 998  
 999  =cut
1000  
1001  BEGIN {
1002    # ensure we can share our non-threaded variables or no-op
1003    if ($ENV{PERL5DB_THREADED}) {
1004      require threads;
1005      require threads::shared;
1006      import threads::shared qw(share);
1007      $DBGR;
1008      share(\$DBGR);
1009      lock($DBGR);
1010      print "Threads support enabled\n";
1011    } else {
1012      *lock  = sub(*) {};
1013      *share = sub(*) {};
1014    }
1015  }
1016  
1017  # This would probably be better done with "use vars", but that wasn't around
1018  # when this code was originally written. (Neither was "use strict".) And on
1019  # the principle of not fiddling with something that was working, this was
1020  # left alone.
1021  warn(               # Do not ;-)
1022      # These variables control the execution of 'dumpvar.pl'.
1023      $dumpvar::hashDepth,
1024      $dumpvar::arrayDepth,
1025      $dumpvar::dumpDBFiles,
1026      $dumpvar::dumpPackages,
1027      $dumpvar::quoteHighBit,
1028      $dumpvar::printUndef,
1029      $dumpvar::globPrint,
1030      $dumpvar::usageOnly,
1031  
1032      # used to save @ARGV and extract any debugger-related flags.
1033      @ARGS,
1034  
1035      # used to control die() reporting in diesignal()
1036      $Carp::CarpLevel,
1037  
1038      # used to prevent multiple entries to diesignal()
1039      # (if for instance diesignal() itself dies)
1040      $panic,
1041  
1042      # used to prevent the debugger from running nonstop
1043      # after a restart
1044      $second_time,
1045    )
1046    if 0;
1047  
1048  foreach my $k (keys (%INC)) {
1049      &share(\$main::{'_<'.$filename});
1050  };
1051  
1052  # Command-line + PERLLIB:
1053  # Save the contents of @INC before they are modified elsewhere.
1054  @ini_INC = @INC;
1055  
1056  # This was an attempt to clear out the previous values of various
1057  # trapped errors. Apparently it didn't help. XXX More info needed!
1058  # $prevwarn = $prevdie = $prevbus = $prevsegv = ''; # Does not help?!
1059  
1060  # We set these variables to safe values. We don't want to blindly turn
1061  # off warnings, because other packages may still want them.
1062  $trace = $signal = $single = 0;    # Uninitialized warning suppression
1063                                     # (local $^W cannot help - other packages!).
1064  
1065  # Default to not exiting when program finishes; print the return
1066  # value when the 'r' command is used to return from a subroutine.
1067  $inhibit_exit = $option{PrintRet} = 1;
1068  
1069  =head1 OPTION PROCESSING
1070  
1071  The debugger's options are actually spread out over the debugger itself and 
1072  C<dumpvar.pl>; some of these are variables to be set, while others are 
1073  subs to be called with a value. To try to make this a little easier to
1074  manage, the debugger uses a few data structures to define what options
1075  are legal and how they are to be processed.
1076  
1077  First, the C<@options> array defines the I<names> of all the options that
1078  are to be accepted.
1079  
1080  =cut
1081  
1082  @options = qw(
1083    CommandSet   HistFile      HistSize
1084    hashDepth    arrayDepth    dumpDepth
1085    DumpDBFiles  DumpPackages  DumpReused
1086    compactDump  veryCompact   quote
1087    HighBit      undefPrint    globPrint
1088    PrintRet     UsageOnly     frame
1089    AutoTrace    TTY           noTTY
1090    ReadLine     NonStop       LineInfo
1091    maxTraceLen  recallCommand ShellBang
1092    pager        tkRunning     ornaments
1093    signalLevel  warnLevel     dieLevel
1094    inhibit_exit ImmediateStop bareStringify
1095    CreateTTY    RemotePort    windowSize
1096    DollarCaretP
1097  );
1098  
1099  @RememberOnROptions = qw(DollarCaretP);
1100  
1101  =pod
1102  
1103  Second, C<optionVars> lists the variables that each option uses to save its
1104  state.
1105  
1106  =cut
1107  
1108  %optionVars = (
1109      hashDepth     => \$dumpvar::hashDepth,
1110      arrayDepth    => \$dumpvar::arrayDepth,
1111      CommandSet    => \$CommandSet,
1112      DumpDBFiles   => \$dumpvar::dumpDBFiles,
1113      DumpPackages  => \$dumpvar::dumpPackages,
1114      DumpReused    => \$dumpvar::dumpReused,
1115      HighBit       => \$dumpvar::quoteHighBit,
1116      undefPrint    => \$dumpvar::printUndef,
1117      globPrint     => \$dumpvar::globPrint,
1118      UsageOnly     => \$dumpvar::usageOnly,
1119      CreateTTY     => \$CreateTTY,
1120      bareStringify => \$dumpvar::bareStringify,
1121      frame         => \$frame,
1122      AutoTrace     => \$trace,
1123      inhibit_exit  => \$inhibit_exit,
1124      maxTraceLen   => \$maxtrace,
1125      ImmediateStop => \$ImmediateStop,
1126      RemotePort    => \$remoteport,
1127      windowSize    => \$window,
1128      HistFile      => \$histfile,
1129      HistSize      => \$histsize,
1130  );
1131  
1132  =pod
1133  
1134  Third, C<%optionAction> defines the subroutine to be called to process each
1135  option.
1136  
1137  =cut 
1138  
1139  %optionAction = (
1140      compactDump   => \&dumpvar::compactDump,
1141      veryCompact   => \&dumpvar::veryCompact,
1142      quote         => \&dumpvar::quote,
1143      TTY           => \&TTY,
1144      noTTY         => \&noTTY,
1145      ReadLine      => \&ReadLine,
1146      NonStop       => \&NonStop,
1147      LineInfo      => \&LineInfo,
1148      recallCommand => \&recallCommand,
1149      ShellBang     => \&shellBang,
1150      pager         => \&pager,
1151      signalLevel   => \&signalLevel,
1152      warnLevel     => \&warnLevel,
1153      dieLevel      => \&dieLevel,
1154      tkRunning     => \&tkRunning,
1155      ornaments     => \&ornaments,
1156      RemotePort    => \&RemotePort,
1157      DollarCaretP  => \&DollarCaretP,
1158  );
1159  
1160  =pod
1161  
1162  Last, the C<%optionRequire> notes modules that must be C<require>d if an
1163  option is used.
1164  
1165  =cut
1166  
1167  # Note that this list is not complete: several options not listed here
1168  # actually require that dumpvar.pl be loaded for them to work, but are
1169  # not in the table. A subsequent patch will correct this problem; for
1170  # the moment, we're just recommenting, and we are NOT going to change
1171  # function.
1172  %optionRequire = (
1173      compactDump => 'dumpvar.pl',
1174      veryCompact => 'dumpvar.pl',
1175      quote       => 'dumpvar.pl',
1176  );
1177  
1178  =pod
1179  
1180  There are a number of initialization-related variables which can be set
1181  by putting code to set them in a BEGIN block in the C<PERL5DB> environment
1182  variable. These are:
1183  
1184  =over 4
1185  
1186  =item C<$rl> - readline control XXX needs more explanation
1187  
1188  =item C<$warnLevel> - whether or not debugger takes over warning handling
1189  
1190  =item C<$dieLevel> - whether or not debugger takes over die handling
1191  
1192  =item C<$signalLevel> - whether or not debugger takes over signal handling
1193  
1194  =item C<$pre> - preprompt actions (array reference)
1195  
1196  =item C<$post> - postprompt actions (array reference)
1197  
1198  =item C<$pretype>
1199  
1200  =item C<$CreateTTY> - whether or not to create a new TTY for this debugger
1201  
1202  =item C<$CommandSet> - which command set to use (defaults to new, documented set)
1203  
1204  =back
1205  
1206  =cut
1207  
1208  # These guys may be defined in $ENV{PERL5DB} :
1209  $rl          = 1     unless defined $rl;
1210  $warnLevel   = 1     unless defined $warnLevel;
1211  $dieLevel    = 1     unless defined $dieLevel;
1212  $signalLevel = 1     unless defined $signalLevel;
1213  $pre         = []    unless defined $pre;
1214  $post        = []    unless defined $post;
1215  $pretype     = []    unless defined $pretype;
1216  $CreateTTY   = 3     unless defined $CreateTTY;
1217  $CommandSet  = '580' unless defined $CommandSet;
1218  
1219  share($rl);
1220  share($warnLevel);
1221  share($dieLevel);
1222  share($signalLevel);
1223  share($pre);
1224  share($post);
1225  share($pretype);
1226  share($rl);
1227  share($CreateTTY);
1228  share($CommandSet);
1229  
1230  =pod
1231  
1232  The default C<die>, C<warn>, and C<signal> handlers are set up.
1233  
1234  =cut
1235  
1236  warnLevel($warnLevel);
1237  dieLevel($dieLevel);
1238  signalLevel($signalLevel);
1239  
1240  =pod
1241  
1242  The pager to be used is needed next. We try to get it from the
1243  environment first.  If it's not defined there, we try to find it in
1244  the Perl C<Config.pm>.  If it's not there, we default to C<more>. We
1245  then call the C<pager()> function to save the pager name.
1246  
1247  =cut
1248  
1249  # This routine makes sure $pager is set up so that '|' can use it.
1250  pager(
1251  
1252      # If PAGER is defined in the environment, use it.
1253      defined $ENV{PAGER}
1254      ? $ENV{PAGER}
1255  
1256        # If not, see if Config.pm defines it.
1257      : eval { require Config }
1258        && defined $Config::Config{pager}
1259      ? $Config::Config{pager}
1260  
1261        # If not, fall back to 'more'.
1262      : 'more'
1263    )
1264    unless defined $pager;
1265  
1266  =pod
1267  
1268  We set up the command to be used to access the man pages, the command
1269  recall character (C<!> unless otherwise defined) and the shell escape
1270  character (C<!> unless otherwise defined). Yes, these do conflict, and
1271  neither works in the debugger at the moment.
1272  
1273  =cut
1274  
1275  setman();
1276  
1277  # Set up defaults for command recall and shell escape (note:
1278  # these currently don't work in linemode debugging).
1279  &recallCommand("!") unless defined $prc;
1280  &shellBang("!")     unless defined $psh;
1281  
1282  =pod
1283  
1284  We then set up the gigantic string containing the debugger help.
1285  We also set the limit on the number of arguments we'll display during a
1286  trace.
1287  
1288  =cut
1289  
1290  sethelp();
1291  
1292  # If we didn't get a default for the length of eval/stack trace args,
1293  # set it here.
1294  $maxtrace = 400 unless defined $maxtrace;
1295  
1296  =head2 SETTING UP THE DEBUGGER GREETING
1297  
1298  The debugger I<greeting> helps to inform the user how many debuggers are
1299  running, and whether the current debugger is the primary or a child.
1300  
1301  If we are the primary, we just hang onto our pid so we'll have it when
1302  or if we start a child debugger. If we are a child, we'll set things up
1303  so we'll have a unique greeting and so the parent will give us our own
1304  TTY later.
1305  
1306  We save the current contents of the C<PERLDB_PIDS> environment variable
1307  because we mess around with it. We'll also need to hang onto it because
1308  we'll need it if we restart.
1309  
1310  Child debuggers make a label out of the current PID structure recorded in
1311  PERLDB_PIDS plus the new PID. They also mark themselves as not having a TTY
1312  yet so the parent will give them one later via C<resetterm()>.
1313  
1314  =cut
1315  
1316  # Save the current contents of the environment; we're about to
1317  # much with it. We'll need this if we have to restart.
1318  $ini_pids = $ENV{PERLDB_PIDS};
1319  
1320  if ( defined $ENV{PERLDB_PIDS} ) {
1321  
1322      # We're a child. Make us a label out of the current PID structure
1323      # recorded in PERLDB_PIDS plus our (new) PID. Mark us as not having
1324      # a term yet so the parent will give us one later via resetterm().
1325  
1326      my $env_pids = $ENV{PERLDB_PIDS};
1327      $pids = "[$env_pids]";
1328  
1329      # Unless we are on OpenVMS, all programs under the DCL shell run under
1330      # the same PID.
1331  
1332      if (($^O eq 'VMS') && ($env_pids =~ /\b$$\b/)) {
1333          $term_pid         = $$;
1334      }
1335      else {
1336          $ENV{PERLDB_PIDS} .= "->$$";
1337          $term_pid = -1;
1338      }
1339  
1340  } ## end if (defined $ENV{PERLDB_PIDS...
1341  else {
1342  
1343      # We're the parent PID. Initialize PERLDB_PID in case we end up with a
1344      # child debugger, and mark us as the parent, so we'll know to set up
1345      # more TTY's is we have to.
1346      $ENV{PERLDB_PIDS} = "$$";
1347      $pids             = "[pid=$$]";
1348      $term_pid         = $$;
1349  }
1350  
1351  $pidprompt = '';
1352  
1353  # Sets up $emacs as a synonym for $slave_editor.
1354  *emacs = $slave_editor if $slave_editor;    # May be used in afterinit()...
1355  
1356  =head2 READING THE RC FILE
1357  
1358  The debugger will read a file of initialization options if supplied. If    
1359  running interactively, this is C<.perldb>; if not, it's C<perldb.ini>.
1360  
1361  =cut      
1362  
1363  # As noted, this test really doesn't check accurately that the debugger
1364  # is running at a terminal or not.
1365  
1366  if ( -e "/dev/tty" ) {                      # this is the wrong metric!
1367      $rcfile = ".perldb";
1368  }
1369  else {
1370      $rcfile = "perldb.ini";
1371  }
1372  
1373  =pod
1374  
1375  The debugger does a safety test of the file to be read. It must be owned
1376  either by the current user or root, and must only be writable by the owner.
1377  
1378  =cut
1379  
1380  # This wraps a safety test around "do" to read and evaluate the init file.
1381  #
1382  # This isn't really safe, because there's a race
1383  # between checking and opening.  The solution is to
1384  # open and fstat the handle, but then you have to read and
1385  # eval the contents.  But then the silly thing gets
1386  # your lexical scope, which is unfortunate at best.
1387  sub safe_do {
1388      my $file = shift;
1389  
1390      # Just exactly what part of the word "CORE::" don't you understand?
1391      local $SIG{__WARN__};
1392      local $SIG{__DIE__};
1393  
1394      unless ( is_safe_file($file) ) {
1395          CORE::warn <<EO_GRIPE;
1396  perldb: Must not source insecure rcfile $file.
1397          You or the superuser must be the owner, and it must not 
1398          be writable by anyone but its owner.
1399  EO_GRIPE
1400          return;
1401      } ## end unless (is_safe_file($file...
1402  
1403      do $file;
1404      CORE::warn("perldb: couldn't parse $file: $@") if $@;
1405  } ## end sub safe_do
1406  
1407  # This is the safety test itself.
1408  #
1409  # Verifies that owner is either real user or superuser and that no
1410  # one but owner may write to it.  This function is of limited use
1411  # when called on a path instead of upon a handle, because there are
1412  # no guarantees that filename (by dirent) whose file (by ino) is
1413  # eventually accessed is the same as the one tested.
1414  # Assumes that the file's existence is not in doubt.
1415  sub is_safe_file {
1416      my $path = shift;
1417      stat($path) || return;    # mysteriously vaporized
1418      my ( $dev, $ino, $mode, $nlink, $uid, $gid ) = stat(_);
1419  
1420      return 0 if $uid != 0 && $uid != $<;
1421      return 0 if $mode & 022;
1422      return 1;
1423  } ## end sub is_safe_file
1424  
1425  # If the rcfile (whichever one we decided was the right one to read)
1426  # exists, we safely do it.
1427  if ( -f $rcfile ) {
1428      safe_do("./$rcfile");
1429  }
1430  
1431  # If there isn't one here, try the user's home directory.
1432  elsif ( defined $ENV{HOME} && -f "$ENV{HOME}/$rcfile" ) {
1433      safe_do("$ENV{HOME}/$rcfile");
1434  }
1435  
1436  # Else try the login directory.
1437  elsif ( defined $ENV{LOGDIR} && -f "$ENV{LOGDIR}/$rcfile" ) {
1438      safe_do("$ENV{LOGDIR}/$rcfile");
1439  }
1440  
1441  # If the PERLDB_OPTS variable has options in it, parse those out next.
1442  if ( defined $ENV{PERLDB_OPTS} ) {
1443      parse_options( $ENV{PERLDB_OPTS} );
1444  }
1445  
1446  =pod
1447  
1448  The last thing we do during initialization is determine which subroutine is
1449  to be used to obtain a new terminal when a new debugger is started. Right now,
1450  the debugger only handles X Windows, OS/2, and Mac OS X (darwin).
1451  
1452  =cut
1453  
1454  # Set up the get_fork_TTY subroutine to be aliased to the proper routine.
1455  # Works if you're running an xterm or xterm-like window, or you're on
1456  # OS/2, or on Mac OS X. This may need some expansion.
1457  
1458  if (not defined &get_fork_TTY)       # only if no routine exists
1459  {
1460      if (defined $ENV{TERM}                       # If we know what kind
1461                                                   # of terminal this is,
1462          and $ENV{TERM} eq 'xterm'                # and it's an xterm,
1463          and defined $ENV{DISPLAY}                # and what display it's on,
1464        )
1465      {
1466          *get_fork_TTY = \&xterm_get_fork_TTY;    # use the xterm version
1467      }
1468      elsif ( $^O eq 'os2' ) {                     # If this is OS/2,
1469          *get_fork_TTY = \&os2_get_fork_TTY;      # use the OS/2 version
1470      }
1471      elsif ( $^O eq 'darwin'                      # If this is Mac OS X
1472              and defined $ENV{TERM_PROGRAM}       # and we're running inside
1473              and $ENV{TERM_PROGRAM}
1474                  eq 'Apple_Terminal'              # Terminal.app
1475              )
1476      {
1477          *get_fork_TTY = \&macosx_get_fork_TTY;   # use the Mac OS X version
1478      }
1479  } ## end if (not defined &get_fork_TTY...
1480  
1481  # untaint $^O, which may have been tainted by the last statement.
1482  # see bug [perl #24674]
1483  $^O =~ m/^(.*)\z/;
1484  $^O = $1;
1485  
1486  # Here begin the unreadable code.  It needs fixing.
1487  
1488  =head2 RESTART PROCESSING
1489  
1490  This section handles the restart command. When the C<R> command is invoked, it
1491  tries to capture all of the state it can into environment variables, and
1492  then sets C<PERLDB_RESTART>. When we start executing again, we check to see
1493  if C<PERLDB_RESTART> is there; if so, we reload all the information that
1494  the R command stuffed into the environment variables.
1495  
1496    PERLDB_RESTART   - flag only, contains no restart data itself.       
1497    PERLDB_HIST      - command history, if it's available
1498    PERLDB_ON_LOAD   - breakpoints set by the rc file
1499    PERLDB_POSTPONE  - subs that have been loaded/not executed, and have actions
1500    PERLDB_VISITED   - files that had breakpoints
1501    PERLDB_FILE_...  - breakpoints for a file
1502    PERLDB_OPT       - active options
1503    PERLDB_INC       - the original @INC
1504    PERLDB_PRETYPE   - preprompt debugger actions
1505    PERLDB_PRE       - preprompt Perl code
1506    PERLDB_POST      - post-prompt Perl code
1507    PERLDB_TYPEAHEAD - typeahead captured by readline()
1508  
1509  We chug through all these variables and plug the values saved in them
1510  back into the appropriate spots in the debugger.
1511  
1512  =cut
1513  
1514  if ( exists $ENV{PERLDB_RESTART} ) {
1515  
1516      # We're restarting, so we don't need the flag that says to restart anymore.
1517      delete $ENV{PERLDB_RESTART};
1518  
1519      # $restart = 1;
1520      @hist          = get_list('PERLDB_HIST');
1521      %break_on_load = get_list("PERLDB_ON_LOAD");
1522      %postponed     = get_list("PERLDB_POSTPONE");
1523  
1524      share(@hist);
1525      share(@truehist);
1526      share(%break_on_load);
1527      share(%postponed);
1528  
1529      # restore breakpoints/actions
1530      my @had_breakpoints = get_list("PERLDB_VISITED");
1531      for ( 0 .. $#had_breakpoints ) {
1532          my %pf = get_list("PERLDB_FILE_$_");
1533          $postponed_file{ $had_breakpoints[$_] } = \%pf if %pf;
1534      }
1535  
1536      # restore options
1537      my %opt = get_list("PERLDB_OPT");
1538      my ( $opt, $val );
1539      while ( ( $opt, $val ) = each %opt ) {
1540          $val =~ s/[\\\']/\\$1/g;
1541          parse_options("$opt'$val'");
1542      }
1543  
1544      # restore original @INC
1545      @INC     = get_list("PERLDB_INC");
1546      @ini_INC = @INC;
1547  
1548      # return pre/postprompt actions and typeahead buffer
1549      $pretype   = [ get_list("PERLDB_PRETYPE") ];
1550      $pre       = [ get_list("PERLDB_PRE") ];
1551      $post      = [ get_list("PERLDB_POST") ];
1552      @typeahead = get_list( "PERLDB_TYPEAHEAD", @typeahead );
1553  } ## end if (exists $ENV{PERLDB_RESTART...
1554  
1555  =head2 SETTING UP THE TERMINAL
1556  
1557  Now, we'll decide how the debugger is going to interact with the user.
1558  If there's no TTY, we set the debugger to run non-stop; there's not going
1559  to be anyone there to enter commands.
1560  
1561  =cut
1562  
1563  if ($notty) {
1564      $runnonstop = 1;
1565      share($runnonstop);
1566  }
1567  
1568  =pod
1569  
1570  If there is a TTY, we have to determine who it belongs to before we can
1571  proceed. If this is a slave editor or graphical debugger (denoted by
1572  the first command-line switch being '-emacs'), we shift this off and
1573  set C<$rl> to 0 (XXX ostensibly to do straight reads).
1574  
1575  =cut
1576  
1577  else {
1578  
1579      # Is Perl being run from a slave editor or graphical debugger?
1580      # If so, don't use readline, and set $slave_editor = 1.
1581      $slave_editor =
1582        ( ( defined $main::ARGV[0] ) and ( $main::ARGV[0] eq '-emacs' ) );
1583      $rl = 0, shift(@main::ARGV) if $slave_editor;
1584  
1585      #require Term::ReadLine;
1586  
1587  =pod
1588  
1589  We then determine what the console should be on various systems:
1590  
1591  =over 4
1592  
1593  =item * Cygwin - We use C<stdin> instead of a separate device.
1594  
1595  =cut
1596  
1597      if ( $^O eq 'cygwin' ) {
1598  
1599          # /dev/tty is binary. use stdin for textmode
1600          undef $console;
1601      }
1602  
1603  =item * Unix - use C</dev/tty>.
1604  
1605  =cut
1606  
1607      elsif ( -e "/dev/tty" ) {
1608          $console = "/dev/tty";
1609      }
1610  
1611  =item * Windows or MSDOS - use C<con>.
1612  
1613  =cut
1614  
1615      elsif ( $^O eq 'dos' or -e "con" or $^O eq 'MSWin32' ) {
1616          $console = "con";
1617      }
1618  
1619  =item * MacOS - use C<Dev:Console:Perl Debug> if this is the MPW version; C<Dev:
1620  Console> if not.
1621  
1622  Note that Mac OS X returns C<darwin>, not C<MacOS>. Also note that the debugger doesn't do anything special for C<darwin>. Maybe it should.
1623  
1624  =cut
1625  
1626      elsif ( $^O eq 'MacOS' ) {
1627          if ( $MacPerl::Version !~ /MPW/ ) {
1628              $console =
1629                "Dev:Console:Perl Debug";    # Separate window for application
1630          }
1631          else {
1632              $console = "Dev:Console";
1633          }
1634      } ## end elsif ($^O eq 'MacOS')
1635  
1636  =item * VMS - use C<sys$command>.
1637  
1638  =cut
1639  
1640      else {
1641  
1642          # everything else is ...
1643          $console = "sys\$command";
1644      }
1645  
1646  =pod
1647  
1648  =back
1649  
1650  Several other systems don't use a specific console. We C<undef $console>
1651  for those (Windows using a slave editor/graphical debugger, NetWare, OS/2
1652  with a slave editor, Epoc).
1653  
1654  =cut
1655  
1656      if ( ( $^O eq 'MSWin32' ) and ( $slave_editor or defined $ENV{EMACS} ) ) {
1657  
1658          # /dev/tty is binary. use stdin for textmode
1659          $console = undef;
1660      }
1661  
1662      if ( $^O eq 'NetWare' ) {
1663  
1664          # /dev/tty is binary. use stdin for textmode
1665          $console = undef;
1666      }
1667  
1668      # In OS/2, we need to use STDIN to get textmode too, even though
1669      # it pretty much looks like Unix otherwise.
1670      if ( defined $ENV{OS2_SHELL} and ( $slave_editor or $ENV{WINDOWID} ) )
1671      {    # In OS/2
1672          $console = undef;
1673      }
1674  
1675      # EPOC also falls into the 'got to use STDIN' camp.
1676      if ( $^O eq 'epoc' ) {
1677          $console = undef;
1678      }
1679  
1680  =pod
1681  
1682  If there is a TTY hanging around from a parent, we use that as the console.
1683  
1684  =cut
1685  
1686      $console = $tty if defined $tty;
1687  
1688  =head2 SOCKET HANDLING   
1689  
1690  The debugger is capable of opening a socket and carrying out a debugging
1691  session over the socket.
1692  
1693  If C<RemotePort> was defined in the options, the debugger assumes that it
1694  should try to start a debugging session on that port. It builds the socket
1695  and then tries to connect the input and output filehandles to it.
1696  
1697  =cut
1698  
1699      # Handle socket stuff.
1700  
1701      if ( defined $remoteport ) {
1702  
1703          # If RemotePort was defined in the options, connect input and output
1704          # to the socket.
1705          require IO::Socket;
1706          $OUT = new IO::Socket::INET(
1707              Timeout  => '10',
1708              PeerAddr => $remoteport,
1709              Proto    => 'tcp',
1710          );
1711          if ( !$OUT ) { die "Unable to connect to remote host: $remoteport\n"; }
1712          $IN = $OUT;
1713      } ## end if (defined $remoteport)
1714  
1715  =pod
1716  
1717  If no C<RemotePort> was defined, and we want to create a TTY on startup,
1718  this is probably a situation where multiple debuggers are running (for example,
1719  a backticked command that starts up another debugger). We create a new IN and
1720  OUT filehandle, and do the necessary mojo to create a new TTY if we know how
1721  and if we can.
1722  
1723  =cut
1724  
1725      # Non-socket.
1726      else {
1727  
1728          # Two debuggers running (probably a system or a backtick that invokes
1729          # the debugger itself under the running one). create a new IN and OUT
1730          # filehandle, and do the necessary mojo to create a new tty if we
1731          # know how, and we can.
1732          create_IN_OUT(4) if $CreateTTY & 4;
1733          if ($console) {
1734  
1735              # If we have a console, check to see if there are separate ins and
1736              # outs to open. (They are assumed identical if not.)
1737  
1738              my ( $i, $o ) = split /,/, $console;
1739              $o = $i unless defined $o;
1740  
1741              # read/write on in, or just read, or read on STDIN.
1742              open( IN,      "+<$i" )
1743                || open( IN, "<$i" )
1744                || open( IN, "<&STDIN" );
1745  
1746              # read/write/create/clobber out, or write/create/clobber out,
1747              # or merge with STDERR, or merge with STDOUT.
1748                   open( OUT, "+>$o" )
1749                || open( OUT, ">$o" )
1750                || open( OUT, ">&STDERR" )
1751                || open( OUT, ">&STDOUT" );    # so we don't dongle stdout
1752  
1753          } ## end if ($console)
1754          elsif ( not defined $console ) {
1755  
1756              # No console. Open STDIN.
1757              open( IN, "<&STDIN" );
1758  
1759              # merge with STDERR, or with STDOUT.
1760              open( OUT,      ">&STDERR" )
1761                || open( OUT, ">&STDOUT" );    # so we don't dongle stdout
1762              $console = 'STDIN/OUT';
1763          } ## end elsif (not defined $console)
1764  
1765          # Keep copies of the filehandles so that when the pager runs, it
1766          # can close standard input without clobbering ours.
1767          $IN = \*IN, $OUT = \*OUT if $console or not defined $console;
1768      } ## end elsif (from if(defined $remoteport))
1769  
1770      # Unbuffer DB::OUT. We need to see responses right away.
1771      my $previous = select($OUT);
1772      $| = 1;                                  # for DB::OUT
1773      select($previous);
1774  
1775      # Line info goes to debugger output unless pointed elsewhere.
1776      # Pointing elsewhere makes it possible for slave editors to
1777      # keep track of file and position. We have both a filehandle
1778      # and a I/O description to keep track of.
1779      $LINEINFO = $OUT     unless defined $LINEINFO;
1780      $lineinfo = $console unless defined $lineinfo;
1781      # share($LINEINFO); # <- unable to share globs
1782      share($lineinfo);   # 
1783  
1784  =pod
1785  
1786  To finish initialization, we show the debugger greeting,
1787  and then call the C<afterinit()> subroutine if there is one.
1788  
1789  =cut
1790  
1791      # Show the debugger greeting.
1792      $header =~ s/.Header: ([^,]+),v(\s+\S+\s+\S+).*$/$1$2/;
1793      unless ($runnonstop) {
1794          local $\ = '';
1795          local $, = '';
1796          if ( $term_pid eq '-1' ) {
1797              print $OUT "\nDaughter DB session started...\n";
1798          }
1799          else {
1800              print $OUT "\nLoading DB routines from $header\n";
1801              print $OUT (
1802                  "Editor support ",
1803                  $slave_editor ? "enabled" : "available", ".\n"
1804              );
1805              print $OUT
1806  "\nEnter h or `h h' for help, or `$doccmd perldebug' for more help.\n\n";
1807          } ## end else [ if ($term_pid eq '-1')
1808      } ## end unless ($runnonstop)
1809  } ## end else [ if ($notty)
1810  
1811  # XXX This looks like a bug to me.
1812  # Why copy to @ARGS and then futz with @args?
1813  @ARGS = @ARGV;
1814  for (@args) {
1815      # Make sure backslashes before single quotes are stripped out, and
1816      # keep args unless they are numeric (XXX why?)
1817      # s/\'/\\\'/g;                      # removed while not justified understandably
1818      # s/(.*)/'$1'/ unless /^-?[\d.]+$/; # ditto
1819  }
1820  
1821  # If there was an afterinit() sub defined, call it. It will get
1822  # executed in our scope, so it can fiddle with debugger globals.
1823  if ( defined &afterinit ) {    # May be defined in $rcfile
1824      &afterinit();
1825  }
1826  
1827  # Inform us about "Stack dump during die enabled ..." in dieLevel().
1828  $I_m_init = 1;
1829  
1830  ############################################################ Subroutines
1831  
1832  =head1 SUBROUTINES
1833  
1834  =head2 DB
1835  
1836  This gigantic subroutine is the heart of the debugger. Called before every
1837  statement, its job is to determine if a breakpoint has been reached, and
1838  stop if so; read commands from the user, parse them, and execute
1839  them, and hen send execution off to the next statement.
1840  
1841  Note that the order in which the commands are processed is very important;
1842  some commands earlier in the loop will actually alter the C<$cmd> variable
1843  to create other commands to be executed later. This is all highly I<optimized>
1844  but can be confusing. Check the comments for each C<$cmd ... && do {}> to
1845  see what's happening in any given command.
1846  
1847  =cut
1848  
1849  sub DB {
1850  
1851      # lock the debugger and get the thread id for the prompt
1852      lock($DBGR);
1853      my $tid;
1854      if ($ENV{PERL5DB_THREADED}) {
1855          $tid = eval { "[".threads->tid."]" };
1856      }
1857  
1858      # Check for whether we should be running continuously or not.
1859      # _After_ the perl program is compiled, $single is set to 1:
1860      if ( $single and not $second_time++ ) {
1861  
1862          # Options say run non-stop. Run until we get an interrupt.
1863          if ($runnonstop) {    # Disable until signal
1864                  # If there's any call stack in place, turn off single
1865                  # stepping into subs throughout the stack.
1866              for ( $i = 0 ; $i <= $stack_depth ; ) {
1867                  $stack[ $i++ ] &= ~1;
1868              }
1869  
1870              # And we are now no longer in single-step mode.
1871              $single = 0;
1872  
1873              # If we simply returned at this point, we wouldn't get
1874              # the trace info. Fall on through.
1875              # return;
1876          } ## end if ($runnonstop)
1877  
1878          elsif ($ImmediateStop) {
1879  
1880              # We are supposed to stop here; XXX probably a break.
1881              $ImmediateStop = 0;    # We've processed it; turn it off
1882              $signal        = 1;    # Simulate an interrupt to force
1883                                     # us into the command loop
1884          }
1885      } ## end if ($single and not $second_time...
1886  
1887      # If we're in single-step mode, or an interrupt (real or fake)
1888      # has occurred, turn off non-stop mode.
1889      $runnonstop = 0 if $single or $signal;
1890  
1891      # Preserve current values of $@, $!, $^E, $,, $/, $\, $^W.
1892      # The code being debugged may have altered them.
1893      &save;
1894  
1895      # Since DB::DB gets called after every line, we can use caller() to
1896      # figure out where we last were executing. Sneaky, eh? This works because
1897      # caller is returning all the extra information when called from the
1898      # debugger.
1899      local ( $package, $filename, $line ) = caller;
1900      local $filename_ini = $filename;
1901  
1902      # set up the context for DB::eval, so it can properly execute
1903      # code on behalf of the user. We add the package in so that the
1904      # code is eval'ed in the proper package (not in the debugger!).
1905      local $usercontext =
1906        '($@, $!, $^E, $,, $/, $\, $^W) = @saved;' . "package $package;";
1907  
1908      # Create an alias to the active file magical array to simplify
1909      # the code here.
1910      local (*dbline) = $main::{ '_<' . $filename };
1911  
1912      # we need to check for pseudofiles on Mac OS (these are files
1913      # not attached to a filename, but instead stored in Dev:Pseudo)
1914      if ( $^O eq 'MacOS' && $#dbline < 0 ) {
1915          $filename_ini = $filename = 'Dev:Pseudo';
1916          *dbline = $main::{ '_<' . $filename };
1917      }
1918  
1919      # Last line in the program.
1920      local $max = $#dbline;
1921  
1922      # if we have something here, see if we should break.
1923      if ( $dbline{$line}
1924          && ( ( $stop, $action ) = split( /\0/, $dbline{$line} ) ) )
1925      {
1926  
1927          # Stop if the stop criterion says to just stop.
1928          if ( $stop eq '1' ) {
1929              $signal |= 1;
1930          }
1931  
1932          # It's a conditional stop; eval it in the user's context and
1933          # see if we should stop. If so, remove the one-time sigil.
1934          elsif ($stop) {
1935              $evalarg = "\$DB::signal |= 1 if do {$stop}";
1936              &eval;
1937              $dbline{$line} =~ s/;9($|\0)/$1/;
1938          }
1939      } ## end if ($dbline{$line} && ...
1940  
1941      # Preserve the current stop-or-not, and see if any of the W
1942      # (watch expressions) has changed.
1943      my $was_signal = $signal;
1944  
1945      # If we have any watch expressions ...
1946      if ( $trace & 2 ) {
1947          for ( my $n = 0 ; $n <= $#to_watch ; $n++ ) {
1948              $evalarg = $to_watch[$n];
1949              local $onetimeDump;    # Tell DB::eval() to not output results
1950  
1951              # Fix context DB::eval() wants to return an array, but
1952              # we need a scalar here.
1953              my ($val) = join( "', '", &eval );
1954              $val = ( ( defined $val ) ? "'$val'" : 'undef' );
1955  
1956              # Did it change?
1957              if ( $val ne $old_watch[$n] ) {
1958  
1959                  # Yep! Show the difference, and fake an interrupt.
1960                  $signal = 1;
1961                  print $OUT <<EOP;
1962  Watchpoint $n:\t$to_watch[$n] changed:
1963      old value:\t$old_watch[$n]
1964      new value:\t$val
1965  EOP
1966                  $old_watch[$n] = $val;
1967              } ## end if ($val ne $old_watch...
1968          } ## end for (my $n = 0 ; $n <= ...
1969      } ## end if ($trace & 2)
1970  
1971  =head2 C<watchfunction()>
1972  
1973  C<watchfunction()> is a function that can be defined by the user; it is a
1974  function which will be run on each entry to C<DB::DB>; it gets the 
1975  current package, filename, and line as its parameters.
1976  
1977  The watchfunction can do anything it likes; it is executing in the 
1978  debugger's context, so it has access to all of the debugger's internal
1979  data structures and functions.
1980  
1981  C<watchfunction()> can control the debugger's actions. Any of the following
1982  will cause the debugger to return control to the user's program after
1983  C<watchfunction()> executes:
1984  
1985  =over 4 
1986  
1987  =item *
1988  
1989  Returning a false value from the C<watchfunction()> itself.
1990  
1991  =item *
1992  
1993  Altering C<$single> to a false value.
1994  
1995  =item *
1996  
1997  Altering C<$signal> to a false value.
1998  
1999  =item *
2000  
2001  Turning off the C<4> bit in C<$trace> (this also disables the
2002  check for C<watchfunction()>. This can be done with
2003  
2004      $trace &= ~4;
2005  
2006  =back
2007  
2008  =cut
2009  
2010      # If there's a user-defined DB::watchfunction, call it with the
2011      # current package, filename, and line. The function executes in
2012      # the DB:: package.
2013      if ( $trace & 4 ) {    # User-installed watch
2014          return
2015            if watchfunction( $package, $filename, $line )
2016            and not $single
2017            and not $was_signal
2018            and not( $trace & ~4 );
2019      } ## end if ($trace & 4)
2020  
2021      # Pick up any alteration to $signal in the watchfunction, and
2022      # turn off the signal now.
2023      $was_signal = $signal;
2024      $signal     = 0;
2025  
2026  =head2 GETTING READY TO EXECUTE COMMANDS
2027  
2028  The debugger decides to take control if single-step mode is on, the
2029  C<t> command was entered, or the user generated a signal. If the program
2030  has fallen off the end, we set things up so that entering further commands
2031  won't cause trouble, and we say that the program is over.
2032  
2033  =cut
2034  
2035      # Check to see if we should grab control ($single true,
2036      # trace set appropriately, or we got a signal).
2037      if ( $single || ( $trace & 1 ) || $was_signal ) {
2038  
2039          # Yes, grab control.
2040          if ($slave_editor) {
2041  
2042              # Tell the editor to update its position.
2043              $position = "\032\032$filename:$line:0\n";
2044              print_lineinfo($position);
2045          }
2046  
2047  =pod
2048  
2049  Special check: if we're in package C<DB::fake>, we've gone through the 
2050  C<END> block at least once. We set up everything so that we can continue
2051  to enter commands and have a valid context to be in.
2052  
2053  =cut
2054  
2055          elsif ( $package eq 'DB::fake' ) {
2056  
2057              # Fallen off the end already.
2058              $term || &setterm;
2059              print_help(<<EOP);
2060  Debugged program terminated.  Use B<q> to quit or B<R> to restart,
2061    use B<o> I<inhibit_exit> to avoid stopping after program termination,
2062    B<h q>, B<h R> or B<h o> to get additional info.  
2063  EOP
2064  
2065              # Set the DB::eval context appropriately.
2066              $package     = 'main';
2067              $usercontext =
2068                  '($@, $!, $^E, $,, $/, $\, $^W) = @saved;'
2069                . "package $package;";    # this won't let them modify, alas
2070          } ## end elsif ($package eq 'DB::fake')
2071  
2072  =pod
2073  
2074  If the program hasn't finished executing, we scan forward to the
2075  next executable line, print that out, build the prompt from the file and line
2076  number information, and print that.   
2077  
2078  =cut
2079  
2080          else {
2081  
2082              # Still somewhere in the midst of execution. Set up the
2083              #  debugger prompt.
2084              $sub =~ s/\'/::/;    # Swap Perl 4 package separators (') to
2085                                   # Perl 5 ones (sorry, we don't print Klingon
2086                                   #module names)
2087  
2088              $prefix = $sub =~ /::/ ? "" : "${'package'}::";
2089              $prefix .= "$sub($filename:";
2090              $after = ( $dbline[$line] =~ /\n$/ ? '' : "\n" );
2091  
2092              # Break up the prompt if it's really long.
2093              if ( length($prefix) > 30 ) {
2094                  $position = "$prefix$line):\n$line:\t$dbline[$line]$after";
2095                  $prefix   = "";
2096                  $infix    = ":\t";
2097              }
2098              else {
2099                  $infix    = "):\t";
2100                  $position = "$prefix$line$infix$dbline[$line]$after";
2101              }
2102  
2103              # Print current line info, indenting if necessary.
2104              if ($frame) {
2105                  print_lineinfo( ' ' x $stack_depth,
2106                      "$line:\t$dbline[$line]$after" );
2107              }
2108              else {
2109                  print_lineinfo($position);
2110              }
2111  
2112              # Scan forward, stopping at either the end or the next
2113              # unbreakable line.
2114              for ( $i = $line + 1 ; $i <= $max && $dbline[$i] == 0 ; ++$i )
2115              {    #{ vi
2116  
2117                  # Drop out on null statements, block closers, and comments.
2118                  last if $dbline[$i] =~ /^\s*[\;\}\#\n]/;
2119  
2120                  # Drop out if the user interrupted us.
2121                  last if $signal;
2122  
2123                  # Append a newline if the line doesn't have one. Can happen
2124                  # in eval'ed text, for instance.
2125                  $after = ( $dbline[$i] =~ /\n$/ ? '' : "\n" );
2126  
2127                  # Next executable line.
2128                  $incr_pos = "$prefix$i$infix$dbline[$i]$after";
2129                  $position .= $incr_pos;
2130                  if ($frame) {
2131  
2132                      # Print it indented if tracing is on.
2133                      print_lineinfo( ' ' x $stack_depth,
2134                          "$i:\t$dbline[$i]$after" );
2135                  }
2136                  else {
2137                      print_lineinfo($incr_pos);
2138                  }
2139              } ## end for ($i = $line + 1 ; $i...
2140          } ## end else [ if ($slave_editor)
2141      } ## end if ($single || ($trace...
2142  
2143  =pod
2144  
2145  If there's an action to be executed for the line we stopped at, execute it.
2146  If there are any preprompt actions, execute those as well.      
2147  
2148  =cut
2149  
2150      # If there's an action, do it now.
2151      $evalarg = $action, &eval if $action;
2152  
2153      # Are we nested another level (e.g., did we evaluate a function
2154      # that had a breakpoint in it at the debugger prompt)?
2155      if ( $single || $was_signal ) {
2156  
2157          # Yes, go down a level.
2158          local $level = $level + 1;
2159  
2160          # Do any pre-prompt actions.
2161          foreach $evalarg (@$pre) {
2162              &eval;
2163          }
2164  
2165          # Complain about too much recursion if we passed the limit.
2166          print $OUT $stack_depth . " levels deep in subroutine calls!\n"
2167            if $single & 4;
2168  
2169          # The line we're currently on. Set $incr to -1 to stay here
2170          # until we get a command that tells us to advance.
2171          $start = $line;
2172          $incr  = -1;      # for backward motion.
2173  
2174          # Tack preprompt debugger actions ahead of any actual input.
2175          @typeahead = ( @$pretype, @typeahead );
2176  
2177  =head2 WHERE ARE WE?
2178  
2179  XXX Relocate this section?
2180  
2181  The debugger normally shows the line corresponding to the current line of
2182  execution. Sometimes, though, we want to see the next line, or to move elsewhere
2183  in the file. This is done via the C<$incr>, C<$start>, and C<$max> variables.
2184  
2185  C<$incr> controls by how many lines the I<current> line should move forward
2186  after a command is executed. If set to -1, this indicates that the I<current>
2187  line shouldn't change.
2188  
2189  C<$start> is the I<current> line. It is used for things like knowing where to
2190  move forwards or backwards from when doing an C<L> or C<-> command.
2191  
2192  C<$max> tells the debugger where the last line of the current file is. It's
2193  used to terminate loops most often.
2194  
2195  =head2 THE COMMAND LOOP
2196  
2197  Most of C<DB::DB> is actually a command parsing and dispatch loop. It comes
2198  in two parts:
2199  
2200  =over 4
2201  
2202  =item *
2203  
2204  The outer part of the loop, starting at the C<CMD> label. This loop
2205  reads a command and then executes it.
2206  
2207  =item *
2208  
2209  The inner part of the loop, starting at the C<PIPE> label. This part
2210  is wholly contained inside the C<CMD> block and only executes a command.
2211  Used to handle commands running inside a pager.
2212  
2213  =back
2214  
2215  So why have two labels to restart the loop? Because sometimes, it's easier to
2216  have a command I<generate> another command and then re-execute the loop to do
2217  the new command. This is faster, but perhaps a bit more convoluted.
2218  
2219  =cut
2220  
2221          # The big command dispatch loop. It keeps running until the
2222          # user yields up control again.
2223          #
2224          # If we have a terminal for input, and we get something back
2225          # from readline(), keep on processing.
2226        CMD:
2227          while (
2228  
2229              # We have a terminal, or can get one ...
2230              ( $term || &setterm ),
2231  
2232              # ... and it belogs to this PID or we get one for this PID ...
2233              ( $term_pid == $$ or resetterm(1) ),
2234  
2235              # ... and we got a line of command input ...
2236              defined(
2237                  $cmd = &readline(
2238                          "$pidprompt $tid DB"
2239                        . ( '<' x $level )
2240                        . ( $#hist + 1 )
2241                        . ( '>' x $level ) . " "
2242                  )
2243              )
2244            )
2245          {
2246  
2247              share($cmd);
2248              # ... try to execute the input as debugger commands.
2249  
2250              # Don't stop running.
2251              $single = 0;
2252  
2253              # No signal is active.
2254              $signal = 0;
2255  
2256              # Handle continued commands (ending with \):
2257              $cmd =~ s/\\$/\n/ && do {
2258                  $cmd .= &readline("  cont: ");
2259                  redo CMD;
2260              };
2261  
2262  =head4 The null command
2263  
2264  A newline entered by itself means I<re-execute the last command>. We grab the
2265  command out of C<$laststep> (where it was recorded previously), and copy it
2266  back into C<$cmd> to be executed below. If there wasn't any previous command,
2267  we'll do nothing below (no command will match). If there was, we also save it
2268  in the command history and fall through to allow the command parsing to pick
2269  it up.
2270  
2271  =cut
2272  
2273              # Empty input means repeat the last command.
2274              $cmd =~ /^$/ && ( $cmd = $laststep );
2275              chomp($cmd);    # get rid of the annoying extra newline
2276              push( @hist, $cmd ) if length($cmd) > 1;
2277              push( @truehist, $cmd );
2278              share(@hist);
2279              share(@truehist);
2280  
2281              # This is a restart point for commands that didn't arrive
2282              # via direct user input. It allows us to 'redo PIPE' to
2283              # re-execute command processing without reading a new command.
2284            PIPE: {
2285                  $cmd =~ s/^\s+//s;    # trim annoying leading whitespace
2286                  $cmd =~ s/\s+$//s;    # trim annoying trailing whitespace
2287                  ($i) = split( /\s+/, $cmd );
2288  
2289  =head3 COMMAND ALIASES
2290  
2291  The debugger can create aliases for commands (these are stored in the
2292  C<%alias> hash). Before a command is executed, the command loop looks it up
2293  in the alias hash and substitutes the contents of the alias for the command,
2294  completely replacing it.
2295  
2296  =cut
2297  
2298                  # See if there's an alias for the command, and set it up if so.
2299                  if ( $alias{$i} ) {
2300  
2301                      # Squelch signal handling; we want to keep control here
2302                      # if something goes loco during the alias eval.
2303                      local $SIG{__DIE__};
2304                      local $SIG{__WARN__};
2305  
2306                      # This is a command, so we eval it in the DEBUGGER's
2307                      # scope! Otherwise, we can't see the special debugger
2308                      # variables, or get to the debugger's subs. (Well, we
2309                      # _could_, but why make it even more complicated?)
2310                      eval "\$cmd =~ $alias{$i}";
2311                      if ($@) {
2312                          local $\ = '';
2313                          print $OUT "Couldn't evaluate `$i' alias: $@";
2314                          next CMD;
2315                      }
2316                  } ## end if ($alias{$i})
2317  
2318  =head3 MAIN-LINE COMMANDS
2319  
2320  All of these commands work up to and after the program being debugged has
2321  terminated. 
2322  
2323  =head4 C<q> - quit
2324  
2325  Quit the debugger. This entails setting the C<$fall_off_end> flag, so we don't 
2326  try to execute further, cleaning any restart-related stuff out of the
2327  environment, and executing with the last value of C<$?>.
2328  
2329  =cut
2330  
2331                  $cmd =~ /^q$/ && do {
2332                      $fall_off_end = 1;
2333                      clean_ENV();
2334                      exit $?;
2335                  };
2336  
2337  =head4 C<t> - trace
2338  
2339  Turn tracing on or off. Inverts the appropriate bit in C<$trace> (q.v.).
2340  
2341  =cut
2342  
2343                  $cmd =~ /^t$/ && do {
2344                      $trace ^= 1;
2345                      local $\ = '';
2346                      print $OUT "Trace = "
2347                        . ( ( $trace & 1 ) ? "on" : "off" ) . "\n";
2348                      next CMD;
2349                  };
2350  
2351  =head4 C<S> - list subroutines matching/not matching a pattern
2352  
2353  Walks through C<%sub>, checking to see whether or not to print the name.
2354  
2355  =cut
2356  
2357                  $cmd =~ /^S(\s+(!)?(.+))?$/ && do {
2358  
2359                      $Srev     = defined $2;     # Reverse scan?
2360                      $Spatt    = $3;             # The pattern (if any) to use.
2361                      $Snocheck = !defined $1;    # No args - print all subs.
2362  
2363                      # Need to make these sane here.
2364                      local $\ = '';
2365                      local $, = '';
2366  
2367                      # Search through the debugger's magical hash of subs.
2368                      # If $nocheck is true, just print the sub name.
2369                      # Otherwise, check it against the pattern. We then use
2370                      # the XOR trick to reverse the condition as required.
2371                      foreach $subname ( sort( keys %sub ) ) {
2372                          if ( $Snocheck or $Srev ^ ( $subname =~ /$Spatt/ ) ) {
2373                              print $OUT $subname, "\n";
2374                          }
2375                      }
2376                      next CMD;
2377                  };
2378  
2379  =head4 C<X> - list variables in current package
2380  
2381  Since the C<V> command actually processes this, just change this to the 
2382  appropriate C<V> command and fall through.
2383  
2384  =cut
2385  
2386                  $cmd =~ s/^X\b/V $package/;
2387  
2388  =head4 C<V> - list variables
2389  
2390  Uses C<dumpvar.pl> to dump out the current values for selected variables. 
2391  
2392  =cut
2393  
2394                  # Bare V commands get the currently-being-debugged package
2395                  # added.
2396                  $cmd =~ /^V$/ && do {
2397                      $cmd = "V $package";
2398                  };
2399  
2400                  # V - show variables in package.
2401                  $cmd =~ /^V\b\s*(\S+)\s*(.*)/ && do {
2402  
2403                      # Save the currently selected filehandle and
2404                      # force output to debugger's filehandle (dumpvar
2405                      # just does "print" for output).
2406                      local ($savout) = select($OUT);
2407  
2408                      # Grab package name and variables to dump.
2409                      $packname = $1;
2410                      @vars     = split( ' ', $2 );
2411  
2412                      # If main::dumpvar isn't here, get it.
2413                      do 'dumpvar.pl' || die $@ unless defined &main::dumpvar;
2414                      if ( defined &main::dumpvar ) {
2415  
2416                          # We got it. Turn off subroutine entry/exit messages
2417                          # for the moment, along with return values.
2418                          local $frame = 0;
2419                          local $doret = -2;
2420  
2421                          # must detect sigpipe failures  - not catching
2422                          # then will cause the debugger to die.
2423                          eval {
2424                              &main::dumpvar(
2425                                  $packname,
2426                                  defined $option{dumpDepth}
2427                                  ? $option{dumpDepth}
2428                                  : -1,    # assume -1 unless specified
2429                                  @vars
2430                              );
2431                          };
2432  
2433                          # The die doesn't need to include the $@, because
2434                          # it will automatically get propagated for us.
2435                          if ($@) {
2436                              die unless $@ =~ /dumpvar print failed/;
2437                          }
2438                      } ## end if (defined &main::dumpvar)
2439                      else {
2440  
2441                          # Couldn't load dumpvar.
2442                          print $OUT "dumpvar.pl not available.\n";
2443                      }
2444  
2445                      # Restore the output filehandle, and go round again.
2446                      select($savout);
2447                      next CMD;
2448                  };
2449  
2450  =head4 C<x> - evaluate and print an expression
2451  
2452  Hands the expression off to C<DB::eval>, setting it up to print the value
2453  via C<dumpvar.pl> instead of just printing it directly.
2454  
2455  =cut
2456  
2457                  $cmd =~ s/^x\b/ / && do {    # Remainder gets done by DB::eval()
2458                      $onetimeDump = 'dump';    # main::dumpvar shows the output
2459  
2460                      # handle special  "x 3 blah" syntax XXX propagate
2461                      # doc back to special variables.
2462                      if ( $cmd =~ s/^\s*(\d+)(?=\s)/ / ) {
2463                          $onetimedumpDepth = $1;
2464                      }
2465                  };
2466  
2467  =head4 C<m> - print methods
2468  
2469  Just uses C<DB::methods> to determine what methods are available.
2470  
2471  =cut
2472  
2473                  $cmd =~ s/^m\s+([\w:]+)\s*$/ / && do {
2474                      methods($1);
2475                      next CMD;
2476                  };
2477  
2478                  # m expr - set up DB::eval to do the work
2479                  $cmd =~ s/^m\b/ / && do {    # Rest gets done by DB::eval()
2480                      $onetimeDump = 'methods';   #  method output gets used there
2481                  };
2482  
2483  =head4 C<f> - switch files
2484  
2485  =cut
2486  
2487                  $cmd =~ /^f\b\s*(.*)/ && do {
2488                      $file = $1;
2489                      $file =~ s/\s+$//;
2490  
2491                      # help for no arguments (old-style was return from sub).
2492                      if ( !$file ) {
2493                          print $OUT
2494                            "The old f command is now the r command.\n";    # hint
2495                          print $OUT "The new f command switches filenames.\n";
2496                          next CMD;
2497                      } ## end if (!$file)
2498  
2499                      # if not in magic file list, try a close match.
2500                      if ( !defined $main::{ '_<' . $file } ) {
2501                          if ( ($try) = grep( m#^_<.*$file#, keys %main:: ) ) {
2502                              {
2503                                  $try = substr( $try, 2 );
2504                                  print $OUT "Choosing $try matching `$file':\n";
2505                                  $file = $try;
2506                              }
2507                          } ## end if (($try) = grep(m#^_<.*$file#...
2508                      } ## end if (!defined $main::{ ...
2509  
2510                      # If not successfully switched now, we failed.
2511                      if ( !defined $main::{ '_<' . $file } ) {
2512                          print $OUT "No file matching `$file' is loaded.\n";
2513                          next CMD;
2514                      }
2515  
2516                      # We switched, so switch the debugger internals around.
2517                      elsif ( $file ne $filename ) {
2518                          *dbline   = $main::{ '_<' . $file };
2519                          $max      = $#dbline;
2520                          $filename = $file;
2521                          $start    = 1;
2522                          $cmd      = "l";
2523                      } ## end elsif ($file ne $filename)
2524  
2525                      # We didn't switch; say we didn't.
2526                      else {
2527                          print $OUT "Already in $file.\n";
2528                          next CMD;
2529                      }
2530                  };
2531  
2532  =head4 C<.> - return to last-executed line.
2533  
2534  We set C<$incr> to -1 to indicate that the debugger shouldn't move ahead,
2535  and then we look up the line in the magical C<%dbline> hash.
2536  
2537  =cut
2538  
2539                  # . command.
2540                  $cmd =~ /^\.$/ && do {
2541                      $incr = -1;    # stay at current line
2542  
2543                      # Reset everything to the old location.
2544                      $start    = $line;
2545                      $filename = $filename_ini;
2546                      *dbline   = $main::{ '_<' . $filename };
2547                      $max      = $#dbline;
2548  
2549                      # Now where are we?
2550                      print_lineinfo($position);
2551                      next CMD;
2552                  };
2553  
2554  =head4 C<-> - back one window
2555  
2556  We change C<$start> to be one window back; if we go back past the first line,
2557  we set it to be the first line. We ser C<$incr> to put us back at the
2558  currently-executing line, and then put a C<l $start +> (list one window from
2559  C<$start>) in C<$cmd> to be executed later.
2560  
2561  =cut
2562  
2563                  # - - back a window.
2564                  $cmd =~ /^-$/ && do {
2565  
2566                      # back up by a window; go to 1 if back too far.
2567                      $start -= $incr + $window + 1;
2568                      $start = 1 if $start <= 0;
2569                      $incr  = $window - 1;
2570  
2571                      # Generate and execute a "l +" command (handled below).
2572                      $cmd = 'l ' . ($start) . '+';
2573                  };
2574  
2575  =head3 PRE-580 COMMANDS VS. NEW COMMANDS: C<a, A, b, B, h, l, L, M, o, O, P, v, w, W, E<lt>, E<lt>E<lt>, {, {{>
2576  
2577  In Perl 5.8.0, a realignment of the commands was done to fix up a number of
2578  problems, most notably that the default case of several commands destroying
2579  the user's work in setting watchpoints, actions, etc. We wanted, however, to
2580  retain the old commands for those who were used to using them or who preferred
2581  them. At this point, we check for the new commands and call C<cmd_wrapper> to
2582  deal with them instead of processing them in-line.
2583  
2584  =cut
2585  
2586                  # All of these commands were remapped in perl 5.8.0;
2587                  # we send them off to the secondary dispatcher (see below).
2588                  $cmd =~ /^([aAbBeEhilLMoOPvwW]\b|[<>\{]{1,2})\s*(.*)/so && do {
2589                      &cmd_wrapper( $1, $2, $line );
2590                      next CMD;
2591                  };
2592  
2593  =head4 C<y> - List lexicals in higher scope
2594  
2595  Uses C<PadWalker> to find the lexicals supplied as arguments in a scope    
2596  above the current one and then displays then using C<dumpvar.pl>.
2597  
2598  =cut
2599  
2600                  $cmd =~ /^y(?:\s+(\d*)\s*(.*))?$/ && do {
2601  
2602                      # See if we've got the necessary support.
2603                      eval { require PadWalker; PadWalker->VERSION(0.08) }
2604                        or &warn(
2605                          $@ =~ /locate/
2606                          ? "PadWalker module not found - please install\n"
2607                          : $@
2608                        )
2609                        and next CMD;
2610  
2611                      # Load up dumpvar if we don't have it. If we can, that is.
2612                      do 'dumpvar.pl' || die $@ unless defined &main::dumpvar;
2613                      defined &main::dumpvar
2614                        or print $OUT "dumpvar.pl not available.\n"
2615                        and next CMD;
2616  
2617                      # Got all the modules we need. Find them and print them.
2618                      my @vars = split( ' ', $2 || '' );
2619  
2620                      # Find the pad.
2621                      my $h = eval { PadWalker::peek_my( ( $1 || 0 ) + 1 ) };
2622  
2623                      # Oops. Can't find it.
2624                      $@ and $@ =~ s/ at .*//, &warn($@), next CMD;
2625  
2626                      # Show the desired vars with dumplex().
2627                      my $savout = select($OUT);
2628  
2629                      # Have dumplex dump the lexicals.
2630                      dumpvar::dumplex( $_, $h->{$_},
2631                          defined $option{dumpDepth} ? $option{dumpDepth} : -1,
2632                          @vars )
2633                        for sort keys %$h;
2634                      select($savout);
2635                      next CMD;
2636                  };
2637  
2638  =head3 COMMANDS NOT WORKING AFTER PROGRAM ENDS
2639  
2640  All of the commands below this point don't work after the program being
2641  debugged has ended. All of them check to see if the program has ended; this
2642  allows the commands to be relocated without worrying about a 'line of
2643  demarcation' above which commands can be entered anytime, and below which
2644  they can't.
2645  
2646  =head4 C<n> - single step, but don't trace down into subs
2647  
2648  Done by setting C<$single> to 2, which forces subs to execute straight through
2649  when entered (see C<DB::sub>). We also save the C<n> command in C<$laststep>,
2650  so a null command knows what to re-execute. 
2651  
2652  =cut
2653  
2654                  # n - next
2655                  $cmd =~ /^n$/ && do {
2656                      end_report(), next CMD if $finished and $level <= 1;
2657  
2658                      # Single step, but don't enter subs.
2659                      $single = 2;
2660  
2661                      # Save for empty command (repeat last).
2662                      $laststep = $cmd;
2663                      last CMD;
2664                  };
2665  
2666  =head4 C<s> - single-step, entering subs
2667  
2668  Sets C<$single> to 1, which causes C<DB::sub> to continue tracing inside     
2669  subs. Also saves C<s> as C<$lastcmd>.
2670  
2671  =cut
2672  
2673                  # s - single step.
2674                  $cmd =~ /^s$/ && do {
2675  
2676                      # Get out and restart the command loop if program
2677                      # has finished.
2678                      end_report(), next CMD if $finished and $level <= 1;
2679  
2680                      # Single step should enter subs.
2681                      $single = 1;
2682  
2683                      # Save for empty command (repeat last).
2684                      $laststep = $cmd;
2685                      last CMD;
2686                  };
2687  
2688  =head4 C<c> - run continuously, setting an optional breakpoint
2689  
2690  Most of the code for this command is taken up with locating the optional
2691  breakpoint, which is either a subroutine name or a line number. We set
2692  the appropriate one-time-break in C<@dbline> and then turn off single-stepping
2693  in this and all call levels above this one.
2694  
2695  =cut
2696  
2697                  # c - start continuous execution.
2698                  $cmd =~ /^c\b\s*([\w:]*)\s*$/ && do {
2699  
2700                      # Hey, show's over. The debugged program finished
2701                      # executing already.
2702                      end_report(), next CMD if $finished and $level <= 1;
2703  
2704                      # Capture the place to put a one-time break.
2705                      $subname = $i = $1;
2706  
2707                      #  Probably not needed, since we finish an interactive
2708                      #  sub-session anyway...
2709                      # local $filename = $filename;
2710                      # local *dbline = *dbline; # XXX Would this work?!
2711                      #
2712                      # The above question wonders if localizing the alias
2713                      # to the magic array works or not. Since it's commented
2714                      # out, we'll just leave that to speculation for now.
2715  
2716                      # If the "subname" isn't all digits, we'll assume it
2717                      # is a subroutine name, and try to find it.
2718                      if ( $subname =~ /\D/ ) {    # subroutine name
2719                              # Qualify it to the current package unless it's
2720                              # already qualified.
2721                          $subname = $package . "::" . $subname
2722                            unless $subname =~ /::/;
2723  
2724                          # find_sub will return "file:line_number" corresponding
2725                          # to where the subroutine is defined; we call find_sub,
2726                          # break up the return value, and assign it in one
2727                          # operation.
2728                          ( $file, $i ) = ( find_sub($subname) =~ /^(.*):(.*)$/ );
2729  
2730                          # Force the line number to be numeric.
2731                          $i += 0;
2732  
2733                          # If we got a line number, we found the sub.
2734                          if ($i) {
2735  
2736                              # Switch all the debugger's internals around so
2737                              # we're actually working with that file.
2738                              $filename = $file;
2739                              *dbline   = $main::{ '_<' . $filename };
2740  
2741                              # Mark that there's a breakpoint in this file.
2742                              $had_breakpoints{$filename} |= 1;
2743  
2744                              # Scan forward to the first executable line
2745                              # after the 'sub whatever' line.
2746                              $max = $#dbline;
2747                              ++$i while $dbline[$i] == 0 && $i < $max;
2748                          } ## end if ($i)
2749  
2750                          # We didn't find a sub by that name.
2751                          else {
2752                              print $OUT "Subroutine $subname not found.\n";
2753                              next CMD;
2754                          }
2755                      } ## end if ($subname =~ /\D/)
2756  
2757                      # At this point, either the subname was all digits (an
2758                      # absolute line-break request) or we've scanned through
2759                      # the code following the definition of the sub, looking
2760                      # for an executable, which we may or may not have found.
2761                      #
2762                      # If $i (which we set $subname from) is non-zero, we
2763                      # got a request to break at some line somewhere. On
2764                      # one hand, if there wasn't any real subroutine name
2765                      # involved, this will be a request to break in the current
2766                      # file at the specified line, so we have to check to make
2767                      # sure that the line specified really is breakable.
2768                      #
2769                      # On the other hand, if there was a subname supplied, the
2770                      # preceding block has moved us to the proper file and
2771                      # location within that file, and then scanned forward
2772                      # looking for the next executable line. We have to make
2773                      # sure that one was found.
2774                      #
2775                      # On the gripping hand, we can't do anything unless the
2776                      # current value of $i points to a valid breakable line.
2777                      # Check that.
2778                      if ($i) {
2779  
2780                          # Breakable?
2781                          if ( $dbline[$i] == 0 ) {
2782                              print $OUT "Line $i not breakable.\n";
2783                              next CMD;
2784                          }
2785  
2786                          # Yes. Set up the one-time-break sigil.
2787                          $dbline{$i} =~ s/($|\0)/;9$1/;  # add one-time-only b.p.
2788                      } ## end if ($i)
2789  
2790                      # Turn off stack tracing from here up.
2791                      for ( $i = 0 ; $i <= $stack_depth ; ) {
2792                          $stack[ $i++ ] &= ~1;
2793                      }
2794                      last CMD;
2795                  };
2796  
2797  =head4 C<r> - return from a subroutine
2798  
2799  For C<r> to work properly, the debugger has to stop execution again
2800  immediately after the return is executed. This is done by forcing
2801  single-stepping to be on in the call level above the current one. If
2802  we are printing return values when a C<r> is executed, set C<$doret>
2803  appropriately, and force us out of the command loop.
2804  
2805  =cut
2806  
2807                  # r - return from the current subroutine.
2808                  $cmd =~ /^r$/ && do {
2809  
2810                      # Can't do anythign if the program's over.
2811                      end_report(), next CMD if $finished and $level <= 1;
2812  
2813                      # Turn on stack trace.
2814                      $stack[$stack_depth] |= 1;
2815  
2816                      # Print return value unless the stack is empty.
2817                      $doret = $option{PrintRet} ? $stack_depth - 1 : -2;
2818                      last CMD;
2819                  };
2820  
2821  =head4 C<T> - stack trace
2822  
2823  Just calls C<DB::print_trace>.
2824  
2825  =cut
2826  
2827                  $cmd =~ /^T$/ && do {
2828                      print_trace( $OUT, 1 );    # skip DB
2829                      next CMD;
2830                  };
2831  
2832  =head4 C<w> - List window around current line.
2833  
2834  Just calls C<DB::cmd_w>.
2835  
2836  =cut
2837  
2838                  $cmd =~ /^w\b\s*(.*)/s && do { &cmd_w( 'w', $1 ); next CMD; };
2839  
2840  =head4 C<W> - watch-expression processing.
2841  
2842  Just calls C<DB::cmd_W>. 
2843  
2844  =cut
2845  
2846                  $cmd =~ /^W\b\s*(.*)/s && do { &cmd_W( 'W', $1 ); next CMD; };
2847  
2848  =head4 C</> - search forward for a string in the source
2849  
2850  We take the argument and treat it as a pattern. If it turns out to be a 
2851  bad one, we return the error we got from trying to C<eval> it and exit.
2852  If not, we create some code to do the search and C<eval> it so it can't 
2853  mess us up.
2854  
2855  =cut
2856  
2857                  $cmd =~ /^\/(.*)$/ && do {
2858  
2859                      # The pattern as a string.
2860                      $inpat = $1;
2861  
2862                      # Remove the final slash.
2863                      $inpat =~ s:([^\\])/$:$1:;
2864  
2865                      # If the pattern isn't null ...
2866                      if ( $inpat ne "" ) {
2867  
2868                          # Turn of warn and die procesing for a bit.
2869                          local $SIG{__DIE__};
2870                          local $SIG{__WARN__};
2871  
2872                          # Create the pattern.
2873                          eval '$inpat =~ m' . "\a$inpat\a";
2874                          if ( $@ ne "" ) {
2875  
2876                              # Oops. Bad pattern. No biscuit.
2877                              # Print the eval error and go back for more
2878                              # commands.
2879                              print $OUT "$@";
2880                              next CMD;
2881                          }
2882                          $pat = $inpat;
2883                      } ## end if ($inpat ne "")
2884  
2885                      # Set up to stop on wrap-around.
2886                      $end = $start;
2887  
2888                      # Don't move off the current line.
2889                      $incr = -1;
2890  
2891                      # Done in eval so nothing breaks if the pattern
2892                      # does something weird.
2893                      eval '
2894                          for (;;) {
2895                              # Move ahead one line.
2896                              ++$start;
2897  
2898                              # Wrap if we pass the last line.
2899                              $start = 1 if ($start > $max);
2900  
2901                              # Stop if we have gotten back to this line again,
2902                              last if ($start == $end);
2903  
2904                              # A hit! (Note, though, that we are doing
2905                              # case-insensitive matching. Maybe a qr//
2906                              # expression would be better, so the user could
2907                              # do case-sensitive matching if desired.
2908                              if ($dbline[$start] =~ m' . "\a$pat\a" . 'i) {
2909                                  if ($slave_editor) {
2910                                      # Handle proper escaping in the slave.
2911                                      print $OUT "\032\032$filename:$start:0\n";
2912                                  } 
2913                                  else {
2914                                      # Just print the line normally.
2915                                      print $OUT "$start:\t",$dbline[$start],"\n";
2916                                  }
2917                                  # And quit since we found something.
2918                                  last;
2919                              }
2920                           } ';
2921  
2922                      # If we wrapped, there never was a match.
2923                      print $OUT "/$pat/: not found\n" if ( $start == $end );
2924                      next CMD;
2925                  };
2926  
2927  =head4 C<?> - search backward for a string in the source
2928  
2929  Same as for C</>, except the loop runs backwards.
2930  
2931  =cut
2932  
2933                  # ? - backward pattern search.
2934                  $cmd =~ /^\?(.*)$/ && do {
2935  
2936                      # Get the pattern, remove trailing question mark.
2937                      $inpat = $1;
2938                      $inpat =~ s:([^\\])\?$:$1:;
2939  
2940                      # If we've got one ...
2941                      if ( $inpat ne "" ) {
2942  
2943                          # Turn off die & warn handlers.
2944                          local $SIG{__DIE__};
2945                          local $SIG{__WARN__};
2946                          eval '$inpat =~ m' . "\a$inpat\a";
2947  
2948                          if ( $@ ne "" ) {
2949  
2950                              # Ouch. Not good. Print the error.
2951                              print $OUT $@;
2952                              next CMD;
2953                          }
2954                          $pat = $inpat;
2955                      } ## end if ($inpat ne "")
2956  
2957                      # Where we are now is where to stop after wraparound.
2958                      $end = $start;
2959  
2960                      # Don't move away from this line.
2961                      $incr = -1;
2962  
2963                      # Search inside the eval to prevent pattern badness
2964                      # from killing us.
2965                      eval '
2966                          for (;;) {
2967                              # Back up a line.
2968                              --$start;
2969  
2970                              # Wrap if we pass the first line.
2971  
2972                              $start = $max if ($start <= 0);
2973  
2974                              # Quit if we get back where we started,
2975                              last if ($start == $end);
2976  
2977                              # Match?
2978                              if ($dbline[$start] =~ m' . "\a$pat\a" . 'i) {
2979                                  if ($slave_editor) {
2980                                      # Yep, follow slave editor requirements.
2981                                      print $OUT "\032\032$filename:$start:0\n";
2982                                  } 
2983                                  else {
2984                                      # Yep, just print normally.
2985                                      print $OUT "$start:\t",$dbline[$start],"\n";
2986                                  }
2987  
2988                                  # Found, so done.
2989                                  last;
2990                              }
2991                          } ';
2992  
2993                      # Say we failed if the loop never found anything,
2994                      print $OUT "?$pat?: not found\n" if ( $start == $end );
2995                      next CMD;
2996                  };
2997  
2998  =head4 C<$rc> - Recall command
2999  
3000  Manages the commands in C<@hist> (which is created if C<Term::ReadLine> reports
3001  that the terminal supports history). It find the the command required, puts it
3002  into C<$cmd>, and redoes the loop to execute it.
3003  
3004  =cut
3005  
3006                  # $rc - recall command.
3007                  $cmd =~ /^$rc+\s*(-)?(\d+)?$/ && do {
3008  
3009                      # No arguments, take one thing off history.
3010                      pop(@hist) if length($cmd) > 1;
3011  
3012                      # Relative (- found)?
3013                      #  Y - index back from most recent (by 1 if bare minus)
3014                      #  N - go to that particular command slot or the last
3015                      #      thing if nothing following.
3016                      $i = $1 ? ( $#hist - ( $2 || 1 ) ) : ( $2 || $#hist );
3017  
3018                      # Pick out the command desired.
3019                      $cmd = $hist[$i];
3020  
3021                      # Print the command to be executed and restart the loop
3022                      # with that command in the buffer.
3023                      print $OUT $cmd, "\n";
3024                      redo CMD;
3025                  };
3026  
3027  =head4 C<$sh$sh> - C<system()> command
3028  
3029  Calls the C<DB::system()> to handle the command. This keeps the C<STDIN> and
3030  C<STDOUT> from getting messed up.
3031  
3032  =cut
3033  
3034                  # $sh$sh - run a shell command (if it's all ASCII).
3035                  # Can't run shell commands with Unicode in the debugger, hmm.
3036                  $cmd =~ /^$sh$sh\s*([\x00-\xff]*)/ && do {
3037  
3038                      # System it.
3039                      &system($1);
3040                      next CMD;
3041                  };
3042  
3043  =head4 C<$rc I<pattern> $rc> - Search command history
3044  
3045  Another command to manipulate C<@hist>: this one searches it with a pattern.
3046  If a command is found, it is placed in C<$cmd> and executed via C<redo>.
3047  
3048  =cut
3049  
3050                  # $rc pattern $rc - find a command in the history.
3051                  $cmd =~ /^$rc([^$rc].*)$/ && do {
3052  
3053                      # Create the pattern to use.
3054                      $pat = "^$1";
3055  
3056                      # Toss off last entry if length is >1 (and it always is).
3057                      pop(@hist) if length($cmd) > 1;
3058  
3059                      # Look backward through the history.
3060                      for ( $i = $#hist ; $i ; --$i ) {
3061  
3062                          # Stop if we find it.
3063                          last if $hist[$i] =~ /$pat/;
3064                      }
3065  
3066                      if ( !$i ) {
3067  
3068                          # Never found it.
3069                          print $OUT "No such command!\n\n";
3070                          next CMD;
3071                      }
3072  
3073                      # Found it. Put it in the buffer, print it, and process it.
3074                      $cmd = $hist[$i];
3075                      print $OUT $cmd, "\n";
3076                      redo CMD;
3077                  };
3078  
3079  =head4 C<$sh> - Invoke a shell     
3080  
3081  Uses C<DB::system> to invoke a shell.
3082  
3083  =cut
3084  
3085                  # $sh - start a shell.
3086                  $cmd =~ /^$sh$/ && do {
3087  
3088                      # Run the user's shell. If none defined, run Bourne.
3089                      # We resume execution when the shell terminates.
3090                      &system( $ENV{SHELL} || "/bin/sh" );
3091                      next CMD;
3092                  };
3093  
3094  =head4 C<$sh I<command>> - Force execution of a command in a shell
3095  
3096  Like the above, but the command is passed to the shell. Again, we use
3097  C<DB::system> to avoid problems with C<STDIN> and C<STDOUT>.
3098  
3099  =cut
3100  
3101                  # $sh command - start a shell and run a command in it.
3102                  $cmd =~ /^$sh\s*([\x00-\xff]*)/ && do {
3103  
3104                      # XXX: using csh or tcsh destroys sigint retvals!
3105                      #&system($1);  # use this instead
3106  
3107                      # use the user's shell, or Bourne if none defined.
3108                      &system( $ENV{SHELL} || "/bin/sh", "-c", $1 );
3109                      next CMD;
3110                  };
3111  
3112  =head4 C<H> - display commands in history
3113  
3114  Prints the contents of C<@hist> (if any).
3115  
3116  =cut
3117  
3118                  $cmd =~ /^H\b\s*\*/ && do {
3119                      @hist = @truehist = ();
3120                      print $OUT "History cleansed\n";
3121                      next CMD;
3122                  };
3123  
3124                  $cmd =~ /^H\b\s*(-(\d+))?/ && do {
3125  
3126                      # Anything other than negative numbers is ignored by
3127                      # the (incorrect) pattern, so this test does nothing.
3128                      $end = $2 ? ( $#hist - $2 ) : 0;
3129  
3130                      # Set to the minimum if less than zero.
3131                      $hist = 0 if $hist < 0;
3132  
3133                      # Start at the end of the array.
3134                      # Stay in while we're still above the ending value.
3135                      # Tick back by one each time around the loop.
3136                      for ( $i = $#hist ; $i > $end ; $i-- ) {
3137  
3138                          # Print the command  unless it has no arguments.
3139                          print $OUT "$i: ", $hist[$i], "\n"
3140                            unless $hist[$i] =~ /^.?$/;
3141                      }
3142                      next CMD;
3143                  };
3144  
3145  =head4 C<man, doc, perldoc> - look up documentation
3146  
3147  Just calls C<runman()> to print the appropriate document.
3148  
3149  =cut
3150  
3151                  # man, perldoc, doc - show manual pages.
3152                  $cmd =~ /^(?:man|(?:perl)?doc)\b(?:\s+([^(]*))?$/ && do {
3153                      runman($1);
3154                      next CMD;
3155                  };
3156  
3157  =head4 C<p> - print
3158  
3159  Builds a C<print EXPR> expression in the C<$cmd>; this will get executed at
3160  the bottom of the loop.
3161  
3162  =cut
3163  
3164                  # p - print (no args): print $_.
3165                  $cmd =~ s/^p$/print {\$DB::OUT} \$_/;
3166  
3167                  # p - print the given expression.
3168                  $cmd =~ s/^p\b/print {\$DB::OUT} /;
3169  
3170  =head4 C<=> - define command alias
3171  
3172  Manipulates C<%alias> to add or list command aliases.
3173  
3174  =cut
3175  
3176                  # = - set up a command alias.
3177                  $cmd =~ s/^=\s*// && do {
3178                      my @keys;
3179                      if ( length $cmd == 0 ) {
3180  
3181                          # No args, get current aliases.
3182                          @keys = sort keys %alias;
3183                      }
3184                      elsif ( my ( $k, $v ) = ( $cmd =~ /^(\S+)\s+(\S.*)/ ) ) {
3185  
3186                          # Creating a new alias. $k is alias name, $v is
3187                          # alias value.
3188  
3189                          # can't use $_ or kill //g state
3190                          for my $x ( $k, $v ) {
3191  
3192                              # Escape "alarm" characters.
3193                              $x =~ s/\a/\\a/g;
3194                          }
3195  
3196                          # Substitute key for value, using alarm chars
3197                          # as separators (which is why we escaped them in
3198                          # the command).
3199                          $alias{$k} = "s\a$k\a$v\a";
3200  
3201                          # Turn off standard warn and die behavior.
3202                          local $SIG{__DIE__};
3203                          local $SIG{__WARN__};
3204  
3205                          # Is it valid Perl?
3206                          unless ( eval "sub { s\a$k\a$v\a }; 1" ) {
3207  
3208                              # Nope. Bad alias. Say so and get out.
3209                              print $OUT "Can't alias $k to $v: $@\n";
3210                              delete $alias{$k};
3211                              next CMD;
3212                          }
3213  
3214                          # We'll only list the new one.
3215                          @keys = ($k);
3216                      } ## end elsif (my ($k, $v) = ($cmd...
3217  
3218                      # The argument is the alias to list.
3219                      else {
3220                          @keys = ($cmd);
3221                      }
3222  
3223                      # List aliases.
3224                      for my $k (@keys) {
3225  
3226                          # Messy metaquoting: Trim the substiution code off.
3227                          # We use control-G as the delimiter because it's not
3228                          # likely to appear in the alias.
3229                          if ( ( my $v = $alias{$k} ) =~ ss\a$k\a(.*)\a$1 ) {
3230  
3231                              # Print the alias.
3232                              print $OUT "$k\t= $1\n";
3233                          }
3234                          elsif ( defined $alias{$k} ) {
3235  
3236                              # Couldn't trim it off; just print the alias code.
3237                              print $OUT "$k\t$alias{$k}\n";
3238                          }
3239                          else {
3240  
3241                              # No such, dude.
3242                              print "No alias for $k\n";
3243                          }
3244                      } ## end for my $k (@keys)
3245                      next CMD;
3246                  };
3247  
3248  =head4 C<source> - read commands from a file.
3249  
3250  Opens a lexical filehandle and stacks it on C<@cmdfhs>; C<DB::readline> will
3251  pick it up.
3252  
3253  =cut
3254  
3255                  # source - read commands from a file (or pipe!) and execute.
3256                  $cmd =~ /^source\s+(.*\S)/ && do {
3257                      if ( open my $fh, $1 ) {
3258  
3259                          # Opened OK; stick it in the list of file handles.
3260                          push @cmdfhs, $fh;
3261                      }
3262                      else {
3263  
3264                          # Couldn't open it.
3265                          &warn("Can't execute `$1': $!\n");
3266                      }
3267                      next CMD;
3268                  };
3269  
3270  =head4 C<save> - send current history to a file
3271  
3272  Takes the complete history, (not the shrunken version you see with C<H>),
3273  and saves it to the given filename, so it can be replayed using C<source>.
3274  
3275  Note that all C<^(save|source)>'s are commented out with a view to minimise recursion.
3276  
3277  =cut
3278  
3279                  # save source - write commands to a file for later use
3280                  $cmd =~ /^save\s*(.*)$/ && do {
3281                      my $file = $1 || '.perl5dbrc';    # default?
3282                      if ( open my $fh, "> $file" ) {
3283  
3284                         # chomp to remove extraneous newlines from source'd files
3285                          chomp( my @truelist =
3286                                map { m/^\s*(save|source)/ ? "#$_" : $_ }
3287                                @truehist );
3288                          print $fh join( "\n", @truelist );
3289                          print "commands saved in $file\n";
3290                      }
3291                      else {
3292                          &warn("Can't save debugger commands in '$1': $!\n");
3293                      }
3294                      next CMD;
3295                  };
3296  
3297  =head4 C<R> - restart
3298  
3299  Restart the debugger session. 
3300  
3301  =head4 C<rerun> - rerun the current session
3302  
3303  Return to any given position in the B<true>-history list
3304  
3305  =cut
3306  
3307                  # R - restart execution.
3308                  # rerun - controlled restart execution.
3309                  $cmd =~ /^(R|rerun\s*(.*))$/ && do {
3310                      my @args = ($1 eq 'R' ? restart() : rerun($2));
3311  
3312                      # Close all non-system fds for a clean restart.  A more
3313                      # correct method would be to close all fds that were not
3314                      # open when the process started, but this seems to be
3315                      # hard.  See "debugger 'R'estart and open database
3316                      # connections" on p5p.
3317  
3318                      my $max_fd = 1024; # default if POSIX can't be loaded
3319                      if (eval { require POSIX }) {
3320                          $max_fd = POSIX::sysconf(POSIX::_SC_OPEN_MAX());
3321                      }
3322  
3323                      if (defined $max_fd) {
3324                          foreach ($^F+1 .. $max_fd-1) {
3325                              next unless open FD_TO_CLOSE, "<&=$_";
3326                              close(FD_TO_CLOSE);
3327                          }
3328                      }
3329  
3330                      # And run Perl again.  We use exec() to keep the
3331                      # PID stable (and that way $ini_pids is still valid).
3332                      exec(@args) || print $OUT "exec failed: $!\n";
3333  
3334                      last CMD;
3335                  };
3336  
3337  =head4 C<|, ||> - pipe output through the pager.
3338  
3339  For C<|>, we save C<OUT> (the debugger's output filehandle) and C<STDOUT>
3340  (the program's standard output). For C<||>, we only save C<OUT>. We open a
3341  pipe to the pager (restoring the output filehandles if this fails). If this
3342  is the C<|> command, we also set up a C<SIGPIPE> handler which will simply 
3343  set C<$signal>, sending us back into the debugger.
3344  
3345  We then trim off the pipe symbols and C<redo> the command loop at the
3346  C<PIPE> label, causing us to evaluate the command in C<$cmd> without
3347  reading another.
3348  
3349  =cut
3350  
3351                  # || - run command in the pager, with output to DB::OUT.
3352                  $cmd =~ /^\|\|?\s*[^|]/ && do {
3353                      if ( $pager =~ /^\|/ ) {
3354  
3355                          # Default pager is into a pipe. Redirect I/O.
3356                          open( SAVEOUT, ">&STDOUT" )
3357                            || &warn("Can't save STDOUT");
3358                          open( STDOUT, ">&OUT" )
3359                            || &warn("Can't redirect STDOUT");
3360                      } ## end if ($pager =~ /^\|/)
3361                      else {
3362  
3363                          # Not into a pipe. STDOUT is safe.
3364                          open( SAVEOUT, ">&OUT" ) || &warn("Can't save DB::OUT");
3365                      }
3366  
3367                      # Fix up environment to record we have less if so.
3368                      fix_less();
3369  
3370                      unless ( $piped = open( OUT, $pager ) ) {
3371  
3372                          # Couldn't open pipe to pager.
3373                          &warn("Can't pipe output to `$pager'");
3374                          if ( $pager =~ /^\|/ ) {
3375  
3376                              # Redirect I/O back again.
3377                              open( OUT, ">&STDOUT" )    # XXX: lost message
3378                                || &warn("Can't restore DB::OUT");
3379                              open( STDOUT, ">&SAVEOUT" )
3380                                || &warn("Can't restore STDOUT");
3381                              close(SAVEOUT);
3382                          } ## end if ($pager =~ /^\|/)
3383                          else {
3384  
3385                              # Redirect I/O. STDOUT already safe.
3386                              open( OUT, ">&STDOUT" )    # XXX: lost message
3387                                || &warn("Can't restore DB::OUT");
3388                          }
3389                          next CMD;
3390                      } ## end unless ($piped = open(OUT,...
3391  
3392                      # Set up broken-pipe handler if necessary.
3393                      $SIG{PIPE} = \&DB::catch
3394                        if $pager =~ /^\|/
3395                        && ( "" eq $SIG{PIPE} || "DEFAULT" eq $SIG{PIPE} );
3396  
3397                      # Save current filehandle, unbuffer out, and put it back.
3398                      $selected = select(OUT);
3399                      $|        = 1;
3400  
3401                      # Don't put it back if pager was a pipe.
3402                      select($selected), $selected = "" unless $cmd =~ /^\|\|/;
3403  
3404                      # Trim off the pipe symbols and run the command now.
3405                      $cmd =~ s/^\|+\s*//;
3406                      redo PIPE;
3407                  };
3408  
3409  =head3 END OF COMMAND PARSING
3410  
3411  Anything left in C<$cmd> at this point is a Perl expression that we want to 
3412  evaluate. We'll always evaluate in the user's context, and fully qualify 
3413  any variables we might want to address in the C<DB> package.
3414  
3415  =cut
3416  
3417                  # t - turn trace on.
3418                  $cmd =~ s/^t\s/\$DB::trace |= 1;\n/;
3419  
3420                  # s - single-step. Remember the last command was 's'.
3421                  $cmd =~ s/^s\s/\$DB::single = 1;\n/ && do { $laststep = 's' };
3422  
3423                  # n - single-step, but not into subs. Remember last command
3424                  # was 'n'.
3425                  $cmd =~ s/^n\s/\$DB::single = 2;\n/ && do { $laststep = 'n' };
3426  
3427              }    # PIPE:
3428  
3429              # Make sure the flag that says "the debugger's running" is
3430              # still on, to make sure we get control again.
3431              $evalarg = "\$^D = \$^D | \$DB::db_stop;\n$cmd";
3432  
3433              # Run *our* eval that executes in the caller's context.
3434              &eval;
3435  
3436              # Turn off the one-time-dump stuff now.
3437              if ($onetimeDump) {
3438                  $onetimeDump      = undef;
3439                  $onetimedumpDepth = undef;
3440              }
3441              elsif ( $term_pid == $$ ) {
3442          eval {        # May run under miniperl, when not available...
3443                      STDOUT->flush();
3444                      STDERR->flush();
3445          };
3446  
3447                  # XXX If this is the master pid, print a newline.
3448                  print $OUT "\n";
3449              }
3450          } ## end while (($term || &setterm...
3451  
3452  =head3 POST-COMMAND PROCESSING
3453  
3454  After each command, we check to see if the command output was piped anywhere.
3455  If so, we go through the necessary code to unhook the pipe and go back to
3456  our standard filehandles for input and output.
3457  
3458  =cut
3459  
3460          continue {    # CMD:
3461  
3462              # At the end of every command:
3463              if ($piped) {
3464  
3465                  # Unhook the pipe mechanism now.
3466                  if ( $pager =~ /^\|/ ) {
3467  
3468                      # No error from the child.
3469                      $? = 0;
3470  
3471                      # we cannot warn here: the handle is missing --tchrist
3472                      close(OUT) || print SAVEOUT "\nCan't close DB::OUT\n";
3473  
3474                      # most of the $? crud was coping with broken cshisms
3475                      # $? is explicitly set to 0, so this never runs.
3476                      if ($?) {
3477                          print SAVEOUT "Pager `$pager' failed: ";
3478                          if ( $? == -1 ) {
3479                              print SAVEOUT "shell returned -1\n";
3480                          }
3481                          elsif ( $? >> 8 ) {
3482                              print SAVEOUT ( $? & 127 )
3483                                ? " (SIG#" . ( $? & 127 ) . ")"
3484                                : "", ( $? & 128 ) ? " -- core dumped" : "", "\n";
3485                          }
3486                          else {
3487                              print SAVEOUT "status ", ( $? >> 8 ), "\n";
3488                          }
3489                      } ## end if ($?)
3490  
3491                      # Reopen filehandle for our output (if we can) and
3492                      # restore STDOUT (if we can).
3493                      open( OUT, ">&STDOUT" ) || &warn("Can't restore DB::OUT");
3494                      open( STDOUT, ">&SAVEOUT" )
3495                        || &warn("Can't restore STDOUT");
3496  
3497                      # Turn off pipe exception handler if necessary.
3498                      $SIG{PIPE} = "DEFAULT" if $SIG{PIPE} eq \&DB::catch;
3499  
3500                      # Will stop ignoring SIGPIPE if done like nohup(1)
3501                      # does SIGINT but Perl doesn't give us a choice.
3502                  } ## end if ($pager =~ /^\|/)
3503                  else {
3504  
3505                      # Non-piped "pager". Just restore STDOUT.
3506                      open( OUT, ">&SAVEOUT" ) || &warn("Can't restore DB::OUT");
3507                  }
3508  
3509                  # Close filehandle pager was using, restore the normal one
3510                  # if necessary,
3511                  close(SAVEOUT);
3512                  select($selected), $selected = "" unless $selected eq "";
3513  
3514                  # No pipes now.
3515                  $piped = "";
3516              } ## end if ($piped)
3517          }    # CMD:
3518  
3519  =head3 COMMAND LOOP TERMINATION
3520  
3521  When commands have finished executing, we come here. If the user closed the
3522  input filehandle, we turn on C<$fall_off_end> to emulate a C<q> command. We
3523  evaluate any post-prompt items. We restore C<$@>, C<$!>, C<$^E>, C<$,>, C<$/>,
3524  C<$\>, and C<$^W>, and return a null list as expected by the Perl interpreter.
3525  The interpreter will then execute the next line and then return control to us
3526  again.
3527  
3528  =cut
3529  
3530          # No more commands? Quit.
3531          $fall_off_end = 1 unless defined $cmd;    # Emulate `q' on EOF
3532  
3533          # Evaluate post-prompt commands.
3534          foreach $evalarg (@$post) {
3535              &eval;
3536          }
3537      }    # if ($single || $signal)
3538  
3539      # Put the user's globals back where you found them.
3540      ( $@, $!, $^E, $,, $/, $\, $^W ) = @saved;
3541      ();
3542  } ## end sub DB
3543  
3544  # The following code may be executed now:
3545  # BEGIN {warn 4}
3546  
3547  =head2 sub
3548  
3549  C<sub> is called whenever a subroutine call happens in the program being 
3550  debugged. The variable C<$DB::sub> contains the name of the subroutine
3551  being called.
3552  
3553  The core function of this subroutine is to actually call the sub in the proper
3554  context, capturing its output. This of course causes C<DB::DB> to get called
3555  again, repeating until the subroutine ends and returns control to C<DB::sub>
3556  again. Once control returns, C<DB::sub> figures out whether or not to dump the
3557  return value, and returns its captured copy of the return value as its own
3558  return value. The value then feeds back into the program being debugged as if
3559  C<DB::sub> hadn't been there at all.
3560  
3561  C<sub> does all the work of printing the subroutine entry and exit messages
3562  enabled by setting C<$frame>. It notes what sub the autoloader got called for,
3563  and also prints the return value if needed (for the C<r> command and if 
3564  the 16 bit is set in C<$frame>).
3565  
3566  It also tracks the subroutine call depth by saving the current setting of
3567  C<$single> in the C<@stack> package global; if this exceeds the value in
3568  C<$deep>, C<sub> automatically turns on printing of the current depth by
3569  setting the C<4> bit in C<$single>. In any case, it keeps the current setting
3570  of stop/don't stop on entry to subs set as it currently is set.
3571  
3572  =head3 C<caller()> support
3573  
3574  If C<caller()> is called from the package C<DB>, it provides some
3575  additional data, in the following order:
3576  
3577  =over 4
3578  
3579  =item * C<$package>
3580  
3581  The package name the sub was in
3582  
3583  =item * C<$filename>
3584  
3585  The filename it was defined in
3586  
3587  =item * C<$line>
3588  
3589  The line number it was defined on
3590  
3591  =item * C<$subroutine>
3592  
3593  The subroutine name; C<(eval)> if an C<eval>().
3594  
3595  =item * C<$hasargs>
3596  
3597  1 if it has arguments, 0 if not
3598  
3599  =item * C<$wantarray>
3600  
3601  1 if array context, 0 if scalar context
3602  
3603  =item * C<$evaltext>
3604  
3605  The C<eval>() text, if any (undefined for C<eval BLOCK>)
3606  
3607  =item * C<$is_require>
3608  
3609  frame was created by a C<use> or C<require> statement
3610  
3611  =item * C<$hints>
3612  
3613  pragma information; subject to change between versions
3614  
3615  =item * C<$bitmask>
3616  
3617  pragma information; subject to change between versions
3618  
3619  =item * C<@DB::args>
3620  
3621  arguments with which the subroutine was invoked
3622  
3623  =back
3624  
3625  =cut
3626  
3627  sub sub {
3628  
3629      # lock ourselves under threads
3630      lock($DBGR);
3631  
3632      # Whether or not the autoloader was running, a scalar to put the
3633      # sub's return value in (if needed), and an array to put the sub's
3634      # return value in (if needed).
3635      my ( $al, $ret, @ret ) = "";
3636      if ($sub =~ /^threads::new$/ && $ENV{PERL5DB_THREADED}) {
3637          print "creating new thread\n"; 
3638      }
3639  
3640      # If the last ten characters are '::AUTOLOAD', note we've traced
3641      # into AUTOLOAD for $sub.
3642      if ( length($sub) > 10 && substr( $sub, -10, 10 ) eq '::AUTOLOAD' ) {
3643          $al = " for $$sub" if defined $$sub;
3644      }
3645  
3646      # We stack the stack pointer and then increment it to protect us
3647      # from a situation that might unwind a whole bunch of call frames
3648      # at once. Localizing the stack pointer means that it will automatically
3649      # unwind the same amount when multiple stack frames are unwound.
3650      local $stack_depth = $stack_depth + 1;    # Protect from non-local exits
3651  
3652      # Expand @stack.
3653      $#stack = $stack_depth;
3654  
3655      # Save current single-step setting.
3656      $stack[-1] = $single;
3657  
3658      # Turn off all flags except single-stepping.
3659      $single &= 1;
3660  
3661      # If we've gotten really deeply recursed, turn on the flag that will
3662      # make us stop with the 'deep recursion' message.
3663      $single |= 4 if $stack_depth == $deep;
3664  
3665      # If frame messages are on ...
3666      (
3667          $frame & 4    # Extended frame entry message
3668          ? (
3669              print_lineinfo( ' ' x ( $stack_depth - 1 ), "in  " ),
3670  
3671              # Why -1? But it works! :-(
3672              # Because print_trace will call add 1 to it and then call
3673              # dump_trace; this results in our skipping -1+1 = 0 stack frames
3674              # in dump_trace.
3675              print_trace( $LINEINFO, -1, 1, 1, "$sub$al" )
3676            )
3677          : print_lineinfo( ' ' x ( $stack_depth - 1 ), "entering $sub$al\n" )
3678  
3679            # standard frame entry message
3680        )
3681        if $frame;
3682  
3683      # Determine the sub's return type,and capture approppriately.
3684      if (wantarray) {
3685  
3686          # Called in array context. call sub and capture output.
3687          # DB::DB will recursively get control again if appropriate; we'll come
3688          # back here when the sub is finished.
3689      @ret = &$sub;
3690  
3691          # Pop the single-step value back off the stack.
3692          $single |= $stack[ $stack_depth-- ];
3693  
3694          # Check for exit trace messages...
3695          (
3696              $frame & 4    # Extended exit message
3697              ? (
3698                  print_lineinfo( ' ' x $stack_depth, "out " ),
3699                  print_trace( $LINEINFO, -1, 1, 1, "$sub$al" )
3700                )
3701              : print_lineinfo( ' ' x $stack_depth, "exited $sub$al\n" )
3702  
3703                # Standard exit message
3704            )
3705            if $frame & 2;
3706  
3707          # Print the return info if we need to.
3708          if ( $doret eq $stack_depth or $frame & 16 ) {
3709  
3710              # Turn off output record separator.
3711              local $\ = '';
3712              my $fh = ( $doret eq $stack_depth ? $OUT : $LINEINFO );
3713  
3714              # Indent if we're printing because of $frame tracing.
3715              print $fh ' ' x $stack_depth if $frame & 16;
3716  
3717              # Print the return value.
3718              print $fh "list context return from $sub:\n";
3719              dumpit( $fh, \@ret );
3720  
3721              # And don't print it again.
3722              $doret = -2;
3723          } ## end if ($doret eq $stack_depth...
3724              # And we have to return the return value now.
3725          @ret;
3726      } ## end if (wantarray)
3727  
3728      # Scalar context.
3729      else {
3730      if ( defined wantarray ) {
3731  
3732          # Save the value if it's wanted at all.
3733          $ret = &$sub;
3734      }
3735      else {
3736  
3737          # Void return, explicitly.
3738          &$sub;
3739          undef $ret;
3740      }
3741  
3742          # Pop the single-step value off the stack.
3743          $single |= $stack[ $stack_depth-- ];
3744  
3745          # If we're doing exit messages...
3746          (
3747              $frame & 4    # Extended messsages
3748              ? (
3749                  print_lineinfo( ' ' x $stack_depth, "out " ),
3750                  print_trace( $LINEINFO, -1, 1, 1, "$sub$al" )
3751                )
3752              : print_lineinfo( ' ' x $stack_depth, "exited $sub$al\n" )
3753  
3754                # Standard messages
3755            )
3756            if $frame & 2;
3757  
3758          # If we are supposed to show the return value... same as before.
3759          if ( $doret eq $stack_depth or $frame & 16 and defined wantarray ) {
3760              local $\ = '';
3761              my $fh = ( $doret eq $stack_depth ? $OUT : $LINEINFO );
3762              print $fh ( ' ' x $stack_depth ) if $frame & 16;
3763              print $fh (
3764                  defined wantarray
3765                  ? "scalar context return from $sub: "
3766                  : "void context return from $sub\n"
3767              );
3768              dumpit( $fh, $ret ) if defined wantarray;
3769              $doret = -2;
3770          } ## end if ($doret eq $stack_depth...
3771  
3772          # Return the appropriate scalar value.
3773          $ret;
3774      } ## end else [ if (wantarray)
3775  } ## end sub sub
3776  
3777  =head1 EXTENDED COMMAND HANDLING AND THE COMMAND API
3778  
3779  In Perl 5.8.0, there was a major realignment of the commands and what they did,
3780  Most of the changes were to systematize the command structure and to eliminate
3781  commands that threw away user input without checking.
3782  
3783  The following sections describe the code added to make it easy to support 
3784  multiple command sets with conflicting command names. This section is a start 
3785  at unifying all command processing to make it simpler to develop commands.
3786  
3787  Note that all the cmd_[a-zA-Z] subroutines require the command name, a line 
3788  number, and C<$dbline> (the current line) as arguments.
3789  
3790  Support functions in this section which have multiple modes of failure C<die> 
3791  on error; the rest simply return a false value.
3792  
3793  The user-interface functions (all of the C<cmd_*> functions) just output
3794  error messages.
3795  
3796  =head2 C<%set>
3797  
3798  The C<%set> hash defines the mapping from command letter to subroutine
3799  name suffix. 
3800  
3801  C<%set> is a two-level hash, indexed by set name and then by command name.
3802  Note that trying to set the CommandSet to C<foobar> simply results in the
3803  5.8.0 command set being used, since there's no top-level entry for C<foobar>.
3804  
3805  =cut 
3806  
3807  ### The API section
3808  
3809  my %set = (    #
3810      'pre580' => {
3811          'a' => 'pre580_a',
3812          'A' => 'pre580_null',
3813          'b' => 'pre580_b',
3814          'B' => 'pre580_null',
3815          'd' => 'pre580_null',
3816          'D' => 'pre580_D',
3817          'h' => 'pre580_h',
3818          'M' => 'pre580_null',
3819          'O' => 'o',
3820          'o' => 'pre580_null',
3821          'v' => 'M',
3822          'w' => 'v',
3823          'W' => 'pre580_W',
3824      },
3825      'pre590' => {
3826          '<'  => 'pre590_prepost',
3827          '<<' => 'pre590_prepost',
3828          '>'  => 'pre590_prepost',
3829          '>>' => 'pre590_prepost',
3830          '{'  => 'pre590_prepost',
3831          '{{' => 'pre590_prepost',
3832      },
3833  );
3834  
3835  =head2 C<cmd_wrapper()> (API)
3836  
3837  C<cmd_wrapper()> allows the debugger to switch command sets 
3838  depending on the value of the C<CommandSet> option. 
3839  
3840  It tries to look up the command in the C<%set> package-level I<lexical>
3841  (which means external entities can't fiddle with it) and create the name of 
3842  the sub to call based on the value found in the hash (if it's there). I<All> 
3843  of the commands to be handled in a set have to be added to C<%set>; if they 
3844  aren't found, the 5.8.0 equivalent is called (if there is one).
3845  
3846  This code uses symbolic references. 
3847  
3848  =cut
3849  
3850  sub cmd_wrapper {
3851      my $cmd      = shift;
3852      my $line     = shift;
3853      my $dblineno = shift;
3854  
3855      # Assemble the command subroutine's name by looking up the
3856      # command set and command name in %set. If we can't find it,
3857      # default to the older version of the command.
3858      my $call = 'cmd_'
3859        . ( $set{$CommandSet}{$cmd}
3860            || ( $cmd =~ /^[<>{]+/o ? 'prepost' : $cmd ) );
3861  
3862      # Call the command subroutine, call it by name.
3863      return &$call( $cmd, $line, $dblineno );
3864  } ## end sub cmd_wrapper
3865  
3866  =head3 C<cmd_a> (command)
3867  
3868  The C<a> command handles pre-execution actions. These are associated with a
3869  particular line, so they're stored in C<%dbline>. We default to the current 
3870  line if none is specified. 
3871  
3872  =cut
3873  
3874  sub cmd_a {
3875      my $cmd    = shift;
3876      my $line   = shift || '';    # [.|line] expr
3877      my $dbline = shift;
3878  
3879      # If it's dot (here), or not all digits,  use the current line.
3880      $line =~ s/^(\.|(?:[^\d]))/$dbline/;
3881  
3882      # Should be a line number followed by an expression.
3883      if ( $line =~ /^\s*(\d*)\s*(\S.+)/ ) {
3884          my ( $lineno, $expr ) = ( $1, $2 );
3885  
3886          # If we have an expression ...
3887          if ( length $expr ) {
3888  
3889              # ... but the line isn't breakable, complain.
3890              if ( $dbline[$lineno] == 0 ) {
3891                  print $OUT
3892                    "Line $lineno($dbline[$lineno]) does not have an action?\n";
3893              }
3894              else {
3895  
3896                  # It's executable. Record that the line has an action.
3897                  $had_breakpoints{$filename} |= 2;
3898  
3899                  # Remove any action, temp breakpoint, etc.
3900                  $dbline{$lineno} =~ s/\0[^\0]*//;
3901  
3902                  # Add the action to the line.
3903                  $dbline{$lineno} .= "\0" . action($expr);
3904              }
3905          } ## end if (length $expr)
3906      } ## end if ($line =~ /^\s*(\d*)\s*(\S.+)/)
3907      else {
3908  
3909          # Syntax wrong.
3910          print $OUT
3911            "Adding an action requires an optional lineno and an expression\n"
3912            ;    # hint
3913      }
3914  } ## end sub cmd_a
3915  
3916  =head3 C<cmd_A> (command)
3917  
3918  Delete actions. Similar to above, except the delete code is in a separate
3919  subroutine, C<delete_action>.
3920  
3921  =cut
3922  
3923  sub cmd_A {
3924      my $cmd    = shift;
3925      my $line   = shift || '';
3926      my $dbline = shift;
3927  
3928      # Dot is this line.
3929      $line =~ s/^\./$dbline/;
3930  
3931      # Call delete_action with a null param to delete them all.
3932      # The '1' forces the eval to be true. It'll be false only
3933      # if delete_action blows up for some reason, in which case
3934      # we print $@ and get out.
3935      if ( $line eq '*' ) {
3936          eval { &delete_action(); 1 } or print $OUT $@ and return;
3937      }
3938  
3939      # There's a real line  number. Pass it to delete_action.
3940      # Error trapping is as above.
3941      elsif ( $line =~ /^(\S.*)/ ) {
3942          eval { &delete_action($1); 1 } or print $OUT $@ and return;
3943      }
3944  
3945      # Swing and a miss. Bad syntax.
3946      else {
3947          print $OUT
3948            "Deleting an action requires a line number, or '*' for all\n" ; # hint
3949      }
3950  } ## end sub cmd_A
3951  
3952  =head3 C<delete_action> (API)
3953  
3954  C<delete_action> accepts either a line number or C<undef>. If a line number
3955  is specified, we check for the line being executable (if it's not, it 
3956  couldn't have had an  action). If it is, we just take the action off (this
3957  will get any kind of an action, including breakpoints).
3958  
3959  =cut
3960  
3961  sub delete_action {
3962      my $i = shift;
3963      if ( defined($i) ) {
3964  
3965          # Can there be one?
3966          die "Line $i has no action .\n" if $dbline[$i] == 0;
3967  
3968          # Nuke whatever's there.
3969          $dbline{$i} =~ s/\0[^\0]*//;    # \^a
3970          delete $dbline{$i} if $dbline{$i} eq '';
3971      }
3972      else {
3973          print $OUT "Deleting all actions...\n";
3974          for my $file ( keys %had_breakpoints ) {
3975              local *dbline = $main::{ '_<' . $file };
3976              my $max = $#dbline;
3977              my $was;
3978              for ( $i = 1 ; $i <= $max ; $i++ ) {
3979                  if ( defined $dbline{$i} ) {
3980                      $dbline{$i} =~ s/\0[^\0]*//;
3981                      delete $dbline{$i} if $dbline{$i} eq '';
3982                  }
3983                  unless ( $had_breakpoints{$file} &= ~2 ) {
3984                      delete $had_breakpoints{$file};
3985                  }
3986              } ## end for ($i = 1 ; $i <= $max...
3987          } ## end for my $file (keys %had_breakpoints)
3988      } ## end else [ if (defined($i))
3989  } ## end sub delete_action
3990  
3991  =head3 C<cmd_b> (command)
3992  
3993  Set breakpoints. Since breakpoints can be set in so many places, in so many
3994  ways, conditionally or not, the breakpoint code is kind of complex. Mostly,
3995  we try to parse the command type, and then shuttle it off to an appropriate
3996  subroutine to actually do the work of setting the breakpoint in the right
3997  place.
3998  
3999  =cut
4000  
4001  sub cmd_b {
4002      my $cmd    = shift;
4003      my $line   = shift;    # [.|line] [cond]
4004      my $dbline = shift;
4005  
4006      # Make . the current line number if it's there..
4007      $line =~ s/^\./$dbline/;
4008  
4009      # No line number, no condition. Simple break on current line.
4010      if ( $line =~ /^\s*$/ ) {
4011          &cmd_b_line( $dbline, 1 );
4012      }
4013  
4014      # Break on load for a file.
4015      elsif ( $line =~ /^load\b\s*(.*)/ ) {
4016          my $file = $1;
4017          $file =~ s/\s+$//;
4018          &cmd_b_load($file);
4019      }
4020  
4021      # b compile|postpone <some sub> [<condition>]
4022      # The interpreter actually traps this one for us; we just put the
4023      # necessary condition in the %postponed hash.
4024      elsif ( $line =~ /^(postpone|compile)\b\s*([':A-Za-z_][':\w]*)\s*(.*)/ ) {
4025  
4026          # Capture the condition if there is one. Make it true if none.
4027          my $cond = length $3 ? $3 : '1';
4028  
4029          # Save the sub name and set $break to 1 if $1 was 'postpone', 0
4030          # if it was 'compile'.
4031          my ( $subname, $break ) = ( $2, $1 eq 'postpone' );
4032  
4033          # De-Perl4-ify the name - ' separators to ::.
4034          $subname =~ s/\'/::/g;
4035  
4036          # Qualify it into the current package unless it's already qualified.
4037          $subname = "${'package'}::" . $subname unless $subname =~ /::/;
4038  
4039          # Add main if it starts with ::.
4040          $subname = "main" . $subname if substr( $subname, 0, 2 ) eq "::";
4041  
4042          # Save the break type for this sub.
4043          $postponed{$subname} = $break ? "break +0 if $cond" : "compile";
4044      } ## end elsif ($line =~ ...
4045  
4046      # b <sub name> [<condition>]
4047      elsif ( $line =~ /^([':A-Za-z_][':\w]*(?:\[.*\])?)\s*(.*)/ ) {
4048  
4049          #
4050          $subname = $1;
4051          $cond = length $2 ? $2 : '1';
4052          &cmd_b_sub( $subname, $cond );
4053      }
4054  
4055      # b <line> [<condition>].
4056      elsif ( $line =~ /^(\d*)\s*(.*)/ ) {
4057  
4058          # Capture the line. If none, it's the current line.
4059          $line = $1 || $dbline;
4060  
4061          # If there's no condition, make it '1'.
4062          $cond = length $2 ? $2 : '1';
4063  
4064          # Break on line.
4065          &cmd_b_line( $line, $cond );
4066      }
4067  
4068      # Line didn't make sense.
4069      else {
4070          print "confused by line($line)?\n";
4071      }
4072  } ## end sub cmd_b
4073  
4074  =head3 C<break_on_load> (API)
4075  
4076  We want to break when this file is loaded. Mark this file in the
4077  C<%break_on_load> hash, and note that it has a breakpoint in 
4078  C<%had_breakpoints>.
4079  
4080  =cut
4081  
4082  sub break_on_load {
4083      my $file = shift;
4084      $break_on_load{$file} = 1;
4085      $had_breakpoints{$file} |= 1;
4086  }
4087  
4088  =head3 C<report_break_on_load> (API)
4089  
4090  Gives us an array of filenames that are set to break on load. Note that 
4091  only files with break-on-load are in here, so simply showing the keys
4092  suffices.
4093  
4094  =cut
4095  
4096  sub report_break_on_load {
4097      sort keys %break_on_load;
4098  }
4099  
4100  =head3 C<cmd_b_load> (command)
4101  
4102  We take the file passed in and try to find it in C<%INC> (which maps modules
4103  to files they came from). We mark those files for break-on-load via 
4104  C<break_on_load> and then report that it was done.
4105  
4106  =cut
4107  
4108  sub cmd_b_load {
4109      my $file = shift;
4110      my @files;
4111  
4112      # This is a block because that way we can use a redo inside it
4113      # even without there being any looping structure at all outside it.
4114      {
4115  
4116          # Save short name and full path if found.
4117          push @files, $file;
4118          push @files, $::INC{$file} if $::INC{$file};
4119  
4120          # Tack on .pm and do it again unless there was a '.' in the name
4121          # already.
4122          $file .= '.pm', redo unless $file =~ /\./;
4123      }
4124  
4125      # Do the real work here.
4126      break_on_load($_) for @files;
4127  
4128      # All the files that have break-on-load breakpoints.
4129      @files = report_break_on_load;
4130  
4131      # Normalize for the purposes of our printing this.
4132      local $\ = '';
4133      local $" = ' ';
4134      print $OUT "Will stop on load of `@files'.\n";
4135  } ## end sub cmd_b_load
4136  
4137  =head3 C<$filename_error> (API package global)
4138  
4139  Several of the functions we need to implement in the API need to work both
4140  on the current file and on other files. We don't want to duplicate code, so
4141  C<$filename_error> is used to contain the name of the file that's being 
4142  worked on (if it's not the current one).
4143  
4144  We can now build functions in pairs: the basic function works on the current
4145  file, and uses C<$filename_error> as part of its error message. Since this is
4146  initialized to C<"">, no filename will appear when we are working on the
4147  current file.
4148  
4149  The second function is a wrapper which does the following:
4150  
4151  =over 4 
4152  
4153  =item *
4154  
4155  Localizes C<$filename_error> and sets it to the name of the file to be processed.
4156  
4157  =item *
4158  
4159  Localizes the C<*dbline> glob and reassigns it to point to the file we want to process. 
4160  
4161  =item *
4162  
4163  Calls the first function. 
4164  
4165  The first function works on the I<current> file (i.e., the one we changed to),
4166  and prints C<$filename_error> in the error message (the name of the other file)
4167  if it needs to. When the functions return, C<*dbline> is restored to point
4168  to the actual current file (the one we're executing in) and
4169  C<$filename_error> is restored to C<"">. This restores everything to
4170  the way it was before the second function was called at all.
4171  
4172  See the comments in C<breakable_line> and C<breakable_line_in_file> for more
4173  details.
4174  
4175  =back
4176  
4177  =cut
4178  
4179  $filename_error = '';
4180  
4181  =head3 breakable_line(from, to) (API)
4182  
4183  The subroutine decides whether or not a line in the current file is breakable.
4184  It walks through C<@dbline> within the range of lines specified, looking for
4185  the first line that is breakable.
4186  
4187  If C<$to> is greater than C<$from>, the search moves forwards, finding the 
4188  first line I<after> C<$to> that's breakable, if there is one.
4189  
4190  If C<$from> is greater than C<$to>, the search goes I<backwards>, finding the
4191  first line I<before> C<$to> that's breakable, if there is one.
4192  
4193  =cut
4194  
4195  sub breakable_line {
4196  
4197      my ( $from, $to ) = @_;
4198  
4199      # $i is the start point. (Where are the FORTRAN programs of yesteryear?)
4200      my $i = $from;
4201  
4202      # If there are at least 2 arguments, we're trying to search a range.
4203      if ( @_ >= 2 ) {
4204  
4205          # $delta is positive for a forward search, negative for a backward one.
4206          my $delta = $from < $to ? +1 : -1;
4207  
4208          # Keep us from running off the ends of the file.
4209          my $limit = $delta > 0 ? $#dbline : 1;
4210  
4211          # Clever test. If you're a mathematician, it's obvious why this
4212          # test works. If not:
4213          # If $delta is positive (going forward), $limit will be $#dbline.
4214          #    If $to is less than $limit, ($limit - $to) will be positive, times
4215          #    $delta of 1 (positive), so the result is > 0 and we should use $to
4216          #    as the stopping point.
4217          #
4218          #    If $to is greater than $limit, ($limit - $to) is negative,
4219          #    times $delta of 1 (positive), so the result is < 0 and we should
4220          #    use $limit ($#dbline) as the stopping point.
4221          #
4222          # If $delta is negative (going backward), $limit will be 1.
4223          #    If $to is zero, ($limit - $to) will be 1, times $delta of -1
4224          #    (negative) so the result is > 0, and we use $to as the stopping
4225          #    point.
4226          #
4227          #    If $to is less than zero, ($limit - $to) will be positive,
4228          #    times $delta of -1 (negative), so the result is not > 0, and
4229          #    we use $limit (1) as the stopping point.
4230          #
4231          #    If $to is 1, ($limit - $to) will zero, times $delta of -1
4232          #    (negative), still giving zero; the result is not > 0, and
4233          #    we use $limit (1) as the stopping point.
4234          #
4235          #    if $to is >1, ($limit - $to) will be negative, times $delta of -1
4236          #    (negative), giving a positive (>0) value, so we'll set $limit to
4237          #    $to.
4238  
4239          $limit = $to if ( $limit - $to ) * $delta > 0;
4240  
4241          # The real search loop.
4242          # $i starts at $from (the point we want to start searching from).
4243          # We move through @dbline in the appropriate direction (determined
4244          # by $delta: either -1 (back) or +1 (ahead).
4245          # We stay in as long as we haven't hit an executable line
4246          # ($dbline[$i] == 0 means not executable) and we haven't reached
4247          # the limit yet (test similar to the above).
4248          $i += $delta while $dbline[$i] == 0 and ( $limit - $i ) * $delta > 0;
4249  
4250      } ## end if (@_ >= 2)
4251  
4252      # If $i points to a line that is executable, return that.
4253      return $i unless $dbline[$i] == 0;
4254  
4255      # Format the message and print it: no breakable lines in range.
4256      my ( $pl, $upto ) = ( '', '' );
4257      ( $pl, $upto ) = ( 's', "..$to" ) if @_ >= 2 and $from != $to;
4258  
4259      # If there's a filename in filename_error, we'll see it.
4260      # If not, not.
4261      die "Line$pl $from$upto$filename_error not breakable\n";
4262  } ## end sub breakable_line
4263  
4264  =head3 breakable_line_in_filename(file, from, to) (API)
4265  
4266  Like C<breakable_line>, but look in another file.
4267  
4268  =cut
4269  
4270  sub breakable_line_in_filename {
4271  
4272      # Capture the file name.
4273      my ($f) = shift;
4274  
4275      # Swap the magic line array over there temporarily.
4276      local *dbline = $main::{ '_<' . $f };
4277  
4278      # If there's an error, it's in this other file.
4279      local $filename_error = " of `$f'";
4280  
4281      # Find the breakable line.
4282      breakable_line(@_);
4283  
4284      # *dbline and $filename_error get restored when this block ends.
4285  
4286  } ## end sub breakable_line_in_filename
4287  
4288  =head3 break_on_line(lineno, [condition]) (API)
4289  
4290  Adds a breakpoint with the specified condition (or 1 if no condition was 
4291  specified) to the specified line. Dies if it can't.
4292  
4293  =cut
4294  
4295  sub break_on_line {
4296      my ( $i, $cond ) = @_;
4297  
4298      # Always true if no condition supplied.
4299      $cond = 1 unless @_ >= 2;
4300  
4301      my $inii  = $i;
4302      my $after = '';
4303      my $pl    = '';
4304  
4305      # Woops, not a breakable line. $filename_error allows us to say
4306      # if it was in a different file.
4307      die "Line $i$filename_error not breakable.\n" if $dbline[$i] == 0;
4308  
4309      # Mark this file as having breakpoints in it.
4310      $had_breakpoints{$filename} |= 1;
4311  
4312      # If there is an action or condition here already ...
4313      if ( $dbline{$i} ) {
4314  
4315          # ... swap this condition for the existing one.
4316          $dbline{$i} =~ s/^[^\0]*/$cond/;
4317      }
4318      else {
4319  
4320          # Nothing here - just add the condition.
4321          $dbline{$i} = $cond;
4322      }
4323  } ## end sub break_on_line
4324  
4325  =head3 cmd_b_line(line, [condition]) (command)
4326  
4327  Wrapper for C<break_on_line>. Prints the failure message if it 
4328  doesn't work.
4329  
4330  =cut 
4331  
4332  sub cmd_b_line {
4333      eval { break_on_line(@_); 1 } or do {
4334          local $\ = '';
4335          print $OUT $@ and return;
4336      };
4337  } ## end sub cmd_b_line
4338  
4339  =head3 break_on_filename_line(file, line, [condition]) (API)
4340  
4341  Switches to the file specified and then calls C<break_on_line> to set 
4342  the breakpoint.
4343  
4344  =cut
4345  
4346  sub break_on_filename_line {
4347      my ( $f, $i, $cond ) = @_;
4348  
4349      # Always true if condition left off.
4350      $cond = 1 unless @_ >= 3;
4351  
4352      # Switch the magical hash temporarily.
4353      local *dbline = $main::{ '_<' . $f };
4354  
4355      # Localize the variables that break_on_line uses to make its message.
4356      local $filename_error = " of `$f'";
4357      local $filename       = $f;
4358  
4359      # Add the breakpoint.
4360      break_on_line( $i, $cond );
4361  } ## end sub break_on_filename_line
4362  
4363  =head3 break_on_filename_line_range(file, from, to, [condition]) (API)
4364  
4365  Switch to another file, search the range of lines specified for an 
4366  executable one, and put a breakpoint on the first one you find.
4367  
4368  =cut
4369  
4370  sub break_on_filename_line_range {
4371      my ( $f, $from, $to, $cond ) = @_;
4372  
4373      # Find a breakable line if there is one.
4374      my $i = breakable_line_in_filename( $f, $from, $to );
4375  
4376      # Always true if missing.
4377      $cond = 1 unless @_ >= 3;
4378  
4379      # Add the breakpoint.
4380      break_on_filename_line( $f, $i, $cond );
4381  } ## end sub break_on_filename_line_range
4382  
4383  =head3 subroutine_filename_lines(subname, [condition]) (API)
4384  
4385  Search for a subroutine within a given file. The condition is ignored.
4386  Uses C<find_sub> to locate the desired subroutine.
4387  
4388  =cut
4389  
4390  sub subroutine_filename_lines {
4391      my ( $subname, $cond ) = @_;
4392  
4393      # Returned value from find_sub() is fullpathname:startline-endline.
4394      # The match creates the list (fullpathname, start, end). Falling off
4395      # the end of the subroutine returns this implicitly.
4396      find_sub($subname) =~ /^(.*):(\d+)-(\d+)$/;
4397  } ## end sub subroutine_filename_lines
4398  
4399  =head3 break_subroutine(subname) (API)
4400  
4401  Places a break on the first line possible in the specified subroutine. Uses
4402  C<subroutine_filename_lines> to find the subroutine, and 
4403  C<break_on_filename_line_range> to place the break.
4404  
4405  =cut
4406  
4407  sub break_subroutine {
4408      my $subname = shift;
4409  
4410      # Get filename, start, and end.
4411      my ( $file, $s, $e ) = subroutine_filename_lines($subname)
4412        or die "Subroutine $subname not found.\n";
4413  
4414      # Null condition changes to '1' (always true).
4415      $cond = 1 unless @_ >= 2;
4416  
4417      # Put a break the first place possible in the range of lines
4418      # that make up this subroutine.
4419      break_on_filename_line_range( $file, $s, $e, @_ );
4420  } ## end sub break_subroutine
4421  
4422  =head3 cmd_b_sub(subname, [condition]) (command)
4423  
4424  We take the incoming subroutine name and fully-qualify it as best we can.
4425  
4426  =over 4
4427  
4428  =item 1. If it's already fully-qualified, leave it alone. 
4429  
4430  =item 2. Try putting it in the current package.
4431  
4432  =item 3. If it's not there, try putting it in CORE::GLOBAL if it exists there.
4433  
4434  =item 4. If it starts with '::', put it in 'main::'.
4435  
4436  =back
4437  
4438  After all this cleanup, we call C<break_subroutine> to try to set the 
4439  breakpoint.
4440  
4441  =cut
4442  
4443  sub cmd_b_sub {
4444      my ( $subname, $cond ) = @_;
4445  
4446      # Add always-true condition if we have none.
4447      $cond = 1 unless @_ >= 2;
4448  
4449      # If the subname isn't a code reference, qualify it so that
4450      # break_subroutine() will work right.
4451      unless ( ref $subname eq 'CODE' ) {
4452  
4453          # Not Perl4.
4454          $subname =~ s/\'/::/g;
4455          my $s = $subname;
4456  
4457          # Put it in this package unless it's already qualified.
4458          $subname = "${'package'}::" . $subname
4459            unless $subname =~ /::/;
4460  
4461          # Requalify it into CORE::GLOBAL if qualifying it into this
4462          # package resulted in its not being defined, but only do so
4463          # if it really is in CORE::GLOBAL.
4464          $subname = "CORE::GLOBAL::$s"
4465            if not defined &$subname
4466            and $s !~ /::/
4467            and defined &{"CORE::GLOBAL::$s"};
4468  
4469          # Put it in package 'main' if it has a leading ::.
4470          $subname = "main" . $subname if substr( $subname, 0, 2 ) eq "::";
4471  
4472      } ## end unless (ref $subname eq 'CODE')
4473  
4474      # Try to set the breakpoint.
4475      eval { break_subroutine( $subname, $cond ); 1 } or do {
4476          local $\ = '';
4477          print $OUT $@ and return;
4478        }
4479  } ## end sub cmd_b_sub
4480  
4481  =head3 C<cmd_B> - delete breakpoint(s) (command)
4482  
4483  The command mostly parses the command line and tries to turn the argument
4484  into a line spec. If it can't, it uses the current line. It then calls
4485  C<delete_breakpoint> to actually do the work.
4486  
4487  If C<*> is  specified, C<cmd_B> calls C<delete_breakpoint> with no arguments,
4488  thereby deleting all the breakpoints.
4489  
4490  =cut
4491  
4492  sub cmd_B {
4493      my $cmd = shift;
4494  
4495      # No line spec? Use dbline.
4496      # If there is one, use it if it's non-zero, or wipe it out if it is.
4497      my $line   = ( $_[0] =~ /^\./ ) ? $dbline : shift || '';
4498      my $dbline = shift;
4499  
4500      # If the line was dot, make the line the current one.
4501      $line =~ s/^\./$dbline/;
4502  
4503      # If it's * we're deleting all the breakpoints.
4504      if ( $line eq '*' ) {
4505          eval { &delete_breakpoint(); 1 } or print $OUT $@ and return;
4506      }
4507  
4508      # If there is a line spec, delete the breakpoint on that line.
4509      elsif ( $line =~ /^(\S.*)/ ) {
4510          eval { &delete_breakpoint( $line || $dbline ); 1 } or do {
4511              local $\ = '';
4512              print $OUT $@ and return;
4513          };
4514      } ## end elsif ($line =~ /^(\S.*)/)
4515  
4516      # No line spec.
4517      else {
4518          print $OUT
4519            "Deleting a breakpoint requires a line number, or '*' for all\n"
4520            ;    # hint
4521      }
4522  } ## end sub cmd_B
4523  
4524  =head3 delete_breakpoint([line]) (API)
4525  
4526  This actually does the work of deleting either a single breakpoint, or all
4527  of them.
4528  
4529  For a single line, we look for it in C<@dbline>. If it's nonbreakable, we
4530  just drop out with a message saying so. If it is, we remove the condition
4531  part of the 'condition\0action' that says there's a breakpoint here. If,
4532  after we've done that, there's nothing left, we delete the corresponding
4533  line in C<%dbline> to signal that no action needs to be taken for this line.
4534  
4535  For all breakpoints, we iterate through the keys of C<%had_breakpoints>, 
4536  which lists all currently-loaded files which have breakpoints. We then look
4537  at each line in each of these files, temporarily switching the C<%dbline>
4538  and C<@dbline> structures to point to the files in question, and do what
4539  we did in the single line case: delete the condition in C<@dbline>, and
4540  delete the key in C<%dbline> if nothing's left.
4541  
4542  We then wholesale delete C<%postponed>, C<%postponed_file>, and 
4543  C<%break_on_load>, because these structures contain breakpoints for files
4544  and code that haven't been loaded yet. We can just kill these off because there
4545  are no magical debugger structures associated with them.
4546  
4547  =cut
4548  
4549  sub delete_breakpoint {
4550      my $i = shift;
4551  
4552      # If we got a line, delete just that one.
4553      if ( defined($i) ) {
4554  
4555          # Woops. This line wasn't breakable at all.
4556          die "Line $i not breakable.\n" if $dbline[$i] == 0;
4557  
4558          # Kill the condition, but leave any action.
4559          $dbline{$i} =~ s/^[^\0]*//;
4560  
4561          # Remove the entry entirely if there's no action left.
4562          delete $dbline{$i} if $dbline{$i} eq '';
4563      }
4564  
4565      # No line; delete them all.
4566      else {
4567          print $OUT "Deleting all breakpoints...\n";
4568  
4569          # %had_breakpoints lists every file that had at least one
4570          # breakpoint in it.
4571          for my $file ( keys %had_breakpoints ) {
4572  
4573              # Switch to the desired file temporarily.
4574              local *dbline = $main::{ '_<' . $file };
4575  
4576              my $max = $#dbline;
4577              my $was;
4578  
4579              # For all lines in this file ...
4580              for ( $i = 1 ; $i <= $max ; $i++ ) {
4581  
4582                  # If there's a breakpoint or action on this line ...
4583                  if ( defined $dbline{$i} ) {
4584  
4585                      # ... remove the breakpoint.
4586                      $dbline{$i} =~ s/^[^\0]+//;
4587                      if ( $dbline{$i} =~ s/^\0?$// ) {
4588  
4589                          # Remove the entry altogether if no action is there.
4590                          delete $dbline{$i};
4591                      }
4592                  } ## end if (defined $dbline{$i...
4593              } ## end for ($i = 1 ; $i <= $max...
4594  
4595              # If, after we turn off the "there were breakpoints in this file"
4596              # bit, the entry in %had_breakpoints for this file is zero,
4597              # we should remove this file from the hash.
4598              if ( not $had_breakpoints{$file} &= ~1 ) {
4599                  delete $had_breakpoints{$file};
4600              }
4601          } ## end for my $file (keys %had_breakpoints)
4602  
4603          # Kill off all the other breakpoints that are waiting for files that
4604          # haven't been loaded yet.
4605          undef %postponed;
4606          undef %postponed_file;
4607          undef %break_on_load;
4608      } ## end else [ if (defined($i))
4609  } ## end sub delete_breakpoint
4610  
4611  =head3 cmd_stop (command)
4612  
4613  This is meant to be part of the new command API, but it isn't called or used
4614  anywhere else in the debugger. XXX It is probably meant for use in development
4615  of new commands.
4616  
4617  =cut
4618  
4619  sub cmd_stop {    # As on ^C, but not signal-safy.
4620      $signal = 1;
4621  }
4622  
4623  =head3 C<cmd_e> - threads
4624  
4625  Display the current thread id:
4626  
4627      e
4628  
4629  This could be how (when implemented) to send commands to this thread id (e cmd)
4630  or that thread id (e tid cmd).
4631  
4632  =cut
4633  
4634  sub cmd_e {
4635      my $cmd  = shift;
4636      my $line = shift;
4637      unless (exists($INC{'threads.pm'})) {
4638          print "threads not loaded($ENV{PERL5DB_THREADED})
4639          please run the debugger with PERL5DB_THREADED=1 set in the environment\n";
4640      } else {
4641          my $tid = threads->tid;
4642          print "thread id: $tid\n";
4643      }
4644  } ## end sub cmd_e
4645  
4646  =head3 C<cmd_E> - list of thread ids
4647  
4648  Display the list of available thread ids:
4649  
4650      E
4651  
4652  This could be used (when implemented) to send commands to all threads (E cmd).
4653  
4654  =cut
4655  
4656  sub cmd_E {
4657      my $cmd  = shift;
4658      my $line = shift;
4659      unless (exists($INC{'threads.pm'})) { 
4660          print "threads not loaded($ENV{PERL5DB_THREADED})
4661          please run the debugger with PERL5DB_THREADED=1 set in the environment\n";
4662      } else {
4663          my $tid = threads->tid;
4664          print "thread ids: ".join(', ', 
4665              map { ($tid == $_->tid ? '<'.$_->tid.'>' : $_->tid) } threads->list
4666          )."\n"; 
4667      }
4668  } ## end sub cmd_E
4669  
4670  =head3 C<cmd_h> - help command (command)
4671  
4672  Does the work of either
4673  
4674  =over 4
4675  
4676  =item *
4677  
4678  Showing all the debugger help
4679  
4680  =item *
4681  
4682  Showing help for a specific command
4683  
4684  =back
4685  
4686  =cut
4687  
4688  sub cmd_h {
4689      my $cmd = shift;
4690  
4691      # If we have no operand, assume null.
4692      my $line = shift || '';
4693  
4694      # 'h h'. Print the long-format help.
4695      if ( $line =~ /^h\s*/ ) {
4696          print_help($help);
4697      }
4698  
4699      # 'h <something>'. Search for the command and print only its help.
4700      elsif ( $line =~ /^(\S.*)$/ ) {
4701  
4702          # support long commands; otherwise bogus errors
4703          # happen when you ask for h on <CR> for example
4704          my $asked = $1;    # the command requested
4705                             # (for proper error message)
4706  
4707          my $qasked = quotemeta($asked);    # for searching; we don't
4708                                             # want to use it as a pattern.
4709                                             # XXX: finds CR but not <CR>
4710  
4711          # Search the help string for the command.
4712          if (
4713              $help =~ /^                    # Start of a line
4714                        <?                   # Optional '<'
4715                        (?:[IB]<)            # Optional markup
4716                        $qasked              # The requested command
4717                       /mx
4718            )
4719          {
4720  
4721              # It's there; pull it out and print it.
4722              while (
4723                  $help =~ /^
4724                                (<?            # Optional '<'
4725                                   (?:[IB]<)   # Optional markup
4726                                   $qasked     # The command
4727                                   ([\s\S]*?)  # Description line(s)
4728                                \n)            # End of last description line
4729                                (?!\s)         # Next line not starting with 
4730                                               # whitespace
4731                               /mgx
4732                )
4733              {
4734                  print_help($1);
4735              }
4736          }
4737  
4738          # Not found; not a debugger command.
4739          else {
4740              print_help("B<$asked> is not a debugger command.\n");
4741          }
4742      } ## end elsif ($line =~ /^(\S.*)$/)
4743  
4744      # 'h' - print the summary help.
4745      else {
4746          print_help($summary);
4747      }
4748  } ## end sub cmd_h
4749  
4750  =head3 C<cmd_i> - inheritance display
4751  
4752  Display the (nested) parentage of the module or object given.
4753  
4754  =cut
4755  
4756  sub cmd_i {
4757      my $cmd  = shift;
4758      my $line = shift;
4759      eval { require Class::ISA };
4760      if ($@) {
4761          &warn( $@ =~ /locate/
4762              ? "Class::ISA module not found - please install\n"
4763              : $@ );
4764      }
4765      else {
4766        ISA:
4767          foreach my $isa ( split( /\s+/, $line ) ) {
4768              $evalarg = $isa;
4769              ($isa) = &eval;
4770              no strict 'refs';
4771              print join(
4772                  ', ',
4773                  map {    # snaffled unceremoniously from Class::ISA
4774                      "$_"
4775                        . (
4776                          defined( ${"$_\::VERSION"} )
4777                          ? ' ' . ${"$_\::VERSION"}
4778                          : undef )
4779                    } Class::ISA::self_and_super_path(ref($isa) || $isa)
4780              );
4781              print "\n";
4782          }
4783      }
4784  } ## end sub cmd_i
4785  
4786  =head3 C<cmd_l> - list lines (command)
4787  
4788  Most of the command is taken up with transforming all the different line
4789  specification syntaxes into 'start-stop'. After that is done, the command
4790  runs a loop over C<@dbline> for the specified range of lines. It handles 
4791  the printing of each line and any markers (C<==E<gt>> for current line,
4792  C<b> for break on this line, C<a> for action on this line, C<:> for this
4793  line breakable). 
4794  
4795  We save the last line listed in the C<$start> global for further listing
4796  later.
4797  
4798  =cut
4799  
4800  sub cmd_l {
4801      my $current_line = $line;
4802      my $cmd  = shift;
4803      my $line = shift;
4804  
4805      # If this is '-something', delete any spaces after the dash.
4806      $line =~ s/^-\s*$/-/;
4807  
4808      # If the line is '$something', assume this is a scalar containing a
4809      # line number.
4810      if ( $line =~ /^(\$.*)/s ) {
4811  
4812          # Set up for DB::eval() - evaluate in *user* context.
4813          $evalarg = $1;
4814          # $evalarg = $2;
4815          my ($s) = &eval;
4816  
4817          # Ooops. Bad scalar.
4818          print( $OUT "Error: $@\n" ), next CMD if $@;
4819  
4820          # Good scalar. If it's a reference, find what it points to.
4821          $s = CvGV_name($s);
4822          print( $OUT "Interpreted as: $1 $s\n" );
4823          $line = "$1 $s";
4824  
4825          # Call self recursively to really do the command.
4826          &cmd_l( 'l', $s );
4827      } ## end if ($line =~ /^(\$.*)/s)
4828  
4829      # l name. Try to find a sub by that name.
4830      elsif ( $line =~ /^([\':A-Za-z_][\':\w]*(\[.*\])?)/s ) {
4831          my $s = $subname = $1;
4832  
4833          # De-Perl4.
4834          $subname =~ s/\'/::/;
4835  
4836          # Put it in this package unless it starts with ::.
4837          $subname = $package . "::" . $subname unless $subname =~ /::/;
4838  
4839          # Put it in CORE::GLOBAL if t doesn't start with :: and
4840          # it doesn't live in this package and it lives in CORE::GLOBAL.
4841          $subname = "CORE::GLOBAL::$s"
4842            if not defined &$subname
4843            and $s !~ /::/
4844            and defined &{"CORE::GLOBAL::$s"};
4845  
4846          # Put leading '::' names into 'main::'.
4847          $subname = "main" . $subname if substr( $subname, 0, 2 ) eq "::";
4848  
4849          # Get name:start-stop from find_sub, and break this up at
4850          # colons.
4851          @pieces = split( /:/, find_sub($subname) || $sub{$subname} );
4852  
4853          # Pull off start-stop.
4854          $subrange = pop @pieces;
4855  
4856          # If the name contained colons, the split broke it up.
4857          # Put it back together.
4858          $file = join( ':', @pieces );
4859  
4860          # If we're not in that file, switch over to it.
4861          if ( $file ne $filename ) {
4862              print $OUT "Switching to file '$file'.\n"
4863                unless $slave_editor;
4864  
4865              # Switch debugger's magic structures.
4866              *dbline   = $main::{ '_<' . $file };
4867              $max      = $#dbline;
4868              $filename = $file;
4869          } ## end if ($file ne $filename)
4870  
4871          # Subrange is 'start-stop'. If this is less than a window full,
4872          # swap it to 'start+', which will list a window from the start point.
4873          if ($subrange) {
4874              if ( eval($subrange) < -$window ) {
4875                  $subrange =~ s/-.*/+/;
4876              }
4877  
4878              # Call self recursively to list the range.
4879              $line = $subrange;
4880              &cmd_l( 'l', $subrange );
4881          } ## end if ($subrange)
4882  
4883          # Couldn't find it.
4884          else {
4885              print $OUT "Subroutine $subname not found.\n";
4886          }
4887      } ## end elsif ($line =~ /^([\':A-Za-z_][\':\w]*(\[.*\])?)/s)
4888  
4889      # Bare 'l' command.
4890      elsif ( $line =~ /^\s*$/ ) {
4891  
4892          # Compute new range to list.
4893          $incr = $window - 1;
4894          $line = $start . '-' . ( $start + $incr );
4895  
4896          # Recurse to do it.
4897          &cmd_l( 'l', $line );
4898      }
4899  
4900      # l [start]+number_of_lines
4901      elsif ( $line =~ /^(\d*)\+(\d*)$/ ) {
4902  
4903          # Don't reset start for 'l +nnn'.
4904          $start = $1 if $1;
4905  
4906          # Increment for list. Use window size if not specified.
4907          # (Allows 'l +' to work.)
4908          $incr = $2;
4909          $incr = $window - 1 unless $incr;
4910  
4911          # Create a line range we'll understand, and recurse to do it.
4912          $line = $start . '-' . ( $start + $incr );
4913          &cmd_l( 'l', $line );
4914      } ## end elsif ($line =~ /^(\d*)\+(\d*)$/)
4915  
4916      # l start-stop or l start,stop
4917      elsif ( $line =~ /^((-?[\d\$\.]+)([-,]([\d\$\.]+))?)?/ ) {
4918  
4919          # Determine end point; use end of file if not specified.
4920          $end = ( !defined $2 ) ? $max : ( $4 ? $4 : $2 );
4921  
4922          # Go on to the end, and then stop.
4923          $end = $max if $end > $max;
4924  
4925          # Determine start line.
4926          $i    = $2;
4927          $i    = $line if $i eq '.';
4928          $i    = 1 if $i < 1;
4929          $incr = $end - $i;
4930  
4931          # If we're running under a slave editor, force it to show the lines.
4932          if ($slave_editor) {
4933              print $OUT "\032\032$filename:$i:0\n";
4934              $i = $end;
4935          }
4936  
4937          # We're doing it ourselves. We want to show the line and special
4938          # markers for:
4939          # - the current line in execution
4940          # - whether a line is breakable or not
4941          # - whether a line has a break or not
4942          # - whether a line has an action or not
4943          else {
4944              for ( ; $i <= $end ; $i++ ) {
4945  
4946                  # Check for breakpoints and actions.
4947                  my ( $stop, $action );
4948                  ( $stop, $action ) = split( /\0/, $dbline{$i} )
4949                    if $dbline{$i};
4950  
4951                  # ==> if this is the current line in execution,
4952                  # : if it's breakable.
4953                  $arrow =
4954                    ( $i == $current_line and $filename eq $filename_ini )
4955                    ? '==>'
4956                    : ( $dbline[$i] + 0 ? ':' : ' ' );
4957  
4958                  # Add break and action indicators.
4959                  $arrow .= 'b' if $stop;
4960                  $arrow .= 'a' if $action;
4961  
4962                  # Print the line.
4963                  print $OUT "$i$arrow\t", $dbline[$i];
4964  
4965                  # Move on to the next line. Drop out on an interrupt.
4966                  $i++, last if $signal;
4967              } ## end for (; $i <= $end ; $i++)
4968  
4969              # Line the prompt up; print a newline if the last line listed
4970              # didn't have a newline.
4971              print $OUT "\n" unless $dbline[ $i - 1 ] =~ /\n$/;
4972          } ## end else [ if ($slave_editor)
4973  
4974          # Save the point we last listed to in case another relative 'l'
4975          # command is desired. Don't let it run off the end.
4976          $start = $i;
4977          $start = $max if $start > $max;
4978      } ## end elsif ($line =~ /^((-?[\d\$\.]+)([-,]([\d\$\.]+))?)?/)
4979  } ## end sub cmd_l
4980  
4981  =head3 C<cmd_L> - list breakpoints, actions, and watch expressions (command)
4982  
4983  To list breakpoints, the command has to look determine where all of them are
4984  first. It starts a C<%had_breakpoints>, which tells us what all files have
4985  breakpoints and/or actions. For each file, we switch the C<*dbline> glob (the 
4986  magic source and breakpoint data structures) to the file, and then look 
4987  through C<%dbline> for lines with breakpoints and/or actions, listing them 
4988  out. We look through C<%postponed> not-yet-compiled subroutines that have 
4989  breakpoints, and through C<%postponed_file> for not-yet-C<require>'d files 
4990  that have breakpoints.
4991  
4992  Watchpoints are simpler: we just list the entries in C<@to_watch>.
4993  
4994  =cut
4995  
4996  sub cmd_L {
4997      my $cmd = shift;
4998  
4999      # If no argument, list everything. Pre-5.8.0 version always lists
5000      # everything
5001      my $arg = shift || 'abw';
5002      $arg = 'abw' unless $CommandSet eq '580';    # sigh...
5003  
5004      # See what is wanted.
5005      my $action_wanted = ( $arg =~ /a/ ) ? 1 : 0;
5006      my $break_wanted  = ( $arg =~ /b/ ) ? 1 : 0;
5007      my $watch_wanted  = ( $arg =~ /w/ ) ? 1 : 0;
5008  
5009      # Breaks and actions are found together, so we look in the same place
5010      # for both.
5011      if ( $break_wanted or $action_wanted ) {
5012  
5013          # Look in all the files with breakpoints...
5014          for my $file ( keys %had_breakpoints ) {
5015  
5016              # Temporary switch to this file.
5017              local *dbline = $main::{ '_<' . $file };
5018  
5019              # Set up to look through the whole file.
5020              my $max = $#dbline;
5021              my $was;    # Flag: did we print something
5022                          # in this file?
5023  
5024              # For each line in the file ...
5025              for ( $i = 1 ; $i <= $max ; $i++ ) {
5026  
5027                  # We've got something on this line.
5028                  if ( defined $dbline{$i} ) {
5029  
5030                      # Print the header if we haven't.
5031                      print $OUT "$file:\n" unless $was++;
5032  
5033                      # Print the line.
5034                      print $OUT " $i:\t", $dbline[$i];
5035  
5036                      # Pull out the condition and the action.
5037                      ( $stop, $action ) = split( /\0/, $dbline{$i} );
5038  
5039                      # Print the break if there is one and it's wanted.
5040                      print $OUT "   break if (", $stop, ")\n"
5041                        if $stop
5042                        and $break_wanted;
5043  
5044                      # Print the action if there is one and it's wanted.
5045                      print $OUT "   action:  ", $action, "\n"
5046                        if $action
5047                        and $action_wanted;
5048  
5049                      # Quit if the user hit interrupt.
5050                      last if $signal;
5051                  } ## end if (defined $dbline{$i...
5052              } ## end for ($i = 1 ; $i <= $max...
5053          } ## end for my $file (keys %had_breakpoints)
5054      } ## end if ($break_wanted or $action_wanted)
5055  
5056      # Look for breaks in not-yet-compiled subs:
5057      if ( %postponed and $break_wanted ) {
5058          print $OUT "Postponed breakpoints in subroutines:\n";
5059          my $subname;
5060          for $subname ( keys %postponed ) {
5061              print $OUT " $subname\t$postponed{$subname}\n";
5062              last if $signal;
5063          }
5064      } ## end if (%postponed and $break_wanted)
5065  
5066      # Find files that have not-yet-loaded breaks:
5067      my @have = map {    # Combined keys
5068          keys %{ $postponed_file{$_} }
5069      } keys %postponed_file;
5070  
5071      # If there are any, list them.
5072      if ( @have and ( $break_wanted or $action_wanted ) ) {
5073          print $OUT "Postponed breakpoints in files:\n";
5074          my ( $file, $line );
5075  
5076          for $file ( keys %postponed_file ) {
5077              my $db = $postponed_file{$file};
5078              print $OUT " $file:\n";
5079              for $line ( sort { $a <=> $b } keys %$db ) {
5080                  print $OUT "  $line:\n";
5081                  my ( $stop, $action ) = split( /\0/, $$db{$line} );
5082                  print $OUT "    break if (", $stop, ")\n"
5083                    if $stop
5084                    and $break_wanted;
5085                  print $OUT "    action:  ", $action, "\n"
5086                    if $action
5087                    and $action_wanted;
5088                  last if $signal;
5089              } ## end for $line (sort { $a <=>...
5090              last if $signal;
5091          } ## end for $file (keys %postponed_file)
5092      } ## end if (@have and ($break_wanted...
5093      if ( %break_on_load and $break_wanted ) {
5094          print $OUT "Breakpoints on load:\n";
5095          my $file;
5096          for $file ( keys %break_on_load ) {
5097              print $OUT " $file\n";
5098              last if $signal;
5099          }
5100      } ## end if (%break_on_load and...
5101      if ($watch_wanted) {
5102          if ( $trace & 2 ) {
5103              print $OUT "Watch-expressions:\n" if @to_watch;
5104              for my $expr (@to_watch) {
5105                  print $OUT " $expr\n";
5106                  last if $signal;
5107              }
5108          } ## end if ($trace & 2)
5109      } ## end if ($watch_wanted)
5110  } ## end sub cmd_L
5111  
5112  =head3 C<cmd_M> - list modules (command)
5113  
5114  Just call C<list_modules>.
5115  
5116  =cut
5117  
5118  sub cmd_M {
5119      &list_modules();
5120  }
5121  
5122  =head3 C<cmd_o> - options (command)
5123  
5124  If this is just C<o> by itself, we list the current settings via 
5125  C<dump_option>. If there's a nonblank value following it, we pass that on to
5126  C<parse_options> for processing.
5127  
5128  =cut
5129  
5130  sub cmd_o {
5131      my $cmd = shift;
5132      my $opt = shift || '';    # opt[=val]
5133  
5134      # Nonblank. Try to parse and process.
5135      if ( $opt =~ /^(\S.*)/ ) {
5136          &parse_options($1);
5137      }
5138  
5139      # Blank. List the current option settings.
5140      else {
5141          for (@options) {
5142              &dump_option($_);
5143          }
5144      }
5145  } ## end sub cmd_o
5146  
5147  =head3 C<cmd_O> - nonexistent in 5.8.x (command)
5148  
5149  Advises the user that the O command has been renamed.
5150  
5151  =cut
5152  
5153  sub cmd_O {
5154      print $OUT "The old O command is now the o command.\n";             # hint
5155      print $OUT "Use 'h' to get current command help synopsis or\n";     #
5156      print $OUT "use 'o CommandSet=pre580' to revert to old usage\n";    #
5157  }
5158  
5159  =head3 C<cmd_v> - view window (command)
5160  
5161  Uses the C<$preview> variable set in the second C<BEGIN> block (q.v.) to
5162  move back a few lines to list the selected line in context. Uses C<cmd_l>
5163  to do the actual listing after figuring out the range of line to request.
5164  
5165  =cut 
5166  
5167  sub cmd_v {
5168      my $cmd  = shift;
5169      my $line = shift;
5170  
5171      # Extract the line to list around. (Astute readers will have noted that
5172      # this pattern will match whether or not a numeric line is specified,
5173      # which means that we'll always enter this loop (though a non-numeric
5174      # argument results in no action at all)).
5175      if ( $line =~ /^(\d*)$/ ) {
5176  
5177          # Total number of lines to list (a windowful).
5178          $incr = $window - 1;
5179  
5180          # Set the start to the argument given (if there was one).
5181          $start = $1 if $1;
5182  
5183          # Back up by the context amount.
5184          $start -= $preview;
5185  
5186          # Put together a linespec that cmd_l will like.
5187          $line = $start . '-' . ( $start + $incr );
5188  
5189          # List the lines.
5190          &cmd_l( 'l', $line );
5191      } ## end if ($line =~ /^(\d*)$/)
5192  } ## end sub cmd_v
5193  
5194  =head3 C<cmd_w> - add a watch expression (command)
5195  
5196  The 5.8 version of this command adds a watch expression if one is specified;
5197  it does nothing if entered with no operands.
5198  
5199  We extract the expression, save it, evaluate it in the user's context, and
5200  save the value. We'll re-evaluate it each time the debugger passes a line,
5201  and will stop (see the code at the top of the command loop) if the value
5202  of any of the expressions changes.
5203  
5204  =cut
5205  
5206  sub cmd_w {
5207      my $cmd = shift;
5208  
5209      # Null expression if no arguments.
5210      my $expr = shift || '';
5211  
5212      # If expression is not null ...
5213      if ( $expr =~ /^(\S.*)/ ) {
5214  
5215          # ... save it.
5216          push @to_watch, $expr;
5217  
5218          # Parameterize DB::eval and call it to get the expression's value
5219          # in the user's context. This version can handle expressions which
5220          # return a list value.
5221          $evalarg = $expr;
5222          my ($val) = join( ' ', &eval );
5223          $val = ( defined $val ) ? "'$val'" : 'undef';
5224  
5225          # Save the current value of the expression.
5226          push @old_watch, $val;
5227  
5228          # We are now watching expressions.
5229          $trace |= 2;
5230      } ## end if ($expr =~ /^(\S.*)/)
5231  
5232      # You have to give one to get one.
5233      else {
5234          print $OUT "Adding a watch-expression requires an expression\n";  # hint
5235      }
5236  } ## end sub cmd_w
5237  
5238  =head3 C<cmd_W> - delete watch expressions (command)
5239  
5240  This command accepts either a watch expression to be removed from the list
5241  of watch expressions, or C<*> to delete them all.
5242  
5243  If C<*> is specified, we simply empty the watch expression list and the 
5244  watch expression value list. We also turn off the bit that says we've got 
5245  watch expressions.
5246  
5247  If an expression (or partial expression) is specified, we pattern-match
5248  through the expressions and remove the ones that match. We also discard
5249  the corresponding values. If no watch expressions are left, we turn off 
5250  the I<watching expressions> bit.
5251  
5252  =cut
5253  
5254  sub cmd_W {
5255      my $cmd  = shift;
5256      my $expr = shift || '';
5257  
5258      # Delete them all.
5259      if ( $expr eq '*' ) {
5260  
5261          # Not watching now.
5262          $trace &= ~2;
5263  
5264          print $OUT "Deleting all watch expressions ...\n";
5265  
5266          # And all gone.
5267          @to_watch = @old_watch = ();
5268      }
5269  
5270      # Delete one of them.
5271      elsif ( $expr =~ /^(\S.*)/ ) {
5272  
5273          # Where we are in the list.
5274          my $i_cnt = 0;
5275  
5276          # For each expression ...
5277          foreach (@to_watch) {
5278              my $val = $to_watch[$i_cnt];
5279  
5280              # Does this one match the command argument?
5281              if ( $val eq $expr ) {    # =~ m/^\Q$i$/) {
5282                                        # Yes. Turn it off, and its value too.
5283                  splice( @to_watch,  $i_cnt, 1 );
5284                  splice( @old_watch, $i_cnt, 1 );
5285              }
5286              $i_cnt++;
5287          } ## end foreach (@to_watch)
5288  
5289          # We don't bother to turn watching off because
5290          #  a) we don't want to stop calling watchfunction() it it exists
5291          #  b) foreach over a null list doesn't do anything anyway
5292  
5293      } ## end elsif ($expr =~ /^(\S.*)/)
5294  
5295      # No command arguments entered.
5296      else {
5297          print $OUT
5298            "Deleting a watch-expression requires an expression, or '*' for all\n"
5299            ;    # hint
5300      }
5301  } ## end sub cmd_W
5302  
5303  ### END of the API section
5304  
5305  =head1 SUPPORT ROUTINES
5306  
5307  These are general support routines that are used in a number of places
5308  throughout the debugger.
5309  
5310  =head2 save
5311  
5312  save() saves the user's versions of globals that would mess us up in C<@saved>,
5313  and installs the versions we like better. 
5314  
5315  =cut
5316  
5317  sub save {
5318  
5319      # Save eval failure, command failure, extended OS error, output field
5320      # separator, input record separator, output record separator and
5321      # the warning setting.
5322      @saved = ( $@, $!, $^E, $,, $/, $\, $^W );
5323  
5324      $,  = "";      # output field separator is null string
5325      $/  = "\n";    # input record separator is newline
5326      $\  = "";      # output record separator is null string
5327      $^W = 0;       # warnings are off
5328  } ## end sub save
5329  
5330  =head2 C<print_lineinfo> - show where we are now
5331  
5332  print_lineinfo prints whatever it is that it is handed; it prints it to the
5333  C<$LINEINFO> filehandle instead of just printing it to STDOUT. This allows
5334  us to feed line information to a slave editor without messing up the 
5335  debugger output.
5336  
5337  =cut
5338  
5339  sub print_lineinfo {
5340  
5341      # Make the terminal sensible if we're not the primary debugger.
5342      resetterm(1) if $LINEINFO eq $OUT and $term_pid != $$;
5343      local $\ = '';
5344      local $, = '';
5345      print $LINEINFO @_;
5346  } ## end sub print_lineinfo
5347  
5348  =head2 C<postponed_sub>
5349  
5350  Handles setting postponed breakpoints in subroutines once they're compiled.
5351  For breakpoints, we use C<DB::find_sub> to locate the source file and line
5352  range for the subroutine, then mark the file as having a breakpoint,
5353  temporarily switch the C<*dbline> glob over to the source file, and then 
5354  search the given range of lines to find a breakable line. If we find one,
5355  we set the breakpoint on it, deleting the breakpoint from C<%postponed>.
5356  
5357  =cut 
5358  
5359  # The following takes its argument via $evalarg to preserve current @_
5360  
5361  sub postponed_sub {
5362  
5363      # Get the subroutine name.
5364      my $subname = shift;
5365  
5366      # If this is a 'break +<n> if <condition>' ...
5367      if ( $postponed{$subname} =~ s/^break\s([+-]?\d+)\s+if\s// ) {
5368  
5369          # If there's no offset, use '+0'.
5370          my $offset = $1 || 0;
5371  
5372          # find_sub's value is 'fullpath-filename:start-stop'. It's
5373          # possible that the filename might have colons in it too.
5374          my ( $file, $i ) = ( find_sub($subname) =~ /^(.*):(\d+)-.*$/ );
5375          if ($i) {
5376  
5377              # We got the start line. Add the offset '+<n>' from
5378              # $postponed{subname}.
5379              $i += $offset;
5380  
5381              # Switch to the file this sub is in, temporarily.
5382              local *dbline = $main::{ '_<' . $file };
5383  
5384              # No warnings, please.
5385              local $^W = 0;    # != 0 is magical below
5386  
5387              # This file's got a breakpoint in it.
5388              $had_breakpoints{$file} |= 1;
5389  
5390              # Last line in file.
5391              my $max = $#dbline;
5392  
5393              # Search forward until we hit a breakable line or get to
5394              # the end of the file.
5395              ++$i until $dbline[$i] != 0 or $i >= $max;
5396  
5397              # Copy the breakpoint in and delete it from %postponed.
5398              $dbline{$i} = delete $postponed{$subname};
5399          } ## end if ($i)
5400  
5401          # find_sub didn't find the sub.
5402          else {
5403              local $\ = '';
5404              print $OUT "Subroutine $subname not found.\n";
5405          }
5406          return;
5407      } ## end if ($postponed{$subname...
5408      elsif ( $postponed{$subname} eq 'compile' ) { $signal = 1 }
5409  
5410      #print $OUT "In postponed_sub for `$subname'.\n";
5411  } ## end sub postponed_sub
5412  
5413  =head2 C<postponed>
5414  
5415  Called after each required file is compiled, but before it is executed;
5416  also called if the name of a just-compiled subroutine is a key of 
5417  C<%postponed>. Propagates saved breakpoints (from C<b compile>, C<b load>,
5418  etc.) into the just-compiled code.
5419  
5420  If this is a C<require>'d file, the incoming parameter is the glob 
5421  C<*{"_<$filename"}>, with C<$filename> the name of the C<require>'d file.
5422  
5423  If it's a subroutine, the incoming parameter is the subroutine name.
5424  
5425  =cut
5426  
5427  sub postponed {
5428  
5429      # If there's a break, process it.
5430      if ($ImmediateStop) {
5431  
5432          # Right, we've stopped. Turn it off.
5433          $ImmediateStop = 0;
5434  
5435          # Enter the command loop when DB::DB gets called.
5436          $signal = 1;
5437      }
5438  
5439      # If this is a subroutine, let postponed_sub() deal with it.
5440      return &postponed_sub unless ref \$_[0] eq 'GLOB';
5441  
5442      # Not a subroutine. Deal with the file.
5443      local *dbline = shift;
5444      my $filename = $dbline;
5445      $filename =~ s/^_<//;
5446      local $\ = '';
5447      $signal = 1, print $OUT "'$filename' loaded...\n"
5448        if $break_on_load{$filename};
5449      print_lineinfo( ' ' x $stack_depth, "Package $filename.\n" ) if $frame;
5450  
5451      # Do we have any breakpoints to put in this file?
5452      return unless $postponed_file{$filename};
5453  
5454      # Yes. Mark this file as having breakpoints.
5455      $had_breakpoints{$filename} |= 1;
5456  
5457      # "Cannot be done: unsufficient magic" - we can't just put the
5458      # breakpoints saved in %postponed_file into %dbline by assigning
5459      # the whole hash; we have to do it one item at a time for the
5460      # breakpoints to be set properly.
5461      #%dbline = %{$postponed_file{$filename}};
5462  
5463      # Set the breakpoints, one at a time.
5464      my $key;
5465  
5466      for $key ( keys %{ $postponed_file{$filename} } ) {
5467  
5468          # Stash the saved breakpoint into the current file's magic line array.
5469          $dbline{$key} = ${ $postponed_file{$filename} }{$key};
5470      }
5471  
5472      # This file's been compiled; discard the stored breakpoints.
5473      delete $postponed_file{$filename};
5474  
5475  } ## end sub postponed
5476  
5477  =head2 C<dumpit>
5478  
5479  C<dumpit> is the debugger's wrapper around dumpvar.pl. 
5480  
5481  It gets a filehandle (to which C<dumpvar.pl>'s output will be directed) and
5482  a reference to a variable (the thing to be dumped) as its input. 
5483  
5484  The incoming filehandle is selected for output (C<dumpvar.pl> is printing to
5485  the currently-selected filehandle, thank you very much). The current
5486  values of the package globals C<$single> and C<$trace> are backed up in 
5487  lexicals, and they are turned off (this keeps the debugger from trying
5488  to single-step through C<dumpvar.pl> (I think.)). C<$frame> is localized to
5489  preserve its current value and it is set to zero to prevent entry/exit
5490  messages from printing, and C<$doret> is localized as well and set to -2 to 
5491  prevent return values from being shown.
5492  
5493  C<dumpit()> then checks to see if it needs to load C<dumpvar.pl> and 
5494  tries to load it (note: if you have a C<dumpvar.pl>  ahead of the 
5495  installed version in C<@INC>, yours will be used instead. Possible security 
5496  problem?).
5497  
5498  It then checks to see if the subroutine C<main::dumpValue> is now defined
5499  (it should have been defined by C<dumpvar.pl>). If it has, C<dumpit()> 
5500  localizes the globals necessary for things to be sane when C<main::dumpValue()>
5501  is called, and picks up the variable to be dumped from the parameter list. 
5502  
5503  It checks the package global C<%options> to see if there's a C<dumpDepth> 
5504  specified. If not, -1 is assumed; if so, the supplied value gets passed on to 
5505  C<dumpvar.pl>. This tells C<dumpvar.pl> where to leave off when dumping a 
5506  structure: -1 means dump everything.
5507  
5508  C<dumpValue()> is then called if possible; if not, C<dumpit()>just prints a 
5509  warning.
5510  
5511  In either case, C<$single>, C<$trace>, C<$frame>, and C<$doret> are restored
5512  and we then return to the caller.
5513  
5514  =cut
5515  
5516  sub dumpit {
5517  
5518      # Save the current output filehandle and switch to the one
5519      # passed in as the first parameter.
5520      local ($savout) = select(shift);
5521  
5522      # Save current settings of $single and $trace, and then turn them off.
5523      my $osingle = $single;
5524      my $otrace  = $trace;
5525      $single = $trace = 0;
5526  
5527      # XXX Okay, what do $frame and $doret do, again?
5528      local $frame = 0;
5529      local $doret = -2;
5530  
5531      # Load dumpvar.pl unless we've already got the sub we need from it.
5532      unless ( defined &main::dumpValue ) {
5533          do 'dumpvar.pl' or die $@;
5534      }
5535  
5536      # If the load succeeded (or we already had dumpvalue()), go ahead
5537      # and dump things.
5538      if ( defined &main::dumpValue ) {
5539          local $\ = '';
5540          local $, = '';
5541          local $" = ' ';
5542          my $v = shift;
5543          my $maxdepth = shift || $option{dumpDepth};
5544          $maxdepth = -1 unless defined $maxdepth;    # -1 means infinite depth
5545          &main::dumpValue( $v, $maxdepth );
5546      } ## end if (defined &main::dumpValue)
5547  
5548      # Oops, couldn't load dumpvar.pl.
5549      else {
5550          local $\ = '';
5551          print $OUT "dumpvar.pl not available.\n";
5552      }
5553  
5554      # Reset $single and $trace to their old values.
5555      $single = $osingle;
5556      $trace  = $otrace;
5557  
5558      # Restore the old filehandle.
5559      select($savout);
5560  } ## end sub dumpit
5561  
5562  =head2 C<print_trace>
5563  
5564  C<print_trace>'s job is to print a stack trace. It does this via the 
5565  C<dump_trace> routine, which actually does all the ferreting-out of the
5566  stack trace data. C<print_trace> takes care of formatting it nicely and
5567  printing it to the proper filehandle.
5568  
5569  Parameters:
5570  
5571  =over 4
5572  
5573  =item *
5574  
5575  The filehandle to print to.
5576  
5577  =item *
5578  
5579  How many frames to skip before starting trace.
5580  
5581  =item *
5582  
5583  How many frames to print.
5584  
5585  =item *
5586  
5587  A flag: if true, print a I<short> trace without filenames, line numbers, or arguments
5588  
5589  =back
5590  
5591  The original comment below seems to be noting that the traceback may not be
5592  correct if this routine is called in a tied method.
5593  
5594  =cut
5595  
5596  # Tied method do not create a context, so may get wrong message:
5597  
5598  sub print_trace {
5599      local $\ = '';
5600      my $fh = shift;
5601  
5602      # If this is going to a slave editor, but we're not the primary
5603      # debugger, reset it first.
5604      resetterm(1)
5605        if $fh        eq $LINEINFO    # slave editor
5606        and $LINEINFO eq $OUT         # normal output
5607        and $term_pid != $$;          # not the primary
5608  
5609      # Collect the actual trace information to be formatted.
5610      # This is an array of hashes of subroutine call info.
5611      my @sub = dump_trace( $_[0] + 1, $_[1] );
5612  
5613      # Grab the "short report" flag from @_.
5614      my $short = $_[2];              # Print short report, next one for sub name
5615  
5616      # Run through the traceback info, format it, and print it.
5617      my $s;
5618      for ( $i = 0 ; $i <= $#sub ; $i++ ) {
5619  
5620          # Drop out if the user has lost interest and hit control-C.
5621          last if $signal;
5622  
5623          # Set the separator so arrys print nice.
5624          local $" = ', ';
5625  
5626          # Grab and stringify the arguments if they are there.
5627          my $args =
5628            defined $sub[$i]{args}
5629            ? "(@{ $sub[$i]{args} })"
5630            : '';
5631  
5632          # Shorten them up if $maxtrace says they're too long.
5633          $args = ( substr $args, 0, $maxtrace - 3 ) . '...'
5634            if length $args > $maxtrace;
5635  
5636          # Get the file name.
5637          my $file = $sub[$i]{file};
5638  
5639          # Put in a filename header if short is off.
5640          $file = $file eq '-e' ? $file : "file `$file'" unless $short;
5641  
5642          # Get the actual sub's name, and shorten to $maxtrace's requirement.
5643          $s = $sub[$i]{sub};
5644          $s = ( substr $s, 0, $maxtrace - 3 ) . '...' if length $s > $maxtrace;
5645  
5646          # Short report uses trimmed file and sub names.
5647          if ($short) {
5648              my $sub = @_ >= 4 ? $_[3] : $s;
5649              print $fh "$sub[$i]{context}=$sub$args from $file:$sub[$i]{line}\n";
5650          } ## end if ($short)
5651  
5652          # Non-short report includes full names.
5653          else {
5654              print $fh "$sub[$i]{context} = $s$args"
5655                . " called from $file"
5656                . " line $sub[$i]{line}\n";
5657          }
5658      } ## end for ($i = 0 ; $i <= $#sub...
5659  } ## end sub print_trace
5660  
5661  =head2 dump_trace(skip[,count])
5662  
5663  Actually collect the traceback information available via C<caller()>. It does
5664  some filtering and cleanup of the data, but mostly it just collects it to
5665  make C<print_trace()>'s job easier.
5666  
5667  C<skip> defines the number of stack frames to be skipped, working backwards
5668  from the most current. C<count> determines the total number of frames to 
5669  be returned; all of them (well, the first 10^9) are returned if C<count>
5670  is omitted.
5671  
5672  This routine returns a list of hashes, from most-recent to least-recent
5673  stack frame. Each has the following keys and values:
5674  
5675  =over 4
5676  
5677  =item * C<context> - C<.> (null), C<$> (scalar), or C<@> (array)
5678  
5679  =item * C<sub> - subroutine name, or C<eval> information
5680  
5681  =item * C<args> - undef, or a reference to an array of arguments
5682  
5683  =item * C<file> - the file in which this item was defined (if any)
5684  
5685  =item * C<line> - the line on which it was defined
5686  
5687  =back
5688  
5689  =cut
5690  
5691  sub dump_trace {
5692  
5693      # How many levels to skip.
5694      my $skip = shift;
5695  
5696      # How many levels to show. (1e9 is a cheap way of saying "all of them";
5697      # it's unlikely that we'll have more than a billion stack frames. If you
5698      # do, you've got an awfully big machine...)
5699      my $count = shift || 1e9;
5700  
5701      # We increment skip because caller(1) is the first level *back* from
5702      # the current one.  Add $skip to the count of frames so we have a
5703      # simple stop criterion, counting from $skip to $count+$skip.
5704      $skip++;
5705      $count += $skip;
5706  
5707      # These variables are used to capture output from caller();
5708      my ( $p, $file, $line, $sub, $h, $context );
5709  
5710      my ( $e, $r, @a, @sub, $args );
5711  
5712      # XXX Okay... why'd we do that?
5713      my $nothard = not $frame & 8;
5714      local $frame = 0;
5715  
5716      # Do not want to trace this.
5717      my $otrace = $trace;
5718      $trace = 0;
5719  
5720      # Start out at the skip count.
5721      # If we haven't reached the number of frames requested, and caller() is
5722      # still returning something, stay in the loop. (If we pass the requested
5723      # number of stack frames, or we run out - caller() returns nothing - we
5724      # quit.
5725      # Up the stack frame index to go back one more level each time.
5726      for (
5727          $i = $skip ;
5728          $i < $count
5729          and ( $p, $file, $line, $sub, $h, $context, $e, $r ) = caller($i) ;
5730          $i++
5731        )
5732      {
5733  
5734          # Go through the arguments and save them for later.
5735          @a = ();
5736          for $arg (@args) {
5737              my $type;
5738              if ( not defined $arg ) {    # undefined parameter
5739                  push @a, "undef";
5740              }
5741  
5742              elsif ( $nothard and tied $arg ) {    # tied parameter
5743                  push @a, "tied";
5744              }
5745              elsif ( $nothard and $type = ref $arg ) {    # reference
5746                  push @a, "ref($type)";
5747              }
5748              else {                                       # can be stringified
5749                  local $_ =
5750                    "$arg";    # Safe to stringify now - should not call f().
5751  
5752                  # Backslash any single-quotes or backslashes.
5753                  s/([\'\\])/\\$1/g;
5754  
5755                  # Single-quote it unless it's a number or a colon-separated
5756                  # name.
5757                  s/(.*)/'$1'/s
5758                    unless /^(?: -?[\d.]+ | \*[\w:]* )$/x;
5759  
5760                  # Turn high-bit characters into meta-whatever.
5761                  s/([\200-\377])/sprintf("M-%c",ord($1)&0177)/eg;
5762  
5763                  # Turn control characters into ^-whatever.
5764                  s/([\0-\37\177])/sprintf("^%c",ord($1)^64)/eg;
5765  
5766                  push( @a, $_ );
5767              } ## end else [ if (not defined $arg)
5768          } ## end for $arg (@args)
5769  
5770          # If context is true, this is array (@)context.
5771          # If context is false, this is scalar ($) context.
5772          # If neither, context isn't defined. (This is apparently a 'can't
5773          # happen' trap.)
5774          $context = $context ? '@' : ( defined $context ? "\$" : '.' );
5775  
5776          # if the sub has args ($h true), make an anonymous array of the
5777          # dumped args.
5778          $args = $h ? [@a] : undef;
5779  
5780          # remove trailing newline-whitespace-semicolon-end of line sequence
5781          # from the eval text, if any.
5782          $e =~ s/\n\s*\;\s*\Z// if $e;
5783  
5784          # Escape backslashed single-quotes again if necessary.
5785          $e =~ s/([\\\'])/\\$1/g if $e;
5786  
5787          # if the require flag is true, the eval text is from a require.
5788          if ($r) {
5789              $sub = "require '$e'";
5790          }
5791  
5792          # if it's false, the eval text is really from an eval.
5793          elsif ( defined $r ) {
5794              $sub = "eval '$e'";
5795          }
5796  
5797          # If the sub is '(eval)', this is a block eval, meaning we don't
5798          # know what the eval'ed text actually was.
5799          elsif ( $sub eq '(eval)' ) {
5800              $sub = "eval {...}";
5801          }
5802  
5803          # Stick the collected information into @sub as an anonymous hash.
5804          push(
5805              @sub,
5806              {
5807                  context => $context,
5808                  sub     => $sub,
5809                  args    => $args,
5810                  file    => $file,
5811                  line    => $line
5812              }
5813          );
5814  
5815          # Stop processing frames if the user hit control-C.
5816          last if $signal;
5817      } ## end for ($i = $skip ; $i < ...
5818  
5819      # Restore the trace value again.
5820      $trace = $otrace;
5821      @sub;
5822  } ## end sub dump_trace
5823  
5824  =head2 C<action()>
5825  
5826  C<action()> takes input provided as the argument to an add-action command,
5827  either pre- or post-, and makes sure it's a complete command. It doesn't do
5828  any fancy parsing; it just keeps reading input until it gets a string
5829  without a trailing backslash.
5830  
5831  =cut
5832  
5833  sub action {
5834      my $action = shift;
5835  
5836      while ( $action =~ s/\\$// ) {
5837  
5838          # We have a backslash on the end. Read more.
5839          $action .= &gets;
5840      } ## end while ($action =~ s/\\$//)
5841  
5842      # Return the assembled action.
5843      $action;
5844  } ## end sub action
5845  
5846  =head2 unbalanced
5847  
5848  This routine mostly just packages up a regular expression to be used
5849  to check that the thing it's being matched against has properly-matched
5850  curly braces.
5851  
5852  Of note is the definition of the C<$balanced_brace_re> global via C<||=>, which
5853  speeds things up by only creating the qr//'ed expression once; if it's 
5854  already defined, we don't try to define it again. A speed hack.
5855  
5856  =cut
5857  
5858  sub unbalanced {
5859  
5860      # I hate using globals!
5861      $balanced_brace_re ||= qr{ 
5862          ^ \{
5863               (?:
5864                   (?> [^{}] + )              # Non-parens without backtracking
5865                  |
5866                   (??{ $balanced_brace_re }) # Group with matching parens
5867                ) *
5868            \} $
5869     }x;
5870      return $_[0] !~ m/$balanced_brace_re/;
5871  } ## end sub unbalanced
5872  
5873  =head2 C<gets()>
5874  
5875  C<gets()> is a primitive (very primitive) routine to read continuations.
5876  It was devised for reading continuations for actions.
5877  it just reads more input with C<readline()> and returns it.
5878  
5879  =cut
5880  
5881  sub gets {
5882      &readline("cont: ");
5883  }
5884  
5885  =head2 C<DB::system()> - handle calls to<system()> without messing up the debugger
5886  
5887  The C<system()> function assumes that it can just go ahead and use STDIN and
5888  STDOUT, but under the debugger, we want it to use the debugger's input and 
5889  outout filehandles. 
5890  
5891  C<DB::system()> socks away the program's STDIN and STDOUT, and then substitutes
5892  the debugger's IN and OUT filehandles for them. It does the C<system()> call,
5893  and then puts everything back again.
5894  
5895  =cut
5896  
5897  sub system {
5898  
5899      # We save, change, then restore STDIN and STDOUT to avoid fork() since
5900      # some non-Unix systems can do system() but have problems with fork().
5901      open( SAVEIN,  "<&STDIN" )  || &warn("Can't save STDIN");
5902      open( SAVEOUT, ">&STDOUT" ) || &warn("Can't save STDOUT");
5903      open( STDIN,   "<&IN" )     || &warn("Can't redirect STDIN");
5904      open( STDOUT,  ">&OUT" )    || &warn("Can't redirect STDOUT");
5905  
5906      # XXX: using csh or tcsh destroys sigint retvals!
5907      system(@_);
5908      open( STDIN,  "<&SAVEIN" )  || &warn("Can't restore STDIN");
5909      open( STDOUT, ">&SAVEOUT" ) || &warn("Can't restore STDOUT");
5910      close(SAVEIN);
5911      close(SAVEOUT);
5912  
5913      # most of the $? crud was coping with broken cshisms
5914      if ( $? >> 8 ) {
5915          &warn( "(Command exited ", ( $? >> 8 ), ")\n" );
5916      }
5917      elsif ($?) {
5918          &warn(
5919              "(Command died of SIG#",
5920              ( $? & 127 ),
5921              ( ( $? & 128 ) ? " -- core dumped" : "" ),
5922              ")", "\n"
5923          );
5924      } ## end elsif ($?)
5925  
5926      return $?;
5927  
5928  } ## end sub system
5929  
5930  =head1 TTY MANAGEMENT
5931  
5932  The subs here do some of the terminal management for multiple debuggers.
5933  
5934  =head2 setterm
5935  
5936  Top-level function called when we want to set up a new terminal for use
5937  by the debugger.
5938  
5939  If the C<noTTY> debugger option was set, we'll either use the terminal
5940  supplied (the value of the C<noTTY> option), or we'll use C<Term::Rendezvous>
5941  to find one. If we're a forked debugger, we call C<resetterm> to try to 
5942  get a whole new terminal if we can. 
5943  
5944  In either case, we set up the terminal next. If the C<ReadLine> option was
5945  true, we'll get a C<Term::ReadLine> object for the current terminal and save
5946  the appropriate attributes. We then 
5947  
5948  =cut
5949  
5950  sub setterm {
5951  
5952      # Load Term::Readline, but quietly; don't debug it and don't trace it.
5953      local $frame = 0;
5954      local $doret = -2;
5955      eval { require Term::ReadLine } or die $@;
5956  
5957      # If noTTY is set, but we have a TTY name, go ahead and hook up to it.
5958      if ($notty) {
5959          if ($tty) {
5960              my ( $i, $o ) = split $tty, /,/;
5961              $o = $i unless defined $o;
5962              open( IN,  "<$i" ) or die "Cannot open TTY `$i' for read: $!";
5963              open( OUT, ">$o" ) or die "Cannot open TTY `$o' for write: $!";
5964              $IN  = \*IN;
5965              $OUT = \*OUT;
5966              my $sel = select($OUT);
5967              $| = 1;
5968              select($sel);
5969          } ## end if ($tty)
5970  
5971          # We don't have a TTY - try to find one via Term::Rendezvous.
5972          else {
5973              eval "require Term::Rendezvous;" or die;
5974  
5975              # See if we have anything to pass to Term::Rendezvous.
5976              # Use $HOME/.perldbtty$$ if not.
5977              my $rv = $ENV{PERLDB_NOTTY} || "$ENV{HOME}/.perldbtty$$";
5978  
5979              # Rendezvous and get the filehandles.
5980              my $term_rv = new Term::Rendezvous $rv;
5981              $IN  = $term_rv->IN;
5982              $OUT = $term_rv->OUT;
5983          } ## end else [ if ($tty)
5984      } ## end if ($notty)
5985  
5986      # We're a daughter debugger. Try to fork off another TTY.
5987      if ( $term_pid eq '-1' ) {    # In a TTY with another debugger
5988          resetterm(2);
5989      }
5990  
5991      # If we shouldn't use Term::ReadLine, don't.
5992      if ( !$rl ) {
5993          $term = new Term::ReadLine::Stub 'perldb', $IN, $OUT;
5994      }
5995  
5996      # We're using Term::ReadLine. Get all the attributes for this terminal.
5997      else {
5998          $term = new Term::ReadLine 'perldb', $IN, $OUT;
5999  
6000          $rl_attribs = $term->Attribs;
6001          $rl_attribs->{basic_word_break_characters} .= '-:+/*,[])}'
6002            if defined $rl_attribs->{basic_word_break_characters}
6003            and index( $rl_attribs->{basic_word_break_characters}, ":" ) == -1;
6004          $rl_attribs->{special_prefixes} = '$@&%';
6005          $rl_attribs->{completer_word_break_characters} .= '$@&%';
6006          $rl_attribs->{completion_function} = \&db_complete;
6007      } ## end else [ if (!$rl)
6008  
6009      # Set up the LINEINFO filehandle.
6010      $LINEINFO = $OUT     unless defined $LINEINFO;
6011      $lineinfo = $console unless defined $lineinfo;
6012  
6013      $term->MinLine(2);
6014  
6015      &load_hist();
6016  
6017      if ( $term->Features->{setHistory} and "@hist" ne "?" ) {
6018          $term->SetHistory(@hist);
6019      }
6020  
6021      # XXX Ornaments are turned on unconditionally, which is not
6022      # always a good thing.
6023      ornaments($ornaments) if defined $ornaments;
6024      $term_pid = $$;
6025  } ## end sub setterm
6026  
6027  sub load_hist {
6028      $histfile //= option_val("HistFile", undef);
6029      return unless defined $histfile;
6030      open my $fh, "<", $histfile or return;
6031      local $/ = "\n";
6032      @hist = ();
6033      while (<$fh>) {
6034          chomp;
6035          push @hist, $_;
6036      }
6037      close $fh;
6038  }
6039  
6040  sub save_hist {
6041      return unless defined $histfile;
6042      eval { require File::Path } or return;
6043      eval { require File::Basename } or return;
6044      File::Path::mkpath(File::Basename::dirname($histfile));
6045      open my $fh, ">", $histfile or die "Could not open '$histfile': $!";
6046      $histsize //= option_val("HistSize",100);
6047      my @copy = grep { $_ ne '?' } @hist;
6048      my $start = scalar(@copy) > $histsize ? scalar(@copy)-$histsize : 0;
6049      for ($start .. $#copy) {
6050          print $fh "$copy[$_]\n";
6051      }
6052      close $fh or die "Could not write '$histfile': $!";
6053  }
6054  
6055  =head1 GET_FORK_TTY EXAMPLE FUNCTIONS
6056  
6057  When the process being debugged forks, or the process invokes a command
6058  via C<system()> which starts a new debugger, we need to be able to get a new
6059  C<IN> and C<OUT> filehandle for the new debugger. Otherwise, the two processes
6060  fight over the terminal, and you can never quite be sure who's going to get the
6061  input you're typing.
6062  
6063  C<get_fork_TTY> is a glob-aliased function which calls the real function that 
6064  is tasked with doing all the necessary operating system mojo to get a new 
6065  TTY (and probably another window) and to direct the new debugger to read and
6066  write there.
6067  
6068  The debugger provides C<get_fork_TTY> functions which work for X Windows,
6069  OS/2, and Mac OS X. Other systems are not supported. You are encouraged
6070  to write C<get_fork_TTY> functions which work for I<your> platform
6071  and contribute them.
6072  
6073  =head3 C<xterm_get_fork_TTY>
6074  
6075  This function provides the C<get_fork_TTY> function for X windows. If a 
6076  program running under the debugger forks, a new <xterm> window is opened and
6077  the subsidiary debugger is directed there.
6078  
6079  The C<open()> call is of particular note here. We have the new C<xterm>
6080  we're spawning route file number 3 to STDOUT, and then execute the C<tty> 
6081  command (which prints the device name of the TTY we'll want to use for input 
6082  and output to STDOUT, then C<sleep> for a very long time, routing this output
6083  to file number 3. This way we can simply read from the <XT> filehandle (which
6084  is STDOUT from the I<commands> we ran) to get the TTY we want to use. 
6085  
6086  Only works if C<xterm> is in your path and C<$ENV{DISPLAY}>, etc. are 
6087  properly set up.
6088  
6089  =cut
6090  
6091  sub xterm_get_fork_TTY {
6092      ( my $name = $0 ) =~ s,^.*[/\\],,s;
6093      open XT,
6094  qq[3>&1 xterm -title "Daughter Perl debugger $pids $name" -e sh -c 'tty 1>&3;\
6095   sleep 10000000' |];
6096  
6097      # Get the output from 'tty' and clean it up a little.
6098      my $tty = <XT>;
6099      chomp $tty;
6100  
6101      $pidprompt = '';    # Shown anyway in titlebar
6102  
6103      # There's our new TTY.
6104      return $tty;
6105  } ## end sub xterm_get_fork_TTY
6106  
6107  =head3 C<os2_get_fork_TTY>
6108  
6109  XXX It behooves an OS/2 expert to write the necessary documentation for this!
6110  
6111  =cut
6112  
6113  # This example function resets $IN, $OUT itself
6114  my $c_pipe = 0;
6115  sub os2_get_fork_TTY { # A simplification of the following (and works without):
6116      local $\  = '';
6117      ( my $name = $0 ) =~ s,^.*[/\\],,s;
6118      my %opt = (    title => "Daughter Perl debugger $pids $name",
6119          ($rl ? (read_by_key => 1) : ()) );
6120      require OS2::Process;
6121      my ($in, $out, $pid) = eval { OS2::Process::io_term(related => 0, %opt) }
6122        or return;
6123      $pidprompt = '';    # Shown anyway in titlebar
6124      reset_IN_OUT($in, $out);
6125      $tty = '*reset*';
6126      return '';          # Indicate that reset_IN_OUT is called
6127  } ## end sub os2_get_fork_TTY
6128  
6129  =head3 C<macosx_get_fork_TTY>
6130  
6131  The Mac OS X version uses AppleScript to tell Terminal.app to create
6132  a new window.
6133  
6134  =cut
6135  
6136  # Notes about Terminal.app's AppleScript support,
6137  # (aka things that might break in future OS versions).
6138  #
6139  # The "do script" command doesn't return a reference to the new window
6140  # it creates, but since it appears frontmost and windows are enumerated
6141  # front to back, we can use "first window" === "window 1".
6142  #
6143  # Since "do script" is implemented by supplying the argument (plus a
6144  # return character) as terminal input, there's a potential race condition
6145  # where the debugger could beat the shell to reading the command.
6146  # To prevent this, we wait for the screen to clear before proceeding.
6147  #
6148  # 10.3 and 10.4:
6149  # There's no direct accessor for the tty device name, so we fiddle
6150  # with the window title options until it says what we want.
6151  #
6152  # 10.5:
6153  # There _is_ a direct accessor for the tty device name, _and_ there's
6154  # a new possible component of the window title (the name of the settings
6155  # set).  A separate version is needed.
6156  
6157  my @script_versions=
6158  
6159      ([237, <<'__LEOPARD__'],
6160  tell application "Terminal"
6161      do script "clear;exec sleep 100000"
6162      tell first tab of first window
6163          copy tty to thetty
6164          set custom title to "forked perl debugger"
6165          set title displays custom title to true
6166          repeat while (length of first paragraph of (get contents)) > 0
6167              delay 0.1
6168          end repeat
6169      end tell
6170  end tell
6171  thetty
6172  __LEOPARD__
6173  
6174       [100, <<'__JAGUAR_TIGER__'],
6175  tell application "Terminal"
6176      do script "clear;exec sleep 100000"
6177      tell first window
6178          set title displays shell path to false
6179          set title displays window size to false
6180          set title displays file name to false
6181          set title displays device name to true
6182          set title displays custom title to true
6183          set custom title to ""
6184          copy "/dev/" & name to thetty
6185          set custom title to "forked perl debugger"
6186          repeat while (length of first paragraph of (get contents)) > 0
6187              delay 0.1
6188          end repeat
6189      end tell
6190  end tell
6191  thetty
6192  __JAGUAR_TIGER__
6193  
6194  );
6195  
6196  sub macosx_get_fork_TTY
6197  {
6198      my($version,$script,$pipe,$tty);
6199  
6200      return unless $version=$ENV{TERM_PROGRAM_VERSION};
6201      foreach my $entry (@script_versions) {
6202      if ($version>=$entry->[0]) {
6203          $script=$entry->[1];
6204          last;
6205      }
6206      }
6207      return unless defined($script);
6208      return unless open($pipe,'-|','/usr/bin/osascript','-e',$script);
6209      $tty=readline($pipe);
6210      close($pipe);
6211      return unless defined($tty) && $tty =~ m(^/dev/);
6212      chomp $tty;
6213      return $tty;
6214  }
6215  
6216  =head2 C<create_IN_OUT($flags)>
6217  
6218  Create a new pair of filehandles, pointing to a new TTY. If impossible,
6219  try to diagnose why.
6220  
6221  Flags are:
6222  
6223  =over 4
6224  
6225  =item * 1 - Don't know how to create a new TTY.
6226  
6227  =item * 2 - Debugger has forked, but we can't get a new TTY.
6228  
6229  =item * 4 - standard debugger startup is happening.
6230  
6231  =back
6232  
6233  =cut
6234  
6235  sub create_IN_OUT {    # Create a window with IN/OUT handles redirected there
6236  
6237      # If we know how to get a new TTY, do it! $in will have
6238      # the TTY name if get_fork_TTY works.
6239      my $in = &get_fork_TTY if defined &get_fork_TTY;
6240  
6241      # It used to be that
6242      $in = $fork_TTY if defined $fork_TTY;    # Backward compatibility
6243  
6244      if ( not defined $in ) {
6245          my $why = shift;
6246  
6247          # We don't know how.
6248          print_help(<<EOP) if $why == 1;
6249  I<#########> Forked, but do not know how to create a new B<TTY>. I<#########>
6250  EOP
6251  
6252          # Forked debugger.
6253          print_help(<<EOP) if $why == 2;
6254  I<#########> Daughter session, do not know how to change a B<TTY>. I<#########>
6255    This may be an asynchronous session, so the parent debugger may be active.
6256  EOP
6257  
6258          # Note that both debuggers are fighting over the same input.
6259          print_help(<<EOP) if $why != 4;
6260    Since two debuggers fight for the same TTY, input is severely entangled.
6261  
6262  EOP
6263          print_help(<<EOP);
6264    I know how to switch the output to a different window in xterms, OS/2
6265    consoles, and Mac OS X Terminal.app only.  For a manual switch, put the name
6266    of the created I<TTY> in B<\$DB::fork_TTY>, or define a function
6267    B<DB::get_fork_TTY()> returning this.
6268  
6269    On I<UNIX>-like systems one can get the name of a I<TTY> for the given window
6270    by typing B<tty>, and disconnect the I<shell> from I<TTY> by B<sleep 1000000>.
6271  
6272  EOP
6273      } ## end if (not defined $in)
6274      elsif ( $in ne '' ) {
6275          TTY($in);
6276      }
6277      else {
6278          $console = '';    # Indicate no need to open-from-the-console
6279      }
6280      undef $fork_TTY;
6281  } ## end sub create_IN_OUT
6282  
6283  =head2 C<resetterm>
6284  
6285  Handles rejiggering the prompt when we've forked off a new debugger.
6286  
6287  If the new debugger happened because of a C<system()> that invoked a 
6288  program under the debugger, the arrow between the old pid and the new
6289  in the prompt has I<two> dashes instead of one.
6290  
6291  We take the current list of pids and add this one to the end. If there
6292  isn't any list yet, we make one up out of the initial pid associated with 
6293  the terminal and our new pid, sticking an arrow (either one-dashed or 
6294  two dashed) in between them.
6295  
6296  If C<CreateTTY> is off, or C<resetterm> was called with no arguments,
6297  we don't try to create a new IN and OUT filehandle. Otherwise, we go ahead
6298  and try to do that.
6299  
6300  =cut
6301  
6302  sub resetterm {    # We forked, so we need a different TTY
6303  
6304      # Needs to be passed to create_IN_OUT() as well.
6305      my $in = shift;
6306  
6307      # resetterm(2): got in here because of a system() starting a debugger.
6308      # resetterm(1): just forked.
6309      my $systemed = $in > 1 ? '-' : '';
6310  
6311      # If there's already a list of pids, add this to the end.
6312      if ($pids) {
6313          $pids =~ s/\]/$systemed->$$]/;
6314      }
6315  
6316      # No pid list. Time to make one.
6317      else {
6318          $pids = "[$term_pid->$$]";
6319      }
6320  
6321      # The prompt we're going to be using for this debugger.
6322      $pidprompt = $pids;
6323  
6324      # We now 0wnz this terminal.
6325      $term_pid = $$;
6326  
6327      # Just return if we're not supposed to try to create a new TTY.
6328      return unless $CreateTTY & $in;
6329  
6330      # Try to create a new IN/OUT pair.
6331      create_IN_OUT($in);
6332  } ## end sub resetterm
6333  
6334  =head2 C<readline>
6335  
6336  First, we handle stuff in the typeahead buffer. If there is any, we shift off
6337  the next line, print a message saying we got it, add it to the terminal
6338  history (if possible), and return it.
6339  
6340  If there's nothing in the typeahead buffer, check the command filehandle stack.
6341  If there are any filehandles there, read from the last one, and return the line
6342  if we got one. If not, we pop the filehandle off and close it, and try the
6343  next one up the stack.
6344  
6345  If we've emptied the filehandle stack, we check to see if we've got a socket 
6346  open, and we read that and return it if we do. If we don't, we just call the 
6347  core C<readline()> and return its value.
6348  
6349  =cut
6350  
6351  sub readline {
6352  
6353      # Localize to prevent it from being smashed in the program being debugged.
6354      local $.;
6355  
6356      # Pull a line out of the typeahead if there's stuff there.
6357      if (@typeahead) {
6358  
6359          # How many lines left.
6360          my $left = @typeahead;
6361  
6362          # Get the next line.
6363          my $got = shift @typeahead;
6364  
6365          # Print a message saying we got input from the typeahead.
6366          local $\ = '';
6367          print $OUT "auto(-$left)", shift, $got, "\n";
6368  
6369          # Add it to the terminal history (if possible).
6370          $term->AddHistory($got)
6371            if length($got) > 1
6372            and defined $term->Features->{addHistory};
6373          return $got;
6374      } ## end if (@typeahead)
6375  
6376      # We really need to read some input. Turn off entry/exit trace and
6377      # return value printing.
6378      local $frame = 0;
6379      local $doret = -2;
6380  
6381      # If there are stacked filehandles to read from ...
6382      while (@cmdfhs) {
6383  
6384          # Read from the last one in the stack.
6385          my $line = CORE::readline( $cmdfhs[-1] );
6386  
6387          # If we got a line ...
6388          defined $line
6389            ? ( print $OUT ">> $line" and return $line )    # Echo and return
6390            : close pop @cmdfhs;                            # Pop and close
6391      } ## end while (@cmdfhs)
6392  
6393      # Nothing on the filehandle stack. Socket?
6394      if ( ref $OUT and UNIVERSAL::isa( $OUT, 'IO::Socket::INET' ) ) {
6395  
6396          # Send anyting we have to send.
6397          $OUT->write( join( '', @_ ) );
6398  
6399          # Receive anything there is to receive.
6400          $stuff;
6401          my $stuff = '';
6402          my $buf;
6403          do {
6404              $IN->recv( $buf = '', 2048 );   # XXX "what's wrong with sysread?"
6405                                              # XXX Don't know. You tell me.
6406          } while length $buf and ($stuff .= $buf) !~ /\n/;
6407  
6408          # What we got.
6409          $stuff;
6410      } ## end if (ref $OUT and UNIVERSAL::isa...
6411  
6412      # No socket. Just read from the terminal.
6413      else {
6414          $term->readline(@_);
6415      }
6416  } ## end sub readline
6417  
6418  =head1 OPTIONS SUPPORT ROUTINES
6419  
6420  These routines handle listing and setting option values.
6421  
6422  =head2 C<dump_option> - list the current value of an option setting
6423  
6424  This routine uses C<option_val> to look up the value for an option.
6425  It cleans up escaped single-quotes and then displays the option and
6426  its value.
6427  
6428  =cut
6429  
6430  sub dump_option {
6431      my ( $opt, $val ) = @_;
6432      $val = option_val( $opt, 'N/A' );
6433      $val =~ s/([\\\'])/\\$1/g;
6434      printf $OUT "%20s = '%s'\n", $opt, $val;
6435  } ## end sub dump_option
6436  
6437  sub options2remember {
6438      foreach my $k (@RememberOnROptions) {
6439          $option{$k} = option_val( $k, 'N/A' );
6440      }
6441      return %option;
6442  }
6443  
6444  =head2 C<option_val> - find the current value of an option
6445  
6446  This can't just be a simple hash lookup because of the indirect way that
6447  the option values are stored. Some are retrieved by calling a subroutine,
6448  some are just variables.
6449  
6450  You must supply a default value to be used in case the option isn't set.
6451  
6452  =cut
6453  
6454  sub option_val {
6455      my ( $opt, $default ) = @_;
6456      my $val;
6457  
6458      # Does this option exist, and is it a variable?
6459      # If so, retrieve the value via the value in %optionVars.
6460      if (    defined $optionVars{$opt}
6461          and defined ${ $optionVars{$opt} } )
6462      {
6463          $val = ${ $optionVars{$opt} };
6464      }
6465  
6466      # Does this option exist, and it's a subroutine?
6467      # If so, call the subroutine via the ref in %optionAction
6468      # and capture the value.
6469      elsif ( defined $optionAction{$opt}
6470          and defined &{ $optionAction{$opt} } )
6471      {
6472          $val = &{ $optionAction{$opt} }();
6473      }
6474  
6475      # If there's an action or variable for the supplied option,
6476      # but no value was set, use the default.
6477      elsif (defined $optionAction{$opt} and not defined $option{$opt}
6478          or defined $optionVars{$opt} and not defined ${ $optionVars{$opt} } )
6479      {
6480          $val = $default;
6481      }
6482  
6483      # Otherwise, do the simple hash lookup.
6484      else {
6485          $val = $option{$opt};
6486      }
6487  
6488      # If the value isn't defined, use the default.
6489      # Then return whatever the value is.
6490      $val = $default unless defined $val;
6491      $val;
6492  } ## end sub option_val
6493  
6494  =head2 C<parse_options>
6495  
6496  Handles the parsing and execution of option setting/displaying commands.
6497  
6498  An option entered by itself is assumed to be I<set me to 1> (the default value)
6499  if the option is a boolean one. If not, the user is prompted to enter a valid
6500  value or to query the current value (via C<option? >).
6501  
6502  If C<option=value> is entered, we try to extract a quoted string from the
6503  value (if it is quoted). If it's not, we just use the whole value as-is.
6504  
6505  We load any modules required to service this option, and then we set it: if
6506  it just gets stuck in a variable, we do that; if there's a subroutine to 
6507  handle setting the option, we call that.
6508  
6509  Finally, if we're running in interactive mode, we display the effect of the
6510  user's command back to the terminal, skipping this if we're setting things
6511  during initialization.
6512  
6513  =cut
6514  
6515  sub parse_options {
6516      local ($_) = @_;
6517      local $\ = '';
6518  
6519      # These options need a value. Don't allow them to be clobbered by accident.
6520      my %opt_needs_val = map { ( $_ => 1 ) } qw{
6521        dumpDepth arrayDepth hashDepth LineInfo maxTraceLen ornaments windowSize
6522        pager quote ReadLine recallCommand RemotePort ShellBang TTY CommandSet
6523      };
6524  
6525      while (length) {
6526          my $val_defaulted;
6527  
6528          # Clean off excess leading whitespace.
6529          s/^\s+// && next;
6530  
6531          # Options are always all word characters, followed by a non-word
6532          # separator.
6533          s/^(\w+)(\W?)// or print( $OUT "Invalid option `$_'\n" ), last;
6534          my ( $opt, $sep ) = ( $1, $2 );
6535  
6536          # Make sure that such an option exists.
6537          my $matches = grep( /^\Q$opt/ && ( $option = $_ ), @options )
6538            || grep( /^\Q$opt/i && ( $option = $_ ), @options );
6539  
6540          print( $OUT "Unknown option `$opt'\n" ), next unless $matches;
6541          print( $OUT "Ambiguous option `$opt'\n" ), next if $matches > 1;
6542          my $val;
6543  
6544          # '?' as separator means query, but must have whitespace after it.
6545          if ( "?" eq $sep ) {
6546              print( $OUT "Option query `$opt?' followed by non-space `$_'\n" ),
6547                last
6548                if /^\S/;
6549  
6550              #&dump_option($opt);
6551          } ## end if ("?" eq $sep)
6552  
6553          # Separator is whitespace (or just a carriage return).
6554          # They're going for a default, which we assume is 1.
6555          elsif ( $sep !~ /\S/ ) {
6556              $val_defaulted = 1;
6557              $val           = "1";   #  this is an evil default; make 'em set it!
6558          }
6559  
6560          # Separator is =. Trying to set a value.
6561          elsif ( $sep eq "=" ) {
6562  
6563              # If quoted, extract a quoted string.
6564              if (s/ (["']) ( (?: \\. | (?! \1 ) [^\\] )* ) \1 //x) {
6565                  my $quote = $1;
6566                  ( $val = $2 ) =~ s/\\([$quote\\])/$1/g;
6567              }
6568  
6569              # Not quoted. Use the whole thing. Warn about 'option='.
6570              else {
6571                  s/^(\S*)//;
6572                  $val = $1;
6573                  print OUT qq(Option better cleared using $opt=""\n)
6574                    unless length $val;
6575              } ## end else [ if (s/ (["']) ( (?: \\. | (?! \1 ) [^\\] )* ) \1 //x)
6576  
6577          } ## end elsif ($sep eq "=")
6578  
6579          # "Quoted" with [], <>, or {}.
6580          else {    #{ to "let some poor schmuck bounce on the % key in B<vi>."
6581              my ($end) =
6582                "\\" . substr( ")]>}$sep", index( "([<{", $sep ), 1 );    #}
6583              s/^(([^\\$end]|\\[\\$end])*)$end($|\s+)//
6584                or print( $OUT "Unclosed option value `$opt$sep$_'\n" ), last;
6585              ( $val = $1 ) =~ s/\\([\\$end])/$1/g;
6586          } ## end else [ if ("?" eq $sep)
6587  
6588          # Exclude non-booleans from getting set to 1 by default.
6589          if ( $opt_needs_val{$option} && $val_defaulted ) {
6590              my $cmd = ( $CommandSet eq '580' ) ? 'o' : 'O';
6591              print $OUT
6592  "Option `$opt' is non-boolean.  Use `$cmd $option=VAL' to set, `$cmd $option?' to query\n";
6593              next;
6594          } ## end if ($opt_needs_val{$option...
6595  
6596          # Save the option value.
6597          $option{$option} = $val if defined $val;
6598  
6599          # Load any module that this option requires.
6600          eval qq{
6601                  local \$frame = 0; 
6602                  local \$doret = -2; 
6603                  require '$optionRequire{$option}';
6604                  1;
6605                 } || die    # XXX: shouldn't happen
6606            if defined $optionRequire{$option}
6607            && defined $val;
6608  
6609          # Set it.
6610          # Stick it in the proper variable if it goes in a variable.
6611          ${ $optionVars{$option} } = $val
6612            if defined $optionVars{$option}
6613            && defined $val;
6614  
6615          # Call the appropriate sub if it gets set via sub.
6616          &{ $optionAction{$option} }($val)
6617            if defined $optionAction{$option}
6618            && defined &{ $optionAction{$option} }
6619            && defined $val;
6620  
6621          # Not initialization - echo the value we set it to.
6622          dump_option($option) unless $OUT eq \*STDERR;
6623      } ## end while (length)
6624  } ## end sub parse_options
6625  
6626  =head1 RESTART SUPPORT
6627  
6628  These routines are used to store (and restore) lists of items in environment 
6629  variables during a restart.
6630  
6631  =head2 set_list
6632  
6633  Set_list packages up items to be stored in a set of environment variables
6634  (VAR_n, containing the number of items, and VAR_0, VAR_1, etc., containing
6635  the values). Values outside the standard ASCII charset are stored by encoding
6636  then as hexadecimal values.
6637  
6638  =cut
6639  
6640  sub set_list {
6641      my ( $stem, @list ) = @_;
6642      my $val;
6643  
6644      # VAR_n: how many we have. Scalar assignment gets the number of items.
6645      $ENV{"${stem}_n"} = @list;
6646  
6647      # Grab each item in the list, escape the backslashes, encode the non-ASCII
6648      # as hex, and then save in the appropriate VAR_0, VAR_1, etc.
6649      for $i ( 0 .. $#list ) {
6650          $val = $list[$i];
6651          $val =~ s/\\/\\\\/g;
6652          $val =~ s/([\0-\37\177\200-\377])/"\\0x" . unpack('H2',$1)/eg;
6653          $ENV{"${stem}_$i"} = $val;
6654      } ## end for $i (0 .. $#list)
6655  } ## end sub set_list
6656  
6657  =head2 get_list
6658  
6659  Reverse the set_list operation: grab VAR_n to see how many we should be getting
6660  back, and then pull VAR_0, VAR_1. etc. back out.
6661  
6662  =cut 
6663  
6664  sub get_list {
6665      my $stem = shift;
6666      my @list;
6667      my $n = delete $ENV{"${stem}_n"};
6668      my $val;
6669      for $i ( 0 .. $n - 1 ) {
6670          $val = delete $ENV{"${stem}_$i"};
6671          $val =~ s/\\((\\)|0x(..))/ $2 ? $2 : pack('H2', $3) /ge;
6672          push @list, $val;
6673      }
6674      @list;
6675  } ## end sub get_list
6676  
6677  =head1 MISCELLANEOUS SIGNAL AND I/O MANAGEMENT
6678  
6679  =head2 catch()
6680  
6681  The C<catch()> subroutine is the essence of fast and low-impact. We simply
6682  set an already-existing global scalar variable to a constant value. This 
6683  avoids allocating any memory possibly in the middle of something that will
6684  get all confused if we do, particularly under I<unsafe signals>.
6685  
6686  =cut
6687  
6688  sub catch {
6689      $signal = 1;
6690      return;    # Put nothing on the stack - malloc/free land!
6691  }
6692  
6693  =head2 C<warn()>
6694  
6695  C<warn> emits a warning, by joining together its arguments and printing
6696  them, with couple of fillips.
6697  
6698  If the composited message I<doesn't> end with a newline, we automatically 
6699  add C<$!> and a newline to the end of the message. The subroutine expects $OUT 
6700  to be set to the filehandle to be used to output warnings; it makes no 
6701  assumptions about what filehandles are available.
6702  
6703  =cut
6704  
6705  sub warn {
6706      my ($msg) = join( "", @_ );
6707      $msg .= ": $!\n" unless $msg =~ /\n$/;
6708      local $\ = '';
6709      print $OUT $msg;
6710  } ## end sub warn
6711  
6712  =head1 INITIALIZATION TTY SUPPORT
6713  
6714  =head2 C<reset_IN_OUT>
6715  
6716  This routine handles restoring the debugger's input and output filehandles
6717  after we've tried and failed to move them elsewhere.  In addition, it assigns 
6718  the debugger's output filehandle to $LINEINFO if it was already open there.
6719  
6720  =cut
6721  
6722  sub reset_IN_OUT {
6723      my $switch_li = $LINEINFO eq $OUT;
6724  
6725      # If there's a term and it's able to get a new tty, try to get one.
6726      if ( $term and $term->Features->{newTTY} ) {
6727          ( $IN, $OUT ) = ( shift, shift );
6728          $term->newTTY( $IN, $OUT );
6729      }
6730  
6731      # This term can't get a new tty now. Better luck later.
6732      elsif ($term) {
6733          &warn("Too late to set IN/OUT filehandles, enabled on next `R'!\n");
6734      }
6735  
6736      # Set the filehndles up as they were.
6737      else {
6738          ( $IN, $OUT ) = ( shift, shift );
6739      }
6740  
6741      # Unbuffer the output filehandle.
6742      my $o = select $OUT;
6743      $| = 1;
6744      select $o;
6745  
6746      # Point LINEINFO to the same output filehandle if it was there before.
6747      $LINEINFO = $OUT if $switch_li;
6748  } ## end sub reset_IN_OUT
6749  
6750  =head1 OPTION SUPPORT ROUTINES
6751  
6752  The following routines are used to process some of the more complicated 
6753  debugger options.
6754  
6755  =head2 C<TTY>
6756  
6757  Sets the input and output filehandles to the specified files or pipes.
6758  If the terminal supports switching, we go ahead and do it. If not, and
6759  there's already a terminal in place, we save the information to take effect
6760  on restart.
6761  
6762  If there's no terminal yet (for instance, during debugger initialization),
6763  we go ahead and set C<$console> and C<$tty> to the file indicated.
6764  
6765  =cut
6766  
6767  sub TTY {
6768  
6769      # With VMS we can get here with $term undefined, so we do not
6770      # switch to this terminal.  There may be a better place to make
6771      # sure that $term is defined on VMS
6772      if ( @_ and ($^O eq 'VMS') and !defined($term) ) {
6773      eval { require Term::ReadLine } or die $@;
6774          if ( !$rl ) {
6775          $term = new Term::ReadLine::Stub 'perldb', $IN, $OUT;
6776      }
6777      else {
6778          $term = new Term::ReadLine 'perldb', $IN, $OUT;
6779      }
6780      }
6781      if ( @_ and $term and $term->Features->{newTTY} ) {
6782  
6783          # This terminal supports switching to a new TTY.
6784          # Can be a list of two files, or on string containing both names,
6785          # comma-separated.
6786          # XXX Should this perhaps be an assignment from @_?
6787          my ( $in, $out ) = shift;
6788          if ( $in =~ /,/ ) {
6789  
6790              # Split list apart if supplied.
6791              ( $in, $out ) = split /,/, $in, 2;
6792          }
6793          else {
6794  
6795              # Use the same file for both input and output.
6796              $out = $in;
6797          }
6798  
6799          # Open file onto the debugger's filehandles, if you can.
6800          open IN,  $in     or die "cannot open `$in' for read: $!";
6801          open OUT, ">$out" or die "cannot open `$out' for write: $!";
6802  
6803          # Swap to the new filehandles.
6804          reset_IN_OUT( \*IN, \*OUT );
6805  
6806          # Save the setting for later.
6807          return $tty = $in;
6808      } ## end if (@_ and $term and $term...
6809  
6810      # Terminal doesn't support new TTY, or doesn't support readline.
6811      # Can't do it now, try restarting.
6812      &warn("Too late to set TTY, enabled on next `R'!\n") if $term and @_;
6813  
6814      # Useful if done through PERLDB_OPTS:
6815      $console = $tty = shift if @_;
6816  
6817      # Return whatever the TTY is.
6818      $tty or $console;
6819  } ## end sub TTY
6820  
6821  =head2 C<noTTY>
6822  
6823  Sets the C<$notty> global, controlling whether or not the debugger tries to
6824  get a terminal to read from. If called after a terminal is already in place,
6825  we save the value to use it if we're restarted.
6826  
6827  =cut
6828  
6829  sub noTTY {
6830      if ($term) {
6831          &warn("Too late to set noTTY, enabled on next `R'!\n") if @_;
6832      }
6833      $notty = shift if @_;
6834      $notty;
6835  } ## end sub noTTY
6836  
6837  =head2 C<ReadLine>
6838  
6839  Sets the C<$rl> option variable. If 0, we use C<Term::ReadLine::Stub> 
6840  (essentially, no C<readline> processing on this I<terminal>). Otherwise, we
6841  use C<Term::ReadLine>. Can't be changed after a terminal's in place; we save
6842  the value in case a restart is done so we can change it then.
6843  
6844  =cut
6845  
6846  sub ReadLine {
6847      if ($term) {
6848          &warn("Too late to set ReadLine, enabled on next `R'!\n") if @_;
6849      }
6850      $rl = shift if @_;
6851      $rl;
6852  } ## end sub ReadLine
6853  
6854  =head2 C<RemotePort>
6855  
6856  Sets the port that the debugger will try to connect to when starting up.
6857  If the terminal's already been set up, we can't do it, but we remember the
6858  setting in case the user does a restart.
6859  
6860  =cut
6861  
6862  sub RemotePort {
6863      if ($term) {
6864          &warn("Too late to set RemotePort, enabled on next 'R'!\n") if @_;
6865      }
6866      $remoteport = shift if @_;
6867      $remoteport;
6868  } ## end sub RemotePort
6869  
6870  =head2 C<tkRunning>
6871  
6872  Checks with the terminal to see if C<Tk> is running, and returns true or
6873  false. Returns false if the current terminal doesn't support C<readline>.
6874  
6875  =cut
6876  
6877  sub tkRunning {
6878      if ( ${ $term->Features }{tkRunning} ) {
6879          return $term->tkRunning(@_);
6880      }
6881      else {
6882          local $\ = '';
6883          print $OUT "tkRunning not supported by current ReadLine package.\n";
6884          0;
6885      }
6886  } ## end sub tkRunning
6887  
6888  =head2 C<NonStop>
6889  
6890  Sets nonstop mode. If a terminal's already been set up, it's too late; the
6891  debugger remembers the setting in case you restart, though.
6892  
6893  =cut
6894  
6895  sub NonStop {
6896      if ($term) {
6897          &warn("Too late to set up NonStop mode, enabled on next `R'!\n")
6898            if @_;
6899      }
6900      $runnonstop = shift if @_;
6901      $runnonstop;
6902  } ## end sub NonStop
6903  
6904  sub DollarCaretP {
6905      if ($term) {
6906          &warn("Some flag changes could not take effect until next 'R'!\n")
6907            if @_;
6908      }
6909      $^P = parse_DollarCaretP_flags(shift) if @_;
6910      expand_DollarCaretP_flags($^P);
6911  }
6912  
6913  =head2 C<pager>
6914  
6915  Set up the C<$pager> variable. Adds a pipe to the front unless there's one
6916  there already.
6917  
6918  =cut
6919  
6920  sub pager {
6921      if (@_) {
6922          $pager = shift;
6923          $pager = "|" . $pager unless $pager =~ /^(\+?\>|\|)/;
6924      }
6925      $pager;
6926  } ## end sub pager
6927  
6928  =head2 C<shellBang>
6929  
6930  Sets the shell escape command, and generates a printable copy to be used 
6931  in the help.
6932  
6933  =cut
6934  
6935  sub shellBang {
6936  
6937      # If we got an argument, meta-quote it, and add '\b' if it
6938      # ends in a word character.
6939      if (@_) {
6940          $sh = quotemeta shift;
6941          $sh .= "\\b" if $sh =~ /\w$/;
6942      }
6943  
6944      # Generate the printable version for the help:
6945      $psh = $sh;    # copy it
6946      $psh =~ s/\\b$//;        # Take off trailing \b if any
6947      $psh =~ s/\\(.)/$1/g;    # De-escape
6948      $psh;                    # return the printable version
6949  } ## end sub shellBang
6950  
6951  =head2 C<ornaments>
6952  
6953  If the terminal has its own ornaments, fetch them. Otherwise accept whatever
6954  was passed as the argument. (This means you can't override the terminal's
6955  ornaments.)
6956  
6957  =cut 
6958  
6959  sub ornaments {
6960      if ( defined $term ) {
6961  
6962          # We don't want to show warning backtraces, but we do want die() ones.
6963          local ( $warnLevel, $dieLevel ) = ( 0, 1 );
6964  
6965          # No ornaments if the terminal doesn't support them.
6966          return '' unless $term->Features->{ornaments};
6967          eval { $term->ornaments(@_) } || '';
6968      }
6969  
6970      # Use what was passed in if we can't determine it ourselves.
6971      else {
6972          $ornaments = shift;
6973      }
6974  } ## end sub ornaments
6975  
6976  =head2 C<recallCommand>
6977  
6978  Sets the recall command, and builds a printable version which will appear in
6979  the help text.
6980  
6981  =cut
6982  
6983  sub recallCommand {
6984  
6985      # If there is input, metaquote it. Add '\b' if it ends with a word
6986      # character.
6987      if (@_) {
6988          $rc = quotemeta shift;
6989          $rc .= "\\b" if $rc =~ /\w$/;
6990      }
6991  
6992      # Build it into a printable version.
6993      $prc = $rc;    # Copy it
6994      $prc =~ s/\\b$//;        # Remove trailing \b
6995      $prc =~ s/\\(.)/$1/g;    # Remove escapes
6996      $prc;                    # Return the printable version
6997  } ## end sub recallCommand
6998  
6999  =head2 C<LineInfo> - where the line number information goes
7000  
7001  Called with no arguments, returns the file or pipe that line info should go to.
7002  
7003  Called with an argument (a file or a pipe), it opens that onto the 
7004  C<LINEINFO> filehandle, unbuffers the filehandle, and then returns the 
7005  file or pipe again to the caller.
7006  
7007  =cut
7008  
7009  sub LineInfo {
7010      return $lineinfo unless @_;
7011      $lineinfo = shift;
7012  
7013      #  If this is a valid "thing to be opened for output", tack a
7014      # '>' onto the front.
7015      my $stream = ( $lineinfo =~ /^(\+?\>|\|)/ ) ? $lineinfo : ">$lineinfo";
7016  
7017      # If this is a pipe, the stream points to a slave editor.
7018      $slave_editor = ( $stream =~ /^\|/ );
7019  
7020      # Open it up and unbuffer it.
7021      open( LINEINFO, "$stream" ) || &warn("Cannot open `$stream' for write");
7022      $LINEINFO = \*LINEINFO;
7023      my $save = select($LINEINFO);
7024      $| = 1;
7025      select($save);
7026  
7027      # Hand the file or pipe back again.
7028      $lineinfo;
7029  } ## end sub LineInfo
7030  
7031  =head1 COMMAND SUPPORT ROUTINES
7032  
7033  These subroutines provide functionality for various commands.
7034  
7035  =head2 C<list_modules>
7036  
7037  For the C<M> command: list modules loaded and their versions.
7038  Essentially just runs through the keys in %INC, picks each package's
7039  C<$VERSION> variable, gets the file name, and formats the information
7040  for output.
7041  
7042  =cut
7043  
7044  sub list_modules {    # versions
7045      my %version;
7046      my $file;
7047  
7048      # keys are the "as-loaded" name, values are the fully-qualified path
7049      # to the file itself.
7050      for ( keys %INC ) {
7051          $file = $_;                                # get the module name
7052          s,\.p[lm]$,,i;                             # remove '.pl' or '.pm'
7053          s,/,::,g;                                  # change '/' to '::'
7054          s/^perl5db$/DB/;                           # Special case: debugger
7055                                                     # moves to package DB
7056          s/^Term::ReadLine::readline$/readline/;    # simplify readline
7057  
7058          # If the package has a $VERSION package global (as all good packages
7059          # should!) decode it and save as partial message.
7060          if ( defined ${ $_ . '::VERSION' } ) {
7061              $version{$file} = "${ $_ . '::VERSION' } from ";
7062          }
7063  
7064          # Finish up the message with the file the package came from.
7065          $version{$file} .= $INC{$file};
7066      } ## end for (keys %INC)
7067  
7068      # Hey, dumpit() formats a hash nicely, so why not use it?
7069      dumpit( $OUT, \%version );
7070  } ## end sub list_modules
7071  
7072  =head2 C<sethelp()>
7073  
7074  Sets up the monster string used to format and print the help.
7075  
7076  =head3 HELP MESSAGE FORMAT
7077  
7078  The help message is a peculiar format unto itself; it mixes C<pod> I<ornaments>
7079  (C<< B<> >> C<< I<> >>) with tabs to come up with a format that's fairly
7080  easy to parse and portable, but which still allows the help to be a little
7081  nicer than just plain text.
7082  
7083  Essentially, you define the command name (usually marked up with C<< B<> >>
7084  and C<< I<> >>), followed by a tab, and then the descriptive text, ending in a
7085  newline. The descriptive text can also be marked up in the same way. If you
7086  need to continue the descriptive text to another line, start that line with
7087  just tabs and then enter the marked-up text.
7088  
7089  If you are modifying the help text, I<be careful>. The help-string parser is 
7090  not very sophisticated, and if you don't follow these rules it will mangle the 
7091  help beyond hope until you fix the string.
7092  
7093  =cut
7094  
7095  sub sethelp {
7096  
7097      # XXX: make sure there are tabs between the command and explanation,
7098      #      or print_help will screw up your formatting if you have
7099      #      eeevil ornaments enabled.  This is an insane mess.
7100  
7101      $help = "
7102  Help is currently only available for the new 5.8 command set. 
7103  No help is available for the old command set. 
7104  We assume you know what you're doing if you switch to it.
7105  
7106  B<T>        Stack trace.
7107  B<s> [I<expr>]    Single step [in I<expr>].
7108  B<n> [I<expr>]    Next, steps over subroutine calls [in I<expr>].
7109  <B<CR>>        Repeat last B<n> or B<s> command.
7110  B<r>        Return from current subroutine.
7111  B<c> [I<line>|I<sub>]    Continue; optionally inserts a one-time-only breakpoint
7112          at the specified position.
7113  B<l> I<min>B<+>I<incr>    List I<incr>+1 lines starting at I<min>.
7114  B<l> I<min>B<->I<max>    List lines I<min> through I<max>.
7115  B<l> I<line>        List single I<line>.
7116  B<l> I<subname>    List first window of lines from subroutine.
7117  B<l> I<\$var>        List first window of lines from subroutine referenced by I<\$var>.
7118  B<l>        List next window of lines.
7119  B<->        List previous window of lines.
7120  B<v> [I<line>]    View window around I<line>.
7121  B<.>        Return to the executed line.
7122  B<f> I<filename>    Switch to viewing I<filename>. File must be already loaded.
7123          I<filename> may be either the full name of the file, or a regular
7124          expression matching the full file name:
7125          B<f> I</home/me/foo.pl> and B<f> I<oo\\.> may access the same file.
7126          Evals (with saved bodies) are considered to be filenames:
7127          B<f> I<(eval 7)> and B<f> I<eval 7\\b> access the body of the 7th eval
7128          (in the order of execution).
7129  B</>I<pattern>B</>    Search forwards for I<pattern>; final B</> is optional.
7130  B<?>I<pattern>B<?>    Search backwards for I<pattern>; final B<?> is optional.
7131  B<L> [I<a|b|w>]        List actions and or breakpoints and or watch-expressions.
7132  B<S> [[B<!>]I<pattern>]    List subroutine names [not] matching I<pattern>.
7133  B<t>        Toggle trace mode.
7134  B<t> I<expr>        Trace through execution of I<expr>.
7135  B<b>        Sets breakpoint on current line)
7136  B<b> [I<line>] [I<condition>]
7137          Set breakpoint; I<line> defaults to the current execution line;
7138          I<condition> breaks if it evaluates to true, defaults to '1'.
7139  B<b> I<subname> [I<condition>]
7140          Set breakpoint at first line of subroutine.
7141  B<b> I<\$var>        Set breakpoint at first line of subroutine referenced by I<\$var>.
7142  B<b> B<load> I<filename> Set breakpoint on 'require'ing the given file.
7143  B<b> B<postpone> I<subname> [I<condition>]
7144          Set breakpoint at first line of subroutine after 
7145          it is compiled.
7146  B<b> B<compile> I<subname>
7147          Stop after the subroutine is compiled.
7148  B<B> [I<line>]    Delete the breakpoint for I<line>.
7149  B<B> I<*>             Delete all breakpoints.
7150  B<a> [I<line>] I<command>
7151          Set an action to be done before the I<line> is executed;
7152          I<line> defaults to the current execution line.
7153          Sequence is: check for breakpoint/watchpoint, print line
7154          if necessary, do action, prompt user if necessary,
7155          execute line.
7156  B<a>        Does nothing
7157  B<A> [I<line>]    Delete the action for I<line>.
7158  B<A> I<*>             Delete all actions.
7159  B<w> I<expr>        Add a global watch-expression.
7160  B<w>             Does nothing
7161  B<W> I<expr>        Delete a global watch-expression.
7162  B<W> I<*>             Delete all watch-expressions.
7163  B<V> [I<pkg> [I<vars>]]    List some (default all) variables in package (default current).
7164          Use B<~>I<pattern> and B<!>I<pattern> for positive and negative regexps.
7165  B<X> [I<vars>]    Same as \"B<V> I<currentpackage> [I<vars>]\".
7166  B<x> I<expr>        Evals expression in list context, dumps the result.
7167  B<m> I<expr>        Evals expression in list context, prints methods callable
7168          on the first element of the result.
7169  B<m> I<class>        Prints methods callable via the given class.
7170  B<M>        Show versions of loaded modules.
7171  B<i> I<class>       Prints nested parents of given class.
7172  B<e>         Display current thread id.
7173  B<E>         Display all thread ids the current one will be identified: <n>.
7174  B<y> [I<n> [I<Vars>]]   List lexicals in higher scope <n>.  Vars same as B<V>.
7175  
7176  B<<> ?            List Perl commands to run before each prompt.
7177  B<<> I<expr>        Define Perl command to run before each prompt.
7178  B<<<> I<expr>        Add to the list of Perl commands to run before each prompt.
7179  B<< *>                Delete the list of perl commands to run before each prompt.
7180  B<>> ?            List Perl commands to run after each prompt.
7181  B<>> I<expr>        Define Perl command to run after each prompt.
7182  B<>>B<>> I<expr>        Add to the list of Perl commands to run after each prompt.
7183  B<>>B< *>        Delete the list of Perl commands to run after each prompt.
7184  B<{> I<db_command>    Define debugger command to run before each prompt.
7185  B<{> ?            List debugger commands to run before each prompt.
7186  B<{{> I<db_command>    Add to the list of debugger commands to run before each prompt.
7187  B<{ *>             Delete the list of debugger commands to run before each prompt.
7188  B<$prc> I<number>    Redo a previous command (default previous command).
7189  B<$prc> I<-number>    Redo number'th-to-last command.
7190  B<$prc> I<pattern>    Redo last command that started with I<pattern>.
7191          See 'B<O> I<recallCommand>' too.
7192  B<$psh$psh> I<cmd>      Run cmd in a subprocess (reads from DB::IN, writes to DB::OUT)"
7193        . (
7194          $rc eq $sh
7195          ? ""
7196          : "
7197  B<$psh> [I<cmd>] Run I<cmd> in subshell (forces \"\$SHELL -c 'cmd'\")."
7198        ) . "
7199          See 'B<O> I<shellBang>' too.
7200  B<source> I<file>     Execute I<file> containing debugger commands (may nest).
7201  B<save> I<file>       Save current debugger session (actual history) to I<file>.
7202  B<rerun>           Rerun session to current position.
7203  B<rerun> I<n>         Rerun session to numbered command.
7204  B<rerun> I<-n>        Rerun session to number'th-to-last command.
7205  B<H> I<-number>    Display last number commands (default all).
7206  B<H> I<*>          Delete complete history.
7207  B<p> I<expr>        Same as \"I<print {DB::OUT} expr>\" in current package.
7208  B<|>I<dbcmd>        Run debugger command, piping DB::OUT to current pager.
7209  B<||>I<dbcmd>        Same as B<|>I<dbcmd> but DB::OUT is temporarilly select()ed as well.
7210  B<\=> [I<alias> I<value>]    Define a command alias, or list current aliases.
7211  I<command>        Execute as a perl statement in current package.
7212  B<R>        Pure-man-restart of debugger, some of debugger state
7213          and command-line options may be lost.
7214          Currently the following settings are preserved:
7215          history, breakpoints and actions, debugger B<O>ptions 
7216          and the following command-line options: I<-w>, I<-I>, I<-e>.
7217  
7218  B<o> [I<opt>] ...    Set boolean option to true
7219  B<o> [I<opt>B<?>]    Query options
7220  B<o> [I<opt>B<=>I<val>] [I<opt>=B<\">I<val>B<\">] ... 
7221          Set options.  Use quotes if spaces in value.
7222      I<recallCommand>, I<ShellBang>    chars used to recall command or spawn shell;
7223      I<pager>            program for output of \"|cmd\";
7224      I<tkRunning>            run Tk while prompting (with ReadLine);
7225      I<signalLevel> I<warnLevel> I<dieLevel>    level of verbosity;
7226      I<inhibit_exit>        Allows stepping off the end of the script.
7227      I<ImmediateStop>        Debugger should stop as early as possible.
7228      I<RemotePort>            Remote hostname:port for remote debugging
7229    The following options affect what happens with B<V>, B<X>, and B<x> commands:
7230      I<arrayDepth>, I<hashDepth>     print only first N elements ('' for all);
7231      I<compactDump>, I<veryCompact>     change style of array and hash dump;
7232      I<globPrint>             whether to print contents of globs;
7233      I<DumpDBFiles>         dump arrays holding debugged files;
7234      I<DumpPackages>         dump symbol tables of packages;
7235      I<DumpReused>             dump contents of \"reused\" addresses;
7236      I<quote>, I<HighBit>, I<undefPrint>     change style of string dump;
7237      I<bareStringify>         Do not print the overload-stringified value;
7238    Other options include:
7239      I<PrintRet>        affects printing of return value after B<r> command,
7240      I<frame>        affects printing messages on subroutine entry/exit.
7241      I<AutoTrace>    affects printing messages on possible breaking points.
7242      I<maxTraceLen>    gives max length of evals/args listed in stack trace.
7243      I<ornaments>     affects screen appearance of the command line.
7244      I<CreateTTY>     bits control attempts to create a new TTY on events:
7245              1: on fork()    2: debugger is started inside debugger
7246              4: on startup
7247      During startup options are initialized from \$ENV{PERLDB_OPTS}.
7248      You can put additional initialization options I<TTY>, I<noTTY>,
7249      I<ReadLine>, I<NonStop>, and I<RemotePort> there (or use
7250      `B<R>' after you set them).
7251  
7252  B<q> or B<^D>        Quit. Set B<\$DB::finished = 0> to debug global destruction.
7253  B<h>        Summary of debugger commands.
7254  B<h> [I<db_command>]    Get help [on a specific debugger command], enter B<|h> to page.
7255  B<h h>        Long help for debugger commands
7256  B<$doccmd> I<manpage>    Runs the external doc viewer B<$doccmd> command on the 
7257          named Perl I<manpage>, or on B<$doccmd> itself if omitted.
7258          Set B<\$DB::doccmd> to change viewer.
7259  
7260  Type `|h h' for a paged display if this was too hard to read.
7261  
7262  ";    # Fix balance of vi % matching: }}}}
7263  
7264      #  note: tabs in the following section are not-so-helpful
7265      $summary = <<"END_SUM";
7266  I<List/search source lines:>               I<Control script execution:>
7267    B<l> [I<ln>|I<sub>]  List source code            B<T>           Stack trace
7268    B<-> or B<.>      List previous/current line  B<s> [I<expr>]    Single step [in expr]
7269    B<v> [I<line>]    View around line            B<n> [I<expr>]    Next, steps over subs
7270    B<f> I<filename>  View source in file         <B<CR>/B<Enter>>  Repeat last B<n> or B<s>
7271    B</>I<pattern>B</> B<?>I<patt>B<?>   Search forw/backw    B<r>           Return from subroutine
7272    B<M>           Show module versions        B<c> [I<ln>|I<sub>]  Continue until position
7273  I<Debugger controls:>                        B<L>           List break/watch/actions
7274    B<o> [...]     Set debugger options        B<t> [I<expr>]    Toggle trace [trace expr]
7275    B<<>[B<<>]|B<{>[B<{>]|B<>>[B<>>] [I<cmd>] Do pre/post-prompt B<b> [I<ln>|I<event>|I<sub>] [I<cnd>] Set breakpoint
7276    B<$prc> [I<N>|I<pat>]   Redo a previous command     B<B> I<ln|*>      Delete a/all breakpoints
7277    B<H> [I<-num>]    Display last num commands   B<a> [I<ln>] I<cmd>  Do cmd before line
7278    B<=> [I<a> I<val>]   Define/list an alias        B<A> I<ln|*>      Delete a/all actions
7279    B<h> [I<db_cmd>]  Get help on command         B<w> I<expr>      Add a watch expression
7280    B<h h>         Complete help page          B<W> I<expr|*>    Delete a/all watch exprs
7281    B<|>[B<|>]I<db_cmd>  Send output to pager        B<$psh>\[B<$psh>\] I<syscmd> Run cmd in a subprocess
7282    B<q> or B<^D>     Quit                        B<R>           Attempt a restart
7283  I<Data Examination:>     B<expr>     Execute perl code, also see: B<s>,B<n>,B<t> I<expr>
7284    B<x>|B<m> I<expr>       Evals expr in list context, dumps the result or lists methods.
7285    B<p> I<expr>         Print expression (uses script's current package).
7286    B<S> [[B<!>]I<pat>]     List subroutine names [not] matching pattern
7287    B<V> [I<Pk> [I<Vars>]]  List Variables in Package.  Vars can be ~pattern or !pattern.
7288    B<X> [I<Vars>]       Same as \"B<V> I<current_package> [I<Vars>]\".  B<i> I<class> inheritance tree.
7289    B<y> [I<n> [I<Vars>]]   List lexicals in higher scope <n>.  Vars same as B<V>.
7290    B<e>     Display thread id     B<E> Display all thread ids.
7291  For more help, type B<h> I<cmd_letter>, or run B<$doccmd perldebug> for all docs.
7292  END_SUM
7293  
7294      # ')}}; # Fix balance of vi % matching
7295  
7296      # and this is really numb...
7297      $pre580_help = "
7298  B<T>        Stack trace.
7299  B<s> [I<expr>]    Single step [in I<expr>].
7300  B<n> [I<expr>]    Next, steps over subroutine calls [in I<expr>].
7301  B<CR>>        Repeat last B<n> or B<s> command.
7302  B<r>        Return from current subroutine.
7303  B<c> [I<line>|I<sub>]    Continue; optionally inserts a one-time-only breakpoint
7304          at the specified position.
7305  B<l> I<min>B<+>I<incr>    List I<incr>+1 lines starting at I<min>.
7306  B<l> I<min>B<->I<max>    List lines I<min> through I<max>.
7307  B<l> I<line>        List single I<line>.
7308  B<l> I<subname>    List first window of lines from subroutine.
7309  B<l> I<\$var>        List first window of lines from subroutine referenced by I<\$var>.
7310  B<l>        List next window of lines.
7311  B<->        List previous window of lines.
7312  B<w> [I<line>]    List window around I<line>.
7313  B<.>        Return to the executed line.
7314  B<f> I<filename>    Switch to viewing I<filename>. File must be already loaded.
7315          I<filename> may be either the full name of the file, or a regular
7316          expression matching the full file name:
7317          B<f> I</home/me/foo.pl> and B<f> I<oo\\.> may access the same file.
7318          Evals (with saved bodies) are considered to be filenames:
7319          B<f> I<(eval 7)> and B<f> I<eval 7\\b> access the body of the 7th eval
7320          (in the order of execution).
7321  B</>I<pattern>B</>    Search forwards for I<pattern>; final B</> is optional.
7322  B<?>I<pattern>B<?>    Search backwards for I<pattern>; final B<?> is optional.
7323  B<L>        List all breakpoints and actions.
7324  B<S> [[B<!>]I<pattern>]    List subroutine names [not] matching I<pattern>.
7325  B<t>        Toggle trace mode.
7326  B<t> I<expr>        Trace through execution of I<expr>.
7327  B<b> [I<line>] [I<condition>]
7328          Set breakpoint; I<line> defaults to the current execution line;
7329          I<condition> breaks if it evaluates to true, defaults to '1'.
7330  B<b> I<subname> [I<condition>]
7331          Set breakpoint at first line of subroutine.
7332  B<b> I<\$var>        Set breakpoint at first line of subroutine referenced by I<\$var>.
7333  B<b> B<load> I<filename> Set breakpoint on `require'ing the given file.
7334  B<b> B<postpone> I<subname> [I<condition>]
7335          Set breakpoint at first line of subroutine after 
7336          it is compiled.
7337  B<b> B<compile> I<subname>
7338          Stop after the subroutine is compiled.
7339  B<d> [I<line>]    Delete the breakpoint for I<line>.
7340  B<D>        Delete all breakpoints.
7341  B<a> [I<line>] I<command>
7342          Set an action to be done before the I<line> is executed;
7343          I<line> defaults to the current execution line.
7344          Sequence is: check for breakpoint/watchpoint, print line
7345          if necessary, do action, prompt user if necessary,
7346          execute line.
7347  B<a> [I<line>]    Delete the action for I<line>.
7348  B<A>        Delete all actions.
7349  B<W> I<expr>        Add a global watch-expression.
7350  B<W>        Delete all watch-expressions.
7351  B<V> [I<pkg> [I<vars>]]    List some (default all) variables in package (default current).
7352          Use B<~>I<pattern> and B<!>I<pattern> for positive and negative regexps.
7353  B<X> [I<vars>]    Same as \"B<V> I<currentpackage> [I<vars>]\".
7354  B<x> I<expr>        Evals expression in list context, dumps the result.
7355  B<m> I<expr>        Evals expression in list context, prints methods callable
7356          on the first element of the result.
7357  B<m> I<class>        Prints methods callable via the given class.
7358  
7359  B<<> ?            List Perl commands to run before each prompt.
7360  B<<> I<expr>        Define Perl command to run before each prompt.
7361  B<<<> I<expr>        Add to the list of Perl commands to run before each prompt.
7362  B<>> ?            List Perl commands to run after each prompt.
7363  B<>> I<expr>        Define Perl command to run after each prompt.
7364  B<>>B<>> I<expr>        Add to the list of Perl commands to run after each prompt.
7365  B<{> I<db_command>    Define debugger command to run before each prompt.
7366  B<{> ?            List debugger commands to run before each prompt.
7367  B<{{> I<db_command>    Add to the list of debugger commands to run before each prompt.
7368  B<$prc> I<number>    Redo a previous command (default previous command).
7369  B<$prc> I<-number>    Redo number'th-to-last command.
7370  B<$prc> I<pattern>    Redo last command that started with I<pattern>.
7371          See 'B<O> I<recallCommand>' too.
7372  B<$psh$psh> I<cmd>      Run cmd in a subprocess (reads from DB::IN, writes to DB::OUT)"
7373        . (
7374          $rc eq $sh
7375          ? ""
7376          : "
7377  B<$psh> [I<cmd>]     Run I<cmd> in subshell (forces \"\$SHELL -c 'cmd'\")."
7378        ) . "
7379          See 'B<O> I<shellBang>' too.
7380  B<source> I<file>        Execute I<file> containing debugger commands (may nest).
7381  B<H> I<-number>    Display last number commands (default all).
7382  B<p> I<expr>        Same as \"I<print {DB::OUT} expr>\" in current package.
7383  B<|>I<dbcmd>        Run debugger command, piping DB::OUT to current pager.
7384  B<||>I<dbcmd>        Same as B<|>I<dbcmd> but DB::OUT is temporarilly select()ed as well.
7385  B<\=> [I<alias> I<value>]    Define a command alias, or list current aliases.
7386  I<command>        Execute as a perl statement in current package.
7387  B<v>        Show versions of loaded modules.
7388  B<R>        Pure-man-restart of debugger, some of debugger state
7389          and command-line options may be lost.
7390          Currently the following settings are preserved:
7391          history, breakpoints and actions, debugger B<O>ptions 
7392          and the following command-line options: I<-w>, I<-I>, I<-e>.
7393  
7394  B<O> [I<opt>] ...    Set boolean option to true
7395  B<O> [I<opt>B<?>]    Query options
7396  B<O> [I<opt>B<=>I<val>] [I<opt>=B<\">I<val>B<\">] ... 
7397          Set options.  Use quotes if spaces in value.
7398      I<recallCommand>, I<ShellBang>    chars used to recall command or spawn shell;
7399      I<pager>            program for output of \"|cmd\";
7400      I<tkRunning>            run Tk while prompting (with ReadLine);
7401      I<signalLevel> I<warnLevel> I<dieLevel>    level of verbosity;
7402      I<inhibit_exit>        Allows stepping off the end of the script.
7403      I<ImmediateStop>        Debugger should stop as early as possible.
7404      I<RemotePort>            Remote hostname:port for remote debugging
7405    The following options affect what happens with B<V>, B<X>, and B<x> commands:
7406      I<arrayDepth>, I<hashDepth>     print only first N elements ('' for all);
7407      I<compactDump>, I<veryCompact>     change style of array and hash dump;
7408      I<globPrint>             whether to print contents of globs;
7409      I<DumpDBFiles>         dump arrays holding debugged files;
7410      I<DumpPackages>         dump symbol tables of packages;
7411      I<DumpReused>             dump contents of \"reused\" addresses;
7412      I<quote>, I<HighBit>, I<undefPrint>     change style of string dump;
7413      I<bareStringify>         Do not print the overload-stringified value;
7414    Other options include:
7415      I<PrintRet>        affects printing of return value after B<r> command,
7416      I<frame>        affects printing messages on subroutine entry/exit.
7417      I<AutoTrace>    affects printing messages on possible breaking points.
7418      I<maxTraceLen>    gives max length of evals/args listed in stack trace.
7419      I<ornaments>     affects screen appearance of the command line.
7420      I<CreateTTY>     bits control attempts to create a new TTY on events:
7421              1: on fork()    2: debugger is started inside debugger
7422              4: on startup
7423      During startup options are initialized from \$ENV{PERLDB_OPTS}.
7424      You can put additional initialization options I<TTY>, I<noTTY>,
7425      I<ReadLine>, I<NonStop>, and I<RemotePort> there (or use
7426      `B<R>' after you set them).
7427  
7428  B<q> or B<^D>        Quit. Set B<\$DB::finished = 0> to debug global destruction.
7429  B<h> [I<db_command>]    Get help [on a specific debugger command], enter B<|h> to page.
7430  B<h h>        Summary of debugger commands.
7431  B<$doccmd> I<manpage>    Runs the external doc viewer B<$doccmd> command on the 
7432          named Perl I<manpage>, or on B<$doccmd> itself if omitted.
7433          Set B<\$DB::doccmd> to change viewer.
7434  
7435  Type `|h' for a paged display if this was too hard to read.
7436  
7437  ";    # Fix balance of vi % matching: }}}}
7438  
7439      #  note: tabs in the following section are not-so-helpful
7440      $pre580_summary = <<"END_SUM";
7441  I<List/search source lines:>               I<Control script execution:>
7442    B<l> [I<ln>|I<sub>]  List source code            B<T>           Stack trace
7443    B<-> or B<.>      List previous/current line  B<s> [I<expr>]    Single step [in expr]
7444    B<w> [I<line>]    List around line            B<n> [I<expr>]    Next, steps over subs
7445    B<f> I<filename>  View source in file         <B<CR>/B<Enter>>  Repeat last B<n> or B<s>
7446    B</>I<pattern>B</> B<?>I<patt>B<?>   Search forw/backw    B<r>           Return from subroutine
7447    B<v>           Show versions of modules    B<c> [I<ln>|I<sub>]  Continue until position
7448  I<Debugger controls:>                        B<L>           List break/watch/actions
7449    B<O> [...]     Set debugger options        B<t> [I<expr>]    Toggle trace [trace expr]
7450    B<<>[B<<>]|B<{>[B<{>]|B<>>[B<>>] [I<cmd>] Do pre/post-prompt B<b> [I<ln>|I<event>|I<sub>] [I<cnd>] Set breakpoint
7451    B<$prc> [I<N>|I<pat>]   Redo a previous command     B<d> [I<ln>] or B<D> Delete a/all breakpoints
7452    B<H> [I<-num>]    Display last num commands   B<a> [I<ln>] I<cmd>  Do cmd before line
7453    B<=> [I<a> I<val>]   Define/list an alias        B<W> I<expr>      Add a watch expression
7454    B<h> [I<db_cmd>]  Get help on command         B<A> or B<W>      Delete all actions/watch
7455    B<|>[B<|>]I<db_cmd>  Send output to pager        B<$psh>\[B<$psh>\] I<syscmd> Run cmd in a subprocess
7456    B<q> or B<^D>     Quit                        B<R>           Attempt a restart
7457  I<Data Examination:>     B<expr>     Execute perl code, also see: B<s>,B<n>,B<t> I<expr>
7458    B<x>|B<m> I<expr>       Evals expr in list context, dumps the result or lists methods.
7459    B<p> I<expr>         Print expression (uses script's current package).
7460    B<S> [[B<!>]I<pat>]     List subroutine names [not] matching pattern
7461    B<V> [I<Pk> [I<Vars>]]  List Variables in Package.  Vars can be ~pattern or !pattern.
7462    B<X> [I<Vars>]       Same as \"B<V> I<current_package> [I<Vars>]\".
7463    B<y> [I<n> [I<Vars>]]   List lexicals in higher scope <n>.  Vars same as B<V>.
7464  For more help, type B<h> I<cmd_letter>, or run B<$doccmd perldebug> for all docs.
7465  END_SUM
7466  
7467      # ')}}; # Fix balance of vi % matching
7468  
7469  } ## end sub sethelp
7470  
7471  =head2 C<print_help()>
7472  
7473  Most of what C<print_help> does is just text formatting. It finds the
7474  C<B> and C<I> ornaments, cleans them off, and substitutes the proper
7475  terminal control characters to simulate them (courtesy of 
7476  C<Term::ReadLine::TermCap>).
7477  
7478  =cut
7479  
7480  sub print_help {
7481      local $_ = shift;
7482  
7483      # Restore proper alignment destroyed by eeevil I<> and B<>
7484      # ornaments: A pox on both their houses!
7485      #
7486      # A help command will have everything up to and including
7487      # the first tab sequence padded into a field 16 (or if indented 20)
7488      # wide.  If it's wider than that, an extra space will be added.
7489      s{
7490          ^                       # only matters at start of line
7491            ( \040{4} | \t )*     # some subcommands are indented
7492            ( < ?                 # so <CR> works
7493              [BI] < [^\t\n] + )  # find an eeevil ornament
7494            ( \t+ )               # original separation, discarded
7495            ( .* )                # this will now start (no earlier) than 
7496                                  # column 16
7497      } {
7498          my($leadwhite, $command, $midwhite, $text) = ($1, $2, $3, $4);
7499          my $clean = $command;
7500          $clean =~ s/[BI]<([^>]*)>/$1/g;  
7501  
7502          # replace with this whole string:
7503          ($leadwhite ? " " x 4 : "")
7504        . $command
7505        . ((" " x (16 + ($leadwhite ? 4 : 0) - length($clean))) || " ")
7506        . $text;
7507  
7508      }mgex;
7509  
7510      s{                          # handle bold ornaments
7511         B < ( [^>] + | > ) >
7512      } {
7513            $Term::ReadLine::TermCap::rl_term_set[2] 
7514          . $1
7515          . $Term::ReadLine::TermCap::rl_term_set[3]
7516      }gex;
7517  
7518      s{                         # handle italic ornaments
7519         I < ( [^>] + | > ) >
7520      } {
7521            $Term::ReadLine::TermCap::rl_term_set[0] 
7522          . $1
7523          . $Term::ReadLine::TermCap::rl_term_set[1]
7524      }gex;
7525  
7526      local $\ = '';
7527      print $OUT $_;
7528  } ## end sub print_help
7529  
7530  =head2 C<fix_less> 
7531  
7532  This routine does a lot of gyrations to be sure that the pager is C<less>.
7533  It checks for C<less> masquerading as C<more> and records the result in
7534  C<$ENV{LESS}> so we don't have to go through doing the stats again.
7535  
7536  =cut
7537  
7538  sub fix_less {
7539  
7540      # We already know if this is set.
7541      return if defined $ENV{LESS} && $ENV{LESS} =~ /r/;
7542  
7543      # Pager is less for sure.
7544      my $is_less = $pager =~ /\bless\b/;
7545      if ( $pager =~ /\bmore\b/ ) {
7546  
7547          # Nope, set to more. See what's out there.
7548          my @st_more = stat('/usr/bin/more');
7549          my @st_less = stat('/usr/bin/less');
7550  
7551          # is it really less, pretending to be more?
7552               $is_less = @st_more
7553            && @st_less
7554            && $st_more[0] == $st_less[0]
7555            && $st_more[1] == $st_less[1];
7556      } ## end if ($pager =~ /\bmore\b/)
7557  
7558      # changes environment!
7559      # 'r' added so we don't do (slow) stats again.
7560      $ENV{LESS} .= 'r' if $is_less;
7561  } ## end sub fix_less
7562  
7563  =head1 DIE AND WARN MANAGEMENT
7564  
7565  =head2 C<diesignal>
7566  
7567  C<diesignal> is a just-drop-dead C<die> handler. It's most useful when trying
7568  to debug a debugger problem.
7569  
7570  It does its best to report the error that occurred, and then forces the
7571  program, debugger, and everything to die.
7572  
7573  =cut
7574  
7575  sub diesignal {
7576  
7577      # No entry/exit messages.
7578      local $frame = 0;
7579  
7580      # No return value prints.
7581      local $doret = -2;
7582  
7583      # set the abort signal handling to the default (just terminate).
7584      $SIG{'ABRT'} = 'DEFAULT';
7585  
7586      # If we enter the signal handler recursively, kill myself with an
7587      # abort signal (so we just terminate).
7588      kill 'ABRT', $$ if $panic++;
7589  
7590      # If we can show detailed info, do so.
7591      if ( defined &Carp::longmess ) {
7592  
7593          # Don't recursively enter the warn handler, since we're carping.
7594          local $SIG{__WARN__} = '';
7595  
7596          # Skip two levels before reporting traceback: we're skipping
7597          # mydie and confess.
7598          local $Carp::CarpLevel = 2;    # mydie + confess
7599  
7600          # Tell us all about it.
7601          &warn( Carp::longmess("Signal @_") );
7602      }
7603  
7604      # No Carp. Tell us about the signal as best we can.
7605      else {
7606          local $\ = '';
7607          print $DB::OUT "Got signal @_\n";
7608      }
7609  
7610      # Drop dead.
7611      kill 'ABRT', $$;
7612  } ## end sub diesignal
7613  
7614  =head2 C<dbwarn>
7615  
7616  The debugger's own default C<$SIG{__WARN__}> handler. We load C<Carp> to
7617  be able to get a stack trace, and output the warning message vi C<DB::dbwarn()>.
7618  
7619  =cut
7620  
7621  sub dbwarn {
7622  
7623      # No entry/exit trace.
7624      local $frame = 0;
7625  
7626      # No return value printing.
7627      local $doret = -2;
7628  
7629      # Turn off warn and die handling to prevent recursive entries to this
7630      # routine.
7631      local $SIG{__WARN__} = '';
7632      local $SIG{__DIE__}  = '';
7633  
7634      # Load Carp if we can. If $^S is false (current thing being compiled isn't
7635      # done yet), we may not be able to do a require.
7636      eval { require Carp }
7637        if defined $^S;    # If error/warning during compilation,
7638                           # require may be broken.
7639  
7640      # Use the core warn() unless Carp loaded OK.
7641      CORE::warn( @_,
7642          "\nCannot print stack trace, load with -MCarp option to see stack" ),
7643        return
7644        unless defined &Carp::longmess;
7645  
7646      # Save the current values of $single and $trace, and then turn them off.
7647      my ( $mysingle, $mytrace ) = ( $single, $trace );
7648      $single = 0;
7649      $trace  = 0;
7650  
7651      # We can call Carp::longmess without its being "debugged" (which we
7652      # don't want - we just want to use it!). Capture this for later.
7653      my $mess = Carp::longmess(@_);
7654  
7655      # Restore $single and $trace to their original values.
7656      ( $single, $trace ) = ( $mysingle, $mytrace );
7657  
7658      # Use the debugger's own special way of printing warnings to print
7659      # the stack trace message.
7660      &warn($mess);
7661  } ## end sub dbwarn
7662  
7663  =head2 C<dbdie>
7664  
7665  The debugger's own C<$SIG{__DIE__}> handler. Handles providing a stack trace
7666  by loading C<Carp> and calling C<Carp::longmess()> to get it. We turn off 
7667  single stepping and tracing during the call to C<Carp::longmess> to avoid 
7668  debugging it - we just want to use it.
7669  
7670  If C<dieLevel> is zero, we let the program being debugged handle the
7671  exceptions. If it's 1, you get backtraces for any exception. If it's 2,
7672  the debugger takes over all exception handling, printing a backtrace and
7673  displaying the exception via its C<dbwarn()> routine. 
7674  
7675  =cut
7676  
7677  sub dbdie {
7678      local $frame         = 0;
7679      local $doret         = -2;
7680      local $SIG{__DIE__}  = '';
7681      local $SIG{__WARN__} = '';
7682      my $i      = 0;
7683      my $ineval = 0;
7684      my $sub;
7685      if ( $dieLevel > 2 ) {
7686          local $SIG{__WARN__} = \&dbwarn;
7687          &warn(@_);    # Yell no matter what
7688          return;
7689      }
7690      if ( $dieLevel < 2 ) {
7691          die @_ if $^S;    # in eval propagate
7692      }
7693  
7694      # The code used to check $^S to see if compiliation of the current thing
7695      # hadn't finished. We don't do it anymore, figuring eval is pretty stable.
7696      eval { require Carp };
7697  
7698      die( @_,
7699          "\nCannot print stack trace, load with -MCarp option to see stack" )
7700        unless defined &Carp::longmess;
7701  
7702      # We do not want to debug this chunk (automatic disabling works
7703      # inside DB::DB, but not in Carp). Save $single and $trace, turn them off,
7704      # get the stack trace from Carp::longmess (if possible), restore $signal
7705      # and $trace, and then die with the stack trace.
7706      my ( $mysingle, $mytrace ) = ( $single, $trace );
7707      $single = 0;
7708      $trace  = 0;
7709      my $mess = "@_";
7710      {
7711  
7712          package Carp;    # Do not include us in the list
7713          eval { $mess = Carp::longmess(@_); };
7714      }
7715      ( $single, $trace ) = ( $mysingle, $mytrace );
7716      die $mess;
7717  } ## end sub dbdie
7718  
7719  =head2 C<warnlevel()>
7720  
7721  Set the C<$DB::warnLevel> variable that stores the value of the
7722  C<warnLevel> option. Calling C<warnLevel()> with a positive value
7723  results in the debugger taking over all warning handlers. Setting
7724  C<warnLevel> to zero leaves any warning handlers set up by the program
7725  being debugged in place.
7726  
7727  =cut
7728  
7729  sub warnLevel {
7730      if (@_) {
7731          $prevwarn = $SIG{__WARN__} unless $warnLevel;
7732          $warnLevel = shift;
7733          if ($warnLevel) {
7734              $SIG{__WARN__} = \&DB::dbwarn;
7735          }
7736          elsif ($prevwarn) {
7737              $SIG{__WARN__} = $prevwarn;
7738          }
7739      } ## end if (@_)
7740      $warnLevel;
7741  } ## end sub warnLevel
7742  
7743  =head2 C<dielevel>
7744  
7745  Similar to C<warnLevel>. Non-zero values for C<dieLevel> result in the 
7746  C<DB::dbdie()> function overriding any other C<die()> handler. Setting it to
7747  zero lets you use your own C<die()> handler.
7748  
7749  =cut
7750  
7751  sub dieLevel {
7752      local $\ = '';
7753      if (@_) {
7754          $prevdie = $SIG{__DIE__} unless $dieLevel;
7755          $dieLevel = shift;
7756          if ($dieLevel) {
7757  
7758              # Always set it to dbdie() for non-zero values.
7759              $SIG{__DIE__} = \&DB::dbdie;    # if $dieLevel < 2;
7760  
7761              # No longer exists, so don't try  to use it.
7762              #$SIG{__DIE__} = \&DB::diehard if $dieLevel >= 2;
7763  
7764              # If we've finished initialization, mention that stack dumps
7765              # are enabled, If dieLevel is 1, we won't stack dump if we die
7766              # in an eval().
7767              print $OUT "Stack dump during die enabled",
7768                ( $dieLevel == 1 ? " outside of evals" : "" ), ".\n"
7769                if $I_m_init;
7770  
7771              # XXX This is probably obsolete, given that diehard() is gone.
7772              print $OUT "Dump printed too.\n" if $dieLevel > 2;
7773          } ## end if ($dieLevel)
7774  
7775          # Put the old one back if there was one.
7776          elsif ($prevdie) {
7777              $SIG{__DIE__} = $prevdie;
7778              print $OUT "Default die handler restored.\n";
7779          }
7780      } ## end if (@_)
7781      $dieLevel;
7782  } ## end sub dieLevel
7783  
7784  =head2 C<signalLevel>
7785  
7786  Number three in a series: set C<signalLevel> to zero to keep your own
7787  signal handler for C<SIGSEGV> and/or C<SIGBUS>. Otherwise, the debugger 
7788  takes over and handles them with C<DB::diesignal()>.
7789  
7790  =cut
7791  
7792  sub signalLevel {
7793      if (@_) {
7794          $prevsegv = $SIG{SEGV} unless $signalLevel;
7795          $prevbus  = $SIG{BUS}  unless $signalLevel;
7796          $signalLevel = shift;
7797          if ($signalLevel) {
7798              $SIG{SEGV} = \&DB::diesignal;
7799              $SIG{BUS}  = \&DB::diesignal;
7800          }
7801          else {
7802              $SIG{SEGV} = $prevsegv;
7803              $SIG{BUS}  = $prevbus;
7804          }
7805      } ## end if (@_)
7806      $signalLevel;
7807  } ## end sub signalLevel
7808  
7809  =head1 SUBROUTINE DECODING SUPPORT
7810  
7811  These subroutines are used during the C<x> and C<X> commands to try to
7812  produce as much information as possible about a code reference. They use
7813  L<Devel::Peek> to try to find the glob in which this code reference lives
7814  (if it does) - this allows us to actually code references which correspond
7815  to named subroutines (including those aliased via glob assignment).
7816  
7817  =head2 C<CvGV_name()>
7818  
7819  Wrapper for C<CvGV_name_or_bust>; tries to get the name of a reference
7820  via that routine. If this fails, return the reference again (when the
7821  reference is stringified, it'll come out as C<SOMETHING(0x...)>).
7822  
7823  =cut
7824  
7825  sub CvGV_name {
7826      my $in   = shift;
7827      my $name = CvGV_name_or_bust($in);
7828      defined $name ? $name : $in;
7829  }
7830  
7831  =head2 C<CvGV_name_or_bust> I<coderef>
7832  
7833  Calls L<Devel::Peek> to try to find the glob the ref lives in; returns
7834  C<undef> if L<Devel::Peek> can't be loaded, or if C<Devel::Peek::CvGV> can't
7835  find a glob for this ref.
7836  
7837  Returns C<< I<package>::I<glob name> >> if the code ref is found in a glob.
7838  
7839  =cut
7840  
7841  sub CvGV_name_or_bust {
7842      my $in = shift;
7843      return if $skipCvGV;    # Backdoor to avoid problems if XS broken...
7844      return unless ref $in;
7845      $in = \&$in;            # Hard reference...
7846      eval { require Devel::Peek; 1 } or return;
7847      my $gv = Devel::Peek::CvGV($in) or return;
7848      *$gv{PACKAGE} . '::' . *$gv{NAME};
7849  } ## end sub CvGV_name_or_bust
7850  
7851  =head2 C<find_sub>
7852  
7853  A utility routine used in various places; finds the file where a subroutine 
7854  was defined, and returns that filename and a line-number range.
7855  
7856  Tries to use C<@sub> first; if it can't find it there, it tries building a
7857  reference to the subroutine and uses C<CvGV_name_or_bust> to locate it,
7858  loading it into C<@sub> as a side effect (XXX I think). If it can't find it
7859  this way, it brute-force searches C<%sub>, checking for identical references.
7860  
7861  =cut
7862  
7863  sub find_sub {
7864      my $subr = shift;
7865      $sub{$subr} or do {
7866          return unless defined &$subr;
7867          my $name = CvGV_name_or_bust($subr);
7868          my $data;
7869          $data = $sub{$name} if defined $name;
7870          return $data if defined $data;
7871  
7872          # Old stupid way...
7873          $subr = \&$subr;    # Hard reference
7874          my $s;
7875          for ( keys %sub ) {
7876              $s = $_, last if $subr eq \&$_;
7877          }
7878          $sub{$s} if $s;
7879        } ## end do
7880  } ## end sub find_sub
7881  
7882  =head2 C<methods>
7883  
7884  A subroutine that uses the utility function C<methods_via> to find all the
7885  methods in the class corresponding to the current reference and in 
7886  C<UNIVERSAL>.
7887  
7888  =cut
7889  
7890  sub methods {
7891  
7892      # Figure out the class - either this is the class or it's a reference
7893      # to something blessed into that class.
7894      my $class = shift;
7895      $class = ref $class if ref $class;
7896  
7897      local %seen;
7898  
7899      # Show the methods that this class has.
7900      methods_via( $class, '', 1 );
7901  
7902      # Show the methods that UNIVERSAL has.
7903      methods_via( 'UNIVERSAL', 'UNIVERSAL', 0 );
7904  } ## end sub methods
7905  
7906  =head2 C<methods_via($class, $prefix, $crawl_upward)>
7907  
7908  C<methods_via> does the work of crawling up the C<@ISA> tree and reporting
7909  all the parent class methods. C<$class> is the name of the next class to
7910  try; C<$prefix> is the message prefix, which gets built up as we go up the
7911  C<@ISA> tree to show parentage; C<$crawl_upward> is 1 if we should try to go
7912  higher in the C<@ISA> tree, 0 if we should stop.
7913  
7914  =cut
7915  
7916  sub methods_via {
7917  
7918      # If we've processed this class already, just quit.
7919      my $class = shift;
7920      return if $seen{$class}++;
7921  
7922      # This is a package that is contributing the methods we're about to print.
7923      my $prefix  = shift;
7924      my $prepend = $prefix ? "via $prefix: " : '';
7925  
7926      my $name;
7927      for $name (
7928  
7929          # Keep if this is a defined subroutine in this class.
7930          grep { defined &{ ${"${class}::"}{$_} } }
7931  
7932          # Extract from all the symbols in this class.
7933          sort keys %{"${class}::"}
7934        )
7935      {
7936  
7937          # If we printed this already, skip it.
7938          next if $seen{$name}++;
7939  
7940          # Print the new method name.
7941          local $\ = '';
7942          local $, = '';
7943          print $DB::OUT "$prepend$name\n";
7944      } ## end for $name (grep { defined...
7945  
7946      # If the $crawl_upward argument is false, just quit here.
7947      return unless shift;
7948  
7949      # $crawl_upward true: keep going up the tree.
7950      # Find all the classes this one is a subclass of.
7951      for $name ( @{"${class}::ISA"} ) {
7952  
7953          # Set up the new prefix.
7954          $prepend = $prefix ? $prefix . " -> $name" : $name;
7955  
7956          # Crawl up the tree and keep trying to crawl up.
7957          methods_via( $name, $prepend, 1 );
7958      }
7959  } ## end sub methods_via
7960  
7961  =head2 C<setman> - figure out which command to use to show documentation
7962  
7963  Just checks the contents of C<$^O> and sets the C<$doccmd> global accordingly.
7964  
7965  =cut
7966  
7967  sub setman {
7968      $doccmd = $^O !~ /^(?:MSWin32|VMS|os2|dos|amigaos|riscos|MacOS|NetWare)\z/s
7969        ? "man"         # O Happy Day!
7970        : "perldoc";    # Alas, poor unfortunates
7971  } ## end sub setman
7972  
7973  =head2 C<runman> - run the appropriate command to show documentation
7974  
7975  Accepts a man page name; runs the appropriate command to display it (set up
7976  during debugger initialization). Uses C<DB::system> to avoid mucking up the
7977  program's STDIN and STDOUT.
7978  
7979  =cut
7980  
7981  sub runman {
7982      my $page = shift;
7983      unless ($page) {
7984          &system("$doccmd $doccmd");
7985          return;
7986      }
7987  
7988      # this way user can override, like with $doccmd="man -Mwhatever"
7989      # or even just "man " to disable the path check.
7990      unless ( $doccmd eq 'man' ) {
7991          &system("$doccmd $page");
7992          return;
7993      }
7994  
7995      $page = 'perl' if lc($page) eq 'help';
7996  
7997      require Config;
7998      my $man1dir = $Config::Config{'man1dir'};
7999      my $man3dir = $Config::Config{'man3dir'};
8000      for ( $man1dir, $man3dir ) { s#/[^/]*\z## if /\S/ }
8001      my $manpath = '';
8002      $manpath .= "$man1dir:" if $man1dir =~ /\S/;
8003      $manpath .= "$man3dir:" if $man3dir =~ /\S/ && $man1dir ne $man3dir;
8004      chop $manpath if $manpath;
8005  
8006      # harmless if missing, I figure
8007      my $oldpath = $ENV{MANPATH};
8008      $ENV{MANPATH} = $manpath if $manpath;
8009      my $nopathopt = $^O =~ /dunno what goes here/;
8010      if (
8011          CORE::system(
8012              $doccmd,
8013  
8014              # I just *know* there are men without -M
8015              ( ( $manpath && !$nopathopt ) ? ( "-M", $manpath ) : () ),
8016              split ' ', $page
8017          )
8018        )
8019      {
8020          unless ( $page =~ /^perl\w/ ) {
8021  # do it this way because its easier to slurp in to keep up to date - clunky though.
8022  my @pods = qw(
8023      5004delta
8024      5005delta
8025      561delta
8026      56delta
8027      570delta
8028      571delta
8029      572delta
8030      573delta
8031      58delta
8032      581delta
8033      582delta
8034      583delta
8035      584delta
8036      590delta
8037      591delta
8038      592delta
8039      aix
8040      amiga
8041      apio
8042      api
8043      apollo
8044      artistic
8045      beos
8046      book
8047      boot
8048      bot
8049      bs2000
8050      call
8051      ce
8052      cheat
8053      clib
8054      cn
8055      compile
8056      cygwin
8057      data
8058      dbmfilter
8059      debguts
8060      debtut
8061      debug
8062      delta
8063      dgux
8064      diag
8065      doc
8066      dos
8067      dsc
8068      ebcdic
8069      embed
8070      epoc
8071      faq1
8072      faq2
8073      faq3
8074      faq4
8075      faq5
8076      faq6
8077      faq7
8078      faq8
8079      faq9
8080      faq
8081      filter
8082      fork
8083      form
8084      freebsd
8085      func
8086      gpl
8087      guts
8088      hack
8089      hist
8090      hpux
8091      hurd
8092      intern
8093      intro
8094      iol
8095      ipc
8096      irix
8097      jp
8098      ko
8099      lexwarn
8100      locale
8101      lol
8102      machten
8103      macos
8104      macosx
8105      mint
8106      modinstall
8107      modlib
8108      mod
8109      modstyle
8110      mpeix
8111      netware
8112      newmod
8113      number
8114      obj
8115      opentut
8116      op
8117      os2
8118      os390
8119      os400
8120      othrtut
8121      packtut
8122      plan9
8123      pod
8124      podspec
8125      port
8126      qnx
8127      ref
8128      reftut
8129      re
8130      requick
8131      reref
8132      retut
8133      run
8134      sec
8135      solaris
8136      style
8137      sub
8138      syn
8139      thrtut
8140      tie
8141      toc
8142      todo
8143      tooc
8144      toot
8145      trap
8146      tru64
8147      tw
8148      unicode
8149      uniintro
8150      util
8151      uts
8152      var
8153      vmesa
8154      vms
8155      vos
8156      win32
8157      xs
8158      xstut
8159  );
8160              if (grep { $page eq $_ } @pods) {
8161                  $page =~ s/^/perl/;
8162                  CORE::system( $doccmd,
8163                      ( ( $manpath && !$nopathopt ) ? ( "-M", $manpath ) : () ),
8164                      $page );
8165              } ## end if (grep { $page eq $_...
8166          } ## end unless ($page =~ /^perl\w/)
8167      } ## end if (CORE::system($doccmd...
8168      if ( defined $oldpath ) {
8169          $ENV{MANPATH} = $manpath;
8170      }
8171      else {
8172          delete $ENV{MANPATH};
8173      }
8174  } ## end sub runman
8175  
8176  #use Carp;                          # This did break, left for debugging
8177  
8178  =head1 DEBUGGER INITIALIZATION - THE SECOND BEGIN BLOCK
8179  
8180  Because of the way the debugger interface to the Perl core is designed, any
8181  debugger package globals that C<DB::sub()> requires have to be defined before
8182  any subroutines can be called. These are defined in the second C<BEGIN> block.
8183  
8184  This block sets things up so that (basically) the world is sane
8185  before the debugger starts executing. We set up various variables that the
8186  debugger has to have set up before the Perl core starts running:
8187  
8188  =over 4 
8189  
8190  =item *
8191  
8192  The debugger's own filehandles (copies of STD and STDOUT for now).
8193  
8194  =item *
8195  
8196  Characters for shell escapes, the recall command, and the history command.
8197  
8198  =item *
8199  
8200  The maximum recursion depth.
8201  
8202  =item *
8203  
8204  The size of a C<w> command's window.
8205  
8206  =item *
8207  
8208  The before-this-line context to be printed in a C<v> (view a window around this line) command.
8209  
8210  =item *
8211  
8212  The fact that we're not in a sub at all right now.
8213  
8214  =item *
8215  
8216  The default SIGINT handler for the debugger.
8217  
8218  =item *
8219  
8220  The appropriate value of the flag in C<$^D> that says the debugger is running
8221  
8222  =item *
8223  
8224  The current debugger recursion level
8225  
8226  =item *
8227  
8228  The list of postponed items and the C<$single> stack (XXX define this)
8229  
8230  =item *
8231  
8232  That we want no return values and no subroutine entry/exit trace.
8233  
8234  =back
8235  
8236  =cut
8237  
8238  # The following BEGIN is very handy if debugger goes havoc, debugging debugger?
8239  
8240  BEGIN {    # This does not compile, alas. (XXX eh?)
8241      $IN  = \*STDIN;     # For bugs before DB::OUT has been opened
8242      $OUT = \*STDERR;    # For errors before DB::OUT has been opened
8243  
8244      # Define characters used by command parsing.
8245      $sh       = '!';      # Shell escape (does not work)
8246      $rc       = ',';      # Recall command (does not work)
8247      @hist     = ('?');    # Show history (does not work)
8248      @truehist = ();       # Can be saved for replay (per session)
8249  
8250      # This defines the point at which you get the 'deep recursion'
8251      # warning. It MUST be defined or the debugger will not load.
8252      $deep = 100;
8253  
8254      # Number of lines around the current one that are shown in the
8255      # 'w' command.
8256      $window = 10;
8257  
8258      # How much before-the-current-line context the 'v' command should
8259      # use in calculating the start of the window it will display.
8260      $preview = 3;
8261  
8262      # We're not in any sub yet, but we need this to be a defined value.
8263      $sub = '';
8264  
8265      # Set up the debugger's interrupt handler. It simply sets a flag
8266      # ($signal) that DB::DB() will check before each command is executed.
8267      $SIG{INT} = \&DB::catch;
8268  
8269      # The following lines supposedly, if uncommented, allow the debugger to
8270      # debug itself. Perhaps we can try that someday.
8271      # This may be enabled to debug debugger:
8272      #$warnLevel = 1 unless defined $warnLevel;
8273      #$dieLevel = 1 unless defined $dieLevel;
8274      #$signalLevel = 1 unless defined $signalLevel;
8275  
8276      # This is the flag that says "a debugger is running, please call
8277      # DB::DB and DB::sub". We will turn it on forcibly before we try to
8278      # execute anything in the user's context, because we always want to
8279      # get control back.
8280      $db_stop = 0;          # Compiler warning ...
8281      $db_stop = 1 << 30;    # ... because this is only used in an eval() later.
8282  
8283      # This variable records how many levels we're nested in debugging. Used
8284      # Used in the debugger prompt, and in determining whether it's all over or
8285      # not.
8286      $level = 0;            # Level of recursive debugging
8287  
8288      # "Triggers bug (?) in perl if we postpone this until runtime."
8289      # XXX No details on this yet, or whether we should fix the bug instead
8290      # of work around it. Stay tuned.
8291      @postponed = @stack = (0);
8292  
8293      # Used to track the current stack depth using the auto-stacked-variable
8294      # trick.
8295      $stack_depth = 0;      # Localized repeatedly; simple way to track $#stack
8296  
8297      # Don't print return values on exiting a subroutine.
8298      $doret = -2;
8299  
8300      # No extry/exit tracing.
8301      $frame = 0;
8302  
8303  } ## end BEGIN
8304  
8305  BEGIN { $^W = $ini_warn; }    # Switch warnings back
8306  
8307  =head1 READLINE SUPPORT - COMPLETION FUNCTION
8308  
8309  =head2 db_complete
8310  
8311  C<readline> support - adds command completion to basic C<readline>. 
8312  
8313  Returns a list of possible completions to C<readline> when invoked. C<readline>
8314  will print the longest common substring following the text already entered. 
8315  
8316  If there is only a single possible completion, C<readline> will use it in full.
8317  
8318  This code uses C<map> and C<grep> heavily to create lists of possible 
8319  completion. Think LISP in this section.
8320  
8321  =cut
8322  
8323  sub db_complete {
8324  
8325      # Specific code for b c l V m f O, &blah, $blah, @blah, %blah
8326      # $text is the text to be completed.
8327      # $line is the incoming line typed by the user.
8328      # $start is the start of the text to be completed in the incoming line.
8329      my ( $text, $line, $start ) = @_;
8330  
8331      # Save the initial text.
8332      # The search pattern is current package, ::, extract the next qualifier
8333      # Prefix and pack are set to undef.
8334      my ( $itext, $search, $prefix, $pack ) =
8335        ( $text, "^\Q${'package'}::\E([^:]+)\$" );
8336  
8337  =head3 C<b postpone|compile> 
8338  
8339  =over 4
8340  
8341  =item *
8342  
8343  Find all the subroutines that might match in this package
8344  
8345  =item *
8346  
8347  Add C<postpone>, C<load>, and C<compile> as possibles (we may be completing the keyword itself)
8348  
8349  =item *
8350  
8351  Include all the rest of the subs that are known
8352  
8353  =item *
8354  
8355  C<grep> out the ones that match the text we have so far
8356  
8357  =item *
8358  
8359  Return this as the list of possible completions
8360  
8361  =back
8362  
8363  =cut 
8364  
8365      return sort grep /^\Q$text/, ( keys %sub ),
8366        qw(postpone load compile),    # subroutines
8367        ( map { /$search/ ? ($1) : () } keys %sub )
8368        if ( substr $line, 0, $start ) =~ /^\|*[blc]\s+((postpone|compile)\s+)?$/;
8369  
8370  =head3 C<b load>
8371  
8372  Get all the possible files from C<@INC> as it currently stands and
8373  select the ones that match the text so far.
8374  
8375  =cut
8376  
8377      return sort grep /^\Q$text/, values %INC    # files
8378        if ( substr $line, 0, $start ) =~ /^\|*b\s+load\s+$/;
8379  
8380  =head3  C<V> (list variable) and C<m> (list modules)
8381  
8382  There are two entry points for these commands:
8383  
8384  =head4 Unqualified package names
8385  
8386  Get the top-level packages and grab everything that matches the text
8387  so far. For each match, recursively complete the partial packages to
8388  get all possible matching packages. Return this sorted list.
8389  
8390  =cut
8391  
8392      return sort map { ( $_, db_complete( $_ . "::", "V ", 2 ) ) }
8393        grep /^\Q$text/, map { /^(.*)::$/ ? ($1) : () } keys %::    # top-packages
8394        if ( substr $line, 0, $start ) =~ /^\|*[Vm]\s+$/ and $text =~ /^\w*$/;
8395  
8396  =head4 Qualified package names
8397  
8398  Take a partially-qualified package and find all subpackages for it
8399  by getting all the subpackages for the package so far, matching all
8400  the subpackages against the text, and discarding all of them which 
8401  start with 'main::'. Return this list.
8402  
8403  =cut
8404  
8405      return sort map { ( $_, db_complete( $_ . "::", "V ", 2 ) ) }
8406        grep !/^main::/, grep /^\Q$text/,
8407        map { /^(.*)::$/ ? ( $prefix . "::$1" ) : () } keys %{ $prefix . '::' }
8408        if ( substr $line, 0, $start ) =~ /^\|*[Vm]\s+$/
8409        and $text =~ /^(.*[^:])::?(\w*)$/
8410        and $prefix = $1;
8411  
8412  =head3 C<f> - switch files
8413  
8414  Here, we want to get a fully-qualified filename for the C<f> command.
8415  Possibilities are:
8416  
8417  =over 4
8418  
8419  =item 1. The original source file itself
8420  
8421  =item 2. A file from C<@INC>
8422  
8423  =item 3. An C<eval> (the debugger gets a C<(eval N)> fake file for each C<eval>).
8424  
8425  =back
8426  
8427  =cut
8428  
8429      if ( $line =~ /^\|*f\s+(.*)/ ) {    # Loaded files
8430             # We might possibly want to switch to an eval (which has a "filename"
8431             # like '(eval 9)'), so we may need to clean up the completion text
8432             # before proceeding.
8433          $prefix = length($1) - length($text);
8434          $text   = $1;
8435  
8436  =pod
8437  
8438  Under the debugger, source files are represented as C<_E<lt>/fullpath/to/file> 
8439  (C<eval>s are C<_E<lt>(eval NNN)>) keys in C<%main::>. We pull all of these 
8440  out of C<%main::>, add the initial source file, and extract the ones that 
8441  match the completion text so far.
8442  
8443  =cut
8444  
8445          return sort
8446            map { substr $_, 2 + $prefix } grep /^_<\Q$text/, ( keys %main:: ),
8447            $0;
8448      } ## end if ($line =~ /^\|*f\s+(.*)/)
8449  
8450  =head3 Subroutine name completion
8451  
8452  We look through all of the defined subs (the keys of C<%sub>) and
8453  return both all the possible matches to the subroutine name plus
8454  all the matches qualified to the current package.
8455  
8456  =cut
8457  
8458      if ( ( substr $text, 0, 1 ) eq '&' ) {    # subroutines
8459          $text = substr $text, 1;
8460          $prefix = "&";
8461          return sort map "$prefix$_", grep /^\Q$text/, ( keys %sub ),
8462            (
8463              map { /$search/ ? ($1) : () }
8464                keys %sub
8465            );
8466      } ## end if ((substr $text, 0, ...
8467  
8468  =head3  Scalar, array, and hash completion: partially qualified package
8469  
8470  Much like the above, except we have to do a little more cleanup:
8471  
8472  =cut
8473  
8474      if ( $text =~ /^[\$@%](.*)::(.*)/ ) {    # symbols in a package
8475  
8476  =pod
8477  
8478  =over 4 
8479  
8480  =item *
8481  
8482  Determine the package that the symbol is in. Put it in C<::> (effectively C<main::>) if no package is specified.
8483  
8484  =cut
8485  
8486          $pack = ( $1 eq 'main' ? '' : $1 ) . '::';
8487  
8488  =pod
8489  
8490  =item *
8491  
8492  Figure out the prefix vs. what needs completing.
8493  
8494  =cut
8495  
8496          $prefix = ( substr $text, 0, 1 ) . $1 . '::';
8497          $text   = $2;
8498  
8499  =pod
8500  
8501  =item *
8502  
8503  Look through all the symbols in the package. C<grep> out all the possible hashes/arrays/scalars, and then C<grep> the possible matches out of those. C<map> the prefix onto all the possibilities.
8504  
8505  =cut
8506  
8507          my @out = map "$prefix$_", grep /^\Q$text/, grep /^_?[a-zA-Z]/,
8508            keys %$pack;
8509  
8510  =pod
8511  
8512  =item *
8513  
8514  If there's only one hit, and it's a package qualifier, and it's not equal to the initial text, re-complete it using the symbol we actually found.
8515  
8516  =cut
8517  
8518          if ( @out == 1 and $out[0] =~ /::$/ and $out[0] ne $itext ) {
8519              return db_complete( $out[0], $line, $start );
8520          }
8521  
8522          # Return the list of possibles.
8523          return sort @out;
8524  
8525      } ## end if ($text =~ /^[\$@%](.*)::(.*)/)
8526  
8527  =pod
8528  
8529  =back
8530  
8531  =head3 Symbol completion: current package or package C<main>.
8532  
8533  =cut
8534  
8535      if ( $text =~ /^[\$@%]/ ) {    # symbols (in $package + packages in main)
8536  
8537  =pod
8538  
8539  =over 4
8540  
8541  =item *
8542  
8543  If it's C<main>, delete main to just get C<::> leading.
8544  
8545  =cut
8546  
8547          $pack = ( $package eq 'main' ? '' : $package ) . '::';
8548  
8549  =pod
8550  
8551  =item *
8552  
8553  We set the prefix to the item's sigil, and trim off the sigil to get the text to be completed.
8554  
8555  =cut
8556  
8557          $prefix = substr $text, 0, 1;
8558          $text   = substr $text, 1;
8559  
8560  =pod
8561  
8562  =item *
8563  
8564  If the package is C<::> (C<main>), create an empty list; if it's something else, create a list of all the packages known.  Append whichever list to a list of all the possible symbols in the current package. C<grep> out the matches to the text entered so far, then C<map> the prefix back onto the symbols.
8565  
8566  =cut
8567  
8568          my @out = map "$prefix$_", grep /^\Q$text/,
8569            ( grep /^_?[a-zA-Z]/, keys %$pack ),
8570            ( $pack eq '::' ? () : ( grep /::$/, keys %:: ) );
8571  
8572  =item *
8573  
8574  If there's only one hit, it's a package qualifier, and it's not equal to the initial text, recomplete using this symbol.
8575  
8576  =back
8577  
8578  =cut
8579  
8580          if ( @out == 1 and $out[0] =~ /::$/ and $out[0] ne $itext ) {
8581              return db_complete( $out[0], $line, $start );
8582          }
8583  
8584          # Return the list of possibles.
8585          return sort @out;
8586      } ## end if ($text =~ /^[\$@%]/)
8587  
8588  =head3 Options 
8589  
8590  We use C<option_val()> to look up the current value of the option. If there's
8591  only a single value, we complete the command in such a way that it is a 
8592  complete command for setting the option in question. If there are multiple
8593  possible values, we generate a command consisting of the option plus a trailing
8594  question mark, which, if executed, will list the current value of the option.
8595  
8596  =cut
8597  
8598      if ( ( substr $line, 0, $start ) =~ /^\|*[oO]\b.*\s$/ )
8599      {    # Options after space
8600             # We look for the text to be matched in the list of possible options,
8601             # and fetch the current value.
8602          my @out = grep /^\Q$text/, @options;
8603          my $val = option_val( $out[0], undef );
8604  
8605          # Set up a 'query option's value' command.
8606          my $out = '? ';
8607          if ( not defined $val or $val =~ /[\n\r]/ ) {
8608  
8609              # There's really nothing else we can do.
8610          }
8611  
8612          # We have a value. Create a proper option-setting command.
8613          elsif ( $val =~ /\s/ ) {
8614  
8615              # XXX This may be an extraneous variable.
8616              my $found;
8617  
8618              # We'll want to quote the string (because of the embedded
8619              # whtespace), but we want to make sure we don't end up with
8620              # mismatched quote characters. We try several possibilities.
8621              foreach $l ( split //, qq/\"\'\#\|/ ) {
8622  
8623                  # If we didn't find this quote character in the value,
8624                  # quote it using this quote character.
8625                  $out = "$l$val$l ", last if ( index $val, $l ) == -1;
8626              }
8627          } ## end elsif ($val =~ /\s/)
8628  
8629          # Don't need any quotes.
8630          else {
8631              $out = "=$val ";
8632          }
8633  
8634          # If there were multiple possible values, return '? ', which
8635          # makes the command into a query command. If there was just one,
8636          # have readline append that.
8637          $rl_attribs->{completer_terminator_character} =
8638            ( @out == 1 ? $out : '? ' );
8639  
8640          # Return list of possibilities.
8641          return sort @out;
8642      } ## end if ((substr $line, 0, ...
8643  
8644  =head3 Filename completion
8645  
8646  For entering filenames. We simply call C<readline>'s C<filename_list()>
8647  method with the completion text to get the possible completions.
8648  
8649  =cut
8650  
8651      return $term->filename_list($text);    # filenames
8652  
8653  } ## end sub db_complete
8654  
8655  =head1 MISCELLANEOUS SUPPORT FUNCTIONS
8656  
8657  Functions that possibly ought to be somewhere else.
8658  
8659  =head2 end_report
8660  
8661  Say we're done.
8662  
8663  =cut
8664  
8665  sub end_report {
8666      local $\ = '';
8667      print $OUT "Use `q' to quit or `R' to restart.  `h q' for details.\n";
8668  }
8669  
8670  =head2 clean_ENV
8671  
8672  If we have $ini_pids, save it in the environment; else remove it from the
8673  environment. Used by the C<R> (restart) command.
8674  
8675  =cut
8676  
8677  sub clean_ENV {
8678      if ( defined($ini_pids) ) {
8679          $ENV{PERLDB_PIDS} = $ini_pids;
8680      }
8681      else {
8682          delete( $ENV{PERLDB_PIDS} );
8683      }
8684  } ## end sub clean_ENV
8685  
8686  # PERLDBf_... flag names from perl.h
8687  our ( %DollarCaretP_flags, %DollarCaretP_flags_r );
8688  
8689  BEGIN {
8690      %DollarCaretP_flags = (
8691          PERLDBf_SUB       => 0x01,     # Debug sub enter/exit
8692          PERLDBf_LINE      => 0x02,     # Keep line #
8693          PERLDBf_NOOPT     => 0x04,     # Switch off optimizations
8694          PERLDBf_INTER     => 0x08,     # Preserve more data
8695          PERLDBf_SUBLINE   => 0x10,     # Keep subr source lines
8696          PERLDBf_SINGLE    => 0x20,     # Start with single-step on
8697          PERLDBf_NONAME    => 0x40,     # For _SUB: no name of the subr
8698          PERLDBf_GOTO      => 0x80,     # Report goto: call DB::goto
8699          PERLDBf_NAMEEVAL  => 0x100,    # Informative names for evals
8700          PERLDBf_NAMEANON  => 0x200,    # Informative names for anon subs
8701          PERLDB_ALL        => 0x33f,    # No _NONAME, _GOTO
8702      );
8703  
8704      %DollarCaretP_flags_r = reverse %DollarCaretP_flags;
8705  }
8706  
8707  sub parse_DollarCaretP_flags {
8708      my $flags = shift;
8709      $flags =~ s/^\s+//;
8710      $flags =~ s/\s+$//;
8711      my $acu = 0;
8712      foreach my $f ( split /\s*\|\s*/, $flags ) {
8713          my $value;
8714          if ( $f =~ /^0x([[:xdigit:]]+)$/ ) {
8715              $value = hex $1;
8716          }
8717          elsif ( $f =~ /^(\d+)$/ ) {
8718              $value = int $1;
8719          }
8720          elsif ( $f =~ /^DEFAULT$/i ) {
8721              $value = $DollarCaretP_flags{PERLDB_ALL};
8722          }
8723          else {
8724              $f =~ /^(?:PERLDBf_)?(.*)$/i;
8725              $value = $DollarCaretP_flags{ 'PERLDBf_' . uc($1) };
8726              unless ( defined $value ) {
8727                  print $OUT (
8728                      "Unrecognized \$^P flag '$f'!\n",
8729                      "Acceptable flags are: "
8730                        . join( ', ', sort keys %DollarCaretP_flags ),
8731                      ", and hexadecimal and decimal numbers.\n"
8732                  );
8733                  return undef;
8734              }
8735          }
8736          $acu |= $value;
8737      }
8738      $acu;
8739  }
8740  
8741  sub expand_DollarCaretP_flags {
8742      my $DollarCaretP = shift;
8743      my @bits         = (
8744          map {
8745              my $n = ( 1 << $_ );
8746              ( $DollarCaretP & $n )
8747                ? ( $DollarCaretP_flags_r{$n}
8748                    || sprintf( '0x%x', $n ) )
8749                : ()
8750            } 0 .. 31
8751      );
8752      return @bits ? join( '|', @bits ) : 0;
8753  }
8754  
8755  =over 4
8756  
8757  =item rerun
8758  
8759  Rerun the current session to:
8760  
8761      rerun        current position
8762  
8763      rerun 4      command number 4
8764  
8765      rerun -4     current command minus 4 (go back 4 steps)
8766  
8767  Whether this always makes sense, in the current context is unknowable, and is
8768  in part left as a useful exersize for the reader.  This sub returns the
8769  appropriate arguments to rerun the current session.
8770  
8771  =cut
8772  
8773  sub rerun {
8774      my $i = shift; 
8775      my @args;
8776      pop(@truehist);                      # strim
8777      unless (defined $truehist[$i]) {
8778          print "Unable to return to non-existent command: $i\n";
8779      } else {
8780          $#truehist = ($i < 0 ? $#truehist + $i : $i > 0 ? $i : $#truehist);
8781          my @temp = @truehist;            # store
8782          push(@DB::typeahead, @truehist); # saved
8783          @truehist = @hist = ();          # flush
8784          @args = &restart();              # setup
8785          &get_list("PERLDB_HIST");        # clean
8786          &set_list("PERLDB_HIST", @temp); # reset
8787      }
8788      return @args;
8789  }
8790  
8791  =item restart
8792  
8793  Restarting the debugger is a complex operation that occurs in several phases.
8794  First, we try to reconstruct the command line that was used to invoke Perl
8795  and the debugger.
8796  
8797  =cut
8798  
8799  sub restart {
8800      # I may not be able to resurrect you, but here goes ...
8801      print $OUT
8802  "Warning: some settings and command-line options may be lost!\n";
8803      my ( @script, @flags, $cl );
8804  
8805      # If warn was on before, turn it on again.
8806      push @flags, '-w' if $ini_warn;
8807  
8808      # Rebuild the -I flags that were on the initial
8809      # command line.
8810      for (@ini_INC) {
8811          push @flags, '-I', $_;
8812      }
8813  
8814      # Turn on taint if it was on before.
8815      push @flags, '-T' if ${^TAINT};
8816  
8817      # Arrange for setting the old INC:
8818      # Save the current @init_INC in the environment.
8819      set_list( "PERLDB_INC", @ini_INC );
8820  
8821      # If this was a perl one-liner, go to the "file"
8822      # corresponding to the one-liner read all the lines
8823      # out of it (except for the first one, which is going
8824      # to be added back on again when 'perl -d' runs: that's
8825      # the 'require perl5db.pl;' line), and add them back on
8826      # to the command line to be executed.
8827      if ( $0 eq '-e' ) {
8828          for ( 1 .. $#{'::_<-e'} ) {  # The first line is PERL5DB
8829              chomp( $cl = ${'::_<-e'}[$_] );
8830              push @script, '-e', $cl;
8831          }
8832      } ## end if ($0 eq '-e')
8833  
8834      # Otherwise we just reuse the original name we had
8835      # before.
8836      else {
8837          @script = $0;
8838      }
8839  
8840  =pod
8841  
8842  After the command line  has been reconstructed, the next step is to save
8843  the debugger's status in environment variables. The C<DB::set_list> routine
8844  is used to save aggregate variables (both hashes and arrays); scalars are
8845  just popped into environment variables directly.
8846  
8847  =cut
8848  
8849      # If the terminal supported history, grab it and
8850      # save that in the environment.
8851      set_list( "PERLDB_HIST",
8852            $term->Features->{getHistory}
8853          ? $term->GetHistory
8854          : @hist );
8855  
8856      # Find all the files that were visited during this
8857      # session (i.e., the debugger had magic hashes
8858      # corresponding to them) and stick them in the environment.
8859      my @had_breakpoints = keys %had_breakpoints;
8860      set_list( "PERLDB_VISITED", @had_breakpoints );
8861  
8862      # Save the debugger options we chose.
8863      set_list( "PERLDB_OPT", %option );
8864      # set_list( "PERLDB_OPT", options2remember() );
8865  
8866      # Save the break-on-loads.
8867      set_list( "PERLDB_ON_LOAD", %break_on_load );
8868  
8869  =pod 
8870  
8871  The most complex part of this is the saving of all of the breakpoints. They
8872  can live in an awful lot of places, and we have to go through all of them,
8873  find the breakpoints, and then save them in the appropriate environment
8874  variable via C<DB::set_list>.
8875  
8876  =cut
8877  
8878      # Go through all the breakpoints and make sure they're
8879      # still valid.
8880      my @hard;
8881      for ( 0 .. $#had_breakpoints ) {
8882  
8883          # We were in this file.
8884          my $file = $had_breakpoints[$_];
8885  
8886          # Grab that file's magic line hash.
8887          *dbline = $main::{ '_<' . $file };
8888  
8889          # Skip out if it doesn't exist, or if the breakpoint
8890          # is in a postponed file (we'll do postponed ones
8891          # later).
8892          next unless %dbline or $postponed_file{$file};
8893  
8894          # In an eval. This is a little harder, so we'll
8895          # do more processing on that below.
8896          ( push @hard, $file ), next
8897            if $file =~ /^\(\w*eval/;
8898  
8899          # XXX I have no idea what this is doing. Yet.
8900          my @add;
8901          @add = %{ $postponed_file{$file} }
8902            if $postponed_file{$file};
8903  
8904          # Save the list of all the breakpoints for this file.
8905          set_list( "PERLDB_FILE_$_", %dbline, @add );
8906      } ## end for (0 .. $#had_breakpoints)
8907  
8908      # The breakpoint was inside an eval. This is a little
8909      # more difficult. XXX and I don't understand it.
8910      for (@hard) {
8911          # Get over to the eval in question.
8912          *dbline = $main::{ '_<' . $_ };
8913          my ( $quoted, $sub, %subs, $line ) = quotemeta $_;
8914          for $sub ( keys %sub ) {
8915              next unless $sub{$sub} =~ /^$quoted:(\d+)-(\d+)$/;
8916              $subs{$sub} = [ $1, $2 ];
8917          }
8918          unless (%subs) {
8919              print $OUT
8920                "No subroutines in $_, ignoring breakpoints.\n";
8921              next;
8922          }
8923        LINES: for $line ( keys %dbline ) {
8924  
8925              # One breakpoint per sub only:
8926              my ( $offset, $sub, $found );
8927            SUBS: for $sub ( keys %subs ) {
8928                  if (
8929                      $subs{$sub}->[1] >=
8930                      $line    # Not after the subroutine
8931                      and (
8932                          not defined $offset    # Not caught
8933                          or $offset < 0
8934                      )
8935                    )
8936                  {                              # or badly caught
8937                      $found  = $sub;
8938                      $offset = $line - $subs{$sub}->[0];
8939                      $offset = "+$offset", last SUBS
8940                        if $offset >= 0;
8941                  } ## end if ($subs{$sub}->[1] >=...
8942              } ## end for $sub (keys %subs)
8943              if ( defined $offset ) {
8944                  $postponed{$found} =
8945                    "break $offset if $dbline{$line}";
8946              }
8947              else {
8948                  print $OUT
8949  "Breakpoint in $_:$line ignored: after all the subroutines.\n";
8950              }
8951          } ## end for $line (keys %dbline)
8952      } ## end for (@hard)
8953  
8954      # Save the other things that don't need to be
8955      # processed.
8956      set_list( "PERLDB_POSTPONE",  %postponed );
8957      set_list( "PERLDB_PRETYPE",   @$pretype );
8958      set_list( "PERLDB_PRE",       @$pre );
8959      set_list( "PERLDB_POST",      @$post );
8960      set_list( "PERLDB_TYPEAHEAD", @typeahead );
8961  
8962      # We are oficially restarting.
8963      $ENV{PERLDB_RESTART} = 1;
8964  
8965      # We are junking all child debuggers.
8966      delete $ENV{PERLDB_PIDS};    # Restore ini state
8967  
8968      # Set this back to the initial pid.
8969      $ENV{PERLDB_PIDS} = $ini_pids if defined $ini_pids;
8970  
8971  =pod 
8972  
8973  After all the debugger status has been saved, we take the command we built up
8974  and then return it, so we can C<exec()> it. The debugger will spot the
8975  C<PERLDB_RESTART> environment variable and realize it needs to reload its state
8976  from the environment.
8977  
8978  =cut
8979  
8980      # And run Perl again. Add the "-d" flag, all the
8981      # flags we built up, the script (whether a one-liner
8982      # or a file), add on the -emacs flag for a slave editor,
8983      # and then the old arguments. 
8984  
8985      return ($^X, '-d', @flags, @script, ($slave_editor ? '-emacs' : ()), @ARGS);
8986  
8987  };  # end restart
8988  
8989  =back
8990  
8991  =head1 END PROCESSING - THE C<END> BLOCK
8992  
8993  Come here at the very end of processing. We want to go into a 
8994  loop where we allow the user to enter commands and interact with the 
8995  debugger, but we don't want anything else to execute. 
8996  
8997  First we set the C<$finished> variable, so that some commands that
8998  shouldn't be run after the end of program quit working.
8999  
9000  We then figure out whether we're truly done (as in the user entered a C<q>
9001  command, or we finished execution while running nonstop). If we aren't,
9002  we set C<$single> to 1 (causing the debugger to get control again).
9003  
9004  We then call C<DB::fake::at_exit()>, which returns the C<Use 'q' to quit ...>
9005  message and returns control to the debugger. Repeat.
9006  
9007  When the user finally enters a C<q> command, C<$fall_off_end> is set to
9008  1 and the C<END> block simply exits with C<$single> set to 0 (don't 
9009  break, run to completion.).
9010  
9011  =cut
9012  
9013  END {
9014      $finished = 1 if $inhibit_exit;    # So that some commands may be disabled.
9015      $fall_off_end = 1 unless $inhibit_exit;
9016  
9017      # Do not stop in at_exit() and destructors on exit:
9018      if ($fall_off_end or $runnonstop) {
9019          &save_hist();
9020      } else {
9021          $DB::single = 1;
9022          DB::fake::at_exit();
9023      }
9024  } ## end END
9025  
9026  =head1 PRE-5.8 COMMANDS
9027  
9028  Some of the commands changed function quite a bit in the 5.8 command 
9029  realignment, so much so that the old code had to be replaced completely.
9030  Because we wanted to retain the option of being able to go back to the
9031  former command set, we moved the old code off to this section.
9032  
9033  There's an awful lot of duplicated code here. We've duplicated the 
9034  comments to keep things clear.
9035  
9036  =head2 Null command
9037  
9038  Does nothing. Used to I<turn off> commands.
9039  
9040  =cut
9041  
9042  sub cmd_pre580_null {
9043  
9044      # do nothing...
9045  }
9046  
9047  =head2 Old C<a> command.
9048  
9049  This version added actions if you supplied them, and deleted them
9050  if you didn't.
9051  
9052  =cut
9053  
9054  sub cmd_pre580_a {
9055      my $xcmd = shift;
9056      my $cmd  = shift;
9057  
9058      # Argument supplied. Add the action.
9059      if ( $cmd =~ /^(\d*)\s*(.*)/ ) {
9060  
9061          # If the line isn't there, use the current line.
9062          $i = $1 || $line;
9063          $j = $2;
9064  
9065          # If there is an action ...
9066          if ( length $j ) {
9067  
9068              # ... but the line isn't breakable, skip it.
9069              if ( $dbline[$i] == 0 ) {
9070                  print $OUT "Line $i may not have an action.\n";
9071              }
9072              else {
9073  
9074                  # ... and the line is breakable:
9075                  # Mark that there's an action in this file.
9076                  $had_breakpoints{$filename} |= 2;
9077  
9078                  # Delete any current action.
9079                  $dbline{$i} =~ s/\0[^\0]*//;
9080  
9081                  # Add the new action, continuing the line as needed.
9082                  $dbline{$i} .= "\0" . action($j);
9083              }
9084          } ## end if (length $j)
9085  
9086          # No action supplied.
9087          else {
9088  
9089              # Delete the action.
9090              $dbline{$i} =~ s/\0[^\0]*//;
9091  
9092              # Mark as having no break or action if nothing's left.
9093              delete $dbline{$i} if $dbline{$i} eq '';
9094          }
9095      } ## end if ($cmd =~ /^(\d*)\s*(.*)/)
9096  } ## end sub cmd_pre580_a
9097  
9098  =head2 Old C<b> command 
9099  
9100  Add breakpoints.
9101  
9102  =cut
9103  
9104  sub cmd_pre580_b {
9105      my $xcmd   = shift;
9106      my $cmd    = shift;
9107      my $dbline = shift;
9108  
9109      # Break on load.
9110      if ( $cmd =~ /^load\b\s*(.*)/ ) {
9111          my $file = $1;
9112          $file =~ s/\s+$//;
9113          &cmd_b_load($file);
9114      }
9115  
9116      # b compile|postpone <some sub> [<condition>]
9117      # The interpreter actually traps this one for us; we just put the
9118      # necessary condition in the %postponed hash.
9119      elsif ( $cmd =~ /^(postpone|compile)\b\s*([':A-Za-z_][':\w]*)\s*(.*)/ ) {
9120  
9121          # Capture the condition if there is one. Make it true if none.
9122          my $cond = length $3 ? $3 : '1';
9123  
9124          # Save the sub name and set $break to 1 if $1 was 'postpone', 0
9125          # if it was 'compile'.
9126          my ( $subname, $break ) = ( $2, $1 eq 'postpone' );
9127  
9128          # De-Perl4-ify the name - ' separators to ::.
9129          $subname =~ s/\'/::/g;
9130  
9131          # Qualify it into the current package unless it's already qualified.
9132          $subname = "${'package'}::" . $subname
9133            unless $subname =~ /::/;
9134  
9135          # Add main if it starts with ::.
9136          $subname = "main" . $subname if substr( $subname, 0, 2 ) eq "::";
9137  
9138          # Save the break type for this sub.
9139          $postponed{$subname} = $break ? "break +0 if $cond" : "compile";
9140      } ## end elsif ($cmd =~ ...
9141  
9142      # b <sub name> [<condition>]
9143      elsif ( $cmd =~ /^([':A-Za-z_][':\w]*(?:\[.*\])?)\s*(.*)/ ) {
9144          my $subname = $1;
9145          my $cond = length $2 ? $2 : '1';
9146          &cmd_b_sub( $subname, $cond );
9147      }
9148  
9149      # b <line> [<condition>].
9150      elsif ( $cmd =~ /^(\d*)\s*(.*)/ ) {
9151          my $i = $1 || $dbline;
9152          my $cond = length $2 ? $2 : '1';
9153          &cmd_b_line( $i, $cond );
9154      }
9155  } ## end sub cmd_pre580_b
9156  
9157  =head2 Old C<D> command.
9158  
9159  Delete all breakpoints unconditionally.
9160  
9161  =cut
9162  
9163  sub cmd_pre580_D {
9164      my $xcmd = shift;
9165      my $cmd  = shift;
9166      if ( $cmd =~ /^\s*$/ ) {
9167          print $OUT "Deleting all breakpoints...\n";
9168  
9169          # %had_breakpoints lists every file that had at least one
9170          # breakpoint in it.
9171          my $file;
9172          for $file ( keys %had_breakpoints ) {
9173  
9174              # Switch to the desired file temporarily.
9175              local *dbline = $main::{ '_<' . $file };
9176  
9177              my $max = $#dbline;
9178              my $was;
9179  
9180              # For all lines in this file ...
9181              for ( $i = 1 ; $i <= $max ; $i++ ) {
9182  
9183                  # If there's a breakpoint or action on this line ...
9184                  if ( defined $dbline{$i} ) {
9185  
9186                      # ... remove the breakpoint.
9187                      $dbline{$i} =~ s/^[^\0]+//;
9188                      if ( $dbline{$i} =~ s/^\0?$// ) {
9189  
9190                          # Remove the entry altogether if no action is there.
9191                          delete $dbline{$i};
9192                      }
9193                  } ## end if (defined $dbline{$i...
9194              } ## end for ($i = 1 ; $i <= $max...
9195  
9196              # If, after we turn off the "there were breakpoints in this file"
9197              # bit, the entry in %had_breakpoints for this file is zero,
9198              # we should remove this file from the hash.
9199              if ( not $had_breakpoints{$file} &= ~1 ) {
9200                  delete $had_breakpoints{$file};
9201              }
9202          } ## end for $file (keys %had_breakpoints)
9203  
9204          # Kill off all the other breakpoints that are waiting for files that
9205          # haven't been loaded yet.
9206          undef %postponed;
9207          undef %postponed_file;
9208          undef %break_on_load;
9209      } ## end if ($cmd =~ /^\s*$/)
9210  } ## end sub cmd_pre580_D
9211  
9212  =head2 Old C<h> command
9213  
9214  Print help. Defaults to printing the long-form help; the 5.8 version 
9215  prints the summary by default.
9216  
9217  =cut
9218  
9219  sub cmd_pre580_h {
9220      my $xcmd = shift;
9221      my $cmd  = shift;
9222  
9223      # Print the *right* help, long format.
9224      if ( $cmd =~ /^\s*$/ ) {
9225          print_help($pre580_help);
9226      }
9227  
9228      # 'h h' - explicitly-requested summary.
9229      elsif ( $cmd =~ /^h\s*/ ) {
9230          print_help($pre580_summary);
9231      }
9232  
9233      # Find and print a command's help.
9234      elsif ( $cmd =~ /^h\s+(\S.*)$/ ) {
9235          my $asked  = $1;                   # for proper errmsg
9236          my $qasked = quotemeta($asked);    # for searching
9237                                             # XXX: finds CR but not <CR>
9238          if (
9239              $pre580_help =~ /^
9240                                <?           # Optional '<'
9241                                (?:[IB]<)    # Optional markup
9242                                $qasked      # The command name
9243                              /mx
9244            )
9245          {
9246  
9247              while (
9248                  $pre580_help =~ /^
9249                                    (             # The command help:
9250                                     <?           # Optional '<'
9251                                     (?:[IB]<)    # Optional markup
9252                                     $qasked      # The command name
9253                                     ([\s\S]*?)   # Lines starting with tabs
9254                                     \n           # Final newline
9255                                    )
9256                                    (?!\s)/mgx
9257                )    # Line not starting with space
9258                     # (Next command's help)
9259              {
9260                  print_help($1);
9261              }
9262          } ## end if ($pre580_help =~ /^<?(?:[IB]<)$qasked/m)
9263  
9264          # Help not found.
9265          else {
9266              print_help("B<$asked> is not a debugger command.\n");
9267          }
9268      } ## end elsif ($cmd =~ /^h\s+(\S.*)$/)
9269  } ## end sub cmd_pre580_h
9270  
9271  =head2 Old C<W> command
9272  
9273  C<W E<lt>exprE<gt>> adds a watch expression, C<W> deletes them all.
9274  
9275  =cut
9276  
9277  sub cmd_pre580_W {
9278      my $xcmd = shift;
9279      my $cmd  = shift;
9280  
9281      # Delete all watch expressions.
9282      if ( $cmd =~ /^$/ ) {
9283  
9284          # No watching is going on.
9285          $trace &= ~2;
9286  
9287          # Kill all the watch expressions and values.
9288          @to_watch = @old_watch = ();
9289      }
9290  
9291      # Add a watch expression.
9292      elsif ( $cmd =~ /^(.*)/s ) {
9293  
9294          # add it to the list to be watched.
9295          push @to_watch, $1;
9296  
9297          # Get the current value of the expression.
9298          # Doesn't handle expressions returning list values!
9299          $evalarg = $1;
9300          my ($val) = &eval;
9301          $val = ( defined $val ) ? "'$val'" : 'undef';
9302  
9303          # Save it.
9304          push @old_watch, $val;
9305  
9306          # We're watching stuff.
9307          $trace |= 2;
9308  
9309      } ## end elsif ($cmd =~ /^(.*)/s)
9310  } ## end sub cmd_pre580_W
9311  
9312  =head1 PRE-AND-POST-PROMPT COMMANDS AND ACTIONS
9313  
9314  The debugger used to have a bunch of nearly-identical code to handle 
9315  the pre-and-post-prompt action commands. C<cmd_pre590_prepost> and
9316  C<cmd_prepost> unify all this into one set of code to handle the 
9317  appropriate actions.
9318  
9319  =head2 C<cmd_pre590_prepost>
9320  
9321  A small wrapper around C<cmd_prepost>; it makes sure that the default doesn't
9322  do something destructive. In pre 5.8 debuggers, the default action was to
9323  delete all the actions.
9324  
9325  =cut
9326  
9327  sub cmd_pre590_prepost {
9328      my $cmd    = shift;
9329      my $line   = shift || '*';
9330      my $dbline = shift;
9331  
9332      return &cmd_prepost( $cmd, $line, $dbline );
9333  } ## end sub cmd_pre590_prepost
9334  
9335  =head2 C<cmd_prepost>
9336  
9337  Actually does all the handling for C<E<lt>>, C<E<gt>>, C<{{>, C<{>, etc.
9338  Since the lists of actions are all held in arrays that are pointed to by
9339  references anyway, all we have to do is pick the right array reference and
9340  then use generic code to all, delete, or list actions.
9341  
9342  =cut
9343  
9344  sub cmd_prepost {
9345      my $cmd = shift;
9346  
9347      # No action supplied defaults to 'list'.
9348      my $line = shift || '?';
9349  
9350      # Figure out what to put in the prompt.
9351      my $which = '';
9352  
9353      # Make sure we have some array or another to address later.
9354      # This means that if ssome reason the tests fail, we won't be
9355      # trying to stash actions or delete them from the wrong place.
9356      my $aref = [];
9357  
9358      # < - Perl code to run before prompt.
9359      if ( $cmd =~ /^\</o ) {
9360          $which = 'pre-perl';
9361          $aref  = $pre;
9362      }
9363  
9364      # > - Perl code to run after prompt.
9365      elsif ( $cmd =~ /^\>/o ) {
9366          $which = 'post-perl';
9367          $aref  = $post;
9368      }
9369  
9370      # { - first check for properly-balanced braces.
9371      elsif ( $cmd =~ /^\{/o ) {
9372          if ( $cmd =~ /^\{.*\}$/o && unbalanced( substr( $cmd, 1 ) ) ) {
9373              print $OUT
9374  "$cmd is now a debugger command\nuse `;$cmd' if you mean Perl code\n";
9375          }
9376  
9377          # Properly balanced. Pre-prompt debugger actions.
9378          else {
9379              $which = 'pre-debugger';
9380              $aref  = $pretype;
9381          }
9382      } ## end elsif ( $cmd =~ /^\{/o )
9383  
9384      # Did we find something that makes sense?
9385      unless ($which) {
9386          print $OUT "Confused by command: $cmd\n";
9387      }
9388  
9389      # Yes.
9390      else {
9391  
9392          # List actions.
9393          if ( $line =~ /^\s*\?\s*$/o ) {
9394              unless (@$aref) {
9395  
9396                  # Nothing there. Complain.
9397                  print $OUT "No $which actions.\n";
9398              }
9399              else {
9400  
9401                  # List the actions in the selected list.
9402                  print $OUT "$which commands:\n";
9403                  foreach my $action (@$aref) {
9404                      print $OUT "\t$cmd -- $action\n";
9405                  }
9406              } ## end else
9407          } ## end if ( $line =~ /^\s*\?\s*$/o)
9408  
9409          # Might be a delete.
9410          else {
9411              if ( length($cmd) == 1 ) {
9412                  if ( $line =~ /^\s*\*\s*$/o ) {
9413  
9414                      # It's a delete. Get rid of the old actions in the
9415                      # selected list..
9416                      @$aref = ();
9417                      print $OUT "All $cmd actions cleared.\n";
9418                  }
9419                  else {
9420  
9421                      # Replace all the actions. (This is a <, >, or {).
9422                      @$aref = action($line);
9423                  }
9424              } ## end if ( length($cmd) == 1)
9425              elsif ( length($cmd) == 2 ) {
9426  
9427                  # Add the action to the line. (This is a <<, >>, or {{).
9428                  push @$aref, action($line);
9429              }
9430              else {
9431  
9432                  # <<<, >>>>, {{{{{{ ... something not a command.
9433                  print $OUT
9434                    "Confused by strange length of $which command($cmd)...\n";
9435              }
9436          } ## end else [ if ( $line =~ /^\s*\?\s*$/o)
9437      } ## end else
9438  } ## end sub cmd_prepost
9439  
9440  =head1 C<DB::fake>
9441  
9442  Contains the C<at_exit> routine that the debugger uses to issue the
9443  C<Debugged program terminated ...> message after the program completes. See
9444  the C<END> block documentation for more details.
9445  
9446  =cut
9447  
9448  package DB::fake;
9449  
9450  sub at_exit {
9451      "Debugged program terminated.  Use `q' to quit or `R' to restart.";
9452  }
9453  
9454  package DB;    # Do not trace this 1; below!
9455  
9456  1;
9457  
9458  


Generated: Tue Mar 17 22:47:18 2015 Cross-referenced by PHPXref 0.7.1