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